mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-26 22:01:07 +00:00
target/arm: Convert T16 add, compare, move (two high registers)
Backports commit 90aa042115a0fe39fe4cb3bcae4c4f728e2f3fdb from qemu
This commit is contained in:
parent
7ca1b3f817
commit
927fb85b51
|
@ -146,6 +146,16 @@ CMP_xri 00101 ... ........ @arith_1i s=1
|
||||||
ADD_rri 00110 ... ........ @arith_1i %s
|
ADD_rri 00110 ... ........ @arith_1i %s
|
||||||
SUB_rri 00111 ... ........ @arith_1i %s
|
SUB_rri 00111 ... ........ @arith_1i %s
|
||||||
|
|
||||||
|
# Add, compare, move (two high registers)
|
||||||
|
|
||||||
|
%reg_0_7 7:1 0:3
|
||||||
|
@addsub_2h .... .... . rm:4 ... \
|
||||||
|
&s_rrr_shi rd=%reg_0_7 rn=%reg_0_7 shim=0 shty=0
|
||||||
|
|
||||||
|
ADD_rrri 0100 0100 . .... ... @addsub_2h s=0
|
||||||
|
CMP_xrri 0100 0101 . .... ... @addsub_2h s=1
|
||||||
|
MOV_rxri 0100 0110 . .... ... @addsub_2h s=0
|
||||||
|
|
||||||
# Branch and exchange
|
# Branch and exchange
|
||||||
|
|
||||||
@branchr .... .... . rm:4 ... &r
|
@branchr .... .... . rm:4 ... &r
|
||||||
|
|
|
@ -11097,55 +11097,11 @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn)
|
||||||
store_reg(s, rd, tmp);
|
store_reg(s, rd, tmp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (insn & (1 << 10)) {
|
|
||||||
/* 0b0100_01xx_xxxx_xxxx
|
|
||||||
* - data processing extended, branch and exchange
|
|
||||||
*/
|
|
||||||
rd = (insn & 7) | ((insn >> 4) & 8);
|
|
||||||
rm = (insn >> 3) & 0xf;
|
|
||||||
op = (insn >> 8) & 3;
|
|
||||||
switch (op) {
|
|
||||||
case 0: /* add */
|
|
||||||
tmp = load_reg(s, rd);
|
|
||||||
tmp2 = load_reg(s, rm);
|
|
||||||
tcg_gen_add_i32(tcg_ctx, tmp, tmp, tmp2);
|
|
||||||
tcg_temp_free_i32(tcg_ctx, tmp2);
|
|
||||||
if (rd == 13) {
|
|
||||||
/* ADD SP, SP, reg */
|
|
||||||
store_sp_checked(s, tmp);
|
|
||||||
} else {
|
|
||||||
store_reg(s, rd, tmp);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 1: /* cmp */
|
|
||||||
tmp = load_reg(s, rd);
|
|
||||||
tmp2 = load_reg(s, rm);
|
|
||||||
gen_sub_CC(s, tmp, tmp, tmp2);
|
|
||||||
tcg_temp_free_i32(tcg_ctx, tmp2);
|
|
||||||
tcg_temp_free_i32(tcg_ctx, tmp);
|
|
||||||
break;
|
|
||||||
case 2: /* mov/cpy */
|
|
||||||
tmp = load_reg(s, rm);
|
|
||||||
if (rd == 13) {
|
|
||||||
/* MOV SP, reg */
|
|
||||||
store_sp_checked(s, tmp);
|
|
||||||
} else {
|
|
||||||
store_reg(s, rd, tmp);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
/* 0b0100_0111_xxxx_xxxx
|
|
||||||
* - branch [and link] exchange thumb register
|
|
||||||
* In decodetree
|
|
||||||
*/
|
|
||||||
goto illegal_op;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 0b0100_00xx_xxxx_xxxx
|
* 0b0100_00xx_xxxx_xxxx
|
||||||
* - Data-processing (two low registers), in decodetree
|
* - Data-processing (two low registers), in decodetree
|
||||||
|
* - data processing extended, branch and exchange, in decodetree
|
||||||
*/
|
*/
|
||||||
goto illegal_op;
|
goto illegal_op;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue