diff --git a/include/gravity/core.h b/include/gravity/core.h index 46bf591..f0300ec 100644 --- a/include/gravity/core.h +++ b/include/gravity/core.h @@ -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); diff --git a/src/builder.c b/src/builder.c index 5a40c95..576abdb 100644 --- a/src/builder.c +++ b/src/builder.c @@ -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; } \ No newline at end of file diff --git a/src/builder.h b/src/builder.h index a3cbfcf..bb99424 100644 --- a/src/builder.h +++ b/src/builder.h @@ -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 \ No newline at end of file diff --git a/src/instruction.c b/src/instruction.c index 1ad7974..69a56b8 100644 --- a/src/instruction.c +++ b/src/instruction.c @@ -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"; } } diff --git a/src/instruction.h b/src/instruction.h index 5ade036..b94c6d0 100644 --- a/src/instruction.h +++ b/src/instruction.h @@ -11,8 +11,9 @@ typedef enum { GravityOpcodeStore, GravityOpcodeLoad, GravityOpcodeRet, - GravityOpcodeBranch, - GravityOpcodeJump + GravityOpcodeJumpIf, + GravityOpcodeJump, + GravityOpcodeIntConst } GravityOpcode; struct GravityInstruction { diff --git a/test.c b/test.c index 76ba47e..c135573 100644 --- a/test.c +++ b/test.c @@ -2,6 +2,7 @@ #include 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));