88; ouput BC:UDE:UHL (long double)
99; NaN payloads are bitshifted
1010__ftod:
11- bit 7, e
11+ sla e ; extract signbit
1212 push af
13- res 7, e
13+ srl e
14+ ; signbit and carry are cleared
1415
15- xor a, a
1616 ld a, e
17-
18- adc hl, hl
1917 ld b, $03 ; ld bc, $380 - 1
18+
19+ adc hl, hl
2020 jr z, .mant_zero ; zero inf or normal
2121 adc a, a
2222 jr z, .subnormal
2323 inc a
24- jr z, .nan
24+ jr z, .nan
2525.normal:
2626 ; (Float64_bias - Float32_bias) - 1 (undoing inc a)
2727 ; (Float64_bias - Float32_bias) = $0380
28- add a, $80 - 1
28+ add a, $80 - 1 ; this can be changed to adc if needed
29+ .subnorm_shift:
30+ ; Same as ld c, a \ ld a, 0 \ adc a, b
2931 ld c, a
3032 adc a, b
3133 sub a, c
@@ -44,12 +46,13 @@ __ftod:
4446
4547 ; zero low bits
4648.infinite:
47- or a, a
49+ ; or a, a ; not needed
50+ ; f64_mant_bits - f32_mant_bits = lowest 29 bits will be zero
4851 ex de, hl
4952 sbc hl, hl
5053.finish:
5154 pop af
52- ret z ; positive
55+ ret nc ; positive
5356 set 7, b
5457 ret ; negative
5558
@@ -61,7 +64,7 @@ __ftod:
6164 jr nz, .normal
6265 ; infinite
6366 ld c, $F0
64- ld b, e ; load all ones with the signbit
67+ ld b, e ; ld b, $7F since infinity is all ones
6568 jr .infinite
6669
6770.subnormal:
@@ -73,16 +76,26 @@ __ftod:
7376 ; (Float64_bias - Float32_bias) = $0380
7477 ; expon = (Float64_bias - Float32_bias) - clz_result
7578 add hl, hl
79+ ; the following three methods are equivilient
80+ if 1
81+ ; ($FF - a) - $7F
7682 cpl
77- adc a, $80
78- ld c, a
79- ld a, b ; ld a, $03
80- jr .shift_28
83+ sub a, $80 - 1
84+ else if 0
85+ ; $FF - (a + $7F)
86+ add a, $80 - 1
87+ cpl
88+ else
89+ ; $80 - c (c is equal to a)
90+ ld a, $80
91+ sub a, c
92+ end if
93+ jr .subnorm_shift
8194
8295.nan:
8396 ld a, $07
8497 ld c, $FF
8598 jr .shift_28
8699
87100 extern __ictlz
88- extern __ishl
101+ extern __ishl
0 commit comments