Skip to content

Commit 453d358

Browse files
committed
Implemented ltod in asm, and removed float64_to_int
1 parent 5c37119 commit 453d358

File tree

3 files changed

+129
-144
lines changed

3 files changed

+129
-144
lines changed

src/crt/float64_to_int.c

Lines changed: 0 additions & 140 deletions
This file was deleted.

src/crt/ltod.src

Lines changed: 123 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
section .text
44

5-
public __ultod, __ltod
5+
if 0
66
; public __utod, __itod
77

88
; __utod:
@@ -41,4 +41,125 @@ __ltod:
4141
pop af, af, iy
4242
ret
4343

44-
extern __ultod_c, __lneg
44+
extern __ultod_c
45+
46+
end if
47+
48+
public __itod
49+
__itod:
50+
push hl
51+
add hl, hl
52+
pop hl
53+
push af
54+
ld e, 0
55+
call c, __ineg
56+
jr __ltod.hijack
57+
58+
section .text
59+
60+
public __utod
61+
__utod:
62+
ld e, 0
63+
64+
require __ultod
65+
66+
section .text
67+
68+
public __ultod
69+
__ultod:
70+
or a, a
71+
push af
72+
jr __ltod.hijack
73+
74+
section .text
75+
76+
public __ltod
77+
__ltod:
78+
rlc e
79+
push af
80+
rrc e
81+
call c, __lneg
82+
83+
require __ltod.hijack
84+
85+
section .text
86+
87+
private __ltod.hijack
88+
__ltod.hijack:
89+
call __lctlz
90+
cp a, 32
91+
jr z, .zero
92+
; clears the MSB since the float will be normalized
93+
; x <<= clz_result + 1; /* shift by 32 is UB */
94+
if 0
95+
; calculate the exponent
96+
push hl
97+
; 1023 + 31 = 1054 = 0x41E
98+
inc.s bc
99+
or a, a
100+
ld b, a ; <<= 8
101+
ld hl, $041E00
102+
ld c, l ; ld c, 0
103+
sbc hl, bc
104+
ld l, e ; (expon16 << (16 + 24)) | (mant48)
105+
ex de, hl
106+
pop hl
107+
108+
ld b, a
109+
inc b
110+
ld a, e
111+
.loop32: ; shift by 32 is not UB here!
112+
add hl, hl
113+
rla
114+
djnz .loop32
115+
ld e, a
116+
else
117+
; calculate the exponent
118+
push hl
119+
; 1023 + 31 = 1054 = 0x41E
120+
inc.s bc
121+
or a, a
122+
ld b, a ; <<= 8
123+
ld hl, $041E00
124+
ld c, l ; ld c, 0
125+
sbc hl, bc
126+
ld l, e ; (expon16 << (16 + 24)) | (mant48)
127+
ex de, hl
128+
129+
pop bc
130+
ld l, a
131+
ld a, e
132+
call __lshl
133+
push bc
134+
pop hl
135+
; shift by 32 is UB
136+
add hl, hl
137+
rla
138+
ld e, a
139+
end if
140+
141+
; UDE:D has expon, E:UHL has mant
142+
; Float64_mant_bits - uint48_bits = 4
143+
ld c, 16 + 4
144+
push bc
145+
call __llshl
146+
pop af ; reset SP
147+
.finish:
148+
pop af
149+
ret nc ; positive
150+
set 7, b
151+
ret ; negative
152+
153+
.zero:
154+
sbc hl, hl
155+
ex de, hl
156+
sbc hl, hl
157+
ld b, e
158+
ld c, e
159+
pop af
160+
ret
161+
162+
extern __lneg
163+
extern __lctlz
164+
extern __lshl
165+
extern __llshl

test/floating_point/float64_from_integer/src/main.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,20 @@ size_t run_test(const char** failed_func) {
3838

3939
result.flt = (long double)((uint32_t)input[i].u32);
4040
if (result.bin != output[i].fu32.bin) {
41+
printf("%zu: ultod\n", i);
4142
print_failed((uint64_t)input[i].u32, result.bin, output[i].fu32.bin);
4243
*failed_func = "ultod";
43-
return i;
44+
// return i;
45+
while (!os_GetCSC());
4446
}
4547

4648
result.flt = (long double)((int32_t)input[i].u32);
4749
if (result.bin != output[i].fi32.bin) {
50+
printf("%zu: ltod\n", i);
4851
print_failed((uint64_t)input[i].u32, result.bin, output[i].fi32.bin);
4952
*failed_func = "ltod";
50-
return i;
53+
// return i;
54+
while (!os_GetCSC());
5155
}
5256

5357
result.flt = (long double)((uint64_t)input[i].u64);

0 commit comments

Comments
 (0)