summaryrefslogtreecommitdiff
path: root/py/asmarm.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-12-14 03:24:17 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-12-14 03:24:17 +0200
commitc0bc3bd736a3442d6fecaf54bd09139f3801551f (patch)
treecd4a3a82e57a49aa362469f7197cb77fb954f888 /py/asmarm.c
parent83d27b0f0bad6a5138d0a0984a9de16e34b93c76 (diff)
asmarm: Fix bug with encoding small negative ints using MVN instruction.
Diffstat (limited to 'py/asmarm.c')
-rw-r--r--py/asmarm.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/py/asmarm.c b/py/asmarm.c
index 60286d55c..51852df5f 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]