|
|
1.1 root 1: /* Kaddd.s 1.3 86/01/05 */
2:
3: #include "../tahoemath/fp.h"
4: #include "../tahoe/SYS.h"
5:
6: /*
7: * _Kaddd(acc_most,acc_least,op_most,op_least,hfs)
8: */
9:
10: ENTRY(Kaddd, R10|R9|R8|R7|R6|R5|R4|R3|R2)
11: /*
12: * see which operand has a greater exponent
13: * The greater one will be fetched into r0,r1,r2,r3.
14: * r0,r1 - 'pure' fraction, r2 - exponent, r3 - sign).
15: * The smaller operand will be fetched into r4,r5,r6,r7.
16: */
17: tstl 4(fp) # handle (a+b) where a and/or b = 0.0
18: jneq next
19: movl 16(fp),r1
20: movl 12(fp),r0
21: ret
22: next:
23: tstl 12(fp)
24: jneq doit
25: movl 8(fp),r1
26: movl 4(fp),r0
27: ret
28: doit:
29: andl3 $EXPMASK,4(fp),r0
30: andl3 $EXPMASK,12(fp),r1
31: cmpl r0,r1
32: jgtr first_greater
33:
34: movl 12(fp),r0 # bigger operand to r0,r1
35: movl 16(fp),r1
36:
37: movl 4(fp),r4 # smaller operand to r4,r5
38: movl 8(fp),r5
39: jmp expo
40:
41: first_greater:
42: movl 4(fp),r0 # bigger operand to r0,r1
43: movl 8(fp),r1
44:
45: movl 12(fp),r4 # smaller operand to r4,r5
46: movl 16(fp),r5
47:
48:
49: /*
50: * Compute exponents:
51: */
52: expo:
53: andl3 $EXPMASK,r0,r2 # r2 will hold the exponent.
54: shrl $EXPSHIFT,r2,r2
55: andl3 $EXPMASK,r4,r6 # r6 will hold the exponent.
56: shrl $EXPSHIFT,r6,r6
57: /*
58: * Compare the exponents:
59: */
60: subl3 r6,r2,r8
61: jeql signs
62: cmpl r8,$MAX_EXP_DIF
63: jleq signs
64: ret # return the bigger number.
65:
66: /*
67: * Remember the signs:
68: */
69: signs:
70: clrl r3
71: bbc $31,r0,sign2 # if negative remember it.
72: incl r3
73: sign2:
74: clrl r7
75: bbc $31,r4,frac # if negative remember it.
76: incl r7
77: /*
78: * Compute 'pure' fraction:
79: */
80: frac:
81: # clear the non fraction parts.
82: andl2 $(0!(EXPMASK | SIGNBIT)),r0
83: # add the hidden bit.
84: orl2 $(0!CLEARHID),r0
85: # clear the non fraction parts.
86: andl2 $(0!(EXPMASK | SIGNBIT)),r4
87: # add the hidden bit.
88: orl2 $(0!CLEARHID),r4
89:
90: /*
91: * Shift the smaller operand:
92: */
93: shrq r8,r4,r4
94: eql_exps:
95: cmpl r3,r7
96: jeql add
97: bbc $0,r3,negr4r5
98: /*
99: * Negate the pair r0,r1:
100: */
101: clrl r3
102: mcoml r1,r1
103: clrl r9 # r9 - carry flag.
104: incl r1
105: bcc comr0
106: incl r9 # remember the carry.
107: comr0: mcoml r0,r0
108: bbc $0,r9,add
109: incl r0
110:
111: /*
112: * Add the fractions:
113: */
114: add:
115: clrl r10 # to remember the sign of the result.
116: addl2 r5,r1
117: adwc r4,r0
118: jgeq norm # if positive go to normelize.
119: incl r10 # else remember it and negate the result.
120: /*
121: * Negate the pair r0,r1:
122: */
123: clrl r3
124: mcoml r1,r1
125: clrl r9 # r9 - carry flag.
126: incl r1
127: bcc comr00
128: incl r9 # remember the carry.
129: comr00: mcoml r0,r0
130: bbc $0,r9,norm
131: incl r0
132: norm: pushl 20(fp) # addr of returnen exception.
133: callf $8,_Kfnorm
134:
135: /*
136: * Add the sign bit
137: */
138: bbs $0,r10,negative
139: bbs $0,r3,negative
140: ret
141: negative:
142: orl2 $SIGNBIT,r0
143: ret
144:
145:
146: /*
147: * Negate the pair r4,r5:
148: */
149: negr4r5:
150: clrl r7
151: mcoml r5,r5
152: clrl r9 # r9 - carry flag.
153: incl r5
154: bcc comr4
155: incl r9 # remember the carry.
156: comr4: mcoml r4,r4
157: bbc $0,r9,add
158: incl r4
159: jmp add
160:
161: movl r4,r0 # return the smaller operand.
162: movl r5,r1
163: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.