File tree Expand file tree Collapse file tree 2 files changed +16
-10
lines changed
test/floating_point/float32_ldexp/src Expand file tree Collapse file tree 2 files changed +16
-10
lines changed Original file line number Diff line number Diff line change @@ -129,24 +129,26 @@ _ldexpf:
129
129
jr nc, _ldexpf.shru_common
130
130
; .underflow:
131
131
inc b ; ld b, 0 ; sets Z
132
- .underflow_to_zero: ; <-- Z is set when underflowing to zero
133
132
.overflow_to_inf: ; <-- NZ is set when infinite
134
- .raise_erange_avoid_negative_zero:
133
+ ld a, $28 ; FE_OVERFLOW | FE_INEXACT
134
+ .underflow_to_zero: ; <-- Z is set when underflowing to zero
135
+ .raise_erange:
135
136
ld hl, $800000
136
137
jr nz, .overflow
138
+ ld a, $24 ; FE_UNDERFLOW | FE_INEXACT
137
139
add hl, hl ; ld hl, 0
138
140
if __ldexpf_avoid_negative_zero
139
141
; prevents negative zero from being emitted on underflow
140
142
res 7, (iy + 6)
141
143
end if
142
144
.overflow:
143
145
ex de, hl
144
- .raise_erange:
145
146
ld hl, 5 ; ERANGE
146
147
ld (_errno), hl
147
148
.raise_inexact:
148
149
ld hl, ___fe_cur_env
149
- set 5, (hl) ; FE_INEXACT
150
+ or a, (hl)
151
+ ld (hl), a
150
152
.result_is_exact:
151
153
ld a, (iy + 6) ; expon
152
154
rla ; extract signbit
@@ -214,13 +216,10 @@ end if
214
216
ld a, c ; UDE
215
217
or a, d
216
218
or a, e
219
+ ld a, $20 ; FE_INEXACT
217
220
jr nz, .raise_inexact
218
221
; NZ needs to be set here
219
- if __ldexpf_avoid_negative_zero
220
- jr .raise_erange_avoid_negative_zero
221
- else
222
222
jr .raise_erange
223
- end if
224
223
225
224
extern _errno
226
225
extern ___fe_cur_env
Original file line number Diff line number Diff line change @@ -65,11 +65,18 @@ size_t run_test(void) {
65
65
F32_pun mant_0 , mant_1 ;
66
66
mant_0 .flt = frexpf (fabsf (input [i ].value .flt ), & temp );
67
67
mant_1 .flt = frexpf (fabsf (output [i ].flt ), & temp );
68
- bool inexact_raised = fetestexcept (FE_INEXACT );
68
+ unsigned char fe_val = __fe_cur_env ;
69
+ bool inexact_raised = (fe_val & FE_INEXACT );
70
+ bool underflow_raised = (fe_val & FE_UNDERFLOW );
71
+ bool overflow_raised = (fe_val & FE_OVERFLOW );
69
72
bool mant_equal = (mant_0 .bin == mant_1 .bin );
70
73
bool became_zero = (mant_0 .bin != 0 && mant_1 .bin == 0 );
71
74
bool became_infinite = (mant_0 .bin != UINT32_C (0x7F800000 ) && mant_1 .bin == UINT32_C (0x7F800000 ));
72
- if (!((mant_equal != inexact_raised ) && ((became_zero || became_infinite ) == (errno == ERANGE )))) {
75
+ if (!(
76
+ (mant_equal != inexact_raised ) &&
77
+ ((became_zero || became_infinite ) == (errno == ERANGE )) &&
78
+ (became_zero == underflow_raised ) && (became_infinite == overflow_raised )
79
+ )) {
73
80
test_printf (
74
81
"%zu: FE: %02X errno: %d\nI: %08lX %+d\nO: %08lX\n" ,
75
82
i , (unsigned int )__fe_cur_env , errno ,
You can’t perform that action at this time.
0 commit comments