aboutsummaryrefslogtreecommitdiff
path: root/compiler.c
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2018-01-06 20:39:26 +0100
committertomsmeding <tom.smeding@gmail.com>2018-01-06 20:39:26 +0100
commitc4a376d1c7263993f13e9cf276ebd9e530fd419c (patch)
treef36010f188778b1b7c30268fb8cdb723080e056f /compiler.c
parent3272b5d83d2e2167eed24748557df88bd66584ee (diff)
Fix INS_NOT
Diffstat (limited to 'compiler.c')
-rw-r--r--compiler.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/compiler.c b/compiler.c
index ea9f768..c6adf6a 100644
--- a/compiler.c
+++ b/compiler.c
@@ -148,7 +148,12 @@ static struct ref compile_expr(struct ir *ir, struct symtab *symtab, struct node
case OP_NOT: {
struct ref r0 = ref_next_register();
struct ref r1 = compile_expr(ir, symtab, node->child1);
- ir_append(ir, irins_make_01(INS_NOT, r0, r1));
+ const char *afterlbl = gen_label_name();
+ ir_append(ir, irins_make_12(INS_TEST, r1, r1));
+ ir_append(ir, irins_make_01(INS_MOV, r0, ref_imm(0)));
+ ir_append(ir, irins_make_jcc(afterlbl, CCNZ));
+ ir_append(ir, irins_make_01(INS_MOV, r0, ref_imm(1)));
+ ir_append(ir, irins_make_name(INS_LBL, afterlbl));
return r0;
}