target/ppc: fix vextu[bhw][lr]x helpers
These helpers shouldn't depend on the host endianness, as they only use
shifts, ands, and int128_* methods.
Fixes: 60caf2216b
("target-ppc: add vextu[bhw][lr]x instructions")
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br>
Message-Id: <20210826141446.2488609-3-matheus.ferst@eldorado.org.br>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
181b0c333d
commit
f297c4c605
@ -1492,34 +1492,16 @@ void helper_vlogefp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *b)
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(HOST_WORDS_BIGENDIAN)
|
||||
#define VEXTU_X_DO(name, size, left) \
|
||||
target_ulong glue(helper_, name)(target_ulong a, ppc_avr_t *b) \
|
||||
{ \
|
||||
int index; \
|
||||
if (left) { \
|
||||
index = (a & 0xf) * 8; \
|
||||
} else { \
|
||||
index = ((15 - (a & 0xf) + 1) * 8) - size; \
|
||||
} \
|
||||
return int128_getlo(int128_rshift(b->s128, index)) & \
|
||||
MAKE_64BIT_MASK(0, size); \
|
||||
}
|
||||
#else
|
||||
#define VEXTU_X_DO(name, size, left) \
|
||||
target_ulong glue(helper_, name)(target_ulong a, ppc_avr_t *b) \
|
||||
{ \
|
||||
int index; \
|
||||
if (left) { \
|
||||
index = ((15 - (a & 0xf) + 1) * 8) - size; \
|
||||
} else { \
|
||||
index = (a & 0xf) * 8; \
|
||||
} \
|
||||
return int128_getlo(int128_rshift(b->s128, index)) & \
|
||||
MAKE_64BIT_MASK(0, size); \
|
||||
}
|
||||
#endif
|
||||
|
||||
#define VEXTU_X_DO(name, size, left) \
|
||||
target_ulong glue(helper_, name)(target_ulong a, ppc_avr_t *b) \
|
||||
{ \
|
||||
int index = (a & 0xf) * 8; \
|
||||
if (left) { \
|
||||
index = 128 - index - size; \
|
||||
} \
|
||||
return int128_getlo(int128_rshift(b->s128, index)) & \
|
||||
MAKE_64BIT_MASK(0, size); \
|
||||
}
|
||||
VEXTU_X_DO(vextublx, 8, 1)
|
||||
VEXTU_X_DO(vextuhlx, 16, 1)
|
||||
VEXTU_X_DO(vextuwlx, 32, 1)
|
||||
|
Loading…
Reference in New Issue
Block a user