Commit c26e4876d1 for qemu.org
commit c26e4876d108f517fb579c2af93960c8035e8d1a
Author: Richard Henderson <richard.henderson@linaro.org>
Date: Fri May 1 15:58:46 2026 +1000
fpu: Use {get,set}_float_rounding_mode everywhere
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
index bc348f75a3..7311c3696e 100644
--- a/fpu/softfloat-parts.c.inc
+++ b/fpu/softfloat-parts.c.inc
@@ -300,7 +300,7 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
int exp;
FloatExceptionFlags flags = 0;
- switch (s->float_rounding_mode) {
+ switch (get_float_rounding_mode(s)) {
case float_round_nearest_even_max:
overflow_norm = true;
/* fall through */
@@ -431,7 +431,7 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
if (p->frac_lo & round_mask) {
/* Need to recompute round-to-even/round-to-odd. */
- switch (s->float_rounding_mode) {
+ switch (get_float_rounding_mode(s)) {
case float_round_nearest_even:
if (N > 64 && frac_lsb == 0) {
inc = ((p->frac_hi & 1) ||
@@ -558,7 +558,7 @@ FloatPartsN partsN(addsub)(const FloatPartsN *a_orig,
if (ab_mask == float_cmask_zero) {
/* 0 - 0 */
- a.sign = s->float_rounding_mode == float_round_down;
+ a.sign = get_float_rounding_mode(s) == float_round_down;
return a;
}
@@ -763,7 +763,7 @@ FloatPartsN partsN(muladd)(const FloatPartsN *a, const FloatPartsN *b,
return_sub_zero:
/* 0 - 0 == -0 for round_down, +0 otherwise. */
return (FloatPartsN){
- .sign = s->float_rounding_mode == float_round_down,
+ .sign = get_float_rounding_mode(s) == float_round_down,
.cls = float_class_zero
};
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 391d8f3169..d99543cc60 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -234,7 +234,7 @@ static inline bool can_use_fpu(const float_status *s)
return false;
}
return likely(s->float_exception_flags & float_flag_inexact &&
- s->float_rounding_mode == float_round_nearest_even);
+ get_float_rounding_mode(s) == float_round_nearest_even);
}
/*
@@ -2803,7 +2803,7 @@ float16 float16_round_to_int(float16 a, float_status *s)
{
FloatParts64 p = float16_unpack_canonical(a, s);
- p = parts64_round_to_int(&p, s->float_rounding_mode, 0, s,
+ p = parts64_round_to_int(&p, get_float_rounding_mode(s), 0, s,
&float16_params);
return float16_round_pack_canonical(&p, s);
}
@@ -2812,7 +2812,7 @@ float32 float32_round_to_int(float32 a, float_status *s)
{
FloatParts64 p = float32_unpack_canonical(a, s);
- p = parts64_round_to_int(&p, s->float_rounding_mode, 0, s,
+ p = parts64_round_to_int(&p, get_float_rounding_mode(s), 0, s,
&float32_params);
return float32_round_pack_canonical(&p, s);
}
@@ -2821,7 +2821,7 @@ float64 float64_round_to_int(float64 a, float_status *s)
{
FloatParts64 p = float64_unpack_canonical(a, s);
- p = parts64_round_to_int(&p, s->float_rounding_mode, 0, s,
+ p = parts64_round_to_int(&p, get_float_rounding_mode(s), 0, s,
&float64_params);
return float64_round_pack_canonical(&p, s);
}
@@ -2830,7 +2830,7 @@ bfloat16 bfloat16_round_to_int(bfloat16 a, float_status *s)
{
FloatParts64 p = bfloat16_unpack_canonical(a, s);
- p = parts64_round_to_int(&p, s->float_rounding_mode, 0, s,
+ p = parts64_round_to_int(&p, get_float_rounding_mode(s), 0, s,
&bfloat16_params);
return bfloat16_round_pack_canonical(&p, s);
}
@@ -2839,7 +2839,7 @@ float128 float128_round_to_int(float128 a, float_status *s)
{
FloatParts128 p = float128_unpack_canonical(a, s);
- p = parts128_round_to_int(&p, s->float_rounding_mode, 0, s,
+ p = parts128_round_to_int(&p, get_float_rounding_mode(s), 0, s,
&float128_params);
return float128_round_pack_canonical(&p, s);
}
@@ -2852,7 +2852,7 @@ floatx80 floatx80_round_to_int(floatx80 a, float_status *status)
return floatx80_default_nan(status);
}
- p = parts128_round_to_int(&p, status->float_rounding_mode, 0, status,
+ p = parts128_round_to_int(&p, get_float_rounding_mode(status), 0, status,
&floatx80_params[status->floatx80_rounding_precision]);
return floatx80_round_pack_canonical(&p, status);
}
@@ -3050,77 +3050,77 @@ static int64_t floatx80_to_int64_scalbn(floatx80 a, FloatRoundMode rmode,
int8_t float16_to_int8(float16 a, float_status *s)
{
- return float16_to_int8_scalbn(a, s->float_rounding_mode, 0, s);
+ return float16_to_int8_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int16_t float16_to_int16(float16 a, float_status *s)
{
- return float16_to_int16_scalbn(a, s->float_rounding_mode, 0, s);
+ return float16_to_int16_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int32_t float16_to_int32(float16 a, float_status *s)
{
- return float16_to_int32_scalbn(a, s->float_rounding_mode, 0, s);
+ return float16_to_int32_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int64_t float16_to_int64(float16 a, float_status *s)
{
- return float16_to_int64_scalbn(a, s->float_rounding_mode, 0, s);
+ return float16_to_int64_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int16_t float32_to_int16(float32 a, float_status *s)
{
- return float32_to_int16_scalbn(a, s->float_rounding_mode, 0, s);
+ return float32_to_int16_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int32_t float32_to_int32(float32 a, float_status *s)
{
- return float32_to_int32_scalbn(a, s->float_rounding_mode, 0, s);
+ return float32_to_int32_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int64_t float32_to_int64(float32 a, float_status *s)
{
- return float32_to_int64_scalbn(a, s->float_rounding_mode, 0, s);
+ return float32_to_int64_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int16_t float64_to_int16(float64 a, float_status *s)
{
- return float64_to_int16_scalbn(a, s->float_rounding_mode, 0, s);
+ return float64_to_int16_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int32_t float64_to_int32(float64 a, float_status *s)
{
- return float64_to_int32_scalbn(a, s->float_rounding_mode, 0, s);
+ return float64_to_int32_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int64_t float64_to_int64(float64 a, float_status *s)
{
- return float64_to_int64_scalbn(a, s->float_rounding_mode, 0, s);
+ return float64_to_int64_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int32_t float128_to_int32(float128 a, float_status *s)
{
- return float128_to_int32_scalbn(a, s->float_rounding_mode, 0, s);
+ return float128_to_int32_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int64_t float128_to_int64(float128 a, float_status *s)
{
- return float128_to_int64_scalbn(a, s->float_rounding_mode, 0, s);
+ return float128_to_int64_scalbn(a, get_float_rounding_mode(s), 0, s);
}
Int128 float128_to_int128(float128 a, float_status *s)
{
- return float128_to_int128_scalbn(a, s->float_rounding_mode, 0, s);
+ return float128_to_int128_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int32_t floatx80_to_int32(floatx80 a, float_status *s)
{
- return floatx80_to_int32_scalbn(a, s->float_rounding_mode, 0, s);
+ return floatx80_to_int32_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int64_t floatx80_to_int64(floatx80 a, float_status *s)
{
- return floatx80_to_int64_scalbn(a, s->float_rounding_mode, 0, s);
+ return floatx80_to_int64_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int16_t float16_to_int16_round_to_zero(float16 a, float_status *s)
@@ -3195,22 +3195,22 @@ int64_t floatx80_to_int64_round_to_zero(floatx80 a, float_status *s)
int8_t bfloat16_to_int8(bfloat16 a, float_status *s)
{
- return bfloat16_to_int8_scalbn(a, s->float_rounding_mode, 0, s);
+ return bfloat16_to_int8_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int16_t bfloat16_to_int16(bfloat16 a, float_status *s)
{
- return bfloat16_to_int16_scalbn(a, s->float_rounding_mode, 0, s);
+ return bfloat16_to_int16_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int32_t bfloat16_to_int32(bfloat16 a, float_status *s)
{
- return bfloat16_to_int32_scalbn(a, s->float_rounding_mode, 0, s);
+ return bfloat16_to_int32_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int64_t bfloat16_to_int64(bfloat16 a, float_status *s)
{
- return bfloat16_to_int64_scalbn(a, s->float_rounding_mode, 0, s);
+ return bfloat16_to_int64_scalbn(a, get_float_rounding_mode(s), 0, s);
}
int8_t bfloat16_to_int8_round_to_zero(bfloat16 a, float_status *s)
@@ -3489,67 +3489,67 @@ static Int128 float128_to_uint128_scalbn(float128 a, FloatRoundMode rmode,
uint8_t float16_to_uint8(float16 a, float_status *s)
{
- return float16_to_uint8_scalbn(a, s->float_rounding_mode, 0, s);
+ return float16_to_uint8_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint16_t float16_to_uint16(float16 a, float_status *s)
{
- return float16_to_uint16_scalbn(a, s->float_rounding_mode, 0, s);
+ return float16_to_uint16_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint32_t float16_to_uint32(float16 a, float_status *s)
{
- return float16_to_uint32_scalbn(a, s->float_rounding_mode, 0, s);
+ return float16_to_uint32_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint64_t float16_to_uint64(float16 a, float_status *s)
{
- return float16_to_uint64_scalbn(a, s->float_rounding_mode, 0, s);
+ return float16_to_uint64_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint16_t float32_to_uint16(float32 a, float_status *s)
{
- return float32_to_uint16_scalbn(a, s->float_rounding_mode, 0, s);
+ return float32_to_uint16_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint32_t float32_to_uint32(float32 a, float_status *s)
{
- return float32_to_uint32_scalbn(a, s->float_rounding_mode, 0, s);
+ return float32_to_uint32_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint64_t float32_to_uint64(float32 a, float_status *s)
{
- return float32_to_uint64_scalbn(a, s->float_rounding_mode, 0, s);
+ return float32_to_uint64_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint16_t float64_to_uint16(float64 a, float_status *s)
{
- return float64_to_uint16_scalbn(a, s->float_rounding_mode, 0, s);
+ return float64_to_uint16_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint32_t float64_to_uint32(float64 a, float_status *s)
{
- return float64_to_uint32_scalbn(a, s->float_rounding_mode, 0, s);
+ return float64_to_uint32_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint64_t float64_to_uint64(float64 a, float_status *s)
{
- return float64_to_uint64_scalbn(a, s->float_rounding_mode, 0, s);
+ return float64_to_uint64_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint32_t float128_to_uint32(float128 a, float_status *s)
{
- return float128_to_uint32_scalbn(a, s->float_rounding_mode, 0, s);
+ return float128_to_uint32_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint64_t float128_to_uint64(float128 a, float_status *s)
{
- return float128_to_uint64_scalbn(a, s->float_rounding_mode, 0, s);
+ return float128_to_uint64_scalbn(a, get_float_rounding_mode(s), 0, s);
}
Int128 float128_to_uint128(float128 a, float_status *s)
{
- return float128_to_uint128_scalbn(a, s->float_rounding_mode, 0, s);
+ return float128_to_uint128_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint16_t float16_to_uint16_round_to_zero(float16 a, float_status *s)
@@ -3614,22 +3614,22 @@ Int128 float128_to_uint128_round_to_zero(float128 a, float_status *s)
uint8_t bfloat16_to_uint8(bfloat16 a, float_status *s)
{
- return bfloat16_to_uint8_scalbn(a, s->float_rounding_mode, 0, s);
+ return bfloat16_to_uint8_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint16_t bfloat16_to_uint16(bfloat16 a, float_status *s)
{
- return bfloat16_to_uint16_scalbn(a, s->float_rounding_mode, 0, s);
+ return bfloat16_to_uint16_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint32_t bfloat16_to_uint32(bfloat16 a, float_status *s)
{
- return bfloat16_to_uint32_scalbn(a, s->float_rounding_mode, 0, s);
+ return bfloat16_to_uint32_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint64_t bfloat16_to_uint64(bfloat16 a, float_status *s)
{
- return bfloat16_to_uint64_scalbn(a, s->float_rounding_mode, 0, s);
+ return bfloat16_to_uint64_scalbn(a, get_float_rounding_mode(s), 0, s);
}
uint8_t bfloat16_to_uint8_round_to_zero(bfloat16 a, float_status *s)
@@ -4878,7 +4878,7 @@ floatx80 roundAndPackFloatx80(FloatX80RoundPrec roundingPrecision, bool zSign,
bool roundNearestEven, increment, isTiny;
int64_t roundIncrement, roundMask, roundBits;
- roundingMode = status->float_rounding_mode;
+ roundingMode = get_float_rounding_mode(status);
roundNearestEven = ( roundingMode == float_round_nearest_even );
switch (roundingPrecision) {
case floatx80_precision_x:
diff --git a/target/alpha/fpu_helper.c b/target/alpha/fpu_helper.c
index 9af77777da..0ced53c54e 100644
--- a/target/alpha/fpu_helper.c
+++ b/target/alpha/fpu_helper.c
@@ -485,7 +485,7 @@ static uint64_t do_cvttq(CPUAlphaState *env, uint64_t a, int roundmode)
uint64_t helper_cvttq(CPUAlphaState *env, uint64_t a)
{
- return do_cvttq(env, a, FP_STATUS.float_rounding_mode);
+ return do_cvttq(env, a, get_float_rounding_mode(&FP_STATUS));
}
uint64_t helper_cvttq_c(CPUAlphaState *env, uint64_t a)
diff --git a/target/arm/tcg/vfp_helper.c b/target/arm/tcg/vfp_helper.c
index e692bc568b..5839e82449 100644
--- a/target/arm/tcg/vfp_helper.c
+++ b/target/arm/tcg/vfp_helper.c
@@ -423,10 +423,10 @@ ftype HELPER(vfp_##name##to##p)(uint##isz##_t x, uint32_t shift, \
float_status *fpst) \
{ \
ftype ret; \
- FloatRoundMode oldmode = fpst->float_rounding_mode; \
- fpst->float_rounding_mode = float_round_nearest_even; \
+ FloatRoundMode oldmode = get_float_rounding_mode(fpst); \
+ set_float_rounding_mode(float_round_nearest_even, fpst); \
ret = itype##_to_##float##fsz##_scalbn(x, -shift, fpst); \
- fpst->float_rounding_mode = oldmode; \
+ set_float_rounding_mode(oldmode, fpst); \
return ret; \
}
@@ -663,7 +663,7 @@ static uint64_t call_recip_estimate(int *exp, int exp_off, uint64_t frac,
static bool round_to_inf(float_status *fpst, bool sign_bit)
{
- switch (fpst->float_rounding_mode) {
+ switch (get_float_rounding_mode(fpst)) {
case float_round_nearest_even: /* Round to Nearest */
return true;
case float_round_up: /* Round to +Inf */
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
index c557141f11..a90f5c87b6 100644
--- a/target/hexagon/fma_emu.c
+++ b/target/hexagon/fma_emu.c
@@ -315,7 +315,7 @@ static float64 accum_round_float64(Accum a, float_status *fp_status)
if ((int128_gethi(a.mant) == 0) && (int128_getlo(a.mant) == 0)
&& ((a.guard | a.round | a.sticky) == 0)) {
/* result zero */
- switch (fp_status->float_rounding_mode) {
+ switch (get_float_rounding_mode(fp_status)) {
case float_round_down:
return zero_float64(1);
default:
@@ -362,7 +362,7 @@ static float64 accum_round_float64(Accum a, float_status *fp_status)
/* OK, we're relatively canonical... now we need to round */
if (a.guard || a.round || a.sticky) {
float_raise(float_flag_inexact, fp_status);
- switch (fp_status->float_rounding_mode) {
+ switch (get_float_rounding_mode(fp_status)) {
case float_round_to_zero:
/* Chop and we're done */
break;
@@ -401,7 +401,7 @@ static float64 accum_round_float64(Accum a, float_status *fp_status)
/* Yep, inf result */
float_raise(float_flag_overflow, fp_status);
float_raise(float_flag_inexact, fp_status);
- switch (fp_status->float_rounding_mode) {
+ switch (get_float_rounding_mode(fp_status)) {
case float_round_to_zero:
return maxfinite_float64(a.sign);
case float_round_up:
diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h
index 99c4728ec8..5176a9f9e3 100644
--- a/target/i386/ops_sse.h
+++ b/target/i386/ops_sse.h
@@ -601,7 +601,7 @@ void glue(helper_cvtph2ps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s)
void glue(helper_cvtps2ph, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, int mode)
{
int i;
- FloatRoundMode prev_rounding_mode = env->sse_status.float_rounding_mode;
+ FloatRoundMode prev_rounding_mode = get_float_rounding_mode(&env->sse_status);
if (!(mode & (1 << 2))) {
set_x86_rounding_mode(mode & 3, &env->sse_status);
}
@@ -613,7 +613,7 @@ void glue(helper_cvtps2ph, SUFFIX)(CPUX86State *env, Reg *d, Reg *s, int mode)
d->Q(i) = 0;
}
- env->sse_status.float_rounding_mode = prev_rounding_mode;
+ set_float_rounding_mode(prev_rounding_mode, &env->sse_status);
}
#endif
@@ -1715,10 +1715,9 @@ void glue(helper_roundps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
uint32_t mode)
{
int old_flags = get_float_exception_flags(&env->sse_status);
- signed char prev_rounding_mode;
+ FloatRoundMode prev_rounding_mode = get_float_rounding_mode(&env->sse_status);
int i;
- prev_rounding_mode = env->sse_status.float_rounding_mode;
if (!(mode & (1 << 2))) {
set_x86_rounding_mode(mode & 3, &env->sse_status);
}
@@ -1732,17 +1731,16 @@ void glue(helper_roundps, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
~float_flag_inexact,
&env->sse_status);
}
- env->sse_status.float_rounding_mode = prev_rounding_mode;
+ set_float_rounding_mode(prev_rounding_mode, &env->sse_status);
}
void glue(helper_roundpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
uint32_t mode)
{
int old_flags = get_float_exception_flags(&env->sse_status);
- signed char prev_rounding_mode;
+ FloatRoundMode prev_rounding_mode = get_float_rounding_mode(&env->sse_status);
int i;
- prev_rounding_mode = env->sse_status.float_rounding_mode;
if (!(mode & (1 << 2))) {
set_x86_rounding_mode(mode & 3, &env->sse_status);
}
@@ -1756,7 +1754,7 @@ void glue(helper_roundpd, SUFFIX)(CPUX86State *env, Reg *d, Reg *s,
~float_flag_inexact,
&env->sse_status);
}
- env->sse_status.float_rounding_mode = prev_rounding_mode;
+ set_float_rounding_mode(prev_rounding_mode, &env->sse_status);
}
#if SHIFT == 1
@@ -1764,10 +1762,9 @@ void glue(helper_roundss, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s,
uint32_t mode)
{
int old_flags = get_float_exception_flags(&env->sse_status);
- signed char prev_rounding_mode;
+ FloatRoundMode prev_rounding_mode = get_float_rounding_mode(&env->sse_status);
int i;
- prev_rounding_mode = env->sse_status.float_rounding_mode;
if (!(mode & (1 << 2))) {
set_x86_rounding_mode(mode & 3, &env->sse_status);
}
@@ -1782,17 +1779,16 @@ void glue(helper_roundss, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s,
~float_flag_inexact,
&env->sse_status);
}
- env->sse_status.float_rounding_mode = prev_rounding_mode;
+ set_float_rounding_mode(prev_rounding_mode, &env->sse_status);
}
void glue(helper_roundsd, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s,
uint32_t mode)
{
int old_flags = get_float_exception_flags(&env->sse_status);
- signed char prev_rounding_mode;
+ FloatRoundMode prev_rounding_mode = get_float_rounding_mode(&env->sse_status);
int i;
- prev_rounding_mode = env->sse_status.float_rounding_mode;
if (!(mode & (1 << 2))) {
set_x86_rounding_mode(mode & 3, &env->sse_status);
}
@@ -1807,7 +1803,7 @@ void glue(helper_roundsd, SUFFIX)(CPUX86State *env, Reg *d, Reg *v, Reg *s,
~float_flag_inexact,
&env->sse_status);
}
- env->sse_status.float_rounding_mode = prev_rounding_mode;
+ set_float_rounding_mode(prev_rounding_mode, &env->sse_status);
}
#endif
diff --git a/target/i386/tcg/fpu_helper.c b/target/i386/tcg/fpu_helper.c
index 37c83ded38..7b0b0dd520 100644
--- a/target/i386/tcg/fpu_helper.c
+++ b/target/i386/tcg/fpu_helper.c
@@ -1183,10 +1183,10 @@ void helper_f2xm1(CPUX86State *env)
bool asign, bsign;
int32_t n, aexp, bexp;
uint64_t asig0, asig1, asig2, bsig0, bsig1;
- FloatRoundMode save_mode = env->fp_status.float_rounding_mode;
+ FloatRoundMode save_mode = get_float_rounding_mode(&env->fp_status);
FloatX80RoundPrec save_prec =
env->fp_status.floatx80_rounding_precision;
- env->fp_status.float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
env->fp_status.floatx80_rounding_precision = floatx80_precision_x;
/* Find the nearest multiple of 1/32 to the argument. */
@@ -1202,7 +1202,7 @@ void helper_f2xm1(CPUX86State *env)
*/
ST0 = f2xm1_table[n].t;
set_float_exception_flags(float_flag_inexact, &env->fp_status);
- env->fp_status.float_rounding_mode = save_mode;
+ set_float_rounding_mode(save_mode, &env->fp_status);
} else {
/*
* Compute the lower parts of a polynomial expansion for
@@ -1282,7 +1282,7 @@ void helper_f2xm1(CPUX86State *env)
asign = bsign;
}
}
- env->fp_status.float_rounding_mode = save_mode;
+ set_float_rounding_mode(save_mode, &env->fp_status);
/* This result is inexact. */
asig1 |= 1;
ST0 = normalizeRoundAndPackFloatx80(floatx80_precision_x,
@@ -1483,10 +1483,10 @@ void helper_fpatan(CPUX86State *env)
uint64_t azsig0, azsig1;
uint64_t azsig2, azsig3, axsig0, axsig1;
floatx80 x8;
- FloatRoundMode save_mode = env->fp_status.float_rounding_mode;
+ FloatRoundMode save_mode = get_float_rounding_mode(&env->fp_status);
FloatX80RoundPrec save_prec =
env->fp_status.floatx80_rounding_precision;
- env->fp_status.float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
env->fp_status.floatx80_rounding_precision = floatx80_precision_x;
if (arg0_exp == 0) {
@@ -1793,7 +1793,7 @@ void helper_fpatan(CPUX86State *env)
}
}
- env->fp_status.float_rounding_mode = save_mode;
+ set_float_rounding_mode(save_mode, &env->fp_status);
env->fp_status.floatx80_rounding_precision = save_prec;
}
/* This result is inexact. */
@@ -2121,10 +2121,10 @@ void helper_fyl2xp1(CPUX86State *env)
} else {
int32_t aexp;
uint64_t asig0, asig1, asig2;
- FloatRoundMode save_mode = env->fp_status.float_rounding_mode;
+ FloatRoundMode save_mode = get_float_rounding_mode(&env->fp_status);
FloatX80RoundPrec save_prec =
env->fp_status.floatx80_rounding_precision;
- env->fp_status.float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
env->fp_status.floatx80_rounding_precision = floatx80_precision_x;
helper_fyl2x_common(env, ST0, &aexp, &asig0, &asig1);
@@ -2139,7 +2139,7 @@ void helper_fyl2xp1(CPUX86State *env)
aexp += arg1_exp - 0x3ffe;
/* This result is inexact. */
asig1 |= 1;
- env->fp_status.float_rounding_mode = save_mode;
+ set_float_rounding_mode(save_mode, &env->fp_status);
ST1 = normalizeRoundAndPackFloatx80(floatx80_precision_x,
arg0_sign ^ arg1_sign, aexp,
asig0, asig1, &env->fp_status);
@@ -2224,10 +2224,10 @@ void helper_fyl2x(CPUX86State *env)
} else {
int32_t int_exp;
floatx80 arg0_m1;
- FloatRoundMode save_mode = env->fp_status.float_rounding_mode;
+ FloatRoundMode save_mode = get_float_rounding_mode(&env->fp_status);
FloatX80RoundPrec save_prec =
env->fp_status.floatx80_rounding_precision;
- env->fp_status.float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
env->fp_status.floatx80_rounding_precision = floatx80_precision_x;
if (arg0_exp == 0) {
@@ -2245,7 +2245,7 @@ void helper_fyl2x(CPUX86State *env)
floatx80_one, &env->fp_status);
if (floatx80_is_zero(arg0_m1)) {
/* Exact power of 2; multiply by ST1. */
- env->fp_status.float_rounding_mode = save_mode;
+ set_float_rounding_mode(save_mode, &env->fp_status);
ST1 = floatx80_mul(int32_to_floatx80(int_exp, &env->fp_status),
ST1, &env->fp_status);
} else {
@@ -2284,7 +2284,7 @@ void helper_fyl2x(CPUX86State *env)
aexp += arg1_exp - 0x3ffe;
/* This result is inexact. */
asig1 |= 1;
- env->fp_status.float_rounding_mode = save_mode;
+ set_float_rounding_mode(save_mode, &env->fp_status);
ST1 = normalizeRoundAndPackFloatx80(floatx80_precision_x,
asign ^ arg1_sign, aexp,
asig0, asig1, &env->fp_status);
diff --git a/target/m68k/softfloat.c b/target/m68k/softfloat.c
index d1f150e641..51706f6db8 100644
--- a/target/m68k/softfloat.c
+++ b/target/m68k/softfloat.c
@@ -266,9 +266,9 @@ floatx80 floatx80_lognp1(floatx80 a, float_status *status)
return floatx80_move(a, status);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
compact = floatx80_make_compact(aExp, aSig);
@@ -336,7 +336,7 @@ floatx80 floatx80_lognp1(floatx80 a, float_status *status)
status); /* LOG(F)+U*V*(A2+V*(A4+V*A6)) */
fp0 = floatx80_add(fp0, fp1, status); /* FP0 IS LOG(F) + LOG(1+U) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, klog2, status);
@@ -402,7 +402,7 @@ floatx80 floatx80_lognp1(floatx80 a, float_status *status)
fp0 = floatx80_mul(fp0, fp1,
status); /* U*V*([B1+W*(B3+W*B5)] + [V*(B2+W*B4)]) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, saveu, status);
@@ -464,9 +464,9 @@ floatx80 floatx80_logn(floatx80 a, float_status *status)
return floatx80_default_nan(status);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
compact = floatx80_make_compact(aExp, aSig);
@@ -523,7 +523,7 @@ floatx80 floatx80_logn(floatx80 a, float_status *status)
status); /* LOG(F)+U*V*(A2+V*(A4+V*A6)) */
fp0 = floatx80_add(fp0, fp1, status); /* FP0 IS LOG(F) + LOG(1+U) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, klog2, status);
@@ -569,7 +569,7 @@ floatx80 floatx80_logn(floatx80 a, float_status *status)
fp0 = floatx80_mul(fp0, fp1,
status); /* U*V*([B1+W*(B3+W*B5)] + [V*(B2+W*B4)]) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, saveu, status);
@@ -620,15 +620,15 @@ floatx80 floatx80_log10(floatx80 a, float_status *status)
return floatx80_default_nan(status);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
fp0 = floatx80_logn(a, status);
fp1 = packFloatx80(0, 0x3FFD, UINT64_C(0xDE5BD8A937287195)); /* INV_L10 */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_mul(fp0, fp1, status); /* LOGN(X)*INV_L10 */
@@ -679,13 +679,13 @@ floatx80 floatx80_log2(floatx80 a, float_status *status)
return floatx80_default_nan(status);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
if (aSig == one_sig) { /* X is 2^k */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = int32_to_floatx80(aExp - 0x3FFF, status);
@@ -693,7 +693,7 @@ floatx80 floatx80_log2(floatx80 a, float_status *status)
fp0 = floatx80_logn(a, status);
fp1 = packFloatx80(0, 0x3FFF, UINT64_C(0xB8AA3B295C17F0BC)); /* INV_L2 */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_mul(fp0, fp1, status); /* LOGN(X)*INV_L2 */
@@ -739,9 +739,9 @@ floatx80 floatx80_etox(floatx80 a, float_status *status)
return packFloatx80(0, one_exp, one_sig);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
adjflag = 0;
@@ -817,7 +817,7 @@ floatx80 floatx80_etox(floatx80 a, float_status *status)
fp0 = floatx80_mul(fp0, adjscale, status);
}
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_mul(fp0, scale, status);
@@ -827,7 +827,7 @@ floatx80 floatx80_etox(floatx80 a, float_status *status)
return a;
} else { /* |X| >= 16380 log2 */
if (compact > 0x400CB27C) { /* |X| >= 16480 log2 */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
if (aSign) {
a = roundAndPackFloatx80(
@@ -876,7 +876,7 @@ floatx80 floatx80_etox(floatx80 a, float_status *status)
}
}
} else { /* |X| < 2^(-65) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(a, float32_to_floatx80(make_float32(0x3F800000),
@@ -922,9 +922,9 @@ floatx80 floatx80_twotox(floatx80 a, float_status *status)
return packFloatx80(0, one_exp, one_sig);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
fp0 = a;
@@ -934,7 +934,7 @@ floatx80 floatx80_twotox(floatx80 a, float_status *status)
if (compact < 0x3FB98000 || compact > 0x400D80C0) {
/* |X| > 16480 or |X| < 2^(-70) */
if (compact > 0x3FFF8000) { /* |X| > 16480 */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
if (aSign) {
@@ -945,7 +945,7 @@ floatx80 floatx80_twotox(floatx80 a, float_status *status)
0, 0x8000, aSig, 0, status);
}
} else { /* |X| < 2^(-70) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, float32_to_floatx80(
@@ -1027,7 +1027,7 @@ floatx80 floatx80_twotox(floatx80 a, float_status *status)
fp0 = floatx80_add(fp0, fact2, status);
fp0 = floatx80_add(fp0, fact1, status);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_mul(fp0, adjfact, status);
@@ -1072,9 +1072,9 @@ floatx80 floatx80_tentox(floatx80 a, float_status *status)
return packFloatx80(0, one_exp, one_sig);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
fp0 = a;
@@ -1084,7 +1084,7 @@ floatx80 floatx80_tentox(floatx80 a, float_status *status)
if (compact < 0x3FB98000 || compact > 0x400B9B07) {
/* |X| > 16480 LOG2/LOG10 or |X| < 2^(-70) */
if (compact > 0x3FFF8000) { /* |X| > 16480 */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
if (aSign) {
@@ -1095,7 +1095,7 @@ floatx80 floatx80_tentox(floatx80 a, float_status *status)
0, 0x8000, aSig, 0, status);
}
} else { /* |X| < 2^(-70) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, float32_to_floatx80(
@@ -1182,7 +1182,7 @@ floatx80 floatx80_tentox(floatx80 a, float_status *status)
fp0 = floatx80_add(fp0, fact2, status);
fp0 = floatx80_add(fp0, fact1, status);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_mul(fp0, adjfact, status);
@@ -1227,9 +1227,9 @@ floatx80 floatx80_tan(floatx80 a, float_status *status)
return packFloatx80(aSign, 0, 0);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
compact = floatx80_make_compact(aExp, aSig);
@@ -1294,7 +1294,7 @@ floatx80 floatx80_tan(floatx80 a, float_status *status)
fp1 = floatx80_add(fp1, fp3, status); /* FP1 is r := (A-R)+a */
goto loop;
} else {
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_move(a, status);
@@ -1354,7 +1354,7 @@ floatx80 floatx80_tan(floatx80 a, float_status *status)
xSign ^= 1;
fp1 = packFloatx80(xSign, xExp, xSig);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_div(fp0, fp1, status);
@@ -1392,7 +1392,7 @@ floatx80 floatx80_tan(floatx80 a, float_status *status)
make_float32(0x3F800000), status),
status); /* 1+S(Q1+S(Q2+S(Q3+SQ4))) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_div(fp0, fp1, status);
@@ -1438,9 +1438,9 @@ floatx80 floatx80_sin(floatx80 a, float_status *status)
return packFloatx80(aSign, 0, 0);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
compact = floatx80_make_compact(aExp, aSig);
@@ -1509,7 +1509,7 @@ floatx80 floatx80_sin(floatx80 a, float_status *status)
fp0 = float32_to_floatx80(make_float32(0x3F800000),
status); /* 1 */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
/* SINTINY */
@@ -1582,7 +1582,7 @@ floatx80 floatx80_sin(floatx80 a, float_status *status)
x = packFloatx80(xSign, xExp, xSig);
fp0 = floatx80_mul(fp0, x, status);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, float32_to_floatx80(posneg1, status), status);
@@ -1632,7 +1632,7 @@ floatx80 floatx80_sin(floatx80 a, float_status *status)
fp0 = floatx80_mul(fp0, x, status); /* R'*S */
fp0 = floatx80_mul(fp0, fp1, status); /* SIN(R')-R' */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, x, status);
@@ -1678,9 +1678,9 @@ floatx80 floatx80_cos(floatx80 a, float_status *status)
return packFloatx80(0, one_exp, one_sig);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
compact = floatx80_make_compact(aExp, aSig);
@@ -1748,7 +1748,7 @@ floatx80 floatx80_cos(floatx80 a, float_status *status)
/* SINSM */
fp0 = float32_to_floatx80(make_float32(0x3F800000), status); /* 1 */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
/* COSTINY */
@@ -1822,7 +1822,7 @@ floatx80 floatx80_cos(floatx80 a, float_status *status)
x = packFloatx80(xSign, xExp, xSig);
fp0 = floatx80_mul(fp0, x, status);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, float32_to_floatx80(posneg1, status), status);
@@ -1870,7 +1870,7 @@ floatx80 floatx80_cos(floatx80 a, float_status *status)
fp0 = floatx80_mul(fp0, x, status); /* R'*S */
fp0 = floatx80_mul(fp0, fp1, status); /* SIN(R')-R' */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, x, status);
@@ -1917,9 +1917,9 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
compact = floatx80_make_compact(aExp, aSig);
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
if (compact < 0x3FFB8000 || compact > 0x4002FFFF) {
@@ -1929,7 +1929,7 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
fp0 = packFloatx80(aSign, piby2_exp, pi_sig);
fp1 = packFloatx80(aSign, 0x0001, one_sig);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_sub(fp0, fp1, status);
@@ -1969,7 +1969,7 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
fp0 = floatx80_add(fp0, xsave, status);
fp1 = packFloatx80(aSign, piby2_exp, pi_sig);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, fp1, status);
@@ -1980,7 +1980,7 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
}
} else { /* |X| < 1/16 */
if (compact < 0x3FD78000) { /* |X| < 2^(-40) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_move(a, status);
@@ -2020,7 +2020,7 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
/* X*Y*([B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))]) */
fp0 = floatx80_mul(fp0, fp1, status);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, xsave, status);
@@ -2069,7 +2069,7 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
fp1 = floatx80_mul(fp1, fp2, status); /* A1*U*V*(A2+V*(A3+V)) */
fp0 = floatx80_add(fp0, fp1, status); /* ATAN(U) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, fp3, status); /* ATAN(X) */
@@ -2122,9 +2122,9 @@ floatx80 floatx80_asin(floatx80 a, float_status *status)
} /* |X| < 1 */
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
one = packFloatx80(0, one_exp, one_sig);
@@ -2136,7 +2136,7 @@ floatx80 floatx80_asin(floatx80 a, float_status *status)
fp1 = floatx80_sqrt(fp1, status); /* SQRT((1+X)*(1-X)) */
fp0 = floatx80_div(fp0, fp1, status); /* X/SQRT((1+X)*(1-X)) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_atan(fp0, status); /* ATAN(X/SQRT((1+X)*(1-X))) */
@@ -2192,9 +2192,9 @@ floatx80 floatx80_acos(floatx80 a, float_status *status)
}
} /* |X| < 1 */
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
one = packFloatx80(0, one_exp, one_sig);
@@ -2206,7 +2206,7 @@ floatx80 floatx80_acos(floatx80 a, float_status *status)
fp0 = floatx80_sqrt(fp0, status); /* SQRT((1-X)/(1+X)) */
fp0 = floatx80_atan(fp0, status); /* ATAN(SQRT((1-X)/(1+X))) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, fp0, status); /* 2 * ATAN(SQRT((1-X)/(1+X))) */
@@ -2256,9 +2256,9 @@ floatx80 floatx80_atanh(floatx80 a, float_status *status)
}
} /* |X| < 1 */
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
one = packFloatx80(0, one_exp, one_sig);
@@ -2270,7 +2270,7 @@ floatx80 floatx80_atanh(floatx80 a, float_status *status)
fp0 = floatx80_div(fp0, fp1, status); /* Z = 2Y/(1-Y) */
fp0 = floatx80_lognp1(fp0, status); /* LOG1P(Z) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_mul(fp0, fp2,
@@ -2315,9 +2315,9 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
return packFloatx80(aSign, 0, 0);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
if (aExp >= 0x3FFD) { /* |X| >= 1/4 */
@@ -2410,7 +2410,7 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
sc = packFloatx80(0, m + 0x3FFF, one_sig);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_mul(fp0, sc, status);
@@ -2423,7 +2423,7 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
fp0 = float32_to_floatx80(make_float32(0xBF800000),
status); /* -1 */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, float32_to_floatx80(
@@ -2434,7 +2434,7 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
return a;
} else {
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
return floatx80_etox(a, status);
@@ -2495,7 +2495,7 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
fp1 = floatx80_add(fp1, fp2, status); /* Q */
fp0 = floatx80_add(fp0, fp1, status); /* S*B1+Q */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, a, status);
@@ -2513,14 +2513,14 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
status);
fp0 = floatx80_add(fp0, sc, status);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_mul(fp0, float64_to_floatx80(
make_float64(0x3730000000000000), status),
status);
} else {
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, sc, status);
@@ -2565,9 +2565,9 @@ floatx80 floatx80_tanh(floatx80 a, float_status *status)
return packFloatx80(aSign, 0, 0);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
compact = floatx80_make_compact(aExp, aSig);
@@ -2576,7 +2576,7 @@ floatx80 floatx80_tanh(floatx80 a, float_status *status)
/* TANHBORS */
if (compact < 0x3FFF8000) {
/* TANHSM */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_move(a, status);
@@ -2593,7 +2593,7 @@ floatx80 floatx80_tanh(floatx80 a, float_status *status)
sign &= 0x80000000;
sign ^= 0x80800000; /* -SIGN(X)*EPS */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, float32_to_floatx80(make_float32(sign),
@@ -2615,7 +2615,7 @@ floatx80 floatx80_tanh(floatx80 a, float_status *status)
fp0 = float32_to_floatx80(make_float32(sign | 0x3F800000),
status); /* SIGN */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp1, fp0, status);
@@ -2638,7 +2638,7 @@ floatx80 floatx80_tanh(floatx80 a, float_status *status)
fp1 = packFloatx80(vSign ^ aSign, vExp, vSig);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_div(fp0, fp1, status);
@@ -2681,9 +2681,9 @@ floatx80 floatx80_sinh(floatx80 a, float_status *status)
return packFloatx80(aSign, 0, 0);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
compact = floatx80_make_compact(aExp, aSig);
@@ -2691,7 +2691,7 @@ floatx80 floatx80_sinh(floatx80 a, float_status *status)
if (compact > 0x400CB167) {
/* SINHBIG */
if (compact > 0x400CB2B3) {
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
return roundAndPackFloatx80(status->floatx80_rounding_precision,
@@ -2707,7 +2707,7 @@ floatx80 floatx80_sinh(floatx80 a, float_status *status)
fp0 = floatx80_etox(fp0, status);
fp2 = packFloatx80(aSign, 0x7FFB, one_sig);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_mul(fp0, fp2, status);
@@ -2727,7 +2727,7 @@ floatx80 floatx80_sinh(floatx80 a, float_status *status)
fact = packFloat32(aSign, 0x7E, 0);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_mul(fp0, float32_to_floatx80(fact, status), status);
@@ -2767,16 +2767,16 @@ floatx80 floatx80_cosh(floatx80 a, float_status *status)
return packFloatx80(0, one_exp, one_sig);
}
- user_rnd_mode = status->float_rounding_mode;
+ user_rnd_mode = get_float_rounding_mode(status);
user_rnd_prec = status->floatx80_rounding_precision;
- status->float_rounding_mode = float_round_nearest_even;
+ set_float_rounding_mode(float_round_nearest_even, status);
status->floatx80_rounding_precision = floatx80_precision_x;
compact = floatx80_make_compact(aExp, aSig);
if (compact > 0x400CB167) {
if (compact > 0x400CB2B3) {
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
return roundAndPackFloatx80(status->floatx80_rounding_precision, 0,
0x8000, one_sig, 0, status);
@@ -2791,7 +2791,7 @@ floatx80 floatx80_cosh(floatx80 a, float_status *status)
fp0 = floatx80_etox(fp0, status);
fp1 = packFloatx80(0, 0x7FFB, one_sig);
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_mul(fp0, fp1, status);
@@ -2809,7 +2809,7 @@ floatx80 floatx80_cosh(floatx80 a, float_status *status)
fp1 = float32_to_floatx80(make_float32(0x3E800000), status); /* 1/4 */
fp1 = floatx80_div(fp1, fp0, status); /* 1/(2*EXP(|X|)) */
- status->float_rounding_mode = user_rnd_mode;
+ set_float_rounding_mode(user_rnd_mode, status);
status->floatx80_rounding_precision = user_rnd_prec;
a = floatx80_add(fp0, fp1, status);
diff --git a/target/ppc/fpu_helper.c b/target/ppc/fpu_helper.c
index 850aca6ed1..c1bdde9e10 100644
--- a/target/ppc/fpu_helper.c
+++ b/target/ppc/fpu_helper.c
@@ -1616,7 +1616,7 @@ void helper_xsaddqp(CPUPPCState *env, uint32_t opcode,
tstat = env->fp_status;
if (unlikely(Rc(opcode) != 0)) {
- tstat.float_rounding_mode = float_round_to_odd;
+ set_float_rounding_mode(float_round_to_odd, &tstat);
}
set_float_exception_flags(0, &tstat);
@@ -1688,7 +1688,7 @@ void helper_xsmulqp(CPUPPCState *env, uint32_t opcode,
helper_reset_fpstatus(env);
tstat = env->fp_status;
if (unlikely(Rc(opcode) != 0)) {
- tstat.float_rounding_mode = float_round_to_odd;
+ set_float_rounding_mode(float_round_to_odd, &tstat);
}
set_float_exception_flags(0, &tstat);
@@ -1762,7 +1762,7 @@ void helper_xsdivqp(CPUPPCState *env, uint32_t opcode,
helper_reset_fpstatus(env);
tstat = env->fp_status;
if (unlikely(Rc(opcode) != 0)) {
- tstat.float_rounding_mode = float_round_to_odd;
+ set_float_rounding_mode(float_round_to_odd, &tstat);
}
set_float_exception_flags(0, &tstat);
@@ -2095,7 +2095,7 @@ void helper_##op(CPUPPCState *env, ppc_vsr_t *xt, ppc_vsr_t *s1, ppc_vsr_t *s2,\
float_status tstat = env->fp_status; \
set_float_exception_flags(0, &tstat); \
if (ro) { \
- tstat.float_rounding_mode = float_round_to_odd; \
+ set_float_rounding_mode(float_round_to_odd, &tstat); \
} \
t.f128 = float128_muladd(s1->f128, s3->f128, s2->f128, maddflgs, &tstat); \
env->fp_status.float_exception_flags |= tstat.float_exception_flags; \
@@ -2706,7 +2706,7 @@ void helper_XSCVQPDP(CPUPPCState *env, uint32_t ro, ppc_vsr_t *xt,
tstat = env->fp_status;
if (ro != 0) {
- tstat.float_rounding_mode = float_round_to_odd;
+ set_float_rounding_mode(float_round_to_odd, &tstat);
}
t.VsrD(0) = float128_to_float64(xb->f128, &tstat);
@@ -3306,7 +3306,7 @@ void helper_xssqrtqp(CPUPPCState *env, uint32_t opcode,
tstat = env->fp_status;
if (unlikely(Rc(opcode) != 0)) {
- tstat.float_rounding_mode = float_round_to_odd;
+ set_float_rounding_mode(float_round_to_odd, &tstat);
}
set_float_exception_flags(0, &tstat);
@@ -3332,7 +3332,7 @@ void helper_xssubqp(CPUPPCState *env, uint32_t opcode,
tstat = env->fp_status;
if (unlikely(Rc(opcode) != 0)) {
- tstat.float_rounding_mode = float_round_to_odd;
+ set_float_rounding_mode(float_round_to_odd, &tstat);
}
set_float_exception_flags(0, &tstat);
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
index 5a3554dd71..c826702bf8 100644
--- a/target/riscv/vector_helper.c
+++ b/target/riscv/vector_helper.c
@@ -4270,9 +4270,9 @@ static uint64_t frec7(uint64_t f, int exp_size, int frac_size,
s->float_exception_flags |= (float_flag_inexact |
float_flag_overflow);
- if ((s->float_rounding_mode == float_round_to_zero) ||
- ((s->float_rounding_mode == float_round_down) && !sign) ||
- ((s->float_rounding_mode == float_round_up) && sign)) {
+ if ((get_float_rounding_mode(s) == float_round_to_zero) ||
+ ((get_float_rounding_mode(s) == float_round_down) && !sign) ||
+ ((get_float_rounding_mode(s) == float_round_up) && sign)) {
/* Return greatest/negative finite value. */
return (sign << (exp_size + frac_size)) |
(MAKE_64BIT_MASK(frac_size, exp_size) - 1);
diff --git a/target/s390x/tcg/fpu_helper.c b/target/s390x/tcg/fpu_helper.c
index 33e0f6100d..6ca0b7162b 100644
--- a/target/s390x/tcg/fpu_helper.c
+++ b/target/s390x/tcg/fpu_helper.c
@@ -62,7 +62,7 @@ static int s390_get_bfp_rounding_mode(CPUS390XState *env, int m3)
switch (m3) {
case 0:
/* current mode */
- return env->fpu_status.float_rounding_mode;
+ return get_float_rounding_mode(&env->fpu_status);
case 1:
/* round to nearest with ties away from 0 */
return float_round_ties_away;
@@ -634,7 +634,7 @@ uint32_t HELPER(cxb)(CPUS390XState *env, Int128 a, Int128 b)
int s390_swap_bfp_rounding_mode(CPUS390XState *env, int m3)
{
- int ret = env->fpu_status.float_rounding_mode;
+ int ret = get_float_rounding_mode(&env->fpu_status);
set_float_rounding_mode(s390_get_bfp_rounding_mode(env, m3),
&env->fpu_status);
diff --git a/tests/fp/fp-bench.c b/tests/fp/fp-bench.c
index d90f542ea2..2b6f66817e 100644
--- a/tests/fp/fp-bench.c
+++ b/tests/fp/fp-bench.c
@@ -615,7 +615,7 @@ static void set_soft_precision(enum rounding rounding)
default:
g_assert_not_reached();
}
- soft_status.float_rounding_mode = mode;
+ set_float_rounding_mode(mode, &soft_status);
}
static void parse_args(int argc, char *argv[])
diff --git a/tests/fp/fp-test.c b/tests/fp/fp-test.c
index c619e5dbf7..fdb0cccf14 100644
--- a/tests/fp/fp-test.c
+++ b/tests/fp/fp-test.c
@@ -967,7 +967,7 @@ void run_test(void)
verCases_roundingCode = 0;
slowfloat_roundingMode = rmode;
- qsf.float_rounding_mode = sf_rounding_to_qemu(rmode);
+ set_float_rounding_mode(sf_rounding_to_qemu(rmode), &qsf);
if (attrs & (FUNC_ARG_ROUNDINGMODE | FUNC_EFF_ROUNDINGMODE)) {
/* print rounding mode if the op is affected by it */
diff --git a/tests/fp/wrap.c.inc b/tests/fp/wrap.c.inc
index 9ff884c140..a67b390e5a 100644
--- a/tests/fp/wrap.c.inc
+++ b/tests/fp/wrap.c.inc
@@ -168,7 +168,7 @@ WRAP_SF_TO_128(qemu_f64_to_f128M, float64_to_float128, float64)
{ \
type *ap = (type *)&a; \
\
- qsf.float_rounding_mode = sf_rounding_to_qemu(round); \
+ set_float_rounding_mode(sf_rounding_to_qemu(round), &qsf); \
return func(*ap, &qsf); \
}
@@ -328,7 +328,7 @@ WRAP_INT_TO_80(qemu_i64_to_extF80M, int64_to_floatx80, int64_t)
floatx80 a; \
\
a = soft_to_qemu80(*ap); \
- qsf.float_rounding_mode = sf_rounding_to_qemu(round); \
+ set_float_rounding_mode(sf_rounding_to_qemu(round), &qsf); \
return func(a, &qsf); \
}
@@ -360,7 +360,7 @@ WRAP_80_TO_INT_MINMAG(qemu_extF80M_to_i64_r_minMag,
float128 a; \
\
a = soft_to_qemu128(*ap); \
- qsf.float_rounding_mode = sf_rounding_to_qemu(round); \
+ set_float_rounding_mode(sf_rounding_to_qemu(round), &qsf); \
return func(a, &qsf); \
}
@@ -414,7 +414,7 @@ WRAP_INT_TO_128(qemu_i64_to_f128M, int64_to_float128, int64_t)
type *ap = (type *)&a; \
type ret; \
\
- qsf.float_rounding_mode = sf_rounding_to_qemu(round); \
+ set_float_rounding_mode(sf_rounding_to_qemu(round), &qsf); \
ret = func(*ap, &qsf); \
return *(type##_t *)&ret; \
}
@@ -431,7 +431,7 @@ static void qemu_extF80M_roundToInt(const extFloat80_t *ap, uint_fast8_t round,
floatx80 ret;
a = soft_to_qemu80(*ap);
- qsf.float_rounding_mode = sf_rounding_to_qemu(round);
+ set_float_rounding_mode(sf_rounding_to_qemu(round), &qsf);
ret = floatx80_round_to_int(a, &qsf);
*res = qemu_to_soft80(ret);
}
@@ -443,7 +443,7 @@ static void qemu_f128M_roundToInt(const float128_t *ap, uint_fast8_t round,
float128 ret;
a = soft_to_qemu128(*ap);
- qsf.float_rounding_mode = sf_rounding_to_qemu(round);
+ set_float_rounding_mode(sf_rounding_to_qemu(round), &qsf);
ret = float128_round_to_int(a, &qsf);
*res = qemu_to_soft128(ret);
}