mirror of
https://github.com/xemu-project/xemu.git
synced 2024-12-11 13:37:05 +00:00
target/arm: Split out formats for 3 vectors + 1 index
Used by FMLA and DOT, but will shortly be used more. Split FMLA from FMLS to avoid an extra sub field; similarly for SDOT from UDOT. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210525010358.152808-53-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
1c737d9c5f
commit
0a82d963b7
@ -73,6 +73,7 @@
|
||||
&rprr_s rd pg rn rm s
|
||||
&rprr_esz rd pg rn rm esz
|
||||
&rrrr_esz rd ra rn rm esz
|
||||
&rrxr_esz rd rn rm ra index esz
|
||||
&rprrr_esz rd pg rn rm ra esz
|
||||
&rpri_esz rd pg rn imm esz
|
||||
&ptrue rd esz pat s
|
||||
@ -252,6 +253,14 @@
|
||||
@rrx_2 ........ .. . index:2 rm:3 ...... rn:5 rd:5 &rrx_esz
|
||||
@rrx_1 ........ .. . index:1 rm:4 ...... rn:5 rd:5 &rrx_esz
|
||||
|
||||
# Three registers and a scalar by N-bit index
|
||||
@rrxr_3 ........ .. . .. rm:3 ...... rn:5 rd:5 \
|
||||
&rrxr_esz ra=%reg_movprfx index=%index3_22_19
|
||||
@rrxr_2 ........ .. . index:2 rm:3 ...... rn:5 rd:5 \
|
||||
&rrxr_esz ra=%reg_movprfx
|
||||
@rrxr_1 ........ .. . index:1 rm:4 ...... rn:5 rd:5 \
|
||||
&rrxr_esz ra=%reg_movprfx
|
||||
|
||||
###########################################################################
|
||||
# Instruction patterns. Grouped according to the SVE encodingindex.xhtml.
|
||||
|
||||
@ -767,10 +776,10 @@ DOT_zzzz 01000100 1 sz:1 0 rm:5 00000 u:1 rn:5 rd:5 \
|
||||
ra=%reg_movprfx
|
||||
|
||||
# SVE integer dot product (indexed)
|
||||
DOT_zzxw 01000100 101 index:2 rm:3 00000 u:1 rn:5 rd:5 \
|
||||
sz=0 ra=%reg_movprfx
|
||||
DOT_zzxw 01000100 111 index:1 rm:4 00000 u:1 rn:5 rd:5 \
|
||||
sz=1 ra=%reg_movprfx
|
||||
SDOT_zzxw_s 01000100 10 1 ..... 000000 ..... ..... @rrxr_2 esz=2
|
||||
SDOT_zzxw_d 01000100 11 1 ..... 000000 ..... ..... @rrxr_1 esz=3
|
||||
UDOT_zzxw_s 01000100 10 1 ..... 000001 ..... ..... @rrxr_2 esz=2
|
||||
UDOT_zzxw_d 01000100 11 1 ..... 000001 ..... ..... @rrxr_1 esz=3
|
||||
|
||||
# SVE floating-point complex add (predicated)
|
||||
FCADD 01100100 esz:2 00000 rot:1 100 pg:3 rm:5 rd:5 \
|
||||
@ -789,12 +798,12 @@ FCMLA_zzxz 01100100 11 1 index:1 rm:4 0001 rot:2 rn:5 rd:5 \
|
||||
### SVE FP Multiply-Add Indexed Group
|
||||
|
||||
# SVE floating-point multiply-add (indexed)
|
||||
FMLA_zzxz 01100100 0.1 .. rm:3 00000 sub:1 rn:5 rd:5 \
|
||||
ra=%reg_movprfx index=%index3_22_19 esz=1
|
||||
FMLA_zzxz 01100100 101 index:2 rm:3 00000 sub:1 rn:5 rd:5 \
|
||||
ra=%reg_movprfx esz=2
|
||||
FMLA_zzxz 01100100 111 index:1 rm:4 00000 sub:1 rn:5 rd:5 \
|
||||
ra=%reg_movprfx esz=3
|
||||
FMLA_zzxz 01100100 0. 1 ..... 000000 ..... ..... @rrxr_3 esz=1
|
||||
FMLA_zzxz 01100100 10 1 ..... 000000 ..... ..... @rrxr_2 esz=2
|
||||
FMLA_zzxz 01100100 11 1 ..... 000000 ..... ..... @rrxr_1 esz=3
|
||||
FMLS_zzxz 01100100 0. 1 ..... 000001 ..... ..... @rrxr_3 esz=1
|
||||
FMLS_zzxz 01100100 10 1 ..... 000001 ..... ..... @rrxr_2 esz=2
|
||||
FMLS_zzxz 01100100 11 1 ..... 000001 ..... ..... @rrxr_1 esz=3
|
||||
|
||||
### SVE FP Multiply Indexed Group
|
||||
|
||||
|
@ -3813,26 +3813,34 @@ static bool trans_DOT_zzzz(DisasContext *s, arg_DOT_zzzz *a)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_DOT_zzxw(DisasContext *s, arg_DOT_zzxw *a)
|
||||
static bool do_zzxz_ool(DisasContext *s, arg_rrxr_esz *a,
|
||||
gen_helper_gvec_4 *fn)
|
||||
{
|
||||
static gen_helper_gvec_4 * const fns[2][2] = {
|
||||
{ gen_helper_gvec_sdot_idx_b, gen_helper_gvec_sdot_idx_h },
|
||||
{ gen_helper_gvec_udot_idx_b, gen_helper_gvec_udot_idx_h }
|
||||
};
|
||||
|
||||
if (fn == NULL) {
|
||||
return false;
|
||||
}
|
||||
if (sve_access_check(s)) {
|
||||
gen_gvec_ool_zzzz(s, fns[a->u][a->sz], a->rd, a->rn, a->rm,
|
||||
a->ra, a->index);
|
||||
gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#define DO_RRXR(NAME, FUNC) \
|
||||
static bool NAME(DisasContext *s, arg_rrxr_esz *a) \
|
||||
{ return do_zzxz_ool(s, a, FUNC); }
|
||||
|
||||
DO_RRXR(trans_SDOT_zzxw_s, gen_helper_gvec_sdot_idx_b)
|
||||
DO_RRXR(trans_SDOT_zzxw_d, gen_helper_gvec_sdot_idx_h)
|
||||
DO_RRXR(trans_UDOT_zzxw_s, gen_helper_gvec_udot_idx_b)
|
||||
DO_RRXR(trans_UDOT_zzxw_d, gen_helper_gvec_udot_idx_h)
|
||||
|
||||
#undef DO_RRXR
|
||||
|
||||
/*
|
||||
*** SVE Floating Point Multiply-Add Indexed Group
|
||||
*/
|
||||
|
||||
static bool trans_FMLA_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
|
||||
static bool do_FMLA_zzxz(DisasContext *s, arg_rrxr_esz *a, bool sub)
|
||||
{
|
||||
static gen_helper_gvec_4_ptr * const fns[3] = {
|
||||
gen_helper_gvec_fmla_idx_h,
|
||||
@ -3847,13 +3855,23 @@ static bool trans_FMLA_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
vec_full_reg_offset(s, a->ra),
|
||||
status, vsz, vsz, (a->index << 1) | a->sub,
|
||||
status, vsz, vsz, (a->index << 1) | sub,
|
||||
fns[a->esz - 1]);
|
||||
tcg_temp_free_ptr(status);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_FMLA_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
|
||||
{
|
||||
return do_FMLA_zzxz(s, a, false);
|
||||
}
|
||||
|
||||
static bool trans_FMLS_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
|
||||
{
|
||||
return do_FMLA_zzxz(s, a, true);
|
||||
}
|
||||
|
||||
/*
|
||||
*** SVE Floating Point Multiply Indexed Group
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user