summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--py/compile.c5
-rw-r--r--tests/inlineasm/asmdata.py16
-rw-r--r--tests/inlineasm/asmdata.py.exp5
3 files changed, 24 insertions, 2 deletions
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