mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:56:38 +00:00
target/arm: Implement and enable FEAT_SSVE_FEXPA for -cpu max
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20260626164819.770787-1-richard.henderson@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
committed by
Peter Maydell
parent
97af096c69
commit
272eef0d25
@@ -176,6 +176,7 @@ the following architecture extensions:
|
||||
- FEAT_SME_I16I64 (16-bit to 64-bit integer widening outer product instructions)
|
||||
- FEAT_SME_LUTv2 (Lookup table instructions with 4-bit indices and 8-bit elements)
|
||||
- FEAT_SSVE_AES (Streaming SVE Mode Advanced Encryption Standard and 128-bit polynomial multiply long instructions)
|
||||
- FEAT_SSVE_FEXPA (Streaming FEXPA instruction)
|
||||
- FEAT_SSVE_FP8DOT2 (SVE2 FP8 2-way dot product to half-precision instructions in Streaming SVE mode)
|
||||
- FEAT_SSVE_FP8DOT4 (SVE2 FP8 4-way dot product to single-precision instructions in Streaming SVE mode)
|
||||
- FEAT_SSVE_FP8FMA (SVE2 FP8 multiply-accumulate to half-precision and single-precision instructions in Streaming SVE mode)
|
||||
|
||||
@@ -174,6 +174,7 @@ abi_ulong get_elf_hwcap(CPUState *cs)
|
||||
GET_FEATURE_ID(aa64_f8mm8, ARM_HWCAP_A64_F8MM8);
|
||||
GET_FEATURE_ID(aa64_f8mm4, ARM_HWCAP_A64_F8MM4);
|
||||
GET_FEATURE_ID(aa64_ssve_aes, ARM_HWCAP_A64_SME_AES);
|
||||
GET_FEATURE_ID(aa64_ssve_fexpa, ARM_HWCAP_A64_SME_SFEXPA);
|
||||
GET_FEATURE_ID(aa64_fprcvt, ARM_HWCAP_A64_FPRCVT);
|
||||
|
||||
return hwcaps;
|
||||
|
||||
@@ -1580,6 +1580,11 @@ static inline bool isar_feature_aa64_sve_b16b16(const ARMISARegisters *id)
|
||||
return FIELD_EX64_IDREG(id, ID_AA64ZFR0, B16B16);
|
||||
}
|
||||
|
||||
static inline bool isar_feature_aa64_ssve_fexpa(const ARMISARegisters *id)
|
||||
{
|
||||
return FIELD_EX64_IDREG(id, ID_AA64SMFR0, SFEXPA);
|
||||
}
|
||||
|
||||
static inline bool isar_feature_aa64_ssve_aes(const ARMISARegisters *id)
|
||||
{
|
||||
return FIELD_EX64_IDREG(id, ID_AA64SMFR0, AES);
|
||||
|
||||
@@ -1384,6 +1384,7 @@ void aarch64_max_tcg_initfn(Object *obj)
|
||||
SET_IDREG(isar, ID_AA64DFR0, t);
|
||||
|
||||
t = GET_IDREG(isar, ID_AA64SMFR0);
|
||||
t = FIELD_DP64(t, ID_AA64SMFR0, SFEXPA, 1); /* FEAT_SSVE_FEXPA */
|
||||
t = FIELD_DP64(t, ID_AA64SMFR0, AES, 1); /* FEAT_SSVE_AES */
|
||||
t = FIELD_DP64(t, ID_AA64SMFR0, SF8DP2, 1); /* FEAT_SSVE_FP8DOT2 */
|
||||
t = FIELD_DP64(t, ID_AA64SMFR0, SF8DP4, 1); /* FEAT_SSVE_FP8DOT4 */
|
||||
|
||||
@@ -1369,12 +1369,21 @@ TRANS_FEAT_NONSTREAMING(ADR_u32, aa64_sve, do_adr, a, gen_helper_sve_adr_u32)
|
||||
*** SVE Integer Misc - Unpredicated Group
|
||||
*/
|
||||
|
||||
static gen_helper_gvec_2 * const fexpa_fns[4] = {
|
||||
NULL, gen_helper_sve_fexpa_h,
|
||||
gen_helper_sve_fexpa_s, gen_helper_sve_fexpa_d,
|
||||
};
|
||||
TRANS_FEAT_NONSTREAMING(FEXPA, aa64_sve, gen_gvec_ool_zz,
|
||||
fexpa_fns[a->esz], a->rd, a->rn, s->fpcr_ah)
|
||||
static bool trans_FEXPA(DisasContext *s, arg_FEXPA *a)
|
||||
{
|
||||
static gen_helper_gvec_2 * const fexpa_fns[4] = {
|
||||
NULL, gen_helper_sve_fexpa_h,
|
||||
gen_helper_sve_fexpa_s, gen_helper_sve_fexpa_d,
|
||||
};
|
||||
|
||||
if (!dc_isar_feature(aa64_ssve_fexpa, s)) {
|
||||
if (!dc_isar_feature(aa64_sve, s)) {
|
||||
return false;
|
||||
}
|
||||
s->is_nonstreaming = true;
|
||||
}
|
||||
return gen_gvec_ool_zz(s, fexpa_fns[a->esz], a->rd, a->rn, s->fpcr_ah);
|
||||
}
|
||||
|
||||
static gen_helper_gvec_3 * const ftssel_fns[4] = {
|
||||
NULL, gen_helper_sve_ftssel_h,
|
||||
|
||||
Reference in New Issue
Block a user