mirror of https://github.com/xemu-project/xemu.git
target-ppc: Correct VSX Integer to FP Conversion
This patch corrects the VSX integer to floating point conversion instructions by using the endian correct accessors. The auxiliary "j" index used by the existing macros is now obsolete and is removed. The JOFFSET preprocessor macro is also obsolete and removed. Signed-off-by: Tom Musta <tommusta@gmail.com> Tested-by: Tom Musta <tommusta@gmail.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
d1dec5ef55
commit
6cd7db3d92
|
@ -2487,12 +2487,6 @@ VSX_CMP(xvcmpeqsp, 4, float32, VsrW(i), eq, 0)
|
||||||
VSX_CMP(xvcmpgesp, 4, float32, VsrW(i), le, 1)
|
VSX_CMP(xvcmpgesp, 4, float32, VsrW(i), le, 1)
|
||||||
VSX_CMP(xvcmpgtsp, 4, float32, VsrW(i), lt, 1)
|
VSX_CMP(xvcmpgtsp, 4, float32, VsrW(i), lt, 1)
|
||||||
|
|
||||||
#if defined(HOST_WORDS_BIGENDIAN)
|
|
||||||
#define JOFFSET 0
|
|
||||||
#else
|
|
||||||
#define JOFFSET 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* VSX_CVT_FP_TO_FP - VSX floating point/floating point conversion
|
/* VSX_CVT_FP_TO_FP - VSX floating point/floating point conversion
|
||||||
* op - instruction mnemonic
|
* op - instruction mnemonic
|
||||||
* nels - number of elements (1, 2 or 4)
|
* nels - number of elements (1, 2 or 4)
|
||||||
|
@ -2614,7 +2608,7 @@ VSX_CVT_FP_TO_INT(xvcvspuxws, 4, float32, uint32, VsrW(i), VsrW(i), 0U)
|
||||||
* jdef - definition of the j index (i or 2*i)
|
* jdef - definition of the j index (i or 2*i)
|
||||||
* sfprf - set FPRF
|
* sfprf - set FPRF
|
||||||
*/
|
*/
|
||||||
#define VSX_CVT_INT_TO_FP(op, nels, stp, ttp, sfld, tfld, jdef, sfprf, r2sp) \
|
#define VSX_CVT_INT_TO_FP(op, nels, stp, ttp, sfld, tfld, sfprf, r2sp) \
|
||||||
void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
||||||
{ \
|
{ \
|
||||||
ppc_vsr_t xt, xb; \
|
ppc_vsr_t xt, xb; \
|
||||||
|
@ -2624,7 +2618,6 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
||||||
getVSR(xT(opcode), &xt, env); \
|
getVSR(xT(opcode), &xt, env); \
|
||||||
\
|
\
|
||||||
for (i = 0; i < nels; i++) { \
|
for (i = 0; i < nels; i++) { \
|
||||||
int j = jdef; \
|
|
||||||
xt.tfld = stp##_to_##ttp(xb.sfld, &env->fp_status); \
|
xt.tfld = stp##_to_##ttp(xb.sfld, &env->fp_status); \
|
||||||
if (r2sp) { \
|
if (r2sp) { \
|
||||||
xt.tfld = helper_frsp(env, xt.tfld); \
|
xt.tfld = helper_frsp(env, xt.tfld); \
|
||||||
|
@ -2638,22 +2631,18 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
||||||
helper_float_check_status(env); \
|
helper_float_check_status(env); \
|
||||||
}
|
}
|
||||||
|
|
||||||
VSX_CVT_INT_TO_FP(xscvsxddp, 1, int64, float64, u64[j], f64[i], i, 1, 0)
|
VSX_CVT_INT_TO_FP(xscvsxddp, 1, int64, float64, VsrD(0), VsrD(0), 1, 0)
|
||||||
VSX_CVT_INT_TO_FP(xscvuxddp, 1, uint64, float64, u64[j], f64[i], i, 1, 0)
|
VSX_CVT_INT_TO_FP(xscvuxddp, 1, uint64, float64, VsrD(0), VsrD(0), 1, 0)
|
||||||
VSX_CVT_INT_TO_FP(xscvsxdsp, 1, int64, float64, u64[j], f64[i], i, 1, 1)
|
VSX_CVT_INT_TO_FP(xscvsxdsp, 1, int64, float64, VsrD(0), VsrD(0), 1, 1)
|
||||||
VSX_CVT_INT_TO_FP(xscvuxdsp, 1, uint64, float64, u64[j], f64[i], i, 1, 1)
|
VSX_CVT_INT_TO_FP(xscvuxdsp, 1, uint64, float64, VsrD(0), VsrD(0), 1, 1)
|
||||||
VSX_CVT_INT_TO_FP(xvcvsxddp, 2, int64, float64, u64[j], f64[i], i, 0, 0)
|
VSX_CVT_INT_TO_FP(xvcvsxddp, 2, int64, float64, VsrD(i), VsrD(i), 0, 0)
|
||||||
VSX_CVT_INT_TO_FP(xvcvuxddp, 2, uint64, float64, u64[j], f64[i], i, 0, 0)
|
VSX_CVT_INT_TO_FP(xvcvuxddp, 2, uint64, float64, VsrD(i), VsrD(i), 0, 0)
|
||||||
VSX_CVT_INT_TO_FP(xvcvsxwdp, 2, int32, float64, u32[j], f64[i], \
|
VSX_CVT_INT_TO_FP(xvcvsxwdp, 2, int32, float64, VsrW(2*i), VsrD(i), 0, 0)
|
||||||
2*i + JOFFSET, 0, 0)
|
VSX_CVT_INT_TO_FP(xvcvuxwdp, 2, uint64, float64, VsrW(2*i), VsrD(i), 0, 0)
|
||||||
VSX_CVT_INT_TO_FP(xvcvuxwdp, 2, uint64, float64, u32[j], f64[i], \
|
VSX_CVT_INT_TO_FP(xvcvsxdsp, 2, int64, float32, VsrD(i), VsrW(2*i), 0, 0)
|
||||||
2*i + JOFFSET, 0, 0)
|
VSX_CVT_INT_TO_FP(xvcvuxdsp, 2, uint64, float32, VsrD(i), VsrW(2*i), 0, 0)
|
||||||
VSX_CVT_INT_TO_FP(xvcvsxdsp, 2, int64, float32, u64[i], f32[j], \
|
VSX_CVT_INT_TO_FP(xvcvsxwsp, 4, int32, float32, VsrW(i), VsrW(i), 0, 0)
|
||||||
2*i + JOFFSET, 0, 0)
|
VSX_CVT_INT_TO_FP(xvcvuxwsp, 4, uint32, float32, VsrW(i), VsrW(i), 0, 0)
|
||||||
VSX_CVT_INT_TO_FP(xvcvuxdsp, 2, uint64, float32, u64[i], f32[j], \
|
|
||||||
2*i + JOFFSET, 0, 0)
|
|
||||||
VSX_CVT_INT_TO_FP(xvcvsxwsp, 4, int32, float32, u32[j], f32[i], i, 0, 0)
|
|
||||||
VSX_CVT_INT_TO_FP(xvcvuxwsp, 4, uint32, float32, u32[j], f32[i], i, 0, 0)
|
|
||||||
|
|
||||||
/* For "use current rounding mode", define a value that will not be one of
|
/* For "use current rounding mode", define a value that will not be one of
|
||||||
* the existing rounding model enums.
|
* the existing rounding model enums.
|
||||||
|
|
Loading…
Reference in New Issue