home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / tahoe / math / Kaddd.s < prev    next >
Encoding:
Text File  |  1991-05-04  |  4.6 KB  |  200 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.  *    @(#)Kaddd.s    7.1 (Berkeley) 12/6/90
  37.  */
  38.  
  39. #include "../math/fp.h"
  40. #include "../tahoe/SYS.h"
  41.  
  42. /*
  43.  * _Kaddd(acc_most,acc_least,op_most,op_least,hfs)
  44.  */
  45.  
  46. ENTRY(Kaddd, R10|R9|R8|R7|R6|R5|R4|R3|R2)
  47. /*
  48.  * see which operand has a greater exponent
  49.  * The greater one will be fetched into r0,r1,r2,r3.
  50.  * r0,r1 - 'pure' fraction, r2 - exponent, r3 - sign).
  51.  * The smaller operand will be fetched into r4,r5,r6,r7.
  52.  */
  53.     tstl    4(fp)    # handle (a+b) where a and/or b = 0.0
  54.     jneq    next
  55.     movl    16(fp),r1
  56.     movl    12(fp),r0
  57.     ret
  58. next:
  59.     tstl    12(fp)
  60.     jneq    doit
  61.     movl    8(fp),r1
  62.     movl    4(fp),r0
  63.     ret
  64. doit:
  65.     andl3    $EXPMASK,4(fp),r0
  66.     andl3    $EXPMASK,12(fp),r1
  67.     cmpl    r0,r1
  68.     jgtr    first_greater
  69.  
  70.     movl    12(fp),r0    # bigger operand to r0,r1
  71.     movl    16(fp),r1
  72.  
  73.     movl    4(fp),r4    # smaller operand to r4,r5
  74.     movl    8(fp),r5
  75.     jmp    expo
  76.  
  77. first_greater:
  78.     movl    4(fp),r0    # bigger operand to r0,r1
  79.     movl    8(fp),r1
  80.  
  81.     movl    12(fp),r4    # smaller operand to r4,r5
  82.     movl    16(fp),r5
  83.  
  84.  
  85. /*
  86.  * Compute exponents:
  87.  */
  88. expo:
  89.     andl3    $EXPMASK,r0,r2    # r2 will hold the exponent.
  90.     shrl    $EXPSHIFT,r2,r2
  91.     andl3    $EXPMASK,r4,r6    # r6 will hold the exponent.
  92.     shrl    $EXPSHIFT,r6,r6
  93. /*
  94.  * Compare the exponents:
  95.  */
  96.     subl3    r6,r2,r8
  97.     jeql    signs
  98.     cmpl    r8,$MAX_EXP_DIF
  99.     jleq    signs
  100.     ret            # return the bigger number.
  101.  
  102. /*
  103.  * Remember the signs:
  104.  */
  105. signs:
  106.     clrl    r3
  107.     bbc    $31,r0,sign2    # if negative remember it.
  108.     incl    r3
  109. sign2:
  110.     clrl    r7
  111.     bbc    $31,r4,frac    # if negative remember it.
  112.     incl    r7
  113. /*
  114.  * Compute 'pure' fraction:
  115.  */
  116. frac:
  117.                 # clear the non fraction parts.
  118.     andl2    $(0!(EXPMASK | SIGNBIT)),r0
  119.                 # add the hidden bit.
  120.     orl2    $(0!CLEARHID),r0
  121.                 # clear the non fraction parts.
  122.     andl2    $(0!(EXPMASK | SIGNBIT)),r4
  123.                 # add the hidden bit.
  124.     orl2    $(0!CLEARHID),r4
  125.  
  126. /*
  127.  * Shift the smaller operand:
  128.  */
  129.     shrq    r8,r4,r4
  130. eql_exps:
  131.     cmpl     r3,r7
  132.     jeql    add
  133.     bbc    $0,r3,negr4r5
  134. /*
  135.  * Negate the pair r0,r1:
  136.  */
  137.     clrl    r3
  138.     mcoml    r1,r1
  139.     clrl    r9        # r9 - carry flag.
  140.     incl    r1
  141.     bcc    comr0
  142.     incl    r9        # remember the carry.
  143. comr0:    mcoml    r0,r0
  144.     bbc    $0,r9,add
  145.     incl    r0
  146.  
  147. /*
  148.  * Add the fractions:
  149.  */
  150. add:
  151.     clrl    r10         # to remember the sign of the result.
  152.     addl2    r5,r1
  153.     adwc    r4,r0
  154.     jgeq    norm        # if positive go to normelize.
  155.     incl    r10        # else remember it and negate the result.
  156. /*
  157.  * Negate the pair r0,r1:
  158.  */
  159.     clrl    r3
  160.     mcoml    r1,r1
  161.     clrl    r9        # r9 - carry flag.
  162.     incl    r1
  163.     bcc    comr00
  164.     incl    r9        # remember the carry.
  165. comr00:    mcoml    r0,r0
  166.     bbc    $0,r9,norm
  167.     incl    r0
  168. norm:    pushl    20(fp)        # addr of returnen exception.
  169.     callf    $8,_Kfnorm
  170.  
  171. /*
  172.  * Add the sign bit
  173.  */
  174.     bbs    $0,r10,negative
  175.     bbs    $0,r3,negative
  176.     ret
  177. negative:
  178.     orl2    $SIGNBIT,r0
  179.     ret
  180.  
  181.  
  182. /*
  183.  * Negate the pair r4,r5:
  184.  */
  185. negr4r5:
  186.     clrl    r7
  187.     mcoml    r5,r5
  188.     clrl    r9        # r9 - carry flag.
  189.     incl    r5
  190.     bcc    comr4
  191.     incl    r9        # remember the carry.
  192. comr4:    mcoml    r4,r4
  193.     bbc    $0,r9,add
  194.     incl    r4
  195.     jmp    add
  196.  
  197.     movl    r4,r0        # return the  smaller operand.
  198.     movl    r5,r1
  199.     ret
  200.