@samitouri / QOSamiQemu / commits / 6ce98c8199

fpu: Use of {get,set}_floatx80_rounding_precision everywhere

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

Richard Henderson committed May 1, 2026 at 16:16 UTC 6ce98c8199f52ea52ee0995da504c0cbff6b8f8c
4 files changed +130 -127
fpu/softfloat.c
+5 -5
@@ -1515,7 +1515,7 @@ float128 float128_round_pack_canonical(FloatParts128 *p, float_status *s)
1515 bool floatx80_unpack_canonical(FloatParts128 *p, floatx80 f, float_status *s)
1516 {
1517 /* Ensure rounding precision is set before beginning. */
1518 - switch (s->floatx80_rounding_precision) {
1518 + switch (get_floatx80_rounding_precision(s)) {
1519 case floatx80_precision_x:
1520 case floatx80_precision_d:
1521 case floatx80_precision_s:
@@ -1550,14 +1550,14 @@ bool floatx80_unpack_canonical(FloatParts128 *p, floatx80 f, float_status *s)
1550
1551 floatx80 floatx80_round_pack_canonical(FloatParts128 *p, float_status *s)
1552 {
1553 - const FloatFmt *fmt = &floatx80_params[s->floatx80_rounding_precision];
1553 + const FloatFmt *fmt = &floatx80_params[get_floatx80_rounding_precision(s)];
1554 uint64_t frac;
1555 int exp;
1556
1557 switch (p->cls) {
1558 case float_class_normal:
1559 case float_class_denormal:
1560 - if (s->floatx80_rounding_precision == floatx80_precision_x) {
1560 + if (get_floatx80_rounding_precision(s) == floatx80_precision_x) {
1561 parts128_uncanon_normal(p, s, fmt, false);
1562 frac = p->frac_hi;
1563 exp = p->exp;
@@ -2853,7 +2853,7 @@ floatx80 floatx80_round_to_int(floatx80 a, float_status *status)
2853 }
2854
2855 p = parts128_round_to_int(&p, get_float_rounding_mode(status), 0, status,
2856 - &floatx80_params[status->floatx80_rounding_precision]);
2856 + &floatx80_params[get_floatx80_rounding_precision(status)]);
2857 return floatx80_round_pack_canonical(&p, status);
2858 }
2859
@@ -4503,7 +4503,7 @@ floatx80 floatx80_sqrt(floatx80 a, float_status *s)
4503 if (!floatx80_unpack_canonical(&p, a, s)) {
4504 return floatx80_default_nan(s);
4505 }
4506 - parts128_sqrt(&p, s, &floatx80_params[s->floatx80_rounding_precision]);
4506 + parts128_sqrt(&p, s, &floatx80_params[get_floatx80_rounding_precision(s)]);
4507 return floatx80_round_pack_canonical(&p, s);
4508 }
4509
target/i386/tcg/fpu_helper.c
+19 -18
@@ -1185,9 +1185,9 @@ void helper_f2xm1(CPUX86State *env)
1185 uint64_t asig0, asig1, asig2, bsig0, bsig1;
1186 FloatRoundMode save_mode = get_float_rounding_mode(&env->fp_status);
1187 FloatX80RoundPrec save_prec =
1188 - env->fp_status.floatx80_rounding_precision;
1188 + get_floatx80_rounding_precision(&env->fp_status);
1189 set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
1190 - env->fp_status.floatx80_rounding_precision = floatx80_precision_x;
1190 + set_floatx80_rounding_precision(floatx80_precision_x, &env->fp_status);
1191
1192 /* Find the nearest multiple of 1/32 to the argument. */
1193 tmp = floatx80_scalbn(ST0, 5, &env->fp_status);
@@ -1290,7 +1290,7 @@ void helper_f2xm1(CPUX86State *env)
1290 &env->fp_status);
1291 }
1292
1293 - env->fp_status.floatx80_rounding_precision = save_prec;
1293 + set_floatx80_rounding_precision(save_prec, &env->fp_status);
1294 }
1295 merge_exception_flags(env, old_flags);
1296 }
@@ -1406,10 +1406,10 @@ void helper_fpatan(CPUX86State *env)
1406 * (and underflowing where appropriate).
1407 */
1408 FloatX80RoundPrec save_prec =
1409 - env->fp_status.floatx80_rounding_precision;
1410 - env->fp_status.floatx80_rounding_precision = floatx80_precision_x;
1409 + get_floatx80_rounding_precision(&env->fp_status);
1410 + set_floatx80_rounding_precision(floatx80_precision_x, &env->fp_status);
1411 ST1 = floatx80_div(ST1, ST0, &env->fp_status);
1412 - env->fp_status.floatx80_rounding_precision = save_prec;
1412 + set_floatx80_rounding_precision(save_prec, &env->fp_status);
1413 if (!floatx80_is_zero(ST1) &&
1414 !(get_float_exception_flags(&env->fp_status) &
1415 float_flag_inexact)) {
@@ -1485,9 +1485,10 @@ void helper_fpatan(CPUX86State *env)
1485 floatx80 x8;
1486 FloatRoundMode save_mode = get_float_rounding_mode(&env->fp_status);
1487 FloatX80RoundPrec save_prec =
1488 - env->fp_status.floatx80_rounding_precision;
1488 + get_floatx80_rounding_precision(&env->fp_status);
1489 set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
1490 - env->fp_status.floatx80_rounding_precision = floatx80_precision_x;
1490 + set_floatx80_rounding_precision(floatx80_precision_x,
1491 + &env->fp_status);
1492
1493 if (arg0_exp == 0) {
1494 normalizeFloatx80Subnormal(arg0_sig, &arg0_exp, &arg0_sig);
@@ -1794,7 +1795,7 @@ void helper_fpatan(CPUX86State *env)
1795 }
1796
1797 set_float_rounding_mode(save_mode, &env->fp_status);
1797 - env->fp_status.floatx80_rounding_precision = save_prec;
1798 + set_floatx80_rounding_precision(save_prec, &env->fp_status);
1799 }
1800 /* This result is inexact. */
1801 rsig1 |= 1;
@@ -2123,9 +2124,9 @@ void helper_fyl2xp1(CPUX86State *env)
2124 uint64_t asig0, asig1, asig2;
2125 FloatRoundMode save_mode = get_float_rounding_mode(&env->fp_status);
2126 FloatX80RoundPrec save_prec =
2126 - env->fp_status.floatx80_rounding_precision;
2127 + get_floatx80_rounding_precision(&env->fp_status);
2128 set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
2128 - env->fp_status.floatx80_rounding_precision = floatx80_precision_x;
2129 + set_floatx80_rounding_precision(floatx80_precision_x, &env->fp_status);
2130
2131 helper_fyl2x_common(env, ST0, &aexp, &asig0, &asig1);
2132 /*
@@ -2143,7 +2144,7 @@ void helper_fyl2xp1(CPUX86State *env)
2144 ST1 = normalizeRoundAndPackFloatx80(floatx80_precision_x,
2145 arg0_sign ^ arg1_sign, aexp,
2146 asig0, asig1, &env->fp_status);
2146 - env->fp_status.floatx80_rounding_precision = save_prec;
2147 + set_floatx80_rounding_precision(save_prec, &env->fp_status);
2148 }
2149 fpop(env);
2150 merge_exception_flags(env, old_flags);
@@ -2226,9 +2227,9 @@ void helper_fyl2x(CPUX86State *env)
2227 floatx80 arg0_m1;
2228 FloatRoundMode save_mode = get_float_rounding_mode(&env->fp_status);
2229 FloatX80RoundPrec save_prec =
2229 - env->fp_status.floatx80_rounding_precision;
2230 + get_floatx80_rounding_precision(&env->fp_status);
2231 set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
2231 - env->fp_status.floatx80_rounding_precision = floatx80_precision_x;
2232 + set_floatx80_rounding_precision(floatx80_precision_x, &env->fp_status);
2233
2234 if (arg0_exp == 0) {
2235 normalizeFloatx80Subnormal(arg0_sig, &arg0_exp, &arg0_sig);
@@ -2290,7 +2291,7 @@ void helper_fyl2x(CPUX86State *env)
2291 asig0, asig1, &env->fp_status);
2292 }
2293
2293 - env->fp_status.floatx80_rounding_precision = save_prec;
2294 + set_floatx80_rounding_precision(save_prec, &env->fp_status);
2295 }
2296 fpop(env);
2297 merge_exception_flags(env, old_flags);
@@ -2368,14 +2369,14 @@ void helper_fscale(CPUX86State *env)
2369 }
2370 } else {
2371 int n;
2371 - FloatX80RoundPrec save = env->fp_status.floatx80_rounding_precision;
2372 + FloatX80RoundPrec save = get_floatx80_rounding_precision(&env->fp_status);
2373 int save_flags = get_float_exception_flags(&env->fp_status);
2374 set_float_exception_flags(0, &env->fp_status);
2375 n = floatx80_to_int32_round_to_zero(ST1, &env->fp_status);
2376 set_float_exception_flags(save_flags, &env->fp_status);
2376 - env->fp_status.floatx80_rounding_precision = floatx80_precision_x;
2377 + set_floatx80_rounding_precision(floatx80_precision_x, &env->fp_status);
2378 ST0 = floatx80_scalbn(ST0, n, &env->fp_status);
2378 - env->fp_status.floatx80_rounding_precision = save;
2379 + set_floatx80_rounding_precision(save, &env->fp_status);
2380 }
2381 merge_exception_flags(env, old_flags);
2382 }
target/m68k/softfloat.c
+105 -103
@@ -72,7 +72,8 @@ floatx80 floatx80_getman(floatx80 a, float_status *status)
72 normalizeFloatx80Subnormal(aSig, &aExp, &aSig);
73 }
74
75 - return roundAndPackFloatx80(status->floatx80_rounding_precision, aSign,
75 + return roundAndPackFloatx80(get_floatx80_rounding_precision(status),
76 + aSign,
77 0x3FFF, aSig, 0, status);
78 }
79
@@ -160,7 +161,7 @@ floatx80 floatx80_scale(floatx80 a, floatx80 b, float_status *status)
161
162 if (0x400F < bExp) {
163 aExp = bSign ? -0x6001 : 0xE000;
163 - return roundAndPackFloatx80(status->floatx80_rounding_precision,
164 + return roundAndPackFloatx80(get_floatx80_rounding_precision(status),
165 aSign, aExp, aSig, 0, status);
166 }
167
@@ -168,7 +169,7 @@ floatx80 floatx80_scale(floatx80 a, floatx80 b, float_status *status)
169 bSig >>= shiftCount;
170 aExp = bSign ? (aExp - bSig) : (aExp + bSig);
171
171 - return roundAndPackFloatx80(status->floatx80_rounding_precision,
172 + return roundAndPackFloatx80(get_floatx80_rounding_precision(status),
173 aSign, aExp, aSig, 0, status);
174 }
175
@@ -192,10 +193,11 @@ floatx80 floatx80_move(floatx80 a, float_status *status)
193 if (aSig == 0) {
194 return a;
195 }
195 - normalizeRoundAndPackFloatx80(status->floatx80_rounding_precision,
196 + normalizeRoundAndPackFloatx80(get_floatx80_rounding_precision(status),
197 aSign, aExp, aSig, 0, status);
198 }
198 - return roundAndPackFloatx80(status->floatx80_rounding_precision, aSign,
199 + return roundAndPackFloatx80(get_floatx80_rounding_precision(status),
200 + aSign,
201 aExp, aSig, 0, status);
202 }
203
@@ -267,9 +269,9 @@ floatx80 floatx80_lognp1(floatx80 a, float_status *status)
269 }
270
271 user_rnd_mode = get_float_rounding_mode(status);
270 - user_rnd_prec = status->floatx80_rounding_precision;
272 + user_rnd_prec = get_floatx80_rounding_precision(status);
273 set_float_rounding_mode(float_round_nearest_even, status);
272 - status->floatx80_rounding_precision = floatx80_precision_x;
274 + set_floatx80_rounding_precision(floatx80_precision_x, status);
275
276 compact = floatx80_make_compact(aExp, aSig);
277
@@ -337,7 +339,7 @@ floatx80 floatx80_lognp1(floatx80 a, float_status *status)
339 fp0 = floatx80_add(fp0, fp1, status); /* FP0 IS LOG(F) + LOG(1+U) */
340
341 set_float_rounding_mode(user_rnd_mode, status);
340 - status->floatx80_rounding_precision = user_rnd_prec;
342 + set_floatx80_rounding_precision(user_rnd_prec, status);
343
344 a = floatx80_add(fp0, klog2, status);
345
@@ -403,7 +405,7 @@ floatx80 floatx80_lognp1(floatx80 a, float_status *status)
405 status); /* U*V*([B1+W*(B3+W*B5)] + [V*(B2+W*B4)]) */
406
407 set_float_rounding_mode(user_rnd_mode, status);
406 - status->floatx80_rounding_precision = user_rnd_prec;
408 + set_floatx80_rounding_precision(user_rnd_prec, status);
409
410 a = floatx80_add(fp0, saveu, status);
411
@@ -465,9 +467,9 @@ floatx80 floatx80_logn(floatx80 a, float_status *status)
467 }
468
469 user_rnd_mode = get_float_rounding_mode(status);
468 - user_rnd_prec = status->floatx80_rounding_precision;
470 + user_rnd_prec = get_floatx80_rounding_precision(status);
471 set_float_rounding_mode(float_round_nearest_even, status);
470 - status->floatx80_rounding_precision = floatx80_precision_x;
472 + set_floatx80_rounding_precision(floatx80_precision_x, status);
473
474 compact = floatx80_make_compact(aExp, aSig);
475
@@ -524,7 +526,7 @@ floatx80 floatx80_logn(floatx80 a, float_status *status)
526 fp0 = floatx80_add(fp0, fp1, status); /* FP0 IS LOG(F) + LOG(1+U) */
527
528 set_float_rounding_mode(user_rnd_mode, status);
527 - status->floatx80_rounding_precision = user_rnd_prec;
529 + set_floatx80_rounding_precision(user_rnd_prec, status);
530
531 a = floatx80_add(fp0, klog2, status);
532
@@ -570,7 +572,7 @@ floatx80 floatx80_logn(floatx80 a, float_status *status)
572 status); /* U*V*([B1+W*(B3+W*B5)] + [V*(B2+W*B4)]) */
573
574 set_float_rounding_mode(user_rnd_mode, status);
573 - status->floatx80_rounding_precision = user_rnd_prec;
575 + set_floatx80_rounding_precision(user_rnd_prec, status);
576
577 a = floatx80_add(fp0, saveu, status);
578
@@ -621,15 +623,15 @@ floatx80 floatx80_log10(floatx80 a, float_status *status)
623 }
624
625 user_rnd_mode = get_float_rounding_mode(status);
624 - user_rnd_prec = status->floatx80_rounding_precision;
626 + user_rnd_prec = get_floatx80_rounding_precision(status);
627 set_float_rounding_mode(float_round_nearest_even, status);
626 - status->floatx80_rounding_precision = floatx80_precision_x;
628 + set_floatx80_rounding_precision(floatx80_precision_x, status);
629
630 fp0 = floatx80_logn(a, status);
631 fp1 = packFloatx80(0, 0x3FFD, UINT64_C(0xDE5BD8A937287195)); /* INV_L10 */
632
633 set_float_rounding_mode(user_rnd_mode, status);
632 - status->floatx80_rounding_precision = user_rnd_prec;
634 + set_floatx80_rounding_precision(user_rnd_prec, status);
635
636 a = floatx80_mul(fp0, fp1, status); /* LOGN(X)*INV_L10 */
637
@@ -680,13 +682,13 @@ floatx80 floatx80_log2(floatx80 a, float_status *status)
682 }
683
684 user_rnd_mode = get_float_rounding_mode(status);
683 - user_rnd_prec = status->floatx80_rounding_precision;
685 + user_rnd_prec = get_floatx80_rounding_precision(status);
686 set_float_rounding_mode(float_round_nearest_even, status);
685 - status->floatx80_rounding_precision = floatx80_precision_x;
687 + set_floatx80_rounding_precision(floatx80_precision_x, status);
688
689 if (aSig == one_sig) { /* X is 2^k */
690 set_float_rounding_mode(user_rnd_mode, status);
689 - status->floatx80_rounding_precision = user_rnd_prec;
691 + set_floatx80_rounding_precision(user_rnd_prec, status);
692
693 a = int32_to_floatx80(aExp - 0x3FFF, status);
694 } else {
@@ -694,7 +696,7 @@ floatx80 floatx80_log2(floatx80 a, float_status *status)
696 fp1 = packFloatx80(0, 0x3FFF, UINT64_C(0xB8AA3B295C17F0BC)); /* INV_L2 */
697
698 set_float_rounding_mode(user_rnd_mode, status);
697 - status->floatx80_rounding_precision = user_rnd_prec;
699 + set_floatx80_rounding_precision(user_rnd_prec, status);
700
701 a = floatx80_mul(fp0, fp1, status); /* LOGN(X)*INV_L2 */
702 }
@@ -740,9 +742,9 @@ floatx80 floatx80_etox(floatx80 a, float_status *status)
742 }
743
744 user_rnd_mode = get_float_rounding_mode(status);
743 - user_rnd_prec = status->floatx80_rounding_precision;
745 + user_rnd_prec = get_floatx80_rounding_precision(status);
746 set_float_rounding_mode(float_round_nearest_even, status);
745 - status->floatx80_rounding_precision = floatx80_precision_x;
747 + set_floatx80_rounding_precision(floatx80_precision_x, status);
748
749 adjflag = 0;
750
@@ -818,7 +820,7 @@ floatx80 floatx80_etox(floatx80 a, float_status *status)
820 }
821
822 set_float_rounding_mode(user_rnd_mode, status);
821 - status->floatx80_rounding_precision = user_rnd_prec;
823 + set_floatx80_rounding_precision(user_rnd_prec, status);
824
825 a = floatx80_mul(fp0, scale, status);
826
@@ -828,15 +830,13 @@ floatx80 floatx80_etox(floatx80 a, float_status *status)
830 } else { /* |X| >= 16380 log2 */
831 if (compact > 0x400CB27C) { /* |X| >= 16480 log2 */
832 set_float_rounding_mode(user_rnd_mode, status);
831 - status->floatx80_rounding_precision = user_rnd_prec;
833 + set_floatx80_rounding_precision(user_rnd_prec, status);
834 if (aSign) {
833 - a = roundAndPackFloatx80(
834 - status->floatx80_rounding_precision,
835 - 0, -0x1000, aSig, 0, status);
835 + a = roundAndPackFloatx80(get_floatx80_rounding_precision(status),
836 + 0, -0x1000, aSig, 0, status);
837 } else {
837 - a = roundAndPackFloatx80(
838 - status->floatx80_rounding_precision,
839 - 0, 0x8000, aSig, 0, status);
838 + a = roundAndPackFloatx80(get_floatx80_rounding_precision(status),
839 + 0, 0x8000, aSig, 0, status);
840 }
841 float_raise(float_flag_inexact, status);
842
@@ -877,7 +877,7 @@ floatx80 floatx80_etox(floatx80 a, float_status *status)
877 }
878 } else { /* |X| < 2^(-65) */
879 set_float_rounding_mode(user_rnd_mode, status);
880 - status->floatx80_rounding_precision = user_rnd_prec;
880 + set_floatx80_rounding_precision(user_rnd_prec, status);
881
882 a = floatx80_add(a, float32_to_floatx80(make_float32(0x3F800000),
883 status), status); /* 1 + X */
@@ -923,9 +923,9 @@ floatx80 floatx80_twotox(floatx80 a, float_status *status)
923 }
924
925 user_rnd_mode = get_float_rounding_mode(status);
926 - user_rnd_prec = status->floatx80_rounding_precision;
926 + user_rnd_prec = get_floatx80_rounding_precision(status);
927 set_float_rounding_mode(float_round_nearest_even, status);
928 - status->floatx80_rounding_precision = floatx80_precision_x;
928 + set_floatx80_rounding_precision(floatx80_precision_x, status);
929
930 fp0 = a;
931
@@ -935,18 +935,18 @@ floatx80 floatx80_twotox(floatx80 a, float_status *status)
935 /* |X| > 16480 or |X| < 2^(-70) */
936 if (compact > 0x3FFF8000) { /* |X| > 16480 */
937 set_float_rounding_mode(user_rnd_mode, status);
938 - status->floatx80_rounding_precision = user_rnd_prec;
938 + set_floatx80_rounding_precision(user_rnd_prec, status);
939
940 if (aSign) {
941 - return roundAndPackFloatx80(status->floatx80_rounding_precision,
941 + return roundAndPackFloatx80(get_floatx80_rounding_precision(status),
942 0, -0x1000, aSig, 0, status);
943 } else {
944 - return roundAndPackFloatx80(status->floatx80_rounding_precision,
944 + return roundAndPackFloatx80(get_floatx80_rounding_precision(status),
945 0, 0x8000, aSig, 0, status);
946 }
947 } else { /* |X| < 2^(-70) */
948 set_float_rounding_mode(user_rnd_mode, status);
949 - status->floatx80_rounding_precision = user_rnd_prec;
949 + set_floatx80_rounding_precision(user_rnd_prec, status);
950
951 a = floatx80_add(fp0, float32_to_floatx80(
952 make_float32(0x3F800000), status),
@@ -1028,7 +1028,7 @@ floatx80 floatx80_twotox(floatx80 a, float_status *status)
1028 fp0 = floatx80_add(fp0, fact1, status);
1029
1030 set_float_rounding_mode(user_rnd_mode, status);
1031 - status->floatx80_rounding_precision = user_rnd_prec;
1031 + set_floatx80_rounding_precision(user_rnd_prec, status);
1032
1033 a = floatx80_mul(fp0, adjfact, status);
1034
@@ -1073,9 +1073,9 @@ floatx80 floatx80_tentox(floatx80 a, float_status *status)
1073 }
1074
1075 user_rnd_mode = get_float_rounding_mode(status);
1076 - user_rnd_prec = status->floatx80_rounding_precision;
1076 + user_rnd_prec = get_floatx80_rounding_precision(status);
1077 set_float_rounding_mode(float_round_nearest_even, status);
1078 - status->floatx80_rounding_precision = floatx80_precision_x;
1078 + set_floatx80_rounding_precision(floatx80_precision_x, status);
1079
1080 fp0 = a;
1081
@@ -1085,18 +1085,18 @@ floatx80 floatx80_tentox(floatx80 a, float_status *status)
1085 /* |X| > 16480 LOG2/LOG10 or |X| < 2^(-70) */
1086 if (compact > 0x3FFF8000) { /* |X| > 16480 */
1087 set_float_rounding_mode(user_rnd_mode, status);
1088 - status->floatx80_rounding_precision = user_rnd_prec;
1088 + set_floatx80_rounding_precision(user_rnd_prec, status);
1089
1090 if (aSign) {
1091 - return roundAndPackFloatx80(status->floatx80_rounding_precision,
1091 + return roundAndPackFloatx80(get_floatx80_rounding_precision(status),
1092 0, -0x1000, aSig, 0, status);
1093 } else {
1094 - return roundAndPackFloatx80(status->floatx80_rounding_precision,
1094 + return roundAndPackFloatx80(get_floatx80_rounding_precision(status),
1095 0, 0x8000, aSig, 0, status);
1096 }
1097 } else { /* |X| < 2^(-70) */
1098 set_float_rounding_mode(user_rnd_mode, status);
1099 - status->floatx80_rounding_precision = user_rnd_prec;
1099 + set_floatx80_rounding_precision(user_rnd_prec, status);
1100
1101 a = floatx80_add(fp0, float32_to_floatx80(
1102 make_float32(0x3F800000), status),
@@ -1183,7 +1183,7 @@ floatx80 floatx80_tentox(floatx80 a, float_status *status)
1183 fp0 = floatx80_add(fp0, fact1, status);
1184
1185 set_float_rounding_mode(user_rnd_mode, status);
1186 - status->floatx80_rounding_precision = user_rnd_prec;
1186 + set_floatx80_rounding_precision(user_rnd_prec, status);
1187
1188 a = floatx80_mul(fp0, adjfact, status);
1189
@@ -1228,9 +1228,9 @@ floatx80 floatx80_tan(floatx80 a, float_status *status)
1228 }
1229
1230 user_rnd_mode = get_float_rounding_mode(status);
1231 - user_rnd_prec = status->floatx80_rounding_precision;
1231 + user_rnd_prec = get_floatx80_rounding_precision(status);
1232 set_float_rounding_mode(float_round_nearest_even, status);
1233 - status->floatx80_rounding_precision = floatx80_precision_x;
1233 + set_floatx80_rounding_precision(floatx80_precision_x, status);
1234
1235 compact = floatx80_make_compact(aExp, aSig);
1236
@@ -1295,7 +1295,7 @@ floatx80 floatx80_tan(floatx80 a, float_status *status)
1295 goto loop;
1296 } else {
1297 set_float_rounding_mode(user_rnd_mode, status);
1298 - status->floatx80_rounding_precision = user_rnd_prec;
1298 + set_floatx80_rounding_precision(user_rnd_prec, status);
1299
1300 a = floatx80_move(a, status);
1301
@@ -1355,7 +1355,7 @@ floatx80 floatx80_tan(floatx80 a, float_status *status)
1355 fp1 = packFloatx80(xSign, xExp, xSig);
1356
1357 set_float_rounding_mode(user_rnd_mode, status);
1358 - status->floatx80_rounding_precision = user_rnd_prec;
1358 + set_floatx80_rounding_precision(user_rnd_prec, status);
1359
1360 a = floatx80_div(fp0, fp1, status);
1361
@@ -1393,7 +1393,7 @@ floatx80 floatx80_tan(floatx80 a, float_status *status)
1393 status); /* 1+S(Q1+S(Q2+S(Q3+SQ4))) */
1394
1395 set_float_rounding_mode(user_rnd_mode, status);
1396 - status->floatx80_rounding_precision = user_rnd_prec;
1396 + set_floatx80_rounding_precision(user_rnd_prec, status);
1397
1398 a = floatx80_div(fp0, fp1, status);
1399
@@ -1439,9 +1439,9 @@ floatx80 floatx80_sin(floatx80 a, float_status *status)
1439 }
1440
1441 user_rnd_mode = get_float_rounding_mode(status);
1442 - user_rnd_prec = status->floatx80_rounding_precision;
1442 + user_rnd_prec = get_floatx80_rounding_precision(status);
1443 set_float_rounding_mode(float_round_nearest_even, status);
1444 - status->floatx80_rounding_precision = floatx80_precision_x;
1444 + set_floatx80_rounding_precision(floatx80_precision_x, status);
1445
1446 compact = floatx80_make_compact(aExp, aSig);
1447
@@ -1510,7 +1510,7 @@ floatx80 floatx80_sin(floatx80 a, float_status *status)
1510 status); /* 1 */
1511
1512 set_float_rounding_mode(user_rnd_mode, status);
1513 - status->floatx80_rounding_precision = user_rnd_prec;
1513 + set_floatx80_rounding_precision(user_rnd_prec, status);
1514
1515 /* SINTINY */
1516 a = floatx80_move(a, status);
@@ -1583,7 +1583,7 @@ floatx80 floatx80_sin(floatx80 a, float_status *status)
1583 fp0 = floatx80_mul(fp0, x, status);
1584
1585 set_float_rounding_mode(user_rnd_mode, status);
1586 - status->floatx80_rounding_precision = user_rnd_prec;
1586 + set_floatx80_rounding_precision(user_rnd_prec, status);
1587
1588 a = floatx80_add(fp0, float32_to_floatx80(posneg1, status), status);
1589
@@ -1633,7 +1633,7 @@ floatx80 floatx80_sin(floatx80 a, float_status *status)
1633 fp0 = floatx80_mul(fp0, fp1, status); /* SIN(R')-R' */
1634
1635 set_float_rounding_mode(user_rnd_mode, status);
1636 - status->floatx80_rounding_precision = user_rnd_prec;
1636 + set_floatx80_rounding_precision(user_rnd_prec, status);
1637
1638 a = floatx80_add(fp0, x, status);
1639
@@ -1679,9 +1679,9 @@ floatx80 floatx80_cos(floatx80 a, float_status *status)
1679 }
1680
1681 user_rnd_mode = get_float_rounding_mode(status);
1682 - user_rnd_prec = status->floatx80_rounding_precision;
1682 + user_rnd_prec = get_floatx80_rounding_precision(status);
1683 set_float_rounding_mode(float_round_nearest_even, status);
1684 - status->floatx80_rounding_precision = floatx80_precision_x;
1684 + set_floatx80_rounding_precision(floatx80_precision_x, status);
1685
1686 compact = floatx80_make_compact(aExp, aSig);
1687
@@ -1749,7 +1749,7 @@ floatx80 floatx80_cos(floatx80 a, float_status *status)
1749 fp0 = float32_to_floatx80(make_float32(0x3F800000), status); /* 1 */
1750
1751 set_float_rounding_mode(user_rnd_mode, status);
1752 - status->floatx80_rounding_precision = user_rnd_prec;
1752 + set_floatx80_rounding_precision(user_rnd_prec, status);
1753
1754 /* COSTINY */
1755 a = floatx80_sub(fp0, float32_to_floatx80(
@@ -1823,7 +1823,7 @@ floatx80 floatx80_cos(floatx80 a, float_status *status)
1823 fp0 = floatx80_mul(fp0, x, status);
1824
1825 set_float_rounding_mode(user_rnd_mode, status);
1826 - status->floatx80_rounding_precision = user_rnd_prec;
1826 + set_floatx80_rounding_precision(user_rnd_prec, status);
1827
1828 a = floatx80_add(fp0, float32_to_floatx80(posneg1, status), status);
1829
@@ -1871,7 +1871,7 @@ floatx80 floatx80_cos(floatx80 a, float_status *status)
1871 fp0 = floatx80_mul(fp0, fp1, status); /* SIN(R')-R' */
1872
1873 set_float_rounding_mode(user_rnd_mode, status);
1874 - status->floatx80_rounding_precision = user_rnd_prec;
1874 + set_floatx80_rounding_precision(user_rnd_prec, status);
1875
1876 a = floatx80_add(fp0, x, status);
1877
@@ -1918,9 +1918,9 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
1918 compact = floatx80_make_compact(aExp, aSig);
1919
1920 user_rnd_mode = get_float_rounding_mode(status);
1921 - user_rnd_prec = status->floatx80_rounding_precision;
1921 + user_rnd_prec = get_floatx80_rounding_precision(status);
1922 set_float_rounding_mode(float_round_nearest_even, status);
1923 - status->floatx80_rounding_precision = floatx80_precision_x;
1923 + set_floatx80_rounding_precision(floatx80_precision_x, status);
1924
1925 if (compact < 0x3FFB8000 || compact > 0x4002FFFF) {
1926 /* |X| >= 16 or |X| < 1/16 */
@@ -1930,7 +1930,7 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
1930 fp1 = packFloatx80(aSign, 0x0001, one_sig);
1931
1932 set_float_rounding_mode(user_rnd_mode, status);
1933 - status->floatx80_rounding_precision = user_rnd_prec;
1933 + set_floatx80_rounding_precision(user_rnd_prec, status);
1934
1935 a = floatx80_sub(fp0, fp1, status);
1936
@@ -1970,7 +1970,7 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
1970 fp1 = packFloatx80(aSign, piby2_exp, pi_sig);
1971
1972 set_float_rounding_mode(user_rnd_mode, status);
1973 - status->floatx80_rounding_precision = user_rnd_prec;
1973 + set_floatx80_rounding_precision(user_rnd_prec, status);
1974
1975 a = floatx80_add(fp0, fp1, status);
1976
@@ -1981,7 +1981,7 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
1981 } else { /* |X| < 1/16 */
1982 if (compact < 0x3FD78000) { /* |X| < 2^(-40) */
1983 set_float_rounding_mode(user_rnd_mode, status);
1984 - status->floatx80_rounding_precision = user_rnd_prec;
1984 + set_floatx80_rounding_precision(user_rnd_prec, status);
1985
1986 a = floatx80_move(a, status);
1987
@@ -2021,7 +2021,7 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
2021 fp0 = floatx80_mul(fp0, fp1, status);
2022
2023 set_float_rounding_mode(user_rnd_mode, status);
2024 - status->floatx80_rounding_precision = user_rnd_prec;
2024 + set_floatx80_rounding_precision(user_rnd_prec, status);
2025
2026 a = floatx80_add(fp0, xsave, status);
2027
@@ -2070,7 +2070,7 @@ floatx80 floatx80_atan(floatx80 a, float_status *status)
2070 fp0 = floatx80_add(fp0, fp1, status); /* ATAN(U) */
2071
2072 set_float_rounding_mode(user_rnd_mode, status);
2073 - status->floatx80_rounding_precision = user_rnd_prec;
2073 + set_floatx80_rounding_precision(user_rnd_prec, status);
2074
2075 a = floatx80_add(fp0, fp3, status); /* ATAN(X) */
2076
@@ -2123,9 +2123,9 @@ floatx80 floatx80_asin(floatx80 a, float_status *status)
2123 } /* |X| < 1 */
2124
2125 user_rnd_mode = get_float_rounding_mode(status);
2126 - user_rnd_prec = status->floatx80_rounding_precision;
2126 + user_rnd_prec = get_floatx80_rounding_precision(status);
2127 set_float_rounding_mode(float_round_nearest_even, status);
2128 - status->floatx80_rounding_precision = floatx80_precision_x;
2128 + set_floatx80_rounding_precision(floatx80_precision_x, status);
2129
2130 one = packFloatx80(0, one_exp, one_sig);
2131 fp0 = a;
@@ -2137,7 +2137,7 @@ floatx80 floatx80_asin(floatx80 a, float_status *status)
2137 fp0 = floatx80_div(fp0, fp1, status); /* X/SQRT((1+X)*(1-X)) */
2138
2139 set_float_rounding_mode(user_rnd_mode, status);
2140 - status->floatx80_rounding_precision = user_rnd_prec;
2140 + set_floatx80_rounding_precision(user_rnd_prec, status);
2141
2142 a = floatx80_atan(fp0, status); /* ATAN(X/SQRT((1+X)*(1-X))) */
2143
@@ -2171,7 +2171,8 @@ floatx80 floatx80_acos(floatx80 a, float_status *status)
2171 }
2172 if (aExp == 0 && aSig == 0) {
2173 float_raise(float_flag_inexact, status);
2174 - return roundAndPackFloatx80(status->floatx80_rounding_precision, 0,
2174 + return roundAndPackFloatx80(get_floatx80_rounding_precision(status),
2175 + 0,
2176 piby2_exp, pi_sig, 0, status);
2177 }
2178
@@ -2193,9 +2194,9 @@ floatx80 floatx80_acos(floatx80 a, float_status *status)
2194 } /* |X| < 1 */
2195
2196 user_rnd_mode = get_float_rounding_mode(status);
2196 - user_rnd_prec = status->floatx80_rounding_precision;
2197 + user_rnd_prec = get_floatx80_rounding_precision(status);
2198 set_float_rounding_mode(float_round_nearest_even, status);
2198 - status->floatx80_rounding_precision = floatx80_precision_x;
2199 + set_floatx80_rounding_precision(floatx80_precision_x, status);
2200
2201 one = packFloatx80(0, one_exp, one_sig);
2202 fp0 = a;
@@ -2207,7 +2208,7 @@ floatx80 floatx80_acos(floatx80 a, float_status *status)
2208 fp0 = floatx80_atan(fp0, status); /* ATAN(SQRT((1-X)/(1+X))) */
2209
2210 set_float_rounding_mode(user_rnd_mode, status);
2210 - status->floatx80_rounding_precision = user_rnd_prec;
2211 + set_floatx80_rounding_precision(user_rnd_prec, status);
2212
2213 a = floatx80_add(fp0, fp0, status); /* 2 * ATAN(SQRT((1-X)/(1+X))) */
2214
@@ -2257,9 +2258,9 @@ floatx80 floatx80_atanh(floatx80 a, float_status *status)
2258 } /* |X| < 1 */
2259
2260 user_rnd_mode = get_float_rounding_mode(status);
2260 - user_rnd_prec = status->floatx80_rounding_precision;
2261 + user_rnd_prec = get_floatx80_rounding_precision(status);
2262 set_float_rounding_mode(float_round_nearest_even, status);
2262 - status->floatx80_rounding_precision = floatx80_precision_x;
2263 + set_floatx80_rounding_precision(floatx80_precision_x, status);
2264
2265 one = packFloatx80(0, one_exp, one_sig);
2266 fp2 = packFloatx80(aSign, 0x3FFE, one_sig); /* SIGN(X) * (1/2) */
@@ -2271,7 +2272,7 @@ floatx80 floatx80_atanh(floatx80 a, float_status *status)
2272 fp0 = floatx80_lognp1(fp0, status); /* LOG1P(Z) */
2273
2274 set_float_rounding_mode(user_rnd_mode, status);
2274 - status->floatx80_rounding_precision = user_rnd_prec;
2275 + set_floatx80_rounding_precision(user_rnd_prec, status);
2276
2277 a = floatx80_mul(fp0, fp2,
2278 status); /* ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z) */
@@ -2316,9 +2317,9 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
2317 }
2318
2319 user_rnd_mode = get_float_rounding_mode(status);
2319 - user_rnd_prec = status->floatx80_rounding_precision;
2320 + user_rnd_prec = get_floatx80_rounding_precision(status);
2321 set_float_rounding_mode(float_round_nearest_even, status);
2321 - status->floatx80_rounding_precision = floatx80_precision_x;
2322 + set_floatx80_rounding_precision(floatx80_precision_x, status);
2323
2324 if (aExp >= 0x3FFD) { /* |X| >= 1/4 */
2325 compact = floatx80_make_compact(aExp, aSig);
@@ -2411,7 +2412,7 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
2412 sc = packFloatx80(0, m + 0x3FFF, one_sig);
2413
2414 set_float_rounding_mode(user_rnd_mode, status);
2414 - status->floatx80_rounding_precision = user_rnd_prec;
2415 + set_floatx80_rounding_precision(user_rnd_prec, status);
2416
2417 a = floatx80_mul(fp0, sc, status);
2418
@@ -2424,7 +2425,7 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
2425 status); /* -1 */
2426
2427 set_float_rounding_mode(user_rnd_mode, status);
2427 - status->floatx80_rounding_precision = user_rnd_prec;
2428 + set_floatx80_rounding_precision(user_rnd_prec, status);
2429
2430 a = floatx80_add(fp0, float32_to_floatx80(
2431 make_float32(0x00800000), status),
@@ -2435,7 +2436,7 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
2436 return a;
2437 } else {
2438 set_float_rounding_mode(user_rnd_mode, status);
2438 - status->floatx80_rounding_precision = user_rnd_prec;
2439 + set_floatx80_rounding_precision(user_rnd_prec, status);
2440
2441 return floatx80_etox(a, status);
2442 }
@@ -2496,7 +2497,7 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
2497 fp0 = floatx80_add(fp0, fp1, status); /* S*B1+Q */
2498
2499 set_float_rounding_mode(user_rnd_mode, status);
2499 - status->floatx80_rounding_precision = user_rnd_prec;
2500 + set_floatx80_rounding_precision(user_rnd_prec, status);
2501
2502 a = floatx80_add(fp0, a, status);
2503
@@ -2514,14 +2515,14 @@ floatx80 floatx80_etoxm1(floatx80 a, float_status *status)
2515 fp0 = floatx80_add(fp0, sc, status);
2516
2517 set_float_rounding_mode(user_rnd_mode, status);
2517 - status->floatx80_rounding_precision = user_rnd_prec;
2518 + set_floatx80_rounding_precision(user_rnd_prec, status);
2519
2520 a = floatx80_mul(fp0, float64_to_floatx80(
2521 make_float64(0x3730000000000000), status),
2522 status);
2523 } else {
2524 set_float_rounding_mode(user_rnd_mode, status);
2524 - status->floatx80_rounding_precision = user_rnd_prec;
2525 + set_floatx80_rounding_precision(user_rnd_prec, status);
2526
2527 a = floatx80_add(fp0, sc, status);
2528 }
@@ -2566,9 +2567,9 @@ floatx80 floatx80_tanh(floatx80 a, float_status *status)
2567 }
2568
2569 user_rnd_mode = get_float_rounding_mode(status);
2569 - user_rnd_prec = status->floatx80_rounding_precision;
2570 + user_rnd_prec = get_floatx80_rounding_precision(status);
2571 set_float_rounding_mode(float_round_nearest_even, status);
2571 - status->floatx80_rounding_precision = floatx80_precision_x;
2572 + set_floatx80_rounding_precision(floatx80_precision_x, status);
2573
2574 compact = floatx80_make_compact(aExp, aSig);
2575
@@ -2577,7 +2578,7 @@ floatx80 floatx80_tanh(floatx80 a, float_status *status)
2578 if (compact < 0x3FFF8000) {
2579 /* TANHSM */
2580 set_float_rounding_mode(user_rnd_mode, status);
2580 - status->floatx80_rounding_precision = user_rnd_prec;
2581 + set_floatx80_rounding_precision(user_rnd_prec, status);
2582
2583 a = floatx80_move(a, status);
2584
@@ -2594,7 +2595,7 @@ floatx80 floatx80_tanh(floatx80 a, float_status *status)
2595 sign ^= 0x80800000; /* -SIGN(X)*EPS */
2596
2597 set_float_rounding_mode(user_rnd_mode, status);
2597 - status->floatx80_rounding_precision = user_rnd_prec;
2598 + set_floatx80_rounding_precision(user_rnd_prec, status);
2599
2600 a = floatx80_add(fp0, float32_to_floatx80(make_float32(sign),
2601 status), status);
@@ -2616,7 +2617,7 @@ floatx80 floatx80_tanh(floatx80 a, float_status *status)
2617 status); /* SIGN */
2618
2619 set_float_rounding_mode(user_rnd_mode, status);
2619 - status->floatx80_rounding_precision = user_rnd_prec;
2620 + set_floatx80_rounding_precision(user_rnd_prec, status);
2621
2622 a = floatx80_add(fp1, fp0, status);
2623
@@ -2639,7 +2640,7 @@ floatx80 floatx80_tanh(floatx80 a, float_status *status)
2640 fp1 = packFloatx80(vSign ^ aSign, vExp, vSig);
2641
2642 set_float_rounding_mode(user_rnd_mode, status);
2642 - status->floatx80_rounding_precision = user_rnd_prec;
2643 + set_floatx80_rounding_precision(user_rnd_prec, status);
2644
2645 a = floatx80_div(fp0, fp1, status);
2646
@@ -2682,9 +2683,9 @@ floatx80 floatx80_sinh(floatx80 a, float_status *status)
2683 }
2684
2685 user_rnd_mode = get_float_rounding_mode(status);
2685 - user_rnd_prec = status->floatx80_rounding_precision;
2686 + user_rnd_prec = get_floatx80_rounding_precision(status);
2687 set_float_rounding_mode(float_round_nearest_even, status);
2687 - status->floatx80_rounding_precision = floatx80_precision_x;
2688 + set_floatx80_rounding_precision(floatx80_precision_x, status);
2689
2690 compact = floatx80_make_compact(aExp, aSig);
2691
@@ -2692,9 +2693,9 @@ floatx80 floatx80_sinh(floatx80 a, float_status *status)
2693 /* SINHBIG */
2694 if (compact > 0x400CB2B3) {
2695 set_float_rounding_mode(user_rnd_mode, status);
2695 - status->floatx80_rounding_precision = user_rnd_prec;
2696 + set_floatx80_rounding_precision(user_rnd_prec, status);
2697
2697 - return roundAndPackFloatx80(status->floatx80_rounding_precision,
2698 + return roundAndPackFloatx80(get_floatx80_rounding_precision(status),
2699 aSign, 0x8000, aSig, 0, status);
2700 } else {
2701 fp0 = floatx80_abs(a); /* Y = |X| */
@@ -2708,7 +2709,7 @@ floatx80 floatx80_sinh(floatx80 a, float_status *status)
2709 fp2 = packFloatx80(aSign, 0x7FFB, one_sig);
2710
2711 set_float_rounding_mode(user_rnd_mode, status);
2711 - status->floatx80_rounding_precision = user_rnd_prec;
2712 + set_floatx80_rounding_precision(user_rnd_prec, status);
2713
2714 a = floatx80_mul(fp0, fp2, status);
2715
@@ -2728,7 +2729,7 @@ floatx80 floatx80_sinh(floatx80 a, float_status *status)
2729 fact = packFloat32(aSign, 0x7E, 0);
2730
2731 set_float_rounding_mode(user_rnd_mode, status);
2731 - status->floatx80_rounding_precision = user_rnd_prec;
2732 + set_floatx80_rounding_precision(user_rnd_prec, status);
2733
2734 a = floatx80_mul(fp0, float32_to_floatx80(fact, status), status);
2735
@@ -2768,17 +2769,18 @@ floatx80 floatx80_cosh(floatx80 a, float_status *status)
2769 }
2770
2771 user_rnd_mode = get_float_rounding_mode(status);
2771 - user_rnd_prec = status->floatx80_rounding_precision;
2772 + user_rnd_prec = get_floatx80_rounding_precision(status);
2773 set_float_rounding_mode(float_round_nearest_even, status);
2773 - status->floatx80_rounding_precision = floatx80_precision_x;
2774 + set_floatx80_rounding_precision(floatx80_precision_x, status);
2775
2776 compact = floatx80_make_compact(aExp, aSig);
2777
2778 if (compact > 0x400CB167) {
2779 if (compact > 0x400CB2B3) {
2780 set_float_rounding_mode(user_rnd_mode, status);
2780 - status->floatx80_rounding_precision = user_rnd_prec;
2781 - return roundAndPackFloatx80(status->floatx80_rounding_precision, 0,
2781 + set_floatx80_rounding_precision(user_rnd_prec, status);
2782 + return roundAndPackFloatx80(get_floatx80_rounding_precision(status),
2783 + 0,
2784 0x8000, one_sig, 0, status);
2785 } else {
2786 fp0 = packFloatx80(0, aExp, aSig);
@@ -2792,7 +2794,7 @@ floatx80 floatx80_cosh(floatx80 a, float_status *status)
2794 fp1 = packFloatx80(0, 0x7FFB, one_sig);
2795
2796 set_float_rounding_mode(user_rnd_mode, status);
2795 - status->floatx80_rounding_precision = user_rnd_prec;
2797 + set_floatx80_rounding_precision(user_rnd_prec, status);
2798
2799 a = floatx80_mul(fp0, fp1, status);
2800
@@ -2810,7 +2812,7 @@ floatx80 floatx80_cosh(floatx80 a, float_status *status)
2812 fp1 = floatx80_div(fp1, fp0, status); /* 1/(2*EXP(|X|)) */
2813
2814 set_float_rounding_mode(user_rnd_mode, status);
2813 - status->floatx80_rounding_precision = user_rnd_prec;
2815 + set_floatx80_rounding_precision(user_rnd_prec, status);
2816
2817 a = floatx80_add(fp0, fp1, status);
2818
tests/fp/fp-test.c
+1 -1
@@ -996,7 +996,7 @@ void run_test(void)
996
997 verCases_roundingPrecision = 0;
998 slow_extF80_roundingPrecision = prec80;
999 - qsf.floatx80_rounding_precision = qsf_prec80;
999 + set_floatx80_rounding_precision(qsf_prec80, &qsf);
1000
1001 if (attrs & FUNC_EFF_ROUNDINGPRECISION) {
1002 verCases_roundingPrecision = prec80;