-
-
Notifications
You must be signed in to change notification settings - Fork 65
Expand file tree
/
Copy pathilogbl.src
More file actions
89 lines (80 loc) · 1.43 KB
/
Copy pathilogbl.src
File metadata and controls
89 lines (80 loc) · 1.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
.assume adl=1
.include "errno.inc"
.include "fenv.inc"
.include "math.inc"
.if EDOM & 0xFF != EDOM
.print "EDOM is assumed to be between 1 and 255"
.err
.endif
.if !(FP_ILOGBNAN == 0x7FFFFF)
.print "ilogbl assumes that FP_ILOGBNAN == 0x7FFFFF (INT_MAX)"
.err
.endif
.if !(FP_ILOGB0 - 1 == FP_ILOGBNAN)
.print "ilogbl assumes FP_ILOGB0 - 1 == FP_ILOGBNAN"
.err
.endif
.section .text
.global _ilogbl
.type _ilogbl, @function
; int ilogbl(long double)
_ilogbl:
ld iy, 0
lea de, iy + 0
add iy, sp
ld hl, (iy + 9)
add hl, hl
ld a, h
rlca
rlca
rlca
add hl, hl
add hl, hl
add.s hl, hl ; clears upper bits
and a, $07
ld l, h
ld h, a
; HL = exponent
adc hl, de
jr z, .L.maybe_subnormal
inc hl
bit 3, h
jr nz, .L.inf_nan
; Float64_exp_bias + 1
ld de, -1024
add hl, de
ret
.L.maybe_subnormal:
ld c, (iy + 9)
ld b, e ; DE is zero
ld de, (iy + 6)
ld hl, (iy + 3)
call __llctlz
cp a, 64
sbc hl, hl
jr z, .L.ret_zero ; A was 64
cpl
ld l, a
; -1023 + 11 + 1 + 1
; Float64_ilogb_subnorm_max + Float64_exponent_bits + Float64_sign_bits
ld de, -1010
add hl, de
ret
.L.ret_zero:
ex de, hl
inc de
.L.inf_nan:
ld hl, $7FFFFF ; FP_ILOGBNAN or INT_MAX
add hl, de ; FP_ILOGB0 when DE is one
ex de, hl
; DE was zero or one, so HL is now zero or one
ld l, EDOM
ld (_errno), hl
ld hl, ___fe_cur_env
set FE_INVALID_BIT, (hl)
ex de, hl
ret
.extern __fpclassifyl
.extern _errno
.extern ___fe_cur_env
.extern __llctlz