1#ifdef LIBC_SCCS 2 .asciz "@(#)addf.s 1.1 (Berkeley/CCI) 07/02/86" 3#endif LIBC_SCCS 4 5#include <tahoemath/fp.h> 6#include "DEFS.h" 7 8XENTRY(addf, R2|R3|R4|R5|R6|R7|R8|R9|R10) 9/* 10 * see which operand has a greater exponent 11 * The greater one will be fetched into r0,r2,r3. 12 * r0- 'pure' fraction, r2 - exponent, r3 - sign). 13 * The smaller operand will be fetched into r4,r6,r7. 14 */ 15 clrl r1 16 andl3 $EXPMASK,4(fp),r0 17 andl3 $EXPMASK,12(fp),r1 18 cmpl r0,r1 19 jgtr first_greater 20 21 movl 12(fp),r0 # bigger operand to r0 22 23 movl 4(fp),r4 # smaller operand to r4 24 jmp expo 25 26first_greater: 27 movl 4(fp),r0 # bigger operand to r0 28 29 movl 12(fp),r4 # smaller operand to r4 30 31 32/* 33 *compute exponents: 34 */ 35expo: 36 andl3 $EXPMASK,r0,r2 # r2 will hold the exponent of greater operand. 37 jeql is_res1 # check for reserved operand. 38 shrl $EXPSHIFT,r2,r2 39 40 41 andl3 $EXPMASK,r4,r6 # r6 will hold the exponent of smaller operand. 42 jeql is_res2 # check for reserved operand. 43 shrl $EXPSHIFT,r6,r6 44/* 45 *compare the exponents: 46 */ 47 subl3 r6,r2,r8 48 jeql signs 49 cmpl r8,$MAX_EXP_DIF 50 jlss signs 51 ret # return the bigger number. 52 53/* 54 *remember the signs: 55 */ 56signs: 57 clrl r3 58 bbc $31,r0,sign2 # if negative remember it.(R3=1) 59 incl r3 60sign2: 61 clrl r7 62 bbc $31,r4,frac # if negative remember it.(R7=1) 63 incl r7 64/* 65 *compute 'pure' fraction: 66 */ 67frac: 68 # clear the non fraction parts. 69 andl2 $(0!(EXPMASK | SIGNBIT)),r0 70 # add the hidden bit. 71 orl2 $(0!CLEARHID),r0 72 # clear the non fraction parts. 73 andl2 $(0!(EXPMASK | SIGNBIT)),r4 74 # add the hidden bit. 75 orl2 $(0!CLEARHID),r4 76 77/* 78 *shift the smaller operand: 79 */ 80 shar r8,r4,r4 81eql_exps: 82 cmpl r3,r7 83 jeql add 84 bbc $0,r3,negr4 85/* 86 *negate r0: 87 */ 88 clrl r3 89 mnegl r0,r0 90 91/* 92 *add the fractions: 93 */ 94add: 95 clrl r10 96 addl2 r4,r0 97 jgeq norm 98 incl r10 99/* 100 *negate the pair r0,r1: 101 */ 102 mnegl r0,r0 103norm: callf $4,sfnorm 104 105/* 106 *add the sign bit 107 */ 108 bbs $0,r10,negative 109 bbs $0,r3,negative # the bigger operand was negative. 110 ret 111negative: 112 orl2 $SIGNBIT,r0 113 ret 114 115 116/* 117 *negate r4: 118 */ 119negr4: 120 mnegl r4,r4 121 jmp add 122 123 124is_res1: 125 bbs $31,r0,res_op 126 movl r4,r0 # return the smaller operand. 127 ret 128 129is_res2: 130 bbs $31,r4,res_op 131 ret # we allready have the 'result' in r0,r1. 132 133res_op: 134 callf $4,sfpresop 135 ret 136