home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / tahoe / math / Kexpf.s < prev    next >
Encoding:
Text File  |  1991-05-04  |  5.4 KB  |  248 lines

  1. /*-
  2.  * Copyright (c) 1985 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * Computer Consoles Inc.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  *
  36.  *    @(#)Kexpf.s    7.1 (Berkeley) 12/6/90
  37.  */
  38.  
  39. #include "../tahoe/SYS.h"
  40.  
  41.     .text
  42. ENTRY(Kexpf, R4|R3)
  43.     subl3    $88,fp,sp
  44.     tstl    4(fp)
  45.     jneq    1f
  46.     movl    one,r0
  47.     ret
  48. 1:
  49.     lnd    _maxf
  50.     cmpd    4(fp)
  51.     jleq    1f
  52.     clrl    r0
  53.     ret
  54. 1:
  55.     cmpd2    4(fp),_maxf
  56.     jleq    1f
  57.     ldd    _HUGE
  58.     cvdf
  59.     stf    r0
  60.     ret
  61. 1:    
  62.     pushl    20(fp)        # hfs
  63.     ldd    _log2e; pushd
  64.     ldd    4(fp); pushd
  65.     callf    $24,_Kmuld
  66.     ldd    r0
  67.     std    4(fp)
  68.  
  69.     pushl    20(fp)        # hfs
  70.     pushl    8(fp)
  71.     pushl    4(fp)
  72.     callf    $16,_Kfloorf
  73.     movl    r0,-88(fp)    # (int)ent from Kfloorf
  74.  
  75.     cvlf    -88(fp)
  76.     clrl    r1
  77.     stf    r0
  78.     pushl    20(fp)        # hfs
  79.     pushl    r1
  80.     pushl    r0
  81.     ldd    4(fp); pushd
  82.     callf    $24,_Ksubd    # (arg - ent)
  83.  
  84.     pushl    20(fp)        # hfs
  85.     ldd    half; pushd
  86.     ldd    r0; pushd
  87.     callf    $24,_Ksubd
  88.     ldd    r0; std    -60(fp)    # fract
  89.  
  90.     pushl    20(fp)        # hfs
  91.     pushd
  92.     pushd
  93.     callf    $24,_Kmuld
  94.     ldd    r0; std    -84(fp)    # xsq
  95.  
  96.     pushl    20(fp)        # hfs
  97.     pushd            # xsq
  98.     ldd    _p2; pushd
  99.     callf    $24,_Kmuld
  100.  
  101.     pushl    20(fp)        # hfs
  102.     ldd    _p1; pushd
  103.     ldd    r0; pushd
  104.     callf    $24,_Kaddd
  105.  
  106.     pushl    20(fp)        # hfs
  107.     ldd    -84(fp); pushd
  108.     ldd    r0; pushd
  109.     callf    $24,_Kmuld
  110.  
  111.     pushl    20(fp)        # hfs
  112.     ldd    _p0; pushd
  113.     ldd    r0; pushd
  114.     callf    $24,_Kaddd
  115.  
  116.     pushl    20(fp)        # hfs
  117.     ldd    -60(fp); pushd    # fract
  118.     ldd    r0; pushd
  119.     callf    $24,_Kmuld
  120.     ldd    r0; std    -68(fp)    # temp1
  121.  
  122.     pushl    20(fp)        # hfs
  123.     ldd    -84(fp); pushd    # xsq
  124.     ldd    _q2; pushd
  125.     callf    $24,_Kmuld
  126.  
  127.     pushl    20(fp)        # hfs
  128.     ldd    _q1; pushd
  129.     ldd    r0; pushd
  130.     callf    $24,_Kaddd
  131.  
  132.     pushl    20(fp)        # hfs
  133.     ldd    -84(fp); pushd
  134.     ldd    r0; pushd
  135.     callf    $24,_Kmuld
  136.  
  137.     pushl    20(fp)        # hfs
  138.     ldd    _q0; pushd
  139.     ldd    r0; pushd
  140.     callf    $24,_Kaddd
  141.     ldd    r0; std    -76(fp)    # temp2
  142.  
  143.     pushl    20(fp)        # hfs for Kldexpf
  144.     pushl    -88(fp)        # ent
  145.  
  146.     pushl    20(fp)        # hfs tor temp2+temp1
  147.     ldd    -68(fp); pushd    # temp1
  148.     ldd    -76(fp); pushd    # temp2
  149.     callf    $24,_Kaddd
  150.  
  151.     pushl    20(fp)        # hfs
  152.     ldd    _sqrt2; pushd
  153.     ldd    r0; pushd    # temp2+temp1
  154.     callf    $24,_Kmuld
  155.     ldd    r0; std    r2        # sqrt2*(temp2+temp1)
  156.  
  157.     pushl    20(fp)        # hfs
  158.     ldd    -68(fp)
  159.     pushd
  160.     ldd    -76(fp)
  161.     pushd
  162.     callf    $24,_Ksubd    # temp2-temp1
  163.  
  164.     pushl    20(fp)        # hfs
  165.     ldd    r0
  166.     pushd            # temp2-temp1
  167.     ldd    r2
  168.     pushd
  169.     callf    $24,_Kdivd
  170.  
  171.     ldd    r0
  172.     pushd
  173.     callf    $20,_Kldexpf
  174.  
  175.     #pushl    20(fp)        # hfs
  176.     #pushl    $0
  177.     #pushl    r0        # cvlf    r0
  178.     #pushl    $0
  179.     #pushl    $0
  180.     #callf    $24,_Kcvtld
  181.  
  182.     #ldd    r0
  183.     #cvdf
  184.     #stf    r0
  185.     ret
  186.  
  187. /* file : Kfloorf.x
  188. */
  189.     .text
  190.     .globl    _Kfloorf
  191.     .data
  192.     .align    2
  193. L19:    .long    0x40800000, 0x00000000 # .double 1
  194.     .text
  195.     .set    L13,0x0
  196.     .data
  197.     .text
  198. _Kfloorf:
  199.     .word    L13
  200.     subl3    $60,fp,sp
  201.     tstl    4(fp)        # if (d<0.0) {
  202.     jgeq    L17
  203.     lnd    4(fp)
  204.     std    4(fp)        # d = -d;
  205.     pushl    12(fp)        # hfs
  206.     addl3    $4,fp,-(sp)    # &d
  207.     pushl    8(fp)
  208.     pushl    4(fp)
  209.     callf    $20,_Kmodf
  210.     clrl    -60+4(fp)
  211.     movl    r0,-60(fp)    # fract = modf(d,&d);
  212.     tstl    r0        # if (fract != 0.0)
  213.     jeql    L18
  214.     pushl    12(fp)        # hfs
  215.     ldd    L19
  216.     pushd
  217.     ldd    4(fp)
  218.     pushd
  219.     callf    $24,_Kaddd
  220.     ldd    r0
  221.     std    4(fp)        # d +=1;
  222. L18:    lnd    4(fp)
  223.     std    4(fp)        # d = -d;
  224.     jbr    L20
  225. L17:    
  226.     pushl    12(fp)        # hfs
  227.     addl3    $4,fp,-(sp)
  228.     pushl    8(fp)
  229.     pushl    4(fp)
  230.     callf    $20,_Kmodf
  231. L20:    ldd    4(fp)
  232.     cvdl    r0        # for Kexpf call only!
  233.     ret
  234.     
  235.     .data
  236. _p0:    .long    0x45BD3D04, 0x7F734DBD # .double 1513.9067990543389
  237. _p1:    .long    0x42A19DD4, 0x989F60DA # .double 20.202065651286927
  238. _p2:    .long    0x3DBD2E42, 0xAB70BDA9 # .double .023093347753750233
  239. _q0:    .long    0x468881B1, 0x7C3A6529 # .double 4368.2116627275583
  240. _q1:    .long    0x44692F28, 0x7AE89541 # .double 233.18421142748162
  241. _q2:    .long    0x40800000, 0x00000000 # .double 1
  242. _log2e:    .long    0x40B8AA3B, 0x295C17F0 # .double 1.4426950408889634
  243. _sqrt2:    .long    0x40B504F3, 0x33F9DE64 # .double 1.414213562373095
  244. _maxf:    .long    0x471C4000, 0x00000000 # .double 10000
  245. _HUGE:    .long    0x7FFFFFFE, 0xFFFFFFFC # .double 1.701411733192644e+38
  246. one:    .long    0x40800000 # .float 1
  247. half:    .long    0x40000000, 0x00000000 # .double .5
  248.