mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
target/mips: Check CPU endianness at runtime using env_is_bigendian()
Since CPU endianness can be toggled at runtime before resetting, checking the endianness at build time preprocessing the TARGET_BIG_ENDIAN definition isn't correct. We have to call mips_env_is_bigendian() to get the CPU endianness at runtime. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20250417131004.47205-4-philmd@linaro.org>
This commit is contained in:
parent
56f8fb6886
commit
33fa8f02a9
1 changed files with 16 additions and 18 deletions
|
@ -8212,7 +8212,6 @@ void helper_msa_ffint_u_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
|
|||
/* Element-by-element access macros */
|
||||
#define DF_ELEMENTS(df) (MSA_WRLEN / DF_BITS(df))
|
||||
|
||||
#if TARGET_BIG_ENDIAN
|
||||
static inline uint64_t bswap16x4(uint64_t x)
|
||||
{
|
||||
uint64_t m = 0x00ff00ff00ff00ffull;
|
||||
|
@ -8223,7 +8222,6 @@ static inline uint64_t bswap32x2(uint64_t x)
|
|||
{
|
||||
return ror64(bswap64(x), 32);
|
||||
}
|
||||
#endif
|
||||
|
||||
void helper_msa_ld_b(CPUMIPSState *env, uint32_t wd,
|
||||
target_ulong addr)
|
||||
|
@ -8252,10 +8250,10 @@ void helper_msa_ld_h(CPUMIPSState *env, uint32_t wd,
|
|||
*/
|
||||
d0 = cpu_ldq_le_data_ra(env, addr + 0, ra);
|
||||
d1 = cpu_ldq_le_data_ra(env, addr + 8, ra);
|
||||
#if TARGET_BIG_ENDIAN
|
||||
d0 = bswap16x4(d0);
|
||||
d1 = bswap16x4(d1);
|
||||
#endif
|
||||
if (mips_env_is_bigendian(env)) {
|
||||
d0 = bswap16x4(d0);
|
||||
d1 = bswap16x4(d1);
|
||||
}
|
||||
pwd->d[0] = d0;
|
||||
pwd->d[1] = d1;
|
||||
}
|
||||
|
@ -8273,10 +8271,10 @@ void helper_msa_ld_w(CPUMIPSState *env, uint32_t wd,
|
|||
*/
|
||||
d0 = cpu_ldq_le_data_ra(env, addr + 0, ra);
|
||||
d1 = cpu_ldq_le_data_ra(env, addr + 8, ra);
|
||||
#if TARGET_BIG_ENDIAN
|
||||
d0 = bswap32x2(d0);
|
||||
d1 = bswap32x2(d1);
|
||||
#endif
|
||||
if (mips_env_is_bigendian(env)) {
|
||||
d0 = bswap32x2(d0);
|
||||
d1 = bswap32x2(d1);
|
||||
}
|
||||
pwd->d[0] = d0;
|
||||
pwd->d[1] = d1;
|
||||
}
|
||||
|
@ -8339,10 +8337,10 @@ void helper_msa_st_h(CPUMIPSState *env, uint32_t wd,
|
|||
/* Store 8 bytes at a time. See helper_msa_ld_h. */
|
||||
d0 = pwd->d[0];
|
||||
d1 = pwd->d[1];
|
||||
#if TARGET_BIG_ENDIAN
|
||||
d0 = bswap16x4(d0);
|
||||
d1 = bswap16x4(d1);
|
||||
#endif
|
||||
if (mips_env_is_bigendian(env)) {
|
||||
d0 = bswap16x4(d0);
|
||||
d1 = bswap16x4(d1);
|
||||
}
|
||||
cpu_stq_le_data_ra(env, addr + 0, d0, ra);
|
||||
cpu_stq_le_data_ra(env, addr + 8, d1, ra);
|
||||
}
|
||||
|
@ -8360,10 +8358,10 @@ void helper_msa_st_w(CPUMIPSState *env, uint32_t wd,
|
|||
/* Store 8 bytes at a time. See helper_msa_ld_w. */
|
||||
d0 = pwd->d[0];
|
||||
d1 = pwd->d[1];
|
||||
#if TARGET_BIG_ENDIAN
|
||||
d0 = bswap32x2(d0);
|
||||
d1 = bswap32x2(d1);
|
||||
#endif
|
||||
if (mips_env_is_bigendian(env)) {
|
||||
d0 = bswap32x2(d0);
|
||||
d1 = bswap32x2(d1);
|
||||
}
|
||||
cpu_stq_le_data_ra(env, addr + 0, d0, ra);
|
||||
cpu_stq_le_data_ra(env, addr + 8, d1, ra);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue