mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 15:45:31 +00:00
target/arm: Add isar_feature_aa32_vfp_simd
Use this in the places that were checking ARM_FEATURE_VFP, and are obviously testing for the existance of the register set as opposed to testing for some particular instruction extension. Backports commit 7fbc6a403a0aab834e764fa61d81ed8586cfe352 from qemu
This commit is contained in:
parent
764207865a
commit
06b52d6660
|
@ -283,7 +283,7 @@ static void arm_cpu_reset(CPUState *s)
|
|||
env->v7m.ccr[M_REG_S] |= R_V7M_CCR_UNALIGN_TRP_MASK;
|
||||
}
|
||||
|
||||
if (arm_feature(env, ARM_FEATURE_VFP)) {
|
||||
if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
|
||||
env->v7m.fpccr[M_REG_NS] = R_V7M_FPCCR_ASPEN_MASK;
|
||||
env->v7m.fpccr[M_REG_S] = R_V7M_FPCCR_ASPEN_MASK |
|
||||
R_V7M_FPCCR_LSPEN_MASK | R_V7M_FPCCR_S_MASK;
|
||||
|
|
|
@ -3323,6 +3323,15 @@ static inline bool isar_feature_aa32_fp16_arith(const ARMISARegisters *id)
|
|||
return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, FP) == 1;
|
||||
}
|
||||
|
||||
static inline bool isar_feature_aa32_vfp_simd(const ARMISARegisters *id)
|
||||
{
|
||||
/*
|
||||
* Return true if either VFP or SIMD is implemented.
|
||||
* In this case, a minimum of VFP w/ D0-D15.
|
||||
*/
|
||||
return FIELD_EX32(id->mvfr0, MVFR0, SIMDREG) > 0;
|
||||
}
|
||||
|
||||
static inline bool isar_feature_aa32_simd_r32(const ARMISARegisters *id)
|
||||
{
|
||||
/* Return true if D16-D31 are implemented */
|
||||
|
|
|
@ -748,7 +748,7 @@ static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
|||
* ASEDIS [31] and D32DIS [30] are both UNK/SBZP without VFP.
|
||||
* TRCDIS [28] is RAZ/WI since we do not implement a trace macrocell.
|
||||
*/
|
||||
if (arm_feature(env, ARM_FEATURE_VFP)) {
|
||||
if (cpu_isar_feature(aa32_vfp_simd, env_archcpu(env))) {
|
||||
/* VFP coprocessor: cp10 & cp11 [23:20] */
|
||||
mask |= (1 << 31) | (1 << 30) | (0xf << 20);
|
||||
|
||||
|
|
|
@ -662,7 +662,8 @@ static uint32_t v7m_integrity_sig(CPUARMState *env, uint32_t lr)
|
|||
*/
|
||||
uint32_t sig = 0xfefa125a;
|
||||
|
||||
if (!arm_feature(env, ARM_FEATURE_VFP) || (lr & R_V7M_EXCRET_FTYPE_MASK)) {
|
||||
if (!cpu_isar_feature(aa32_vfp_simd, env_archcpu(env))
|
||||
|| (lr & R_V7M_EXCRET_FTYPE_MASK)) {
|
||||
sig |= 1;
|
||||
}
|
||||
return sig;
|
||||
|
@ -764,7 +765,7 @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain,
|
|||
|
||||
if (dotailchain) {
|
||||
/* Sanitize LR FType and PREFIX bits */
|
||||
if (!arm_feature(env, ARM_FEATURE_VFP)) {
|
||||
if (!cpu_isar_feature(aa32_vfp_simd, cpu)) {
|
||||
lr |= R_V7M_EXCRET_FTYPE_MASK;
|
||||
}
|
||||
lr = deposit32(lr, 24, 8, 0xff);
|
||||
|
@ -1296,7 +1297,7 @@ static void do_v7m_exception_exit(ARMCPU *cpu)
|
|||
|
||||
ftype = excret & R_V7M_EXCRET_FTYPE_MASK;
|
||||
|
||||
if (!arm_feature(env, ARM_FEATURE_VFP) && !ftype) {
|
||||
if (!ftype && !cpu_isar_feature(aa32_vfp_simd, cpu)) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "M profile: zero FTYPE in exception "
|
||||
"exit PC value 0x%" PRIx32 " is UNPREDICTABLE "
|
||||
"if FPU not present\n",
|
||||
|
|
Loading…
Reference in a new issue