target/arm: Bring VLSTM/VLLDM helper store/load closer to the ARM pseudocode
This patch brings the VLSTM and VLLDM helper functions closer to the ARM pseudocode by adding MO_ALIGN to the MemOpIdx of the associated store (`cpu_stl_mmu`) operations and load (`cpu_ldl_mmu`) operations. Note that this is not a bug fix: an 8-byte alignment check already exists and remains in place, enforcing stricter alignment than the 4 bytes requirement in the individual loads and stores. This change merely makes the helper implementations closer to the ARM pseudocode. That said, as a side effect, the MMU index is now resolved once instead of on every `cpu_*_data_ra` call, reducing redundant lookups Signed-off-by: William Kosasih <kosasihwilliam4@gmail.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20250703085604.154449-2-kosasihwilliam4@gmail.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
9526b9b620
commit
fa8f6f25ea
1 changed files with 15 additions and 9 deletions
|
|
@ -1048,6 +1048,9 @@ void HELPER(v7m_vlstm)(CPUARMState *env, uint32_t fptr)
|
|||
bool s = env->v7m.fpccr[M_REG_S] & R_V7M_FPCCR_S_MASK;
|
||||
bool lspact = env->v7m.fpccr[s] & R_V7M_FPCCR_LSPACT_MASK;
|
||||
uintptr_t ra = GETPC();
|
||||
ARMMMUIdx mmu_idx = arm_mmu_idx(env);
|
||||
MemOpIdx oi = make_memop_idx(MO_TEUL | MO_ALIGN,
|
||||
arm_to_core_mmu_idx(mmu_idx));
|
||||
|
||||
assert(env->v7m.secure);
|
||||
|
||||
|
|
@ -1073,7 +1076,7 @@ void HELPER(v7m_vlstm)(CPUARMState *env, uint32_t fptr)
|
|||
* Note that we do not use v7m_stack_write() here, because the
|
||||
* accesses should not set the FSR bits for stacking errors if they
|
||||
* fail. (In pseudocode terms, they are AccType_NORMAL, not AccType_STACK
|
||||
* or AccType_LAZYFP). Faults in cpu_stl_data_ra() will throw exceptions
|
||||
* or AccType_LAZYFP). Faults in cpu_stl_mmu() will throw exceptions
|
||||
* and longjmp out.
|
||||
*/
|
||||
if (!(env->v7m.fpccr[M_REG_S] & R_V7M_FPCCR_LSPEN_MASK)) {
|
||||
|
|
@ -1089,12 +1092,12 @@ void HELPER(v7m_vlstm)(CPUARMState *env, uint32_t fptr)
|
|||
if (i >= 16) {
|
||||
faddr += 8; /* skip the slot for the FPSCR */
|
||||
}
|
||||
cpu_stl_data_ra(env, faddr, slo, ra);
|
||||
cpu_stl_data_ra(env, faddr + 4, shi, ra);
|
||||
cpu_stl_mmu(env, faddr, slo, oi, ra);
|
||||
cpu_stl_mmu(env, faddr + 4, shi, oi, ra);
|
||||
}
|
||||
cpu_stl_data_ra(env, fptr + 0x40, vfp_get_fpscr(env), ra);
|
||||
cpu_stl_mmu(env, fptr + 0x40, vfp_get_fpscr(env), oi, ra);
|
||||
if (cpu_isar_feature(aa32_mve, cpu)) {
|
||||
cpu_stl_data_ra(env, fptr + 0x44, env->v7m.vpr, ra);
|
||||
cpu_stl_mmu(env, fptr + 0x44, env->v7m.vpr, oi, ra);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1121,6 +1124,9 @@ void HELPER(v7m_vlldm)(CPUARMState *env, uint32_t fptr)
|
|||
{
|
||||
ARMCPU *cpu = env_archcpu(env);
|
||||
uintptr_t ra = GETPC();
|
||||
ARMMMUIdx mmu_idx = arm_mmu_idx(env);
|
||||
MemOpIdx oi = make_memop_idx(MO_TEUL | MO_ALIGN,
|
||||
arm_to_core_mmu_idx(mmu_idx));
|
||||
|
||||
/* fptr is the value of Rn, the frame pointer we load the FP regs from */
|
||||
assert(env->v7m.secure);
|
||||
|
|
@ -1155,16 +1161,16 @@ void HELPER(v7m_vlldm)(CPUARMState *env, uint32_t fptr)
|
|||
faddr += 8; /* skip the slot for the FPSCR and VPR */
|
||||
}
|
||||
|
||||
slo = cpu_ldl_data_ra(env, faddr, ra);
|
||||
shi = cpu_ldl_data_ra(env, faddr + 4, ra);
|
||||
slo = cpu_ldl_mmu(env, faddr, oi, ra);
|
||||
shi = cpu_ldl_mmu(env, faddr + 4, oi, ra);
|
||||
|
||||
dn = (uint64_t) shi << 32 | slo;
|
||||
*aa32_vfp_dreg(env, i / 2) = dn;
|
||||
}
|
||||
fpscr = cpu_ldl_data_ra(env, fptr + 0x40, ra);
|
||||
fpscr = cpu_ldl_mmu(env, fptr + 0x40, oi, ra);
|
||||
vfp_set_fpscr(env, fpscr);
|
||||
if (cpu_isar_feature(aa32_mve, cpu)) {
|
||||
env->v7m.vpr = cpu_ldl_data_ra(env, fptr + 0x44, ra);
|
||||
env->v7m.vpr = cpu_ldl_mmu(env, fptr + 0x44, oi, ra);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue