|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1986 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 are permitted ! 9: * provided that: (1) source distributions retain this entire copyright ! 10: * notice and comment, and (2) distributions including binaries display ! 11: * the following acknowledgement: ``This product includes software ! 12: * developed by the University of California, Berkeley and its contributors'' ! 13: * in the documentation or other materials provided with the distribution ! 14: * and in all advertising materials mentioning features or use of this ! 15: * software. Neither the name of the University nor the names of its ! 16: * contributors may be used to endorse or promote products derived ! 17: * from this software without specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: #if defined(SYSLIBC_SCCS) && !defined(lint) ! 24: .asciz "@(#)addd.s 1.3 (Berkeley) 6/1/90" ! 25: #endif /* SYSLIBC_SCCS and not lint */ ! 26: ! 27: #include <tahoemath/fp.h> ! 28: #include "DEFS.h" ! 29: ! 30: XENTRY(addd, R2|R3|R4|R5|R6|R7|R8|R9|R10) ! 31: /* ! 32: * see which operand has a greater exponent ! 33: * The greater one will be fetched into r0,r1,r2,r3. ! 34: * r0,r1 - 'pure' fraction, r2 - exponent, r3 - sign). ! 35: * The smaller operand will be fetched into r4,r5,r6,r7. ! 36: */ ! 37: andl3 $EXPMASK,4(fp),r0 ! 38: andl3 $EXPMASK,12(fp),r1 ! 39: cmpl r0,r1 ! 40: jgtr first_greater ! 41: ! 42: movl 12(fp),r0 # bigger operand to r0,r1 ! 43: movl 16(fp),r1 ! 44: ! 45: movl 4(fp),r4 # smaller operand to r4,r5 ! 46: movl 8(fp),r5 ! 47: jmp expo ! 48: ! 49: first_greater: ! 50: movl 4(fp),r0 # bigger operand to r0,r1 ! 51: movl 8(fp),r1 ! 52: ! 53: movl 12(fp),r4 # smaller operand to r4,r5 ! 54: movl 16(fp),r5 ! 55: ! 56: /* ! 57: * compute exponents: ! 58: */ ! 59: expo: ! 60: andl3 $EXPMASK,r0,r2 # r2 will hold the exponent. ! 61: jeql is_res1 # check for reserved operand. ! 62: shrl $EXPSHIFT,r2,r2 ! 63: ! 64: ! 65: andl3 $EXPMASK,r4,r6 # r6 will hold the exponent. ! 66: jeql is_res2 # check for reserved operand. ! 67: shrl $EXPSHIFT,r6,r6 ! 68: /* ! 69: * compare the exponents: ! 70: */ ! 71: subl3 r6,r2,r8 ! 72: jeql signs ! 73: cmpl r8,$MAX_EXP_DIF ! 74: jlss signs ! 75: ret # return the bigger number. ! 76: ! 77: /* ! 78: * remember the signs: ! 79: */ ! 80: signs: ! 81: clrl r3 ! 82: bbc $31,r0,sign2 # if negative remember it. ! 83: incl r3 ! 84: sign2: ! 85: clrl r7 ! 86: bbc $31,r4,frac # if negative remember it. ! 87: incl r7 ! 88: /* ! 89: * compute 'pure' fraction: ! 90: */ ! 91: frac: ! 92: # clear the non fraction parts. ! 93: andl2 $(0!(EXPMASK | SIGNBIT)),r0 ! 94: # add the hidden bit. ! 95: orl2 $(0!CLEARHID),r0 ! 96: # clear the non fraction parts. ! 97: andl2 $(0!(EXPMASK | SIGNBIT)),r4 ! 98: # add the hidden bit. ! 99: orl2 $(0!CLEARHID),r4 ! 100: ! 101: /* ! 102: * shift the smaller operand: ! 103: */ ! 104: shrq r8,r4,r4 ! 105: eql_exps: ! 106: cmpl r3,r7 ! 107: jeql add ! 108: bbc $0,r3,negr4r5 ! 109: /* ! 110: * negate the pair r0,r1: ! 111: */ ! 112: clrl r3 ! 113: mcoml r1,r1 ! 114: clrl r9 # r9 - carry flag. ! 115: incl r1 ! 116: bcc comr0 ! 117: incl r9 # remember the carry. ! 118: comr0: mcoml r0,r0 ! 119: bbc $0,r9,add ! 120: incl r0 ! 121: ! 122: /* ! 123: * add the fractions: ! 124: */ ! 125: add: ! 126: clrl r10 # to remember the sign of the result. ! 127: addl2 r5,r1 ! 128: adwc r4,r0 ! 129: jgeq norm # if positive go to normelize. ! 130: incl r10 # else remember it and negate the result. ! 131: /* ! 132: * negate the pair r0,r1: ! 133: */ ! 134: clrl r3 ! 135: mcoml r1,r1 ! 136: clrl r9 # r9 - carry flag. ! 137: incl r1 ! 138: bcc comr00 ! 139: incl r9 # remember the carry. ! 140: comr00: mcoml r0,r0 ! 141: bbc $0,r9,norm ! 142: incl r0 ! 143: norm: callf $4,fnorm ! 144: ! 145: /* ! 146: * add the sign bit ! 147: */ ! 148: bbs $0,r10,negative ! 149: bbs $0,r3,negative ! 150: ret ! 151: negative: ! 152: orl2 $SIGNBIT,r0 ! 153: ret ! 154: ! 155: ! 156: /* ! 157: * negate the pair r4,r5: ! 158: */ ! 159: negr4r5: ! 160: clrl r7 ! 161: mcoml r5,r5 ! 162: clrl r9 # r9 - carry flag. ! 163: incl r5 ! 164: bcc comr4 ! 165: incl r9 # remember the carry. ! 166: comr4: mcoml r4,r4 ! 167: bbc $0,r9,add ! 168: incl r4 ! 169: jmp add ! 170: ! 171: ! 172: is_res1: ! 173: bbs $31,r0,res_op ! 174: movl r4,r0 # return the smaller operand. ! 175: movl r5,r1 ! 176: ret ! 177: ! 178: is_res2: ! 179: bbs $31,r4,res_op ! 180: ret # we allready have the 'result' in r0,r1. ! 181: ! 182: res_op: ! 183: callf $4,fpresop ! 184: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.