diff options
author | Damien George <damien.p.george@gmail.com> | 2015-02-13 11:06:23 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2015-02-13 11:06:23 +0000 |
commit | 192d536fe40010cc26d2d69d8bc6cdb30928e68d (patch) | |
tree | 931d35ab40395e863a8fa04709e009e7200019e4 /py/emitinlinethumb.c | |
parent | 32f0b7942cf44b7a722db30c554cfc70d3f70289 (diff) |
py: Implement clz and rbit for inline Thumb assembler.
Diffstat (limited to 'py/emitinlinethumb.c')
-rw-r--r-- | py/emitinlinethumb.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/py/emitinlinethumb.c b/py/emitinlinethumb.c index d28e015cd..199138682 100644 --- a/py/emitinlinethumb.c +++ b/py/emitinlinethumb.c @@ -363,7 +363,7 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a } else if (n_args == 2) { if (MP_PARSE_NODE_IS_ID(pn_args[1])) { // second arg is a register (or should be) - mp_uint_t op_code; + mp_uint_t op_code, op_code_hi; if (strcmp(op_str, "mov") == 0) { mp_uint_t reg_dest = get_arg_reg(emit, op_str, pn_args[0], 15); mp_uint_t reg_src = get_arg_reg(emit, op_str, pn_args[1], 15); @@ -391,6 +391,18 @@ STATIC void emit_inline_thumb_op(emit_inline_asm_t *emit, qstr op, mp_uint_t n_a } else if (strcmp(op_str, "mul") == 0) { op_code = ASM_THUMB_FORMAT_4_MUL; goto op_format_4; } else if (strcmp(op_str, "bic") == 0) { op_code = ASM_THUMB_FORMAT_4_BIC; goto op_format_4; } else if (strcmp(op_str, "mvn") == 0) { op_code = ASM_THUMB_FORMAT_4_MVN; goto op_format_4; + } else if (strcmp(op_str, "clz") == 0) { + op_code_hi = 0xfab0; + op_code = 0xf080; + mp_uint_t rd, rm; + op_clz_rbit: + rd = get_arg_reg(emit, op_str, pn_args[0], 15); + rm = get_arg_reg(emit, op_str, pn_args[1], 15); + asm_thumb_op32(emit->as, op_code_hi | rm, op_code | (rd << 8) | rm); + } else if (strcmp(op_str, "rbit") == 0) { + op_code_hi = 0xfa90; + op_code = 0xf0a0; + goto op_clz_rbit; } else { goto unknown_op; } |