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;