Skip to content

Commit b56d688

Browse files
committed
Updated the definition of quiet NaN for issignaling
1 parent 5c37119 commit b56d688

File tree

4 files changed

+15
-43
lines changed

4 files changed

+15
-43
lines changed

src/libc/issignalingf.src

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,20 @@
44

55
public __issignalingf
66

7-
; assumes quiet NaN is 0x7FC00000 or 0xFFC00000
7+
; assumes quiet NaN is NaN with bit 22 set
88
; bool _issignalingf(float)
99
__issignalingf:
1010
; based off __isnanf, unoptimized
1111
xor a, a
1212
ld iy, 0
1313
add iy, sp
14+
bit 6, (iy + 5) ; 22 % 8 == 6
15+
ret nz ; quiet bit set, return false
1416
ld hl, (iy + 3)
1517
adc hl, hl
1618
ret z ; infinity
1719
ld a, (iy + 6)
1820
rla
19-
20-
or a, a
21-
adc hl, hl
22-
jr z, .quiet_nan
23-
2421
add a, 1 ; attempt to overflow the exponent
2522
sbc a, a
2623
ret
27-
28-
.quiet_nan:
29-
xor a, a
30-
ret

src/libc/issignalingl.src

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,14 @@
44

55
public __issignalingl
66

7-
; assumes quiet NaN is 0x7FF8000000000000 or 0xFFF8000000000000
7+
; assumes quiet NaN is NaN with bit 51 set
88
; bool _issignalingl(long double)
99
__issignalingl:
10-
; based off __isnanl, unoptimized
11-
pop bc, hl, de
12-
xor a, a
13-
adc hl, de
14-
pop de
15-
push bc, bc, bc, bc
16-
ld a, e
17-
jr nz, .mant_nonzero ; normal, subnormal, or NaN
18-
jr c, .mant_nonzero ; normal, subnormal, or NaN
19-
; common NaN, inf, normal, or subnormal
20-
; quiet NaN will be along this path
21-
xor a, $F8
22-
ret z ; quiet NaN
23-
xor a, $F8
24-
ret z
25-
dec a
26-
.mant_nonzero:
27-
add a, 16 ; overflows 0xF0
28-
sbc a, a
29-
ret z
30-
ld a, d
31-
add a, a
32-
add a, 2
33-
sbc a, a
10+
ld hl, 9
11+
add hl, sp
12+
bit 3, (hl) ; 51 % 8 == 3
13+
jp z, __isnanl
14+
xor a, a ; quiet bit set, return false
3415
ret
16+
17+
extern __isnanl

test/floating_point/float32_classification/src/main.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,13 @@ static const testb test_values[] = {
6363
{/* UINT32_C(0x00800000), */ UINT32_C(0x7F7FFFFF), false, false, false, true , true , false, false, FP_NORMAL },
6464
{/* UINT32_C(0x7F800000), */ UINT32_C(0x7F800000), false, false, true , false, false, false, false, FP_INFINITE },
6565
{/* UINT32_C(0x7F800001), */ UINT32_C(0x7FBFFFFF), true , true , false, false, false, false, false, FP_NAN },
66-
{/* UINT32_C(0x7FC00000), */ UINT32_C(0x7FC00000), false, true , false, false, false, false, false, FP_NAN },
67-
{/* UINT32_C(0x7FC00001), */ UINT32_C(0x7FFFFFFF), true , true , false, false, false, false, false, FP_NAN },
66+
{/* UINT32_C(0x7FC00000), */ UINT32_C(0x7FFFFFFF), false, true , false, false, false, false, false, FP_NAN },
6867
{/* UINT32_C(0x80000000), */ UINT32_C(0x80000000), false, false, false, true , false, false, true , FP_ZERO },
6968
{/* UINT32_C(0x80000001), */ UINT32_C(0x807FFFFF), false, false, false, true , false, true , false, FP_SUBNORMAL},
7069
{/* UINT32_C(0x80800000), */ UINT32_C(0xFF7FFFFF), false, false, false, true , true , false, false, FP_NORMAL },
7170
{/* UINT32_C(0xFF800000), */ UINT32_C(0xFF800000), false, false, true , false, false, false, false, FP_INFINITE },
7271
{/* UINT32_C(0xFF800001), */ UINT32_C(0xFFBFFFFF), true , true , false, false, false, false, false, FP_NAN },
73-
{/* UINT32_C(0xFFC00000), */ UINT32_C(0xFFC00000), false, true , false, false, false, false, false, FP_NAN },
74-
{/* UINT32_C(0xFFC00001), */ UINT32_C(0xFFFFFFFF), true , true , false, false, false, false, false, FP_NAN },
72+
{/* UINT32_C(0xFFC00000), */ UINT32_C(0xFFFFFFFF), false, true , false, false, false, false, false, FP_NAN },
7573
};
7674

7775
/**

test/floating_point/float64_classification/src/main.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,13 @@ static const testb test_values[] = {
6363
{/* UINT64_C(0x0010000000000000), */ UINT64_C(0x7FEFFFFFFFFFFFFF), false, false, false, true , true , false, false, FP_NORMAL },
6464
{/* UINT64_C(0x7FF0000000000000), */ UINT64_C(0x7FF0000000000000), false, false, true , false, false, false, false, FP_INFINITE },
6565
{/* UINT64_C(0x7FF0000000000001), */ UINT64_C(0x7FF7FFFFFFFFFFFF), true , true , false, false, false, false, false, FP_NAN },
66-
{/* UINT64_C(0x7FF8000000000000), */ UINT64_C(0x7FF8000000000000), false, true , false, false, false, false, false, FP_NAN },
67-
{/* UINT64_C(0x7FF8000000000001), */ UINT64_C(0x7FFFFFFFFFFFFFFF), true , true , false, false, false, false, false, FP_NAN },
66+
{/* UINT64_C(0x7FF8000000000000), */ UINT64_C(0x7FFFFFFFFFFFFFFF), false, true , false, false, false, false, false, FP_NAN },
6867
{/* UINT64_C(0x8000000000000000), */ UINT64_C(0x8000000000000000), false, false, false, true , false, false, true , FP_ZERO },
6968
{/* UINT64_C(0x8000000000000001), */ UINT64_C(0x800FFFFFFFFFFFFF), false, false, false, true , false, true , false, FP_SUBNORMAL},
7069
{/* UINT64_C(0x8010000000000000), */ UINT64_C(0xFFEFFFFFFFFFFFFF), false, false, false, true , true , false, false, FP_NORMAL },
7170
{/* UINT64_C(0xFFF0000000000000), */ UINT64_C(0xFFF0000000000000), false, false, true , false, false, false, false, FP_INFINITE },
7271
{/* UINT64_C(0xFFF0000000000001), */ UINT64_C(0xFFF7FFFFFFFFFFFF), true , true , false, false, false, false, false, FP_NAN },
73-
{/* UINT64_C(0xFFF8000000000000), */ UINT64_C(0xFFF8000000000000), false, true , false, false, false, false, false, FP_NAN },
74-
{/* UINT64_C(0xFFF8000000000001), */ UINT64_C(0xFFFFFFFFFFFFFFFF), true , true , false, false, false, false, false, FP_NAN },
72+
{/* UINT64_C(0xFFF8000000000000), */ UINT64_C(0xFFFFFFFFFFFFFFFF), false, true , false, false, false, false, false, FP_NAN },
7573
};
7674

7775
/**

0 commit comments

Comments
 (0)