change name of branch instruction to "jumpif"

This commit is contained in:
2026-08-04 10:10:49 +10:00
parent f0ee7263ec
commit 063f5a3d30
6 changed files with 39 additions and 15 deletions

View File

@@ -27,7 +27,7 @@ GravityBuilder gravityCreateBuilder(void);
GravityFunction gravityNewFunction(GravityModule module, const char* name, GravityType functionType); GravityFunction gravityNewFunction(GravityModule module, const char* name, GravityType functionType);
GravityBlock gravityStartBlock(const char* name, GravityFunction function); 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 gravityCreateFunctionType(int numArgs, GravityType* argTypes, GravityType returnType);
GravityType gravityCreateIntegerType(uint8_t width, bool isSigned); GravityType gravityCreateIntegerType(uint8_t width, bool isSigned);
@@ -42,8 +42,6 @@ void gravityBuilderSwitchToBlock(GravityBuilder builder, GravityBlock block);
void gravityAppendBlockArgument(GravityBlock block, GravityType type); void gravityAppendBlockArgument(GravityBlock block, GravityType type);
GravityValue gravityGetBlockArg(GravityBlock block, unsigned int index); GravityValue gravityGetBlockArg(GravityBlock block, unsigned int index);
GravityValue gravityNewIntConstant(GravityType intType, int64_t value);
// instructions // instructions
GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const char* name); GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const char* name);
void gravityBuildStore(GravityBuilder builder, GravityValue pointer, GravityValue value); void gravityBuildStore(GravityBuilder builder, GravityValue pointer, GravityValue value);

View File

@@ -41,7 +41,7 @@ GravityValue gravityBuildAlloc(GravityBuilder builder, GravityType type, const c
GravityType wrapperType = gravityCreateType(); GravityType wrapperType = gravityCreateType();
wrapperType->typeKind = GravityTypeTypeKind; wrapperType->typeKind = GravityTypeTypeKind;
wrapperType->typeData = type;\ wrapperType->typeData = type;
GravityValue constant = gravityNewConstant(wrapperType); GravityValue constant = gravityNewConstant(wrapperType);
gravityBuildInstruction(builder, GravityOpcodeAlloc, (GravityValue[]){constant}, 1, result); gravityBuildInstruction(builder, GravityOpcodeAlloc, (GravityValue[]){constant}, 1, result);
@@ -99,7 +99,7 @@ void gravityBuildBr(GravityBuilder builder, GravityValue condition, GravityBlock
gravityBuildInstruction( gravityBuildInstruction(
builder, builder,
GravityOpcodeBranch, GravityOpcodeJumpIf,
(GravityValue[]){condition, thenValue, elseValue}, (GravityValue[]){condition, thenValue, elseValue},
3, 3,
NULL NULL
@@ -116,4 +116,19 @@ void gravityBuildJump(GravityBuilder builder, GravityBlock block, GravityValue*
1, 1,
NULL 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;
} }

View File

@@ -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 gravityBuildBr(GravityBuilder builder, GravityValue condition, GravityBlock thenBranch, GravityValue* thenParams, GravityBlock elseBranch, GravityValue* elseParams);
void gravityBuildJump(GravityBuilder builder, GravityBlock block, GravityValue* params); void gravityBuildJump(GravityBuilder builder, GravityBlock block, GravityValue* params);
GravityValue gravityBuildIntConstant(GravityBuilder builder, GravityType intType, int64_t value, const char* name);
#endif #endif

View File

@@ -6,8 +6,9 @@ char* gravityOpcodeToCStr(GravityOpcode opcode) {
case GravityOpcodeStore: return "store"; case GravityOpcodeStore: return "store";
case GravityOpcodeLoad: return "load"; case GravityOpcodeLoad: return "load";
case GravityOpcodeRet: return "ret"; case GravityOpcodeRet: return "ret";
case GravityOpcodeBranch: return "br"; case GravityOpcodeJumpIf: return "jumpif";
case GravityOpcodeJump: return "jmp"; case GravityOpcodeJump: return "jump";
case GravityOpcodeIntConst: return "iconst";
default: return "fixme"; default: return "fixme";
} }
} }

View File

@@ -11,8 +11,9 @@ typedef enum {
GravityOpcodeStore, GravityOpcodeStore,
GravityOpcodeLoad, GravityOpcodeLoad,
GravityOpcodeRet, GravityOpcodeRet,
GravityOpcodeBranch, GravityOpcodeJumpIf,
GravityOpcodeJump GravityOpcodeJump,
GravityOpcodeIntConst
} GravityOpcode; } GravityOpcode;
struct GravityInstruction { struct GravityInstruction {

19
test.c
View File

@@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
int main(void) { int main(void) {
// define program
GravityModule module = gravityCreateModule(); GravityModule module = gravityCreateModule();
GravityBuilder builder = gravityCreateBuilder(); GravityBuilder builder = gravityCreateBuilder();
@@ -20,27 +21,33 @@ int main(void) {
gravityAppendBlockArgument(elseBlock, ptrType); gravityAppendBlockArgument(elseBlock, ptrType);
GravityBlock mergeBlock = gravityStartBlock("merge", mainFunc); GravityBlock mergeBlock = gravityStartBlock("merge", mainFunc);
gravityAppendBlockArgument(mergeBlock, ptrType);
// write entry // write entry
gravityBuilderSwitchToBlock(builder, entryBlock); gravityBuilderSwitchToBlock(builder, entryBlock);
GravityValue x = gravityBuildAlloc(builder, charType, "x"); 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 // then block
gravityBuilderSwitchToBlock(builder, thenBlock); gravityBuilderSwitchToBlock(builder, thenBlock);
GravityValue thenValue = gravityGetBlockArg(thenBlock, 0); GravityValue thenValue = gravityGetBlockArg(thenBlock, 0);
gravityBuildStore(builder, thenValue, gravityNewIntConstant(charType, 5)); GravityValue fiveConst = gravityBuildIntConstant(builder, charType, 5, "five");
gravityBuildJump(builder, mergeBlock, NULL); gravityBuildStore(builder, thenValue, fiveConst);
gravityBuildJump(builder, mergeBlock, (GravityValue[]){thenValue});
// else block // else block
gravityBuilderSwitchToBlock(builder, elseBlock); gravityBuilderSwitchToBlock(builder, elseBlock);
GravityValue elseValue = gravityGetBlockArg(elseBlock, 0); GravityValue elseValue = gravityGetBlockArg(elseBlock, 0);
gravityBuildStore(builder, elseValue, gravityNewIntConstant(charType, 10)); GravityValue tenConst = gravityBuildIntConstant(builder, charType, 10, "ten");
gravityBuildJump(builder, mergeBlock, NULL); gravityBuildStore(builder, elseValue, tenConst);
gravityBuildJump(builder, mergeBlock, (GravityValue[]){elseValue});
// merge block
gravityBuilderSwitchToBlock(builder, mergeBlock); gravityBuilderSwitchToBlock(builder, mergeBlock);
GravityValue xValue = gravityBuildLoad(builder, x, "xValue"); GravityValue xVar = gravityGetBlockArg(mergeBlock, 0);
GravityValue xValue = gravityBuildLoad(builder, xVar, "xValue");
gravityBuildRet(builder, xValue); gravityBuildRet(builder, xValue);
printf("%s\n", gravityFunctionToCStr(mainFunc)); printf("%s\n", gravityFunctionToCStr(mainFunc));