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);
|
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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
@@ -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";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
19
test.c
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user