From c0fa903d6b2ed5131ae60f8faff2c6ad5276b3a2 Mon Sep 17 00:00:00 2001 From: Damien George Date: Tue, 26 Jul 2022 12:24:50 +1000 Subject: [PATCH] py/compile: Support large integers in inline-asm data directive. Fixes issue #8956. Signed-off-by: Damien George --- py/compile.c | 5 +++-- tests/inlineasm/asmdata.py | 16 ++++++++++++++++ tests/inlineasm/asmdata.py.exp | 5 +++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 tests/inlineasm/asmdata.py create mode 100644 tests/inlineasm/asmdata.py.exp diff --git a/py/compile.c b/py/compile.c index ff3e5ffc6d..8aaf885327 100644 --- a/py/compile.c +++ b/py/compile.c @@ -3286,12 +3286,13 @@ STATIC void compile_scope_inline_asm(compiler_t *comp, scope_t *scope, pass_kind if (pass > MP_PASS_SCOPE) { mp_int_t bytesize = MP_PARSE_NODE_LEAF_SMALL_INT(pn_arg[0]); for (uint j = 1; j < n_args; j++) { - if (!MP_PARSE_NODE_IS_SMALL_INT(pn_arg[j])) { + mp_obj_t int_obj; + if (!mp_parse_node_get_int_maybe(pn_arg[j], &int_obj)) { compile_syntax_error(comp, nodes[i], MP_ERROR_TEXT("'data' requires integer arguments")); return; } mp_asm_base_data((mp_asm_base_t *)comp->emit_inline_asm, - bytesize, MP_PARSE_NODE_LEAF_SMALL_INT(pn_arg[j])); + bytesize, mp_obj_int_get_truncated(int_obj)); } } } else { diff --git a/tests/inlineasm/asmdata.py b/tests/inlineasm/asmdata.py new file mode 100644 index 0000000000..bbd20c9186 --- /dev/null +++ b/tests/inlineasm/asmdata.py @@ -0,0 +1,16 @@ +# test the "data" directive + + +@micropython.asm_thumb +def ret_num(r0) -> uint: + lsl(r0, r0, 2) + mov(r1, pc) + add(r0, r0, r1) + ldr(r0, [r0, 4]) + b(HERE) + data(4, 0x12345678, 0x20000000, 0x40000000, 0x7FFFFFFF + 1, (1 << 32) - 2) + label(HERE) + + +for i in range(5): + print(hex(ret_num(i))) diff --git a/tests/inlineasm/asmdata.py.exp b/tests/inlineasm/asmdata.py.exp new file mode 100644 index 0000000000..502c04f993 --- /dev/null +++ b/tests/inlineasm/asmdata.py.exp @@ -0,0 +1,5 @@ +0x12345678 +0x20000000 +0x40000000 +0x80000000 +0xfffffffe