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
|
||||
@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_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
|
||||
@ -847,6 +848,15 @@ SMINP_v 0.00 1110 ..1 ..... 10101 1 ..... ..... @qrrr_e
|
||||
UMAXP_v 0.10 1110 ..1 ..... 10100 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
|
||||
|
||||
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(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
|
||||
*/
|
||||
@ -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. */
|
||||
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);
|
||||
|
||||
switch (opcode) {
|
||||
case 0x3: /* logic ops */
|
||||
disas_simd_3same_logic(s, insn);
|
||||
break;
|
||||
default:
|
||||
disas_simd_3same_int(s, insn);
|
||||
break;
|
||||
case 0x3: /* logic ops */
|
||||
case 0x14: /* SMAXP, UMAXP */
|
||||
case 0x15: /* SMINP, UMINP */
|
||||
case 0x17: /* ADDP */
|
||||
|
Loading…
Reference in New Issue
Block a user