change name of branch instruction to "jumpif"
This commit is contained in:
@@ -27,7 +27,7 @@ GravityBuilder gravityCreateBuilder(void);
|
||||
GravityFunction gravityNewFunction(GravityModule module, const char* name, GravityType functionType);
|
||||
GravityBlock gravityStartBlock(const char* name, GravityFunction function);
|
||||
|
||||
GravityValue newIntConstant(GravityType intType, int64_t value);
|
||||
GravityValue gravityBuildIntConstant(GravityBuilder builder, GravityType intType, int64_t value, const char* name);
|
||||
|
||||
GravityType gravityCreateFunctionType(int numArgs, GravityType* argTypes, GravityType returnType);
|
||||
GravityType gravityCreateIntegerType(uint8_t width, bool isSigned);
|
||||
@@ -42,8 +42,6 @@ void gravityBuilderSwitchToBlock(GravityBuilder builder, GravityBlock block);
|
||||
void gravityAppendBlockArgument(GravityBlock block, GravityType type);
|
||||
GravityValue gravityGetBlockArg(GravityBlock block, unsigned int index);
|
||||
|
||||
GravityValue gravityNewIntConstant(GravityType intType, int64_t value);
|
||||
|
||||
// instructions
|
||||
GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const char* name);
|
||||
void gravityBuildStore(GravityBuilder builder, GravityValue pointer, GravityValue value);
|
||||
|
||||
@@ -41,7 +41,7 @@ GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const c
|
||||
|
||||
GravityType wrapperType = gravityCreateType();
|
||||
wrapperType->typeKind = GravityTypeTypeKind;
|
||||
wrapperType->typeData = type;\
|
||||
wrapperType->typeData = type;
|
||||
|
||||
GravityValue constant = gravityNewConstant(wrapperType);
|
||||
gravityBuildInstruction(builder, GravityOpcodeAlloc, (GravityValue[]){constant}, 1, result);
|
||||
@@ -99,7 +99,7 @@ void gravityBuildBr(GravityBuilder builder, GravityValue condition, GravityBlock
|
||||
|
||||
gravityBuildInstruction(
|
||||
builder,
|
||||
GravityOpcodeBranch,
|
||||
GravityOpcodeJumpIf,
|
||||
(GravityValue[]){condition, thenValue, elseValue},
|
||||
3,
|
||||
NULL
|
||||
@@ -116,4 +116,19 @@ void gravityBuildJump(GravityBuilder builder, GravityBlock block, GravityValue*
|
||||
1,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
|
||||
GravityValue gravityBuildIntConstant(GravityBuilder builder, GravityType intType, int64_t value, const char* name) {
|
||||
GravityValue irConstant = gravityNewIntConstant(intType, value);
|
||||
GravityValue result = gravityNewValue(name, intType);
|
||||
|
||||
gravityBuildInstruction(
|
||||
builder,
|
||||
GravityOpcodeIntConst,
|
||||
(GravityValue[]){irConstant},
|
||||
1,
|
||||
result
|
||||
);
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -24,4 +24,6 @@ void gravityBuildRet(GravityBuilder builder, GravityValue returnValue);
|
||||
void gravityBuildBr(GravityBuilder builder, GravityValue condition, GravityBlock thenBranch, GravityValue* thenParams, GravityBlock elseBranch, GravityValue* elseParams);
|
||||
void gravityBuildJump(GravityBuilder builder, GravityBlock block, GravityValue* params);
|
||||
|
||||
GravityValue gravityBuildIntConstant(GravityBuilder builder, GravityType intType, int64_t value, const char* name);
|
||||
|
||||
#endif
|
||||
@@ -6,8 +6,9 @@ char* gravityOpcodeToCStr(GravityOpcode opcode) {
|
||||
case GravityOpcodeStore: return "store";
|
||||
case GravityOpcodeLoad: return "load";
|
||||
case GravityOpcodeRet: return "ret";
|
||||
case GravityOpcodeBranch: return "br";
|
||||
case GravityOpcodeJump: return "jmp";
|
||||
case GravityOpcodeJumpIf: return "jumpif";
|
||||
case GravityOpcodeJump: return "jump";
|
||||
case GravityOpcodeIntConst: return "iconst";
|
||||
default: return "fixme";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,8 +11,9 @@ typedef enum {
|
||||
GravityOpcodeStore,
|
||||
GravityOpcodeLoad,
|
||||
GravityOpcodeRet,
|
||||
GravityOpcodeBranch,
|
||||
GravityOpcodeJump
|
||||
GravityOpcodeJumpIf,
|
||||
GravityOpcodeJump,
|
||||
GravityOpcodeIntConst
|
||||
} GravityOpcode;
|
||||
|
||||
struct GravityInstruction {
|
||||
|
||||
19
test.c
19
test.c
@@ -2,6 +2,7 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void) {
|
||||
// define program
|
||||
GravityModule module = gravityCreateModule();
|
||||
GravityBuilder builder = gravityCreateBuilder();
|
||||
|
||||
@@ -20,27 +21,33 @@ int main(void) {
|
||||
gravityAppendBlockArgument(elseBlock, ptrType);
|
||||
|
||||
GravityBlock mergeBlock = gravityStartBlock("merge", mainFunc);
|
||||
gravityAppendBlockArgument(mergeBlock, ptrType);
|
||||
|
||||
// write entry
|
||||
gravityBuilderSwitchToBlock(builder, entryBlock);
|
||||
GravityValue x = gravityBuildAlloc(builder, charType, "x");
|
||||
|
||||
gravityBuildBr(builder, gravityNewIntConstant(charType, 1), thenBlock, (GravityValue[]){x}, elseBlock, (GravityValue[]){x});
|
||||
GravityValue oneConst = gravityBuildIntConstant(builder, charType, 1, "true");
|
||||
gravityBuildBr(builder, oneConst, thenBlock, (GravityValue[]){x}, elseBlock, (GravityValue[]){x});
|
||||
|
||||
// then block
|
||||
gravityBuilderSwitchToBlock(builder, thenBlock);
|
||||
GravityValue thenValue = gravityGetBlockArg(thenBlock, 0);
|
||||
gravityBuildStore(builder, thenValue, gravityNewIntConstant(charType, 5));
|
||||
gravityBuildJump(builder, mergeBlock, NULL);
|
||||
GravityValue fiveConst = gravityBuildIntConstant(builder, charType, 5, "five");
|
||||
gravityBuildStore(builder, thenValue, fiveConst);
|
||||
gravityBuildJump(builder, mergeBlock, (GravityValue[]){thenValue});
|
||||
|
||||
// else block
|
||||
gravityBuilderSwitchToBlock(builder, elseBlock);
|
||||
GravityValue elseValue = gravityGetBlockArg(elseBlock, 0);
|
||||
gravityBuildStore(builder, elseValue, gravityNewIntConstant(charType, 10));
|
||||
gravityBuildJump(builder, mergeBlock, NULL);
|
||||
GravityValue tenConst = gravityBuildIntConstant(builder, charType, 10, "ten");
|
||||
gravityBuildStore(builder, elseValue, tenConst);
|
||||
gravityBuildJump(builder, mergeBlock, (GravityValue[]){elseValue});
|
||||
|
||||
// merge block
|
||||
gravityBuilderSwitchToBlock(builder, mergeBlock);
|
||||
GravityValue xValue = gravityBuildLoad(builder, x, "xValue");
|
||||
GravityValue xVar = gravityGetBlockArg(mergeBlock, 0);
|
||||
GravityValue xValue = gravityBuildLoad(builder, xVar, "xValue");
|
||||
gravityBuildRet(builder, xValue);
|
||||
|
||||
printf("%s\n", gravityFunctionToCStr(mainFunc));
|
||||
|
||||
Reference in New Issue
Block a user