mirror of https://gitee.com/openkylin/qemu.git
target/arm: Fix VLDRB/H/W for predicated elements
For vector loads, predicated elements are zeroed, instead of retaining their previous values (as happens for most data processing operations). This means we need to distinguish "beat not executed due to ECI" (don't touch destination element) from "beat executed but predicated out" (zero destination element). Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
e3152d02da
commit
41704cc262
|
@ -146,12 +146,13 @@ static void mve_advance_vpt(CPUARMState *env)
|
|||
env->v7m.vpr = vpr;
|
||||
}
|
||||
|
||||
|
||||
/* For loads, predicated lanes are zeroed instead of keeping their old values */
|
||||
#define DO_VLDR(OP, MSIZE, LDTYPE, ESIZE, TYPE) \
|
||||
void HELPER(mve_##OP)(CPUARMState *env, void *vd, uint32_t addr) \
|
||||
{ \
|
||||
TYPE *d = vd; \
|
||||
uint16_t mask = mve_element_mask(env); \
|
||||
uint16_t eci_mask = mve_eci_mask(env); \
|
||||
unsigned b, e; \
|
||||
/* \
|
||||
* R_SXTM allows the dest reg to become UNKNOWN for abandoned \
|
||||
|
@ -159,8 +160,9 @@ static void mve_advance_vpt(CPUARMState *env)
|
|||
* then take an exception. \
|
||||
*/ \
|
||||
for (b = 0, e = 0; b < 16; b += ESIZE, e++) { \
|
||||
if (mask & (1 << b)) { \
|
||||
d[H##ESIZE(e)] = cpu_##LDTYPE##_data_ra(env, addr, GETPC()); \
|
||||
if (eci_mask & (1 << b)) { \
|
||||
d[H##ESIZE(e)] = (mask & (1 << b)) ? \
|
||||
cpu_##LDTYPE##_data_ra(env, addr, GETPC()) : 0; \
|
||||
} \
|
||||
addr += MSIZE; \
|
||||
} \
|
||||
|
|
Loading…
Reference in New Issue