target-ppc: Eliminate set_fprf Argument From helper_compute_fprf
The set_fprf argument to the helper_compute_fprf helper function is no longer necessary -- the helper is only invoked when FPSCR[FPRF] is going to be set. Eliminate the unnecessary argument from the function signature and its corresponding implementation. Change the return value of the helper to "void". Update the name of the local variable "ret" to "fprf", which now makes more sense. Signed-off-by: Tom Musta <tommusta@gmail.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
7d45556eff
commit
58dd0a4787
@ -63,59 +63,55 @@ static inline int ppc_float64_get_unbiased_exp(float64 f)
|
|||||||
return ((f >> 52) & 0x7FF) - 1023;
|
return ((f >> 52) & 0x7FF) - 1023;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t helper_compute_fprf(CPUPPCState *env, uint64_t arg, uint32_t set_fprf)
|
void helper_compute_fprf(CPUPPCState *env, uint64_t arg)
|
||||||
{
|
{
|
||||||
CPU_DoubleU farg;
|
CPU_DoubleU farg;
|
||||||
int isneg;
|
int isneg;
|
||||||
int ret;
|
int fprf;
|
||||||
|
|
||||||
farg.ll = arg;
|
farg.ll = arg;
|
||||||
isneg = float64_is_neg(farg.d);
|
isneg = float64_is_neg(farg.d);
|
||||||
if (unlikely(float64_is_any_nan(farg.d))) {
|
if (unlikely(float64_is_any_nan(farg.d))) {
|
||||||
if (float64_is_signaling_nan(farg.d)) {
|
if (float64_is_signaling_nan(farg.d)) {
|
||||||
/* Signaling NaN: flags are undefined */
|
/* Signaling NaN: flags are undefined */
|
||||||
ret = 0x00;
|
fprf = 0x00;
|
||||||
} else {
|
} else {
|
||||||
/* Quiet NaN */
|
/* Quiet NaN */
|
||||||
ret = 0x11;
|
fprf = 0x11;
|
||||||
}
|
}
|
||||||
} else if (unlikely(float64_is_infinity(farg.d))) {
|
} else if (unlikely(float64_is_infinity(farg.d))) {
|
||||||
/* +/- infinity */
|
/* +/- infinity */
|
||||||
if (isneg) {
|
if (isneg) {
|
||||||
ret = 0x09;
|
fprf = 0x09;
|
||||||
} else {
|
} else {
|
||||||
ret = 0x05;
|
fprf = 0x05;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (float64_is_zero(farg.d)) {
|
if (float64_is_zero(farg.d)) {
|
||||||
/* +/- zero */
|
/* +/- zero */
|
||||||
if (isneg) {
|
if (isneg) {
|
||||||
ret = 0x12;
|
fprf = 0x12;
|
||||||
} else {
|
} else {
|
||||||
ret = 0x02;
|
fprf = 0x02;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (isden(farg.d)) {
|
if (isden(farg.d)) {
|
||||||
/* Denormalized numbers */
|
/* Denormalized numbers */
|
||||||
ret = 0x10;
|
fprf = 0x10;
|
||||||
} else {
|
} else {
|
||||||
/* Normalized numbers */
|
/* Normalized numbers */
|
||||||
ret = 0x00;
|
fprf = 0x00;
|
||||||
}
|
}
|
||||||
if (isneg) {
|
if (isneg) {
|
||||||
ret |= 0x08;
|
fprf |= 0x08;
|
||||||
} else {
|
} else {
|
||||||
ret |= 0x04;
|
fprf |= 0x04;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (set_fprf) {
|
|
||||||
/* We update FPSCR_FPRF */
|
/* We update FPSCR_FPRF */
|
||||||
env->fpscr &= ~(0x1F << FPSCR_FPRF);
|
env->fpscr &= ~(0x1F << FPSCR_FPRF);
|
||||||
env->fpscr |= ret << FPSCR_FPRF;
|
env->fpscr |= fprf << FPSCR_FPRF;
|
||||||
}
|
|
||||||
/* We just need fpcc to update Rc1 */
|
|
||||||
return ret & 0xF;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Floating-point invalid operations exception */
|
/* Floating-point invalid operations exception */
|
||||||
@ -1853,7 +1849,7 @@ void helper_##name(CPUPPCState *env, uint32_t opcode) \
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (sfprf) { \
|
if (sfprf) { \
|
||||||
helper_compute_fprf(env, xt.fld, sfprf); \
|
helper_compute_fprf(env, xt.fld); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
putVSR(xT(opcode), &xt, env); \
|
putVSR(xT(opcode), &xt, env); \
|
||||||
@ -1908,7 +1904,7 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (sfprf) { \
|
if (sfprf) { \
|
||||||
helper_compute_fprf(env, xt.fld, sfprf); \
|
helper_compute_fprf(env, xt.fld); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -1962,7 +1958,7 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (sfprf) { \
|
if (sfprf) { \
|
||||||
helper_compute_fprf(env, xt.fld, sfprf); \
|
helper_compute_fprf(env, xt.fld); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -2003,7 +1999,7 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (sfprf) { \
|
if (sfprf) { \
|
||||||
helper_compute_fprf(env, xt.fld, sfprf); \
|
helper_compute_fprf(env, xt.fld); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -2052,7 +2048,7 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (sfprf) { \
|
if (sfprf) { \
|
||||||
helper_compute_fprf(env, xt.fld, sfprf); \
|
helper_compute_fprf(env, xt.fld); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -2102,7 +2098,7 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (sfprf) { \
|
if (sfprf) { \
|
||||||
helper_compute_fprf(env, xt.fld, sfprf); \
|
helper_compute_fprf(env, xt.fld); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -2302,7 +2298,7 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (sfprf) { \
|
if (sfprf) { \
|
||||||
helper_compute_fprf(env, xt_out.fld, sfprf); \
|
helper_compute_fprf(env, xt_out.fld); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
putVSR(xT(opcode), &xt_out, env); \
|
putVSR(xT(opcode), &xt_out, env); \
|
||||||
@ -2509,7 +2505,7 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
|||||||
} \
|
} \
|
||||||
if (sfprf) { \
|
if (sfprf) { \
|
||||||
helper_compute_fprf(env, ttp##_to_float64(xt.tfld, \
|
helper_compute_fprf(env, ttp##_to_float64(xt.tfld, \
|
||||||
&env->fp_status), sfprf); \
|
&env->fp_status)); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -2619,7 +2615,7 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
|||||||
xt.tfld = helper_frsp(env, xt.tfld); \
|
xt.tfld = helper_frsp(env, xt.tfld); \
|
||||||
} \
|
} \
|
||||||
if (sfprf) { \
|
if (sfprf) { \
|
||||||
helper_compute_fprf(env, xt.tfld, sfprf); \
|
helper_compute_fprf(env, xt.tfld); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -2674,7 +2670,7 @@ void helper_##op(CPUPPCState *env, uint32_t opcode) \
|
|||||||
xt.fld = tp##_round_to_int(xb.fld, &env->fp_status); \
|
xt.fld = tp##_round_to_int(xb.fld, &env->fp_status); \
|
||||||
} \
|
} \
|
||||||
if (sfprf) { \
|
if (sfprf) { \
|
||||||
helper_compute_fprf(env, xt.fld, sfprf); \
|
helper_compute_fprf(env, xt.fld); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@ -2714,7 +2710,7 @@ uint64_t helper_xsrsp(CPUPPCState *env, uint64_t xb)
|
|||||||
|
|
||||||
uint64_t xt = helper_frsp(env, xb);
|
uint64_t xt = helper_frsp(env, xb);
|
||||||
|
|
||||||
helper_compute_fprf(env, xt, 1);
|
helper_compute_fprf(env, xt);
|
||||||
helper_float_check_status(env);
|
helper_float_check_status(env);
|
||||||
return xt;
|
return xt;
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ DEF_HELPER_FLAGS_2(brinc, TCG_CALL_NO_RWG_SE, tl, tl, tl)
|
|||||||
|
|
||||||
DEF_HELPER_1(float_check_status, void, env)
|
DEF_HELPER_1(float_check_status, void, env)
|
||||||
DEF_HELPER_1(reset_fpstatus, void, env)
|
DEF_HELPER_1(reset_fpstatus, void, env)
|
||||||
DEF_HELPER_3(compute_fprf, i32, env, i64, i32)
|
DEF_HELPER_2(compute_fprf, void, env, i64)
|
||||||
DEF_HELPER_3(store_fpscr, void, env, i64, i32)
|
DEF_HELPER_3(store_fpscr, void, env, i64, i32)
|
||||||
DEF_HELPER_2(fpscr_clrbit, void, env, i32)
|
DEF_HELPER_2(fpscr_clrbit, void, env, i32)
|
||||||
DEF_HELPER_2(fpscr_setbit, void, env, i32)
|
DEF_HELPER_2(fpscr_setbit, void, env, i32)
|
||||||
|
@ -252,14 +252,8 @@ static inline void gen_reset_fpstatus(void)
|
|||||||
|
|
||||||
static inline void gen_compute_fprf(TCGv_i64 arg)
|
static inline void gen_compute_fprf(TCGv_i64 arg)
|
||||||
{
|
{
|
||||||
TCGv_i32 t0 = tcg_temp_new_i32();
|
gen_helper_compute_fprf(cpu_env, arg);
|
||||||
|
|
||||||
/* This case might be optimized later */
|
|
||||||
tcg_gen_movi_i32(t0, 1);
|
|
||||||
gen_helper_compute_fprf(t0, cpu_env, arg, t0);
|
|
||||||
gen_helper_float_check_status(cpu_env);
|
gen_helper_float_check_status(cpu_env);
|
||||||
|
|
||||||
tcg_temp_free_i32(t0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void gen_set_access_type(DisasContext *ctx, int access_type)
|
static inline void gen_set_access_type(DisasContext *ctx, int access_type)
|
||||||
|
Loading…
Reference in New Issue
Block a user