mirror of https://github.com/xemu-project/xemu.git
target/arm: Convert disas_simd_3same_logic to decodetree
This includes AND, ORR, EOR, BIC, ORN, BSF, BIT, BIF. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20240524232121.284515-37-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
641d823142
commit
f240df3c31
|
@ -55,6 +55,7 @@
|
||||||
@rrr_q1e3 ........ ... rm:5 ...... rn:5 rd:5 &qrrr_e q=1 esz=3
|
@rrr_q1e3 ........ ... rm:5 ...... rn:5 rd:5 &qrrr_e q=1 esz=3
|
||||||
@rrrr_q1e3 ........ ... rm:5 . ra:5 rn:5 rd:5 &qrrrr_e q=1 esz=3
|
@rrrr_q1e3 ........ ... rm:5 . ra:5 rn:5 rd:5 &qrrrr_e q=1 esz=3
|
||||||
|
|
||||||
|
@qrrr_b . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=0
|
||||||
@qrrr_h . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=1
|
@qrrr_h . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=1
|
||||||
@qrrr_sd . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=%esz_sd
|
@qrrr_sd . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=%esz_sd
|
||||||
@qrrr_e . q:1 ...... esz:2 . rm:5 ...... rn:5 rd:5 &qrrr_e
|
@qrrr_e . q:1 ...... esz:2 . rm:5 ...... rn:5 rd:5 &qrrr_e
|
||||||
|
@ -847,6 +848,15 @@ SMINP_v 0.00 1110 ..1 ..... 10101 1 ..... ..... @qrrr_e
|
||||||
UMAXP_v 0.10 1110 ..1 ..... 10100 1 ..... ..... @qrrr_e
|
UMAXP_v 0.10 1110 ..1 ..... 10100 1 ..... ..... @qrrr_e
|
||||||
UMINP_v 0.10 1110 ..1 ..... 10101 1 ..... ..... @qrrr_e
|
UMINP_v 0.10 1110 ..1 ..... 10101 1 ..... ..... @qrrr_e
|
||||||
|
|
||||||
|
AND_v 0.00 1110 001 ..... 00011 1 ..... ..... @qrrr_b
|
||||||
|
BIC_v 0.00 1110 011 ..... 00011 1 ..... ..... @qrrr_b
|
||||||
|
ORR_v 0.00 1110 101 ..... 00011 1 ..... ..... @qrrr_b
|
||||||
|
ORN_v 0.00 1110 111 ..... 00011 1 ..... ..... @qrrr_b
|
||||||
|
EOR_v 0.10 1110 001 ..... 00011 1 ..... ..... @qrrr_b
|
||||||
|
BSL_v 0.10 1110 011 ..... 00011 1 ..... ..... @qrrr_b
|
||||||
|
BIT_v 0.10 1110 101 ..... 00011 1 ..... ..... @qrrr_b
|
||||||
|
BIF_v 0.10 1110 111 ..... 00011 1 ..... ..... @qrrr_b
|
||||||
|
|
||||||
### Advanced SIMD scalar x indexed element
|
### Advanced SIMD scalar x indexed element
|
||||||
|
|
||||||
FMUL_si 0101 1111 00 .. .... 1001 . 0 ..... ..... @rrx_h
|
FMUL_si 0101 1111 00 .. .... 1001 . 0 ..... ..... @rrx_h
|
||||||
|
|
|
@ -5280,6 +5280,24 @@ TRANS(SMINP_v, do_gvec_fn3_no64, a, gen_gvec_sminp)
|
||||||
TRANS(UMAXP_v, do_gvec_fn3_no64, a, gen_gvec_umaxp)
|
TRANS(UMAXP_v, do_gvec_fn3_no64, a, gen_gvec_umaxp)
|
||||||
TRANS(UMINP_v, do_gvec_fn3_no64, a, gen_gvec_uminp)
|
TRANS(UMINP_v, do_gvec_fn3_no64, a, gen_gvec_uminp)
|
||||||
|
|
||||||
|
TRANS(AND_v, do_gvec_fn3, a, tcg_gen_gvec_and)
|
||||||
|
TRANS(BIC_v, do_gvec_fn3, a, tcg_gen_gvec_andc)
|
||||||
|
TRANS(ORR_v, do_gvec_fn3, a, tcg_gen_gvec_or)
|
||||||
|
TRANS(ORN_v, do_gvec_fn3, a, tcg_gen_gvec_orc)
|
||||||
|
TRANS(EOR_v, do_gvec_fn3, a, tcg_gen_gvec_xor)
|
||||||
|
|
||||||
|
static bool do_bitsel(DisasContext *s, bool is_q, int d, int a, int b, int c)
|
||||||
|
{
|
||||||
|
if (fp_access_check(s)) {
|
||||||
|
gen_gvec_fn4(s, is_q, d, a, b, c, tcg_gen_gvec_bitsel, 0);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRANS(BSL_v, do_bitsel, a->q, a->rd, a->rd, a->rn, a->rm)
|
||||||
|
TRANS(BIT_v, do_bitsel, a->q, a->rd, a->rm, a->rn, a->rd)
|
||||||
|
TRANS(BIF_v, do_bitsel, a->q, a->rd, a->rm, a->rd, a->rn)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Advanced SIMD scalar/vector x indexed element
|
* Advanced SIMD scalar/vector x indexed element
|
||||||
*/
|
*/
|
||||||
|
@ -10901,52 +10919,6 @@ static void disas_simd_three_reg_diff(DisasContext *s, uint32_t insn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Logic op (opcode == 3) subgroup of C3.6.16. */
|
|
||||||
static void disas_simd_3same_logic(DisasContext *s, uint32_t insn)
|
|
||||||
{
|
|
||||||
int rd = extract32(insn, 0, 5);
|
|
||||||
int rn = extract32(insn, 5, 5);
|
|
||||||
int rm = extract32(insn, 16, 5);
|
|
||||||
int size = extract32(insn, 22, 2);
|
|
||||||
bool is_u = extract32(insn, 29, 1);
|
|
||||||
bool is_q = extract32(insn, 30, 1);
|
|
||||||
|
|
||||||
if (!fp_access_check(s)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (size + 4 * is_u) {
|
|
||||||
case 0: /* AND */
|
|
||||||
gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_and, 0);
|
|
||||||
return;
|
|
||||||
case 1: /* BIC */
|
|
||||||
gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_andc, 0);
|
|
||||||
return;
|
|
||||||
case 2: /* ORR */
|
|
||||||
gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_or, 0);
|
|
||||||
return;
|
|
||||||
case 3: /* ORN */
|
|
||||||
gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_orc, 0);
|
|
||||||
return;
|
|
||||||
case 4: /* EOR */
|
|
||||||
gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_xor, 0);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case 5: /* BSL bitwise select */
|
|
||||||
gen_gvec_fn4(s, is_q, rd, rd, rn, rm, tcg_gen_gvec_bitsel, 0);
|
|
||||||
return;
|
|
||||||
case 6: /* BIT, bitwise insert if true */
|
|
||||||
gen_gvec_fn4(s, is_q, rd, rm, rn, rd, tcg_gen_gvec_bitsel, 0);
|
|
||||||
return;
|
|
||||||
case 7: /* BIF, bitwise insert if false */
|
|
||||||
gen_gvec_fn4(s, is_q, rd, rm, rd, rn, tcg_gen_gvec_bitsel, 0);
|
|
||||||
return;
|
|
||||||
|
|
||||||
default:
|
|
||||||
g_assert_not_reached();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Integer op subgroup of C3.6.16. */
|
/* Integer op subgroup of C3.6.16. */
|
||||||
static void disas_simd_3same_int(DisasContext *s, uint32_t insn)
|
static void disas_simd_3same_int(DisasContext *s, uint32_t insn)
|
||||||
{
|
{
|
||||||
|
@ -11212,12 +11184,10 @@ static void disas_simd_three_reg_same(DisasContext *s, uint32_t insn)
|
||||||
int opcode = extract32(insn, 11, 5);
|
int opcode = extract32(insn, 11, 5);
|
||||||
|
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case 0x3: /* logic ops */
|
|
||||||
disas_simd_3same_logic(s, insn);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
disas_simd_3same_int(s, insn);
|
disas_simd_3same_int(s, insn);
|
||||||
break;
|
break;
|
||||||
|
case 0x3: /* logic ops */
|
||||||
case 0x14: /* SMAXP, UMAXP */
|
case 0x14: /* SMAXP, UMAXP */
|
||||||
case 0x15: /* SMINP, UMINP */
|
case 0x15: /* SMINP, UMINP */
|
||||||
case 0x17: /* ADDP */
|
case 0x17: /* ADDP */
|
||||||
|
|
Loading…
Reference in New Issue