mirror of https://github.com/xemu-project/xemu.git
target-ppc: Altivec 2.07: Change VMUL_DO to Support 64-bit Integers
This VMUL_DO macro provides support for the various vmule* and vmulo* instructions. These instructions multiply vector elements, producing products that are one size larger; e.g. vmuleub multiplies unsigned 8-bit elements and produces a 16 bit unsigned element. The existing macro works correctly for the existing instructions (8-bit, and 16-bit source elements) but does not work correctly for 32-bit source elements. This patch adds an explicit cast to the multiplicands, forcing them to be of the target element type. This is required for the forthcoming patches that add the vmul[eo][us]w instructions. Signed-off-by: Tom Musta <tommusta@gmail.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
56eabc7508
commit
aa9e930c88
|
@ -983,28 +983,30 @@ void helper_vmsumuhs(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
|
|||
}
|
||||
}
|
||||
|
||||
#define VMUL_DO(name, mul_element, prod_element, evenp) \
|
||||
#define VMUL_DO(name, mul_element, prod_element, cast, evenp) \
|
||||
void helper_v##name(ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
|
||||
{ \
|
||||
int i; \
|
||||
\
|
||||
VECTOR_FOR_INORDER_I(i, prod_element) { \
|
||||
if (evenp) { \
|
||||
r->prod_element[i] = a->mul_element[i * 2 + HI_IDX] * \
|
||||
b->mul_element[i * 2 + HI_IDX]; \
|
||||
r->prod_element[i] = \
|
||||
(cast)a->mul_element[i * 2 + HI_IDX] * \
|
||||
(cast)b->mul_element[i * 2 + HI_IDX]; \
|
||||
} else { \
|
||||
r->prod_element[i] = a->mul_element[i * 2 + LO_IDX] * \
|
||||
b->mul_element[i * 2 + LO_IDX]; \
|
||||
r->prod_element[i] = \
|
||||
(cast)a->mul_element[i * 2 + LO_IDX] * \
|
||||
(cast)b->mul_element[i * 2 + LO_IDX]; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
#define VMUL(suffix, mul_element, prod_element) \
|
||||
VMUL_DO(mule##suffix, mul_element, prod_element, 1) \
|
||||
VMUL_DO(mulo##suffix, mul_element, prod_element, 0)
|
||||
VMUL(sb, s8, s16)
|
||||
VMUL(sh, s16, s32)
|
||||
VMUL(ub, u8, u16)
|
||||
VMUL(uh, u16, u32)
|
||||
#define VMUL(suffix, mul_element, prod_element, cast) \
|
||||
VMUL_DO(mule##suffix, mul_element, prod_element, cast, 1) \
|
||||
VMUL_DO(mulo##suffix, mul_element, prod_element, cast, 0)
|
||||
VMUL(sb, s8, s16, int16_t)
|
||||
VMUL(sh, s16, s32, int32_t)
|
||||
VMUL(ub, u8, u16, uint16_t)
|
||||
VMUL(uh, u16, u32, uint32_t)
|
||||
#undef VMUL_DO
|
||||
#undef VMUL
|
||||
|
||||
|
|
Loading…
Reference in New Issue