home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 April / Chip_1997-04_cd.bin / prezent / cb / data.z / POW10.ASM < prev    next >
Assembly Source File  |  1997-01-16  |  4KB  |  230 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Delphi Runtime Library                          *
  5. ; *                            *
  6. ; *    Copyright (c) 1996 Borland International    *
  7. ; *                            *
  8. ; *******************************************************
  9.  
  10.     INCLUDE    SE.ASM
  11.  
  12.     .386
  13.     .MODEL    FLAT
  14.  
  15.     PUBLIC    _Pow10,FPower10
  16.  
  17.     .CODE
  18.  
  19. ;    FUNCTION _Pow10( val: Extended; int pow: Integer ) : Extended;
  20.  
  21. _Pow10    PROC
  22.  
  23. ; ->    FST(0)    val
  24. ; ->    EAX    Power
  25. ; <-    FST(0)    val * 10**Power
  26.  
  27. ;    This routine generates 10**power with no more than two
  28. ;    floating point multiplications. Up to 10**31, no multiplications
  29. ;    are needed.
  30.  
  31. FPower10:
  32.  
  33.     TEST    EAX,EAX
  34.     JL    @@neg
  35.     JE    @@exit
  36.     CMP    EAX,5120
  37.     JGE    @@inf
  38.     MOV    EDX,EAX
  39.     AND    EDX,01FH
  40.     LEA    EDX,[EDX+EDX*4]
  41.     FLD    tab0[EDX*2]
  42.     FMULP
  43.  
  44.     SHR    EAX,5
  45.     JE    @@exit
  46.  
  47.     MOV    EDX,EAX
  48.     AND    EDX,0FH
  49.     JE    @@skip2ndMul
  50.     LEA    EDX,[EDX+EDX*4]
  51.     FLD    tab1-10[EDX*2]
  52.     FMULP
  53.  
  54. @@skip2ndMul:
  55.  
  56.     SHR    EAX,4
  57.     JE    @@exit
  58.     LEA    EAX,[EAX+EAX*4]
  59.     FLD    tab2-10[EAX*2]
  60.     FMULP
  61.  
  62. @@exit:
  63.     RET
  64.  
  65. @@neg:
  66.     NEG    EAX
  67.     CMP    EAX,5120
  68.     JGE    @@zero
  69.     MOV    EDX,EAX
  70.     AND    EDX,01FH
  71.     LEA    EDX,[EDX+EDX*4]
  72.     FLD    tab0[EDX*2]
  73.     FDIVP
  74.  
  75.     SHR    EAX,5
  76.     JE    @@exit
  77.  
  78.     MOV    EDX,EAX
  79.     AND    EDX,0FH
  80.     JE    @@skip2ndDiv
  81.     LEA    EDX,[EDX+EDX*4]
  82.     FLD    tab1-10[EDX*2]
  83.     FDIVP
  84.  
  85. @@skip2ndDiv:
  86.  
  87.     SHR    EAX,4
  88.     JE    @@exit
  89.     LEA    EAX,[EAX+EAX*4]
  90.     FLD    tab2-10[EAX*2]
  91.     FDIVP
  92.  
  93.     RET
  94.  
  95. @@inf:
  96.     FLD    inf
  97.     RET
  98.  
  99. @@zero:
  100.     FLDZ
  101.     RET
  102.  
  103. inf    DT    7FFF8000000000000000R
  104.  
  105. if 0    ; unfortunately, tasm32 makes some numbers one bit too small...
  106. tab0    DT    1E0
  107.     DT    1E1
  108.     DT    1E2
  109.     DT    1E3
  110.     DT    1E4
  111.     DT    1E5
  112.     DT    1E6
  113.     DT    1E7
  114.     DT    1E8
  115.     DT    1E9
  116.     DT    1E10
  117.     DT    1E11
  118.     DT    1E12
  119.     DT    1E13
  120.     DT    1E14
  121.     DT    1E15
  122.     DT    1E16
  123.     DT    1E17
  124.     DT    1E18
  125.     DT    1E19
  126.     DT    1E20
  127.     DT    1E21
  128.     DT    1E22
  129.     DT    1E23
  130.     DT    1E24
  131.     DT    1E25
  132.     DT    1E26
  133.     DT    1E27
  134.     DT    1E28
  135.     DT    1E29
  136.     DT    1E30
  137.     DT    1E31
  138.  
  139. tab1    DT    1E32
  140.     DT    1E64
  141.     DT    1E96
  142.     DT    1E128
  143.     DT    1E160
  144.     DT    1E192
  145.     DT    1E224
  146.     DT    1E256
  147.     DT    1E288
  148.     DT    1E320
  149.     DT    1E352
  150.     DT    1E384
  151.     DT    1E416
  152.     DT    1E448
  153.     DT    1E480
  154.  
  155. tab2    DT    1E512
  156.     DT    1E1024
  157.     DT    1E1536
  158.     DT    1E2048
  159.     DT    1E2560
  160.     DT    1E3072
  161.     DT    1E3584
  162.     DT    1E4096
  163.     DT    1E4608
  164.  
  165. else    ;    these are better numbers ...
  166.  
  167. tab0    DT    3FFF8000000000000000R    ; 10**0
  168.     DT    4002A000000000000000R    ; 10**1
  169.     DT    4005C800000000000000R    ; 10**2
  170.     DT    4008FA00000000000000R    ; 10**3
  171.     DT    400C9C40000000000000R    ; 10**4
  172.     DT    400FC350000000000000R    ; 10**5
  173.     DT    4012F424000000000000R    ; 10**6
  174.     DT    40169896800000000000R    ; 10**7
  175.     DT    4019BEBC200000000000R    ; 10**8
  176.     DT    401CEE6B280000000000R    ; 10**9
  177.     DT    40209502F90000000000R    ; 10**10
  178.     DT    4023BA43B74000000000R    ; 10**11
  179.     DT    4026E8D4A51000000000R    ; 10**12
  180.     DT    402A9184E72A00000000R    ; 10**13
  181.     DT    402DB5E620F480000000R    ; 10**14
  182.     DT    4030E35FA931A0000000R    ; 10**15
  183.     DT    40348E1BC9BF04000000R    ; 10**16
  184.     DT    4037B1A2BC2EC5000000R    ; 10**17
  185.     DT    403ADE0B6B3A76400000R    ; 10**18
  186.     DT    403E8AC7230489E80000R    ; 10**19
  187.     DT    4041AD78EBC5AC620000R    ; 10**20
  188.     DT    4044D8D726B7177A8000R    ; 10**21
  189.     DT    4048878678326EAC9000R    ; 10**22
  190.     DT    404BA968163F0A57B400R    ; 10**23
  191.     DT    404ED3C21BCECCEDA100R    ; 10**24
  192.     DT    405284595161401484A0R    ; 10**25
  193.     DT    4055A56FA5B99019A5C8R    ; 10**26
  194.     DT    4058CECB8F27F4200F3AR    ; 10**27
  195.     DT    405C813F3978F8940984R    ; 10**28
  196.     DT    405FA18F07D736B90BE5R    ; 10**29
  197.     DT    4062C9F2C9CD04674EDFR    ; 10**30
  198.     DT    4065FC6F7C4045812296R    ; 10**31
  199.  
  200. tab1    DT    40699DC5ADA82B70B59ER    ; 10**32
  201.     DT    40D3C2781F49FFCFA6D5R    ; 10**64
  202.     DT    413DEFB3AB16C59B14A3R    ; 10**96
  203.     DT    41A893BA47C980E98CE0R    ; 10**128
  204.     DT    4212B616A12B7FE617AAR    ; 10**160
  205.     DT    427CE070F78D3927556BR    ; 10**192
  206.     DT    42E78A5296FFE33CC930R    ; 10**224
  207.     DT    4351AA7EEBFB9DF9DE8ER    ; 10**256
  208.     DT    43BBD226FC195C6A2F8CR    ; 10**288
  209.     DT    442681842F29F2CCE376R    ; 10**320
  210.     DT    44909FA42700DB900AD2R    ; 10**352
  211.     DT    44FAC4C5E310AEF8AA17R    ; 10**384
  212.     DT    4564F28A9C07E9B09C59R    ; 10**416
  213.     DT    45CF957A4AE1EBF7F3D4R    ; 10**448
  214.     DT    4639B83ED8DC0795A262R    ; 10**480
  215.  
  216. tab2    DT    46A3E319A0AEA60E91C7R    ; 10**512
  217.     DT    4D48C976758681750C17R    ; 10**1024
  218.     DT    53EDB2B8353B3993A7E4R    ; 10**1536
  219.     DT    5A929E8B3B5DC53D5DE5R    ; 10**2048
  220.     DT    61378CA554C020A1F0A6R    ; 10**2560
  221.     DT    67DBF9895D25D88B5A8BR    ; 10**3072
  222.     DT    6E80DD5DC8A2BF27F3F8R    ; 10**3584
  223.     DT    7525C46052028A20979BR    ; 10**4096
  224.     DT    7BCAAE3511626ED559F0R    ; 10**4608
  225. endif
  226.  
  227. _Pow10    ENDP
  228.  
  229.     END
  230.