From c0bc3bd736a3442d6fecaf54bd09139f3801551f Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sun, 14 Dec 2014 03:24:17 +0200 Subject: [PATCH] asmarm: Fix bug with encoding small negative ints using MVN instruction. --- py/asmarm.c | 5 +++-- tests/micropython/viper_binop_comp_imm.py | 9 +++++++++ tests/micropython/viper_binop_comp_imm.py.exp | 4 ++++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 tests/micropython/viper_binop_comp_imm.py create mode 100644 tests/micropython/viper_binop_comp_imm.py.exp diff --git a/py/asmarm.c b/py/asmarm.c index 60286d55c8..51852df5f4 100644 --- a/py/asmarm.c +++ b/py/asmarm.c @@ -282,8 +282,9 @@ void asm_arm_mov_reg_i32(asm_arm_t *as, uint rd, int imm) { // TODO: There are more variants of immediate values if ((imm & 0xFF) == imm) { emit_al(as, asm_arm_op_mov_imm(rd, imm)); - } else if (imm < 0 && ((-imm) & 0xFF) == -imm) { - emit_al(as, asm_arm_op_mvn_imm(rd, -imm)); + } else if (imm < 0 && imm >= -256) { + // mvn is "move not", not "move negative" + emit_al(as, asm_arm_op_mvn_imm(rd, ~imm)); } else { //Insert immediate into code and jump over it emit_al(as, 0x59f0000 | (rd << 12)); // ldr rd, [pc] diff --git a/tests/micropython/viper_binop_comp_imm.py b/tests/micropython/viper_binop_comp_imm.py new file mode 100644 index 0000000000..c7c0408959 --- /dev/null +++ b/tests/micropython/viper_binop_comp_imm.py @@ -0,0 +1,9 @@ +# comparisons with immediate boundary values +@micropython.viper +def f(a: int): + print(a == -1, a == -255, a == -256, a == -257) + +f(-1) +f(-255) +f(-256) +f(-257) diff --git a/tests/micropython/viper_binop_comp_imm.py.exp b/tests/micropython/viper_binop_comp_imm.py.exp new file mode 100644 index 0000000000..3da9d09fbc --- /dev/null +++ b/tests/micropython/viper_binop_comp_imm.py.exp @@ -0,0 +1,4 @@ +True False False False +False True False False +False False True False +False False False True