diff --git a/py/emitinlinethumb.c b/py/emitinlinethumb.c index 737c03c104..d28e015cdb 100644 --- a/py/emitinlinethumb.c +++ b/py/emitinlinethumb.c @@ -490,6 +490,17 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a src_b = get_arg_i(emit, op_str, pn_args[2], 0x7); } asm_thumb_format_2(emit->as, op_code, rlo_dest, rlo_src, src_b); + } else if (strcmp(op_str, "sdiv") == 0) { + op_code = 0xfb90; // sdiv high part + mp_uint_t rd, rn, rm; + op_sdiv_udiv: + rd = get_arg_reg(emit, op_str, pn_args[0], 15); + rn = get_arg_reg(emit, op_str, pn_args[1], 15); + rm = get_arg_reg(emit, op_str, pn_args[2], 15); + asm_thumb_op32(emit->as, op_code | rn, 0xf0f0 | (rd << 8) | rm); + } else if (strcmp(op_str, "udiv") == 0) { + op_code = 0xfbb0; // udiv high part + goto op_sdiv_udiv; } else if (strcmp(op_str, "sub") == 0) { op_code = ASM_THUMB_FORMAT_2_SUB; goto op_format_2; diff --git a/py/objfun.c b/py/objfun.c index 28706cc687..75a326c124 100644 --- a/py/objfun.c +++ b/py/objfun.c @@ -431,6 +431,8 @@ STATIC mp_uint_t convert_obj_for_inline_asm(mp_obj_t obj) { return 0; } else if (obj == mp_const_true) { return 1; + } else if (MP_OBJ_IS_TYPE(obj, &mp_type_int)) { + return mp_obj_int_get_truncated(obj); } else if (MP_OBJ_IS_STR(obj)) { // pointer to the string (it's probably constant though!) mp_uint_t l; diff --git a/tests/inlineasm/asmdiv.py b/tests/inlineasm/asmdiv.py new file mode 100644 index 0000000000..b97d566eb5 --- /dev/null +++ b/tests/inlineasm/asmdiv.py @@ -0,0 +1,16 @@ +@micropython.asm_thumb +def sdiv(r0, r1): + sdiv(r0, r0, r1) + +@micropython.asm_thumb +def udiv(r0, r1): + udiv(r0, r0, r1) + +print(sdiv(1234, 3)) +print(sdiv(-1234, 3)) +print(sdiv(1234, -3)) +print(sdiv(-1234, -3)) + +print(udiv(1234, 3)) +print(udiv(0xffffffff, 0x7fffffff)) +print(udiv(0xffffffff, 0xffffffff)) diff --git a/tests/inlineasm/asmdiv.py.exp b/tests/inlineasm/asmdiv.py.exp new file mode 100644 index 0000000000..f1b80deb32 --- /dev/null +++ b/tests/inlineasm/asmdiv.py.exp @@ -0,0 +1,7 @@ +411 +-411 +-411 +411 +411 +2 +1