diff options
author | tomsmeding <tom.smeding@gmail.com> | 2018-01-06 20:39:26 +0100 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2018-01-06 20:39:26 +0100 |
commit | c4a376d1c7263993f13e9cf276ebd9e530fd419c (patch) | |
tree | f36010f188778b1b7c30268fb8cdb723080e056f /compiler.c | |
parent | 3272b5d83d2e2167eed24748557df88bd66584ee (diff) |
Fix INS_NOT
Diffstat (limited to 'compiler.c')
-rw-r--r-- | compiler.c | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -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; } |