Skip to content

Commit 7a56eb4

Browse files
committed
Saved 4 bytes in ftod
1 parent fc0ab8f commit 7a56eb4

File tree

1 file changed

+28
-15
lines changed

1 file changed

+28
-15
lines changed

src/crt/ftod.src

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,26 @@
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

Comments
 (0)