mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-11 05:35:35 +00:00
target/arm: Add isar_feature_aa64_fp_simd, isar_feature_aa32_vfp
We cannot easily create "any" functions for these, because the ID_AA64PFR0 fields for FP and SIMD signal "enabled" with zero. Which means that an aarch32-only cpu will return incorrect results when testing the aarch64 registers. To use these, we must either have context or additionally test vs ARM_FEATURE_AARCH64. Backports commit 7d63183ff1a61b3f7934dc9b40b10e4fd5e100cd from qemu
This commit is contained in:
parent
39c49f488b
commit
7e99995b7b
|
@ -901,8 +901,9 @@ static int arm_cpu_realizefn(struct uc_struct *uc, DeviceState *dev, Error **err
|
|||
* We rely on no XScale CPU having VFP so we can use the same bits in the
|
||||
* TB flags field for VECSTRIDE and XSCALE_CPAR.
|
||||
*/
|
||||
assert(!(arm_feature(env, ARM_FEATURE_VFP) &&
|
||||
arm_feature(env, ARM_FEATURE_XSCALE)));
|
||||
assert(arm_feature(&cpu->env, ARM_FEATURE_AARCH64) ||
|
||||
!cpu_isar_feature(aa32_vfp_simd, cpu) ||
|
||||
!arm_feature(env, ARM_FEATURE_XSCALE));
|
||||
|
||||
if (cpu->reset_hivecs) {
|
||||
cpu->reset_sctlr |= (1 << 13);
|
||||
|
|
|
@ -3367,6 +3367,11 @@ static inline bool isar_feature_aa32_fpdp_v3(const ARMISARegisters *id)
|
|||
return FIELD_EX32(id->mvfr0, MVFR0, FPDP) >= 2;
|
||||
}
|
||||
|
||||
static inline bool isar_feature_aa32_vfp(const ARMISARegisters *id)
|
||||
{
|
||||
return isar_feature_aa32_fpsp_v2(id) || isar_feature_aa32_fpdp_v2(id);
|
||||
}
|
||||
|
||||
/*
|
||||
* We always set the FP and SIMD FP16 fields to indicate identical
|
||||
* levels of support (assuming SIMD is implemented at all), so
|
||||
|
@ -3569,6 +3574,12 @@ static inline bool isar_feature_aa64_dcpodp(const ARMISARegisters *id)
|
|||
return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, DPB) >= 2;
|
||||
}
|
||||
|
||||
static inline bool isar_feature_aa64_fp_simd(const ARMISARegisters *id)
|
||||
{
|
||||
/* We always set the AdvSIMD and FP fields identically. */
|
||||
return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, FP) != 0xf;
|
||||
}
|
||||
|
||||
static inline bool isar_feature_aa64_fp16(const ARMISARegisters *id)
|
||||
{
|
||||
/* We always set the AdvSIMD and FP fields identically wrt FP16. */
|
||||
|
|
Loading…
Reference in a new issue