target-mips: Restore the order of helpers
Restore the order of helpers that used to be: unary operations (generic, then MIPS-specific), binary operations (generic, then MIPS-specific), compare operations. At one point FMA operations were inserted at a random place in the file, disregarding the preexisting order, and later on even more operations sprinkled across the file. Revert the mess by moving FMA operations to a new ternary class inserted after the binary class and move the misplaced unary and binary operations to where they belong. Signed-off-by: Maciej W. Rozycki <macro@codesourcery.com> Signed-off-by: Leon Alrae <leon.alrae@imgtec.com>
This commit is contained in:
parent
51fdea945a
commit
8fc605b8aa
@ -2935,110 +2935,6 @@ FLOAT_UNOP(abs)
|
|||||||
FLOAT_UNOP(chs)
|
FLOAT_UNOP(chs)
|
||||||
#undef FLOAT_UNOP
|
#undef FLOAT_UNOP
|
||||||
|
|
||||||
#define FLOAT_FMADDSUB(name, bits, muladd_arg) \
|
|
||||||
uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env, \
|
|
||||||
uint ## bits ## _t fs, \
|
|
||||||
uint ## bits ## _t ft, \
|
|
||||||
uint ## bits ## _t fd) \
|
|
||||||
{ \
|
|
||||||
uint ## bits ## _t fdret; \
|
|
||||||
\
|
|
||||||
fdret = float ## bits ## _muladd(fs, ft, fd, muladd_arg, \
|
|
||||||
&env->active_fpu.fp_status); \
|
|
||||||
update_fcr31(env, GETPC()); \
|
|
||||||
return fdret; \
|
|
||||||
}
|
|
||||||
|
|
||||||
FLOAT_FMADDSUB(maddf_s, 32, 0)
|
|
||||||
FLOAT_FMADDSUB(maddf_d, 64, 0)
|
|
||||||
FLOAT_FMADDSUB(msubf_s, 32, float_muladd_negate_product)
|
|
||||||
FLOAT_FMADDSUB(msubf_d, 64, float_muladd_negate_product)
|
|
||||||
#undef FLOAT_FMADDSUB
|
|
||||||
|
|
||||||
#define FLOAT_MINMAX(name, bits, minmaxfunc) \
|
|
||||||
uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env, \
|
|
||||||
uint ## bits ## _t fs, \
|
|
||||||
uint ## bits ## _t ft) \
|
|
||||||
{ \
|
|
||||||
uint ## bits ## _t fdret; \
|
|
||||||
\
|
|
||||||
fdret = float ## bits ## _ ## minmaxfunc(fs, ft, \
|
|
||||||
&env->active_fpu.fp_status); \
|
|
||||||
update_fcr31(env, GETPC()); \
|
|
||||||
return fdret; \
|
|
||||||
}
|
|
||||||
|
|
||||||
FLOAT_MINMAX(max_s, 32, maxnum)
|
|
||||||
FLOAT_MINMAX(max_d, 64, maxnum)
|
|
||||||
FLOAT_MINMAX(maxa_s, 32, maxnummag)
|
|
||||||
FLOAT_MINMAX(maxa_d, 64, maxnummag)
|
|
||||||
|
|
||||||
FLOAT_MINMAX(min_s, 32, minnum)
|
|
||||||
FLOAT_MINMAX(min_d, 64, minnum)
|
|
||||||
FLOAT_MINMAX(mina_s, 32, minnummag)
|
|
||||||
FLOAT_MINMAX(mina_d, 64, minnummag)
|
|
||||||
#undef FLOAT_MINMAX
|
|
||||||
|
|
||||||
#define FLOAT_RINT(name, bits) \
|
|
||||||
uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env, \
|
|
||||||
uint ## bits ## _t fs) \
|
|
||||||
{ \
|
|
||||||
uint ## bits ## _t fdret; \
|
|
||||||
\
|
|
||||||
fdret = float ## bits ## _round_to_int(fs, &env->active_fpu.fp_status); \
|
|
||||||
update_fcr31(env, GETPC()); \
|
|
||||||
return fdret; \
|
|
||||||
}
|
|
||||||
|
|
||||||
FLOAT_RINT(rint_s, 32)
|
|
||||||
FLOAT_RINT(rint_d, 64)
|
|
||||||
#undef FLOAT_RINT
|
|
||||||
|
|
||||||
#define FLOAT_CLASS_SIGNALING_NAN 0x001
|
|
||||||
#define FLOAT_CLASS_QUIET_NAN 0x002
|
|
||||||
#define FLOAT_CLASS_NEGATIVE_INFINITY 0x004
|
|
||||||
#define FLOAT_CLASS_NEGATIVE_NORMAL 0x008
|
|
||||||
#define FLOAT_CLASS_NEGATIVE_SUBNORMAL 0x010
|
|
||||||
#define FLOAT_CLASS_NEGATIVE_ZERO 0x020
|
|
||||||
#define FLOAT_CLASS_POSITIVE_INFINITY 0x040
|
|
||||||
#define FLOAT_CLASS_POSITIVE_NORMAL 0x080
|
|
||||||
#define FLOAT_CLASS_POSITIVE_SUBNORMAL 0x100
|
|
||||||
#define FLOAT_CLASS_POSITIVE_ZERO 0x200
|
|
||||||
|
|
||||||
#define FLOAT_CLASS(name, bits) \
|
|
||||||
uint ## bits ## _t helper_float_ ## name (uint ## bits ## _t arg) \
|
|
||||||
{ \
|
|
||||||
if (float ## bits ## _is_signaling_nan(arg)) { \
|
|
||||||
return FLOAT_CLASS_SIGNALING_NAN; \
|
|
||||||
} else if (float ## bits ## _is_quiet_nan(arg)) { \
|
|
||||||
return FLOAT_CLASS_QUIET_NAN; \
|
|
||||||
} else if (float ## bits ## _is_neg(arg)) { \
|
|
||||||
if (float ## bits ## _is_infinity(arg)) { \
|
|
||||||
return FLOAT_CLASS_NEGATIVE_INFINITY; \
|
|
||||||
} else if (float ## bits ## _is_zero(arg)) { \
|
|
||||||
return FLOAT_CLASS_NEGATIVE_ZERO; \
|
|
||||||
} else if (float ## bits ## _is_zero_or_denormal(arg)) { \
|
|
||||||
return FLOAT_CLASS_NEGATIVE_SUBNORMAL; \
|
|
||||||
} else { \
|
|
||||||
return FLOAT_CLASS_NEGATIVE_NORMAL; \
|
|
||||||
} \
|
|
||||||
} else { \
|
|
||||||
if (float ## bits ## _is_infinity(arg)) { \
|
|
||||||
return FLOAT_CLASS_POSITIVE_INFINITY; \
|
|
||||||
} else if (float ## bits ## _is_zero(arg)) { \
|
|
||||||
return FLOAT_CLASS_POSITIVE_ZERO; \
|
|
||||||
} else if (float ## bits ## _is_zero_or_denormal(arg)) { \
|
|
||||||
return FLOAT_CLASS_POSITIVE_SUBNORMAL; \
|
|
||||||
} else { \
|
|
||||||
return FLOAT_CLASS_POSITIVE_NORMAL; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
FLOAT_CLASS(class_s, 32)
|
|
||||||
FLOAT_CLASS(class_d, 64)
|
|
||||||
#undef FLOAT_CLASS
|
|
||||||
|
|
||||||
/* MIPS specific unary operations */
|
/* MIPS specific unary operations */
|
||||||
uint64_t helper_float_recip_d(CPUMIPSState *env, uint64_t fdt0)
|
uint64_t helper_float_recip_d(CPUMIPSState *env, uint64_t fdt0)
|
||||||
{
|
{
|
||||||
@ -3140,6 +3036,66 @@ uint64_t helper_float_rsqrt1_ps(CPUMIPSState *env, uint64_t fdt0)
|
|||||||
return ((uint64_t)fsth2 << 32) | fst2;
|
return ((uint64_t)fsth2 << 32) | fst2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define FLOAT_RINT(name, bits) \
|
||||||
|
uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env, \
|
||||||
|
uint ## bits ## _t fs) \
|
||||||
|
{ \
|
||||||
|
uint ## bits ## _t fdret; \
|
||||||
|
\
|
||||||
|
fdret = float ## bits ## _round_to_int(fs, &env->active_fpu.fp_status); \
|
||||||
|
update_fcr31(env, GETPC()); \
|
||||||
|
return fdret; \
|
||||||
|
}
|
||||||
|
|
||||||
|
FLOAT_RINT(rint_s, 32)
|
||||||
|
FLOAT_RINT(rint_d, 64)
|
||||||
|
#undef FLOAT_RINT
|
||||||
|
|
||||||
|
#define FLOAT_CLASS_SIGNALING_NAN 0x001
|
||||||
|
#define FLOAT_CLASS_QUIET_NAN 0x002
|
||||||
|
#define FLOAT_CLASS_NEGATIVE_INFINITY 0x004
|
||||||
|
#define FLOAT_CLASS_NEGATIVE_NORMAL 0x008
|
||||||
|
#define FLOAT_CLASS_NEGATIVE_SUBNORMAL 0x010
|
||||||
|
#define FLOAT_CLASS_NEGATIVE_ZERO 0x020
|
||||||
|
#define FLOAT_CLASS_POSITIVE_INFINITY 0x040
|
||||||
|
#define FLOAT_CLASS_POSITIVE_NORMAL 0x080
|
||||||
|
#define FLOAT_CLASS_POSITIVE_SUBNORMAL 0x100
|
||||||
|
#define FLOAT_CLASS_POSITIVE_ZERO 0x200
|
||||||
|
|
||||||
|
#define FLOAT_CLASS(name, bits) \
|
||||||
|
uint ## bits ## _t helper_float_ ## name (uint ## bits ## _t arg) \
|
||||||
|
{ \
|
||||||
|
if (float ## bits ## _is_signaling_nan(arg)) { \
|
||||||
|
return FLOAT_CLASS_SIGNALING_NAN; \
|
||||||
|
} else if (float ## bits ## _is_quiet_nan(arg)) { \
|
||||||
|
return FLOAT_CLASS_QUIET_NAN; \
|
||||||
|
} else if (float ## bits ## _is_neg(arg)) { \
|
||||||
|
if (float ## bits ## _is_infinity(arg)) { \
|
||||||
|
return FLOAT_CLASS_NEGATIVE_INFINITY; \
|
||||||
|
} else if (float ## bits ## _is_zero(arg)) { \
|
||||||
|
return FLOAT_CLASS_NEGATIVE_ZERO; \
|
||||||
|
} else if (float ## bits ## _is_zero_or_denormal(arg)) { \
|
||||||
|
return FLOAT_CLASS_NEGATIVE_SUBNORMAL; \
|
||||||
|
} else { \
|
||||||
|
return FLOAT_CLASS_NEGATIVE_NORMAL; \
|
||||||
|
} \
|
||||||
|
} else { \
|
||||||
|
if (float ## bits ## _is_infinity(arg)) { \
|
||||||
|
return FLOAT_CLASS_POSITIVE_INFINITY; \
|
||||||
|
} else if (float ## bits ## _is_zero(arg)) { \
|
||||||
|
return FLOAT_CLASS_POSITIVE_ZERO; \
|
||||||
|
} else if (float ## bits ## _is_zero_or_denormal(arg)) { \
|
||||||
|
return FLOAT_CLASS_POSITIVE_SUBNORMAL; \
|
||||||
|
} else { \
|
||||||
|
return FLOAT_CLASS_POSITIVE_NORMAL; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
FLOAT_CLASS(class_s, 32)
|
||||||
|
FLOAT_CLASS(class_d, 64)
|
||||||
|
#undef FLOAT_CLASS
|
||||||
|
|
||||||
/* binary operations */
|
/* binary operations */
|
||||||
#define FLOAT_BINOP(name) \
|
#define FLOAT_BINOP(name) \
|
||||||
uint64_t helper_float_ ## name ## _d(CPUMIPSState *env, \
|
uint64_t helper_float_ ## name ## _d(CPUMIPSState *env, \
|
||||||
@ -3185,61 +3141,6 @@ FLOAT_BINOP(mul)
|
|||||||
FLOAT_BINOP(div)
|
FLOAT_BINOP(div)
|
||||||
#undef FLOAT_BINOP
|
#undef FLOAT_BINOP
|
||||||
|
|
||||||
#define UNFUSED_FMA(prefix, a, b, c, flags) \
|
|
||||||
{ \
|
|
||||||
a = prefix##_mul(a, b, &env->active_fpu.fp_status); \
|
|
||||||
if ((flags) & float_muladd_negate_c) { \
|
|
||||||
a = prefix##_sub(a, c, &env->active_fpu.fp_status); \
|
|
||||||
} else { \
|
|
||||||
a = prefix##_add(a, c, &env->active_fpu.fp_status); \
|
|
||||||
} \
|
|
||||||
if ((flags) & float_muladd_negate_result) { \
|
|
||||||
a = prefix##_chs(a); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FMA based operations */
|
|
||||||
#define FLOAT_FMA(name, type) \
|
|
||||||
uint64_t helper_float_ ## name ## _d(CPUMIPSState *env, \
|
|
||||||
uint64_t fdt0, uint64_t fdt1, \
|
|
||||||
uint64_t fdt2) \
|
|
||||||
{ \
|
|
||||||
UNFUSED_FMA(float64, fdt0, fdt1, fdt2, type); \
|
|
||||||
update_fcr31(env, GETPC()); \
|
|
||||||
return fdt0; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
uint32_t helper_float_ ## name ## _s(CPUMIPSState *env, \
|
|
||||||
uint32_t fst0, uint32_t fst1, \
|
|
||||||
uint32_t fst2) \
|
|
||||||
{ \
|
|
||||||
UNFUSED_FMA(float32, fst0, fst1, fst2, type); \
|
|
||||||
update_fcr31(env, GETPC()); \
|
|
||||||
return fst0; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
uint64_t helper_float_ ## name ## _ps(CPUMIPSState *env, \
|
|
||||||
uint64_t fdt0, uint64_t fdt1, \
|
|
||||||
uint64_t fdt2) \
|
|
||||||
{ \
|
|
||||||
uint32_t fst0 = fdt0 & 0XFFFFFFFF; \
|
|
||||||
uint32_t fsth0 = fdt0 >> 32; \
|
|
||||||
uint32_t fst1 = fdt1 & 0XFFFFFFFF; \
|
|
||||||
uint32_t fsth1 = fdt1 >> 32; \
|
|
||||||
uint32_t fst2 = fdt2 & 0XFFFFFFFF; \
|
|
||||||
uint32_t fsth2 = fdt2 >> 32; \
|
|
||||||
\
|
|
||||||
UNFUSED_FMA(float32, fst0, fst1, fst2, type); \
|
|
||||||
UNFUSED_FMA(float32, fsth0, fsth1, fsth2, type); \
|
|
||||||
update_fcr31(env, GETPC()); \
|
|
||||||
return ((uint64_t)fsth0 << 32) | fst0; \
|
|
||||||
}
|
|
||||||
FLOAT_FMA(madd, 0)
|
|
||||||
FLOAT_FMA(msub, float_muladd_negate_c)
|
|
||||||
FLOAT_FMA(nmadd, float_muladd_negate_result)
|
|
||||||
FLOAT_FMA(nmsub, float_muladd_negate_result | float_muladd_negate_c)
|
|
||||||
#undef FLOAT_FMA
|
|
||||||
|
|
||||||
/* MIPS specific binary operations */
|
/* MIPS specific binary operations */
|
||||||
uint64_t helper_float_recip2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2)
|
uint64_t helper_float_recip2_d(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt2)
|
||||||
{
|
{
|
||||||
@ -3337,6 +3238,106 @@ uint64_t helper_float_mulr_ps(CPUMIPSState *env, uint64_t fdt0, uint64_t fdt1)
|
|||||||
return ((uint64_t)fsth2 << 32) | fst2;
|
return ((uint64_t)fsth2 << 32) | fst2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define FLOAT_MINMAX(name, bits, minmaxfunc) \
|
||||||
|
uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env, \
|
||||||
|
uint ## bits ## _t fs, \
|
||||||
|
uint ## bits ## _t ft) \
|
||||||
|
{ \
|
||||||
|
uint ## bits ## _t fdret; \
|
||||||
|
\
|
||||||
|
fdret = float ## bits ## _ ## minmaxfunc(fs, ft, \
|
||||||
|
&env->active_fpu.fp_status); \
|
||||||
|
update_fcr31(env, GETPC()); \
|
||||||
|
return fdret; \
|
||||||
|
}
|
||||||
|
|
||||||
|
FLOAT_MINMAX(max_s, 32, maxnum)
|
||||||
|
FLOAT_MINMAX(max_d, 64, maxnum)
|
||||||
|
FLOAT_MINMAX(maxa_s, 32, maxnummag)
|
||||||
|
FLOAT_MINMAX(maxa_d, 64, maxnummag)
|
||||||
|
|
||||||
|
FLOAT_MINMAX(min_s, 32, minnum)
|
||||||
|
FLOAT_MINMAX(min_d, 64, minnum)
|
||||||
|
FLOAT_MINMAX(mina_s, 32, minnummag)
|
||||||
|
FLOAT_MINMAX(mina_d, 64, minnummag)
|
||||||
|
#undef FLOAT_MINMAX
|
||||||
|
|
||||||
|
/* ternary operations */
|
||||||
|
#define UNFUSED_FMA(prefix, a, b, c, flags) \
|
||||||
|
{ \
|
||||||
|
a = prefix##_mul(a, b, &env->active_fpu.fp_status); \
|
||||||
|
if ((flags) & float_muladd_negate_c) { \
|
||||||
|
a = prefix##_sub(a, c, &env->active_fpu.fp_status); \
|
||||||
|
} else { \
|
||||||
|
a = prefix##_add(a, c, &env->active_fpu.fp_status); \
|
||||||
|
} \
|
||||||
|
if ((flags) & float_muladd_negate_result) { \
|
||||||
|
a = prefix##_chs(a); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FMA based operations */
|
||||||
|
#define FLOAT_FMA(name, type) \
|
||||||
|
uint64_t helper_float_ ## name ## _d(CPUMIPSState *env, \
|
||||||
|
uint64_t fdt0, uint64_t fdt1, \
|
||||||
|
uint64_t fdt2) \
|
||||||
|
{ \
|
||||||
|
UNFUSED_FMA(float64, fdt0, fdt1, fdt2, type); \
|
||||||
|
update_fcr31(env, GETPC()); \
|
||||||
|
return fdt0; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
uint32_t helper_float_ ## name ## _s(CPUMIPSState *env, \
|
||||||
|
uint32_t fst0, uint32_t fst1, \
|
||||||
|
uint32_t fst2) \
|
||||||
|
{ \
|
||||||
|
UNFUSED_FMA(float32, fst0, fst1, fst2, type); \
|
||||||
|
update_fcr31(env, GETPC()); \
|
||||||
|
return fst0; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
uint64_t helper_float_ ## name ## _ps(CPUMIPSState *env, \
|
||||||
|
uint64_t fdt0, uint64_t fdt1, \
|
||||||
|
uint64_t fdt2) \
|
||||||
|
{ \
|
||||||
|
uint32_t fst0 = fdt0 & 0XFFFFFFFF; \
|
||||||
|
uint32_t fsth0 = fdt0 >> 32; \
|
||||||
|
uint32_t fst1 = fdt1 & 0XFFFFFFFF; \
|
||||||
|
uint32_t fsth1 = fdt1 >> 32; \
|
||||||
|
uint32_t fst2 = fdt2 & 0XFFFFFFFF; \
|
||||||
|
uint32_t fsth2 = fdt2 >> 32; \
|
||||||
|
\
|
||||||
|
UNFUSED_FMA(float32, fst0, fst1, fst2, type); \
|
||||||
|
UNFUSED_FMA(float32, fsth0, fsth1, fsth2, type); \
|
||||||
|
update_fcr31(env, GETPC()); \
|
||||||
|
return ((uint64_t)fsth0 << 32) | fst0; \
|
||||||
|
}
|
||||||
|
FLOAT_FMA(madd, 0)
|
||||||
|
FLOAT_FMA(msub, float_muladd_negate_c)
|
||||||
|
FLOAT_FMA(nmadd, float_muladd_negate_result)
|
||||||
|
FLOAT_FMA(nmsub, float_muladd_negate_result | float_muladd_negate_c)
|
||||||
|
#undef FLOAT_FMA
|
||||||
|
|
||||||
|
#define FLOAT_FMADDSUB(name, bits, muladd_arg) \
|
||||||
|
uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env, \
|
||||||
|
uint ## bits ## _t fs, \
|
||||||
|
uint ## bits ## _t ft, \
|
||||||
|
uint ## bits ## _t fd) \
|
||||||
|
{ \
|
||||||
|
uint ## bits ## _t fdret; \
|
||||||
|
\
|
||||||
|
fdret = float ## bits ## _muladd(fs, ft, fd, muladd_arg, \
|
||||||
|
&env->active_fpu.fp_status); \
|
||||||
|
update_fcr31(env, GETPC()); \
|
||||||
|
return fdret; \
|
||||||
|
}
|
||||||
|
|
||||||
|
FLOAT_FMADDSUB(maddf_s, 32, 0)
|
||||||
|
FLOAT_FMADDSUB(maddf_d, 64, 0)
|
||||||
|
FLOAT_FMADDSUB(msubf_s, 32, float_muladd_negate_product)
|
||||||
|
FLOAT_FMADDSUB(msubf_d, 64, float_muladd_negate_product)
|
||||||
|
#undef FLOAT_FMADDSUB
|
||||||
|
|
||||||
/* compare operations */
|
/* compare operations */
|
||||||
#define FOP_COND_D(op, cond) \
|
#define FOP_COND_D(op, cond) \
|
||||||
void helper_cmp_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \
|
void helper_cmp_d_ ## op(CPUMIPSState *env, uint64_t fdt0, \
|
||||||
|
Loading…
Reference in New Issue
Block a user