aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2019-10-02 01:06:47 +0200
committerdec05eba <dec05eba@protonmail.com>2020-07-25 14:36:46 +0200
commitfa03e7d230f2625c384ca9a7c314b6d05ab44e70 (patch)
tree3304f6b7b6bd2953e4b4da75bf0387650a9eaa90
parentb124548bcee1ab6d034d4499fe695073566ae37d (diff)
Switch signed<->unsigned asm instructions for logical op
-rw-r--r--executor/x86_64/executor.c16
-rw-r--r--tests/binop.amal14
-rw-r--r--tests/main.c1
3 files changed, 23 insertions, 8 deletions
diff --git a/executor/x86_64/executor.c b/executor/x86_64/executor.c
index 7591dcf..65f8baa 100644
--- a/executor/x86_64/executor.c
+++ b/executor/x86_64/executor.c
@@ -505,7 +505,7 @@ int amal_exec_ilt(amal_executor *self, AmalReg dst_reg, AmalReg src_reg1, AmalRe
asm_xor_rm64(&impl->asm, rcx_op.value.reg, rcx_op.value.reg);
asm_mov(&impl->asm, &rax_op, &src_op1);
asm_cmp(&impl->asm, &rax_op, &src_op2);
- asm_setb_r(&impl->asm, rcx_op.value.reg);
+ asm_setl_r(&impl->asm, rcx_op.value.reg);
asm_mov(&impl->asm, &dst_op, &rcx_op);
return 0;
}
@@ -522,7 +522,7 @@ int amal_exec_ile(amal_executor *self, AmalReg dst_reg, AmalReg src_reg1, AmalRe
asm_xor_rm64(&impl->asm, rcx_op.value.reg, rcx_op.value.reg);
asm_mov(&impl->asm, &rax_op, &src_op1);
asm_cmp(&impl->asm, &rax_op, &src_op2);
- asm_setbe_r(&impl->asm, rcx_op.value.reg);
+ asm_setle_r(&impl->asm, rcx_op.value.reg);
asm_mov(&impl->asm, &dst_op, &rcx_op);
return 0;
}
@@ -539,7 +539,7 @@ int amal_exec_igt(amal_executor *self, AmalReg dst_reg, AmalReg src_reg1, AmalRe
asm_xor_rm64(&impl->asm, rcx_op.value.reg, rcx_op.value.reg);
asm_mov(&impl->asm, &rax_op, &src_op1);
asm_cmp(&impl->asm, &rax_op, &src_op2);
- asm_seta_r(&impl->asm, rcx_op.value.reg);
+ asm_setg_r(&impl->asm, rcx_op.value.reg);
asm_mov(&impl->asm, &dst_op, &rcx_op);
return 0;
}
@@ -556,7 +556,7 @@ int amal_exec_ige(amal_executor *self, AmalReg dst_reg, AmalReg src_reg1, AmalRe
asm_xor_rm64(&impl->asm, rcx_op.value.reg, rcx_op.value.reg);
asm_mov(&impl->asm, &rax_op, &src_op1);
asm_cmp(&impl->asm, &rax_op, &src_op2);
- asm_setae_r(&impl->asm, rcx_op.value.reg);
+ asm_setge_r(&impl->asm, rcx_op.value.reg);
asm_mov(&impl->asm, &dst_op, &rcx_op);
return 0;
}
@@ -573,7 +573,7 @@ int amal_exec_lt(amal_executor *self, AmalReg dst_reg, AmalReg src_reg1, AmalReg
asm_xor_rm64(&impl->asm, rcx_op.value.reg, rcx_op.value.reg);
asm_mov(&impl->asm, &rax_op, &src_op1);
asm_cmp(&impl->asm, &rax_op, &src_op2);
- asm_setl_r(&impl->asm, rcx_op.value.reg);
+ asm_setb_r(&impl->asm, rcx_op.value.reg);
asm_mov(&impl->asm, &dst_op, &rcx_op);
return 0;
}
@@ -590,7 +590,7 @@ int amal_exec_le(amal_executor *self, AmalReg dst_reg, AmalReg src_reg1, AmalReg
asm_xor_rm64(&impl->asm, rcx_op.value.reg, rcx_op.value.reg);
asm_mov(&impl->asm, &rax_op, &src_op1);
asm_cmp(&impl->asm, &rax_op, &src_op2);
- asm_setle_r(&impl->asm, rcx_op.value.reg);
+ asm_setbe_r(&impl->asm, rcx_op.value.reg);
asm_mov(&impl->asm, &dst_op, &rcx_op);
return 0;
}
@@ -607,7 +607,7 @@ int amal_exec_gt(amal_executor *self, AmalReg dst_reg, AmalReg src_reg1, AmalReg
asm_xor_rm64(&impl->asm, rcx_op.value.reg, rcx_op.value.reg);
asm_mov(&impl->asm, &rax_op, &src_op1);
asm_cmp(&impl->asm, &rax_op, &src_op2);
- asm_setg_r(&impl->asm, rcx_op.value.reg);
+ asm_seta_r(&impl->asm, rcx_op.value.reg);
asm_mov(&impl->asm, &dst_op, &rcx_op);
return 0;
}
@@ -624,7 +624,7 @@ int amal_exec_ge(amal_executor *self, AmalReg dst_reg, AmalReg src_reg1, AmalReg
asm_xor_rm64(&impl->asm, rcx_op.value.reg, rcx_op.value.reg);
asm_mov(&impl->asm, &rax_op, &src_op1);
asm_cmp(&impl->asm, &rax_op, &src_op2);
- asm_setge_r(&impl->asm, rcx_op.value.reg);
+ asm_setae_r(&impl->asm, rcx_op.value.reg);
asm_mov(&impl->asm, &dst_op, &rcx_op);
return 0;
}
diff --git a/tests/binop.amal b/tests/binop.amal
new file mode 100644
index 0000000..1ec826d
--- /dev/null
+++ b/tests/binop.amal
@@ -0,0 +1,14 @@
+extern const printf: fn(fmt: ?&c_char, ...) c_int;
+
+const main = fn {
+ var value = 23 + 50;
+ if value < 23
+ printf("less!\n");
+ else
+ printf("more!\n");
+
+ while value >= 0 {
+ printf("value: %ld\n", value);
+ value = value - 1;
+ }
+} \ No newline at end of file
diff --git a/tests/main.c b/tests/main.c
index 0b3a744..f555e16 100644
--- a/tests/main.c
+++ b/tests/main.c
@@ -321,6 +321,7 @@ static void run_all_tests(void) {
test_load("tests/main.amal");
test_load("tests/utf8bom.amal");
test_load("tests/bytecode.amal");
+ test_load("tests/binop.amal");
test_load_error("tests/errors/duplicate_declaration.amal",
"2:7: error: Variable with the name main was declared twice in the same scope\n"