home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1997 April
/
Chip_1997-04_cd.bin
/
prezent
/
cb
/
data.z
/
POW10.ASM
< prev
next >
Wrap
Assembly Source File
|
1997-01-16
|
4KB
|
230 lines
; *******************************************************
; * *
; * Delphi Runtime Library *
; * *
; * Copyright (c) 1996 Borland International *
; * *
; *******************************************************
INCLUDE SE.ASM
.386
.MODEL FLAT
PUBLIC _Pow10,FPower10
.CODE
; FUNCTION _Pow10( val: Extended; int pow: Integer ) : Extended;
_Pow10 PROC
; -> FST(0) val
; -> EAX Power
; <- FST(0) val * 10**Power
; This routine generates 10**power with no more than two
; floating point multiplications. Up to 10**31, no multiplications
; are needed.
FPower10:
TEST EAX,EAX
JL @@neg
JE @@exit
CMP EAX,5120
JGE @@inf
MOV EDX,EAX
AND EDX,01FH
LEA EDX,[EDX+EDX*4]
FLD tab0[EDX*2]
FMULP
SHR EAX,5
JE @@exit
MOV EDX,EAX
AND EDX,0FH
JE @@skip2ndMul
LEA EDX,[EDX+EDX*4]
FLD tab1-10[EDX*2]
FMULP
@@skip2ndMul:
SHR EAX,4
JE @@exit
LEA EAX,[EAX+EAX*4]
FLD tab2-10[EAX*2]
FMULP
@@exit:
RET
@@neg:
NEG EAX
CMP EAX,5120
JGE @@zero
MOV EDX,EAX
AND EDX,01FH
LEA EDX,[EDX+EDX*4]
FLD tab0[EDX*2]
FDIVP
SHR EAX,5
JE @@exit
MOV EDX,EAX
AND EDX,0FH
JE @@skip2ndDiv
LEA EDX,[EDX+EDX*4]
FLD tab1-10[EDX*2]
FDIVP
@@skip2ndDiv:
SHR EAX,4
JE @@exit
LEA EAX,[EAX+EAX*4]
FLD tab2-10[EAX*2]
FDIVP
RET
@@inf:
FLD inf
RET
@@zero:
FLDZ
RET
inf DT 7FFF8000000000000000R
if 0 ; unfortunately, tasm32 makes some numbers one bit too small...
tab0 DT 1E0
DT 1E1
DT 1E2
DT 1E3
DT 1E4
DT 1E5
DT 1E6
DT 1E7
DT 1E8
DT 1E9
DT 1E10
DT 1E11
DT 1E12
DT 1E13
DT 1E14
DT 1E15
DT 1E16
DT 1E17
DT 1E18
DT 1E19
DT 1E20
DT 1E21
DT 1E22
DT 1E23
DT 1E24
DT 1E25
DT 1E26
DT 1E27
DT 1E28
DT 1E29
DT 1E30
DT 1E31
tab1 DT 1E32
DT 1E64
DT 1E96
DT 1E128
DT 1E160
DT 1E192
DT 1E224
DT 1E256
DT 1E288
DT 1E320
DT 1E352
DT 1E384
DT 1E416
DT 1E448
DT 1E480
tab2 DT 1E512
DT 1E1024
DT 1E1536
DT 1E2048
DT 1E2560
DT 1E3072
DT 1E3584
DT 1E4096
DT 1E4608
else ; these are better numbers ...
tab0 DT 3FFF8000000000000000R ; 10**0
DT 4002A000000000000000R ; 10**1
DT 4005C800000000000000R ; 10**2
DT 4008FA00000000000000R ; 10**3
DT 400C9C40000000000000R ; 10**4
DT 400FC350000000000000R ; 10**5
DT 4012F424000000000000R ; 10**6
DT 40169896800000000000R ; 10**7
DT 4019BEBC200000000000R ; 10**8
DT 401CEE6B280000000000R ; 10**9
DT 40209502F90000000000R ; 10**10
DT 4023BA43B74000000000R ; 10**11
DT 4026E8D4A51000000000R ; 10**12
DT 402A9184E72A00000000R ; 10**13
DT 402DB5E620F480000000R ; 10**14
DT 4030E35FA931A0000000R ; 10**15
DT 40348E1BC9BF04000000R ; 10**16
DT 4037B1A2BC2EC5000000R ; 10**17
DT 403ADE0B6B3A76400000R ; 10**18
DT 403E8AC7230489E80000R ; 10**19
DT 4041AD78EBC5AC620000R ; 10**20
DT 4044D8D726B7177A8000R ; 10**21
DT 4048878678326EAC9000R ; 10**22
DT 404BA968163F0A57B400R ; 10**23
DT 404ED3C21BCECCEDA100R ; 10**24
DT 405284595161401484A0R ; 10**25
DT 4055A56FA5B99019A5C8R ; 10**26
DT 4058CECB8F27F4200F3AR ; 10**27
DT 405C813F3978F8940984R ; 10**28
DT 405FA18F07D736B90BE5R ; 10**29
DT 4062C9F2C9CD04674EDFR ; 10**30
DT 4065FC6F7C4045812296R ; 10**31
tab1 DT 40699DC5ADA82B70B59ER ; 10**32
DT 40D3C2781F49FFCFA6D5R ; 10**64
DT 413DEFB3AB16C59B14A3R ; 10**96
DT 41A893BA47C980E98CE0R ; 10**128
DT 4212B616A12B7FE617AAR ; 10**160
DT 427CE070F78D3927556BR ; 10**192
DT 42E78A5296FFE33CC930R ; 10**224
DT 4351AA7EEBFB9DF9DE8ER ; 10**256
DT 43BBD226FC195C6A2F8CR ; 10**288
DT 442681842F29F2CCE376R ; 10**320
DT 44909FA42700DB900AD2R ; 10**352
DT 44FAC4C5E310AEF8AA17R ; 10**384
DT 4564F28A9C07E9B09C59R ; 10**416
DT 45CF957A4AE1EBF7F3D4R ; 10**448
DT 4639B83ED8DC0795A262R ; 10**480
tab2 DT 46A3E319A0AEA60E91C7R ; 10**512
DT 4D48C976758681750C17R ; 10**1024
DT 53EDB2B8353B3993A7E4R ; 10**1536
DT 5A929E8B3B5DC53D5DE5R ; 10**2048
DT 61378CA554C020A1F0A6R ; 10**2560
DT 67DBF9895D25D88B5A8BR ; 10**3072
DT 6E80DD5DC8A2BF27F3F8R ; 10**3584
DT 7525C46052028A20979BR ; 10**4096
DT 7BCAAE3511626ED559F0R ; 10**4608
endif
_Pow10 ENDP
END