target/arm: Convert T16, shift immediate

Backports commit 151c2f2841b01bf6fef079c9f1db15a86cae8276 from qemu
This commit is contained in:
Richard Henderson 2019-11-20 12:41:58 -05:00 committed by Lioncash
parent ee96ab9ea9
commit fad910c50b
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7
2 changed files with 10 additions and 24 deletions

View file

@ -126,6 +126,14 @@ ADD_rri 10101 rd:3 ........ \
STM 11000 ... ........ @ldstm
LDM_t16 11001 ... ........ @ldstm
# Shift (immediate)
@shift_i ..... shim:5 rm:3 rd:3 &s_rrr_shi %s rn=%reg_0
MOV_rxri 000 00 ..... ... ... @shift_i shty=0 # LSL
MOV_rxri 000 01 ..... ... ... @shift_i shty=1 # LSR
MOV_rxri 000 10 ..... ... ... @shift_i shty=2 # ASR
# Add/subtract (three low registers)
@addsub_3 ....... rm:3 rn:3 rd:3 \

View file

@ -11108,7 +11108,7 @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
static void disas_thumb_insn(DisasContext *s, uint32_t insn)
{
TCGContext *tcg_ctx = s->uc->tcg_ctx;
uint32_t val, op, rm, rd, shift;
uint32_t val, rd;
int32_t offset;
TCGv_i32 tmp;
TCGv_i32 tmp2;
@ -11120,29 +11120,7 @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn)
/* fall back to legacy decoder */
switch (insn >> 12) {
case 0: case 1:
rd = insn & 7;
op = (insn >> 11) & 3;
if (op == 3) {
/*
* 0b0001_1xxx_xxxx_xxxx
* - Add, subtract (three low registers)
* - Add, subtract (two low registers and immediate)
* In decodetree.
*/
goto illegal_op;
} else {
/* shift immediate */
rm = (insn >> 3) & 7;
shift = (insn >> 6) & 0x1f;
tmp = load_reg(s, rm);
gen_arm_shift_im(s, tmp, op, shift, s->condexec_mask == 0);
if (!s->condexec_mask)
gen_logic_CC(s, tmp);
store_reg(s, rd, tmp);
}
break;
case 0: case 1: /* add/sub (3reg, 2reg imm), shift imm; in decodetree */
case 2: case 3: /* add, sub, cmp, mov (reg, imm), in decodetree */
goto illegal_op;
case 4: