aboutsummaryrefslogtreecommitdiff
path: root/py/emitinlinethumb.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2016-01-07 14:54:13 +0000
committerDamien George <damien.p.george@gmail.com>2016-01-07 16:34:11 +0000
commitea8be373a975356808a19a79f1dd20383bec82ba (patch)
treee514c9d912b842c52568bcc26d1f9f2f64c11d06 /py/emitinlinethumb.c
parent47dc5922cab047003acbdb404b9e151f343f9679 (diff)
py/inlinethumb: Remove 30-bit restriction on movwt instruction.
movwt can now move a full 32-bit constant into a register.
Diffstat (limited to 'py/emitinlinethumb.c')
-rw-r--r--py/emitinlinethumb.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/py/emitinlinethumb.c b/py/emitinlinethumb.c
index 854b1460d..317febe92 100644
--- a/py/emitinlinethumb.c
+++ b/py/emitinlinethumb.c
@@ -703,11 +703,10 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a
goto op_movw_movt;
} else if (ARMV7M && strcmp(op_str, "movwt") == 0) {
// this is a convenience instruction
- // we clear the MSB since it might be set from extracting the small int value
mp_uint_t reg_dest = get_arg_reg(emit, op_str, pn_args[0], 15);
- int i_src = get_arg_i(emit, op_str, pn_args[1], 0xffffffff);
+ uint32_t i_src = get_arg_i(emit, op_str, pn_args[1], 0xffffffff);
asm_thumb_mov_reg_i16(emit->as, ASM_THUMB_OP_MOVW, reg_dest, i_src & 0xffff);
- asm_thumb_mov_reg_i16(emit->as, ASM_THUMB_OP_MOVT, reg_dest, (i_src >> 16) & 0x7fff);
+ asm_thumb_mov_reg_i16(emit->as, ASM_THUMB_OP_MOVT, reg_dest, (i_src >> 16) & 0xffff);
} else if (ARMV7M && strcmp(op_str, "ldrex") == 0) {
mp_uint_t r_dest = get_arg_reg(emit, op_str, pn_args[0], 15);
mp_parse_node_t pn_base, pn_offset;