home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / tahoe / math / Ksqrtf.s < prev    next >
Encoding:
Text File  |  1991-05-04  |  4.5 KB  |  191 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.  *    @(#)Ksqrtf.s    7.1 (Berkeley) 12/6/90
  37.  */
  38.  
  39. #include "../tahoe/SYS.h"
  40.  
  41.     .text
  42. ENTRY(Ksqrtf, 0)
  43.     subl3    $76,fp,sp
  44.     tstl    4(fp)            # if (arg <= 0.) {
  45.     jgtr    L18
  46.     jgeq    L19            # if (arg < 0.)
  47. L19:    clrl    r1
  48.     clrl    r0
  49.     ret                # return(0.);}
  50. L18:    
  51.     pushl    20(fp)            # hfs
  52.     subl3    $72,fp,-(sp)
  53.     pushl    8(fp)
  54.     pushl    4(fp)
  55.     callf    $20,_Kfrexpf
  56.     clrl    -60+4(fp)
  57.     movl    r0,-60(fp)        # x = frexp(arg,&exp);
  58.     jbr    L20
  59. L2000001:
  60.     pushl    20(fp)            # hfs
  61.     ldd    two
  62.     pushd
  63.     ldd    -60(fp)
  64.     pushd
  65.     callf    $24,_Kmuld        # x * 2
  66.     ldd    r0
  67.     std    -60(fp)            # x *= 2;
  68.     decl    -72(fp)            # exp--;}
  69. L20:    cmpd2    -60(fp),half        # while(x < 0.5){
  70.     jlss    L2000001
  71.     bitl    $1,-72(fp)        # if(exp & 1) {
  72.     jeql    L24
  73.     pushl    20(fp)            # hfs
  74.     ldd    two
  75.     pushd
  76.     ldd    -60(fp)
  77.     pushd
  78.     callf    $24,_Kmuld        # x * 2
  79.     ldd    r0
  80.     std    -60(fp)            # x *= 2;
  81.     decl    -72(fp)            # exp--;}
  82. L24:    pushl    20(fp)            # hfs
  83.     ldd    -60(fp)
  84.     pushd
  85.     ldd    one
  86.     pushd
  87.     callf    $24,_Kaddd        # (1.0+x)
  88.     pushl    20(fp)            # hfs
  89.     ldd    r0
  90.     pushd
  91.     ldd    half
  92.     pushd
  93.     callf    $24,_Kmuld
  94.     ldd    r0
  95.     std    -68(fp)             # temp=0.5*(1.0+x);
  96.     jbr    L28
  97. L2000003:
  98.     pushl    20(fp)            # hfs
  99.     ldd    big
  100.     pushd
  101.     ldd    -68(fp)
  102.     pushd
  103.     callf    $24,_Kmuld        # temp*(1L<<30)
  104.     ldd    r0
  105.     std    -68(fp)            # temp *=(1L<<30);
  106.     subl2    $60,-72(fp)        # exp -= 60;}
  107. L28:    cmpl    -72(fp),$60        # while(exp > 60){
  108.     jleq    L31
  109.     jbr    L2000003
  110. L2000005:
  111.     pushl    20(fp)            # hfs
  112.     ldd    big
  113.     pushd
  114.     ldd    -68(fp)
  115.     pushd
  116.     callf    $24,_Kdivd
  117.     ldd    r0
  118.     std    -68(fp)            # temp /= (1L<<30);
  119.     addl2    $60,-72(fp)        # exp +=60;}
  120. L31:    cmpl    -72(fp),$-60        # while(exp < -60) {
  121.     jlss    L2000005
  122.     tstl    -72(fp)            # if(exp >=0)
  123.     jlss    L34
  124.     divl3    $2,-72(fp),r0
  125.     shll    r0,$1,r0
  126.     pushl    20(fp)            # hfs
  127.     pushl    $0
  128.     pushl    r0
  129.     pushl    $0
  130.     pushl    $0
  131.     callf    $24,_Kcvtld
  132.     pushl    20(fp)            # hfs
  133.     ldd    r0
  134.     pushd
  135.     ldd    -68(fp)
  136.     pushd
  137.     callf    $24,_Kmuld        # temp * (1L <<(exp/2))
  138.     jbr    L2000006        # temp *= 1L << (exp/2));
  139. L34:    mnegl    -72(fp),r0        # -exp
  140.     divl2    $2,r0            # -exp/2
  141.     shll    r0,$1,r0
  142.     pushl    20(fp)            # hfs
  143.     pushl    $0
  144.     pushl    r0
  145.     pushl    $0
  146.     pushl    $0
  147.     callf    $24,_Kcvtld
  148.     pushl    20(fp)            # hfs
  149.     ldd    r0
  150.     pushd
  151.     ldd    -68(fp)
  152.     pushd
  153.     callf    $24,_Kdivd        # temp / (1L <<(-exp/2))
  154. L2000006:
  155.     ldd    r0
  156.     std    -68(fp)            # temp (*/)= 1L << (exp/2));
  157.     clrl    -76(fp)
  158. L2000008:
  159.     pushl    20(fp)            # hfs
  160.     ldd    -68(fp)
  161.     pushd
  162.     ldd    4(fp)
  163.     pushd
  164.     callf    $24,_Kdivd
  165.     pushl    20(fp)            # hfs
  166.     ldd    r0
  167.     pushd
  168.     ldd    -68(fp)
  169.     pushd
  170.     callf    $24,_Kaddd
  171.     pushl    20(fp)            # hfs
  172.     ldd    r0    
  173.     pushd
  174.     ldd    half
  175.     pushd
  176.     callf    $24,_Kmuld
  177.     ldd    r0
  178.     std    -68(fp)            # temp=0.5*(temp+arg/temp);
  179.     aobleq    $3,-76(fp),L2000008
  180.     ldd    -68(fp)
  181.     cvdf
  182.     stf    r0
  183.     ret
  184.  
  185.     .data
  186.     .align    2
  187. half:    .long    0x40000000, 0x00000000 # .double .5
  188. two:    .long    0x41000000, 0x00000000 # .double 2
  189. one:    .long    0x40800000, 0x00000000 # .double 1
  190. big:    .long    0x4F800000, 0x00000000 # .double (1<<30)
  191.