|
|
1.1 root 1: //////////
2: / libc/crt/i386/_fxam.s
3: / i386 C runtime library.
4: / IEEE software floating point support.
5: //////////
6:
7: //////////
8: / int _fxam(double d)
9: / Return a value indicating the type of d,
10: / corresponding to the return value of the "fxam" opcode, as follows:
11: / 1 + NAN
12: / 3 - NAN
13: / 4 + Normal
14: / 5 + Infinity
15: / 6 - Normal
16: / 7 - Infinity
17: / 8 + 0
18: / 10 - 0
19: / 12 + Denormal
20: / 14 - Denormal
21: //////////
22:
23: d .equ 4
24: EXPMASK .equ 0x7FF00000
25: MANMASK .equ 0x000FFFFF
26:
27: .globl _fxam
28:
29: _fxam:
30: movl %edx, d+4(%esp)
31: movl %eax, d(%esp) / d to EDX:EAX
32: movl %ecx, %edx
33: andl %ecx, $MANMASK / extract hi mantissa dword
34: orl %eax, %ecx / EAX nonzero if any mantissa bits set
35: movl %ecx, %edx
36: andl %ecx, $EXPMASK / extract exponent in ECX
37: jz ?zeroexp
38: cmpl %ecx, $EXPMASK
39: jz ?maxexp
40: movl %eax, $4 / arg is normal
41: ?setsign:
42: orl %edx, %edx
43: jns ?L0 / arg positive, return value from EAX
44: addl %eax, $2 / bump result by 2 for negative arg
45: ?L0:
46: ret
47:
48: ?zeroexp: / exp is 0, arg is 0.0 or denormal
49: orl %eax, %eax / check if any mantissa bits set
50: movl %eax, $8
51: jz ?setsign / arg is zero
52: movl %eax, $12 / arg is denormal
53: jmp ?setsign
54:
55: ?maxexp: / exp is max, arg is infinity or NaN
56: orl %eax, %eax / check if any mantissa bits set
57: movl %eax, $5
58: jz ?setsign / arg is infinity
59: movl %eax, $1 / arg is NaN
60: jmp ?setsign
61:
62: / end of libc/crt/i386/_fxam.s
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.