forked from ground/cground
Add not to compiler
This commit is contained in:
@@ -114,6 +114,7 @@ Supported instructions so far:
|
||||
* inequal
|
||||
* greater
|
||||
* lesser
|
||||
* not
|
||||
* jump
|
||||
* if
|
||||
* @ (label creation)
|
||||
|
||||
@@ -221,6 +221,33 @@ char* compileGroundProgram(GroundProgram* program) {
|
||||
|
||||
break;
|
||||
}
|
||||
case NOT: {
|
||||
if (gi.args.length < 2) {
|
||||
runtimeError(TOO_FEW_ARGS, "Expecting 2 args", &gi, i);
|
||||
}
|
||||
if (gi.args.length > 2) {
|
||||
runtimeError(TOO_MANY_ARGS, "Expecting 2 args", &gi, i);
|
||||
}
|
||||
if (gi.args.args[0].type != VALUE && gi.args.args[0].type != VALREF) {
|
||||
runtimeError(ARG_TYPE_MISMATCH, "Expecting an Int (for now) for arg 1", &gi, i);
|
||||
}
|
||||
if (gi.args.args[1].type != DIRREF) {
|
||||
runtimeError(ARG_TYPE_MISMATCH, "Expecting a DirectRef", &gi, i);
|
||||
}
|
||||
|
||||
char* varName = gi.args.args[1].value.refName;
|
||||
|
||||
APPEND_ESTR(start, " ; not\n");
|
||||
APPEND_ESTR(start, " mov rax, ");
|
||||
APPEND_ESTR(start, processValueString(gi.args.args[0]));
|
||||
APPEND_ESTR(start, "\n");
|
||||
APPEND_ESTR(start, " xor rax, 1\n");
|
||||
APPEND_ESTR(start, " mov [");
|
||||
APPEND_ESTR(start, varName);
|
||||
APPEND_ESTR(start, "], rax\n");
|
||||
|
||||
break;
|
||||
}
|
||||
case ADD: {
|
||||
if (gi.args.length < 3) {
|
||||
runtimeError(TOO_FEW_ARGS, "Expecting 2 args for add instruction", &gi, i);
|
||||
|
||||
Reference in New Issue
Block a user