From a3ca9791335b65b70eecf41122cf1e5d8eb5abe0 Mon Sep 17 00:00:00 2001 From: Maxwell Jeffress Date: Wed, 21 Jan 2026 16:02:13 +1100 Subject: [PATCH] Add not to compiler --- README.md | 1 + src/compiler.c | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/README.md b/README.md index 9240c35..acfb242 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ Supported instructions so far: * inequal * greater * lesser +* not * jump * if * @ (label creation) diff --git a/src/compiler.c b/src/compiler.c index 716aed9..b2c2dcb 100644 --- a/src/compiler.c +++ b/src/compiler.c @@ -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);