* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / linux86-0.16.17 / libc / i386fp / frexp.x
blob318fc3423a1179f920633f9e4bc6a505ccb30d5b
1 ! bcc 386 floating point routines (version 2) -- _frexp
2 ! authors: Timothy Murphy (tim@maths.tcd.ie), Bruce Evans
4 #include "fplib.h"
6         .extern fpdenormal
8 ! void frexp(double value, int *exponent);
9 ! splits a double into exponent and fraction (where 0.5 <= fraction < 1.0)
11         .globl  _frexp
12         .align  ALIGNMENT
13 _frexp:
14 push ebx
15 #undef PC_SIZE
16 #define PC_SIZE 8
17         mov     eax,PC_SIZE+D_LOW[esp]  ! lower dword of x
18         mov     ebx,PC_SIZE+D_HIGH[esp] ! upper dword of x
19         mov     edx,PC_SIZE+D_SIZE[esp] ! exponent pointer
20         mov     ecx,ebx         ! extract exponent here
21         and     ecx,#D_EXP_MASK
22         jz      exp_x_0
24         shr     ecx,#D_EXP_SHIFT        ! exponent + bias
25 got_x:
26         sub     ecx,#D_EXP_BIAS-1       ! D_EXP_BIAS is for 1.x form, we want 0.1x form
27         mov     [edx],ecx       ! return exponent
28         and     ebx,#D_SIGN_MASK | D_FRAC_MASK  ! extract sign and fraction
29         or      ebx,#(D_EXP_BIAS-1) << D_EXP_SHIFT      ! set new exponent for 0.1x
30 mov edx,ebx
31 pop ebx
32         ret
34         .align  ALIGNMENT
35 exp_x_0:
36         test    ebx,#D_FRAC_MASK
37         jnz     xu_denorm
38         test    eax,eax
39         jnz     xl_denorm
40         mov     [edx],ecx       ! return zero exponent
41         mov     ebx,ecx         ! guard against -0 (may not be necessary)
42 mov edx,ebx
43 pop ebx
44         ret
46         .align  ALIGNMENT
47 xl_denorm:
48         call    fpdenormal
49         bsr     ecx,eax         ! zzzz
50         neg     ecx
51         add     ecx,#REG_BIT-1
52         shl     eax,cl
53         shld    ebx,eax,#D_NORM_BIT+1
54         shl     eax,#D_NORM_BIT+1
55         sub     ecx,#D_NORM_BIT+1
56         jmp     got_x
58         .align  ALIGNMENT
59 xu_denorm:
60         call    fpdenormal
61         bsr     ecx,ebx
62         neg     ecx
63         add     ecx,#D_NORM_BIT
64         shld    ebx,eax,cl
65         shl     eax,cl
66         jmp     got_x