non-AT&T implementations of frexp.c in machine/gen/frexp.c
[unix-history] / usr / src / lib / libc / tahoe / fpe / addd.s
CommitLineData
1f0502d3
KB
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 *
019bea33 8 * %sccs.include.redist.c%
1f0502d3
KB
9 */
10
11#if defined(SYSLIBC_SCCS) && !defined(lint)
019bea33 12 .asciz "@(#)addd.s 1.3 (Berkeley) %G%"
1f0502d3 13#endif /* SYSLIBC_SCCS and not lint */
5733b822
SL
14
15#include <tahoemath/fp.h>
16#include "DEFS.h"
17
18XENTRY(addd, R2|R3|R4|R5|R6|R7|R8|R9|R10)
19/*
20 * see which operand has a greater exponent
21 * The greater one will be fetched into r0,r1,r2,r3.
22 * r0,r1 - 'pure' fraction, r2 - exponent, r3 - sign).
23 * The smaller operand will be fetched into r4,r5,r6,r7.
24 */
25 andl3 $EXPMASK,4(fp),r0
26 andl3 $EXPMASK,12(fp),r1
27 cmpl r0,r1
28 jgtr first_greater
29
30 movl 12(fp),r0 # bigger operand to r0,r1
31 movl 16(fp),r1
32
33 movl 4(fp),r4 # smaller operand to r4,r5
34 movl 8(fp),r5
35 jmp expo
36
37first_greater:
38 movl 4(fp),r0 # bigger operand to r0,r1
39 movl 8(fp),r1
40
41 movl 12(fp),r4 # smaller operand to r4,r5
42 movl 16(fp),r5
43
44/*
45 * compute exponents:
46 */
47expo:
48 andl3 $EXPMASK,r0,r2 # r2 will hold the exponent.
49 jeql is_res1 # check for reserved operand.
50 shrl $EXPSHIFT,r2,r2
51
52
53 andl3 $EXPMASK,r4,r6 # r6 will hold the exponent.
54 jeql is_res2 # check for reserved operand.
55 shrl $EXPSHIFT,r6,r6
56/*
57 * compare the exponents:
58 */
59 subl3 r6,r2,r8
60 jeql signs
61 cmpl r8,$MAX_EXP_DIF
62 jlss signs
63 ret # return the bigger number.
64
65/*
66 * remember the signs:
67 */
68signs:
69 clrl r3
70 bbc $31,r0,sign2 # if negative remember it.
71 incl r3
72sign2:
73 clrl r7
74 bbc $31,r4,frac # if negative remember it.
75 incl r7
76/*
77 * compute 'pure' fraction:
78 */
79frac:
80 # clear the non fraction parts.
81 andl2 $(0!(EXPMASK | SIGNBIT)),r0
82 # add the hidden bit.
83 orl2 $(0!CLEARHID),r0
84 # clear the non fraction parts.
85 andl2 $(0!(EXPMASK | SIGNBIT)),r4
86 # add the hidden bit.
87 orl2 $(0!CLEARHID),r4
88
89/*
90 * shift the smaller operand:
91 */
92 shrq r8,r4,r4
93eql_exps:
94 cmpl r3,r7
95 jeql add
96 bbc $0,r3,negr4r5
97/*
98 * negate the pair r0,r1:
99 */
100 clrl r3
101 mcoml r1,r1
102 clrl r9 # r9 - carry flag.
103 incl r1
104 bcc comr0
105 incl r9 # remember the carry.
106comr0: mcoml r0,r0
107 bbc $0,r9,add
108 incl r0
109
110/*
111 * add the fractions:
112 */
113add:
114 clrl r10 # to remember the sign of the result.
115 addl2 r5,r1
116 adwc r4,r0
117 jgeq norm # if positive go to normelize.
118 incl r10 # else remember it and negate the result.
119/*
120 * negate the pair r0,r1:
121 */
122 clrl r3
123 mcoml r1,r1
124 clrl r9 # r9 - carry flag.
125 incl r1
126 bcc comr00
127 incl r9 # remember the carry.
128comr00: mcoml r0,r0
129 bbc $0,r9,norm
130 incl r0
131norm: callf $4,fnorm
132
133/*
134 * add the sign bit
135 */
136 bbs $0,r10,negative
137 bbs $0,r3,negative
138 ret
139negative:
140 orl2 $SIGNBIT,r0
141 ret
142
143
144/*
145 * negate the pair r4,r5:
146 */
147negr4r5:
148 clrl r7
149 mcoml r5,r5
150 clrl r9 # r9 - carry flag.
151 incl r5
152 bcc comr4
153 incl r9 # remember the carry.
154comr4: mcoml r4,r4
155 bbc $0,r9,add
156 incl r4
157 jmp add
158
159
160is_res1:
161 bbs $31,r0,res_op
162 movl r4,r0 # return the smaller operand.
163 movl r5,r1
164 ret
165
166is_res2:
167 bbs $31,r4,res_op
168 ret # we allready have the 'result' in r0,r1.
169
170res_op:
171 callf $4,fpresop
172 ret