From c4a376d1c7263993f13e9cf276ebd9e530fd419c Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sat, 6 Jan 2018 20:39:26 +0100 Subject: Fix INS_NOT --- compiler.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'compiler.c') 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; } -- cgit v1.2.3-54-g00ecf