target/ppc: rework vmrg{l,h}{b,h,w} instructions to use Vsr* macros
The current implementations make use of the endian-specific macros MRGLO/MRGHI and also reference HI_IDX and LO_IDX directly to calculate array offsets. Rework the implementation to use the Vsr* macros so that these per-endian references can be removed. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
6e66d0c648
commit
d81c20404e
@ -976,43 +976,27 @@ void helper_vmladduhm(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
|
||||
}
|
||||
}
|
||||
|
||||
#define VMRG_DO(name, element, highp) \
|
||||
void helper_v##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
||||
{ \
|
||||
ppc_avr_t result; \
|
||||
int i; \
|
||||
size_t n_elems = ARRAY_SIZE(r->element); \
|
||||
\
|
||||
for (i = 0; i < n_elems / 2; i++) { \
|
||||
if (highp) { \
|
||||
result.element[i*2+HI_IDX] = a->element[i]; \
|
||||
result.element[i*2+LO_IDX] = b->element[i]; \
|
||||
} else { \
|
||||
result.element[n_elems - i * 2 - (1 + HI_IDX)] = \
|
||||
b->element[n_elems - i - 1]; \
|
||||
result.element[n_elems - i * 2 - (1 + LO_IDX)] = \
|
||||
a->element[n_elems - i - 1]; \
|
||||
} \
|
||||
} \
|
||||
*r = result; \
|
||||
#define VMRG_DO(name, element, access, ofs) \
|
||||
void helper_v##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
||||
{ \
|
||||
ppc_avr_t result; \
|
||||
int i, half = ARRAY_SIZE(r->element) / 2; \
|
||||
\
|
||||
for (i = 0; i < half; i++) { \
|
||||
result.access(i * 2 + 0) = a->access(i + ofs); \
|
||||
result.access(i * 2 + 1) = b->access(i + ofs); \
|
||||
} \
|
||||
*r = result; \
|
||||
}
|
||||
#if defined(HOST_WORDS_BIGENDIAN)
|
||||
#define MRGHI 0
|
||||
#define MRGLO 1
|
||||
#else
|
||||
#define MRGHI 1
|
||||
#define MRGLO 0
|
||||
#endif
|
||||
#define VMRG(suffix, element) \
|
||||
VMRG_DO(mrgl##suffix, element, MRGHI) \
|
||||
VMRG_DO(mrgh##suffix, element, MRGLO)
|
||||
VMRG(b, u8)
|
||||
VMRG(h, u16)
|
||||
VMRG(w, u32)
|
||||
|
||||
#define VMRG(suffix, element, access) \
|
||||
VMRG_DO(mrgl##suffix, element, access, half) \
|
||||
VMRG_DO(mrgh##suffix, element, access, 0)
|
||||
VMRG(b, u8, VsrB)
|
||||
VMRG(h, u16, VsrH)
|
||||
VMRG(w, u32, VsrW)
|
||||
#undef VMRG_DO
|
||||
#undef VMRG
|
||||
#undef MRGHI
|
||||
#undef MRGLO
|
||||
|
||||
void helper_vmsummbm(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
|
||||
ppc_avr_t *b, ppc_avr_t *c)
|
||||
|
Loading…
x
Reference in New Issue
Block a user