stan.sa revision 1.3.32.1 1 1.3.32.1 bouyer * $NetBSD: stan.sa,v 1.3.32.1 2000/11/20 20:11:37 bouyer Exp $
2 1.3 cgd
3 1.1 mycroft * MOTOROLA MICROPROCESSOR & MEMORY TECHNOLOGY GROUP
4 1.1 mycroft * M68000 Hi-Performance Microprocessor Division
5 1.1 mycroft * M68040 Software Package
6 1.1 mycroft *
7 1.1 mycroft * M68040 Software Package Copyright (c) 1993, 1994 Motorola Inc.
8 1.1 mycroft * All rights reserved.
9 1.1 mycroft *
10 1.1 mycroft * THE SOFTWARE is provided on an "AS IS" basis and without warranty.
11 1.1 mycroft * To the maximum extent permitted by applicable law,
12 1.1 mycroft * MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
13 1.1 mycroft * INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
14 1.1 mycroft * PARTICULAR PURPOSE and any warranty against infringement with
15 1.1 mycroft * regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
16 1.1 mycroft * and any accompanying written materials.
17 1.1 mycroft *
18 1.1 mycroft * To the maximum extent permitted by applicable law,
19 1.1 mycroft * IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
20 1.1 mycroft * (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS
21 1.1 mycroft * PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
22 1.1 mycroft * OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
23 1.1 mycroft * SOFTWARE. Motorola assumes no responsibility for the maintenance
24 1.1 mycroft * and support of the SOFTWARE.
25 1.1 mycroft *
26 1.1 mycroft * You are hereby granted a copyright license to use, modify, and
27 1.1 mycroft * distribute the SOFTWARE so long as this entire notice is retained
28 1.1 mycroft * without alteration in any modified and/or redistributed versions,
29 1.1 mycroft * and that such modified versions are clearly identified as such.
30 1.1 mycroft * No licenses are granted by implication, estoppel or otherwise
31 1.1 mycroft * under any patents or trademarks of Motorola, Inc.
32 1.1 mycroft
33 1.1 mycroft *
34 1.1 mycroft * stan.sa 3.3 7/29/91
35 1.1 mycroft *
36 1.1 mycroft * The entry point stan computes the tangent of
37 1.1 mycroft * an input argument;
38 1.1 mycroft * stand does the same except for denormalized input.
39 1.1 mycroft *
40 1.1 mycroft * Input: Double-extended number X in location pointed to
41 1.1 mycroft * by address register a0.
42 1.1 mycroft *
43 1.1 mycroft * Output: The value tan(X) returned in floating-point register Fp0.
44 1.1 mycroft *
45 1.1 mycroft * Accuracy and Monotonicity: The returned result is within 3 ulp in
46 1.1 mycroft * 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
47 1.1 mycroft * result is subsequently rounded to double precision. The
48 1.1 mycroft * result is provably monotonic in double precision.
49 1.1 mycroft *
50 1.1 mycroft * Speed: The program sTAN takes approximately 170 cycles for
51 1.3.32.1 bouyer * input argument X such that |X| < 15Pi, which is the usual
52 1.1 mycroft * situation.
53 1.1 mycroft *
54 1.1 mycroft * Algorithm:
55 1.1 mycroft *
56 1.1 mycroft * 1. If |X| >= 15Pi or |X| < 2**(-40), go to 6.
57 1.1 mycroft *
58 1.1 mycroft * 2. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let
59 1.1 mycroft * k = N mod 2, so in particular, k = 0 or 1.
60 1.1 mycroft *
61 1.1 mycroft * 3. If k is odd, go to 5.
62 1.1 mycroft *
63 1.1 mycroft * 4. (k is even) Tan(X) = tan(r) and tan(r) is approximated by a
64 1.1 mycroft * rational function U/V where
65 1.1 mycroft * U = r + r*s*(P1 + s*(P2 + s*P3)), and
66 1.1 mycroft * V = 1 + s*(Q1 + s*(Q2 + s*(Q3 + s*Q4))), s = r*r.
67 1.1 mycroft * Exit.
68 1.1 mycroft *
69 1.1 mycroft * 4. (k is odd) Tan(X) = -cot(r). Since tan(r) is approximated by a
70 1.1 mycroft * rational function U/V where
71 1.1 mycroft * U = r + r*s*(P1 + s*(P2 + s*P3)), and
72 1.1 mycroft * V = 1 + s*(Q1 + s*(Q2 + s*(Q3 + s*Q4))), s = r*r,
73 1.1 mycroft * -Cot(r) = -V/U. Exit.
74 1.1 mycroft *
75 1.1 mycroft * 6. If |X| > 1, go to 8.
76 1.1 mycroft *
77 1.1 mycroft * 7. (|X|<2**(-40)) Tan(X) = X. Exit.
78 1.1 mycroft *
79 1.1 mycroft * 8. Overwrite X by X := X rem 2Pi. Now that |X| <= Pi, go back to 2.
80 1.1 mycroft *
81 1.1 mycroft
82 1.1 mycroft STAN IDNT 2,1 Motorola 040 Floating Point Software Package
83 1.1 mycroft
84 1.1 mycroft section 8
85 1.1 mycroft
86 1.1 mycroft include fpsp.h
87 1.1 mycroft
88 1.1 mycroft BOUNDS1 DC.L $3FD78000,$4004BC7E
89 1.1 mycroft TWOBYPI DC.L $3FE45F30,$6DC9C883
90 1.1 mycroft
91 1.1 mycroft TANQ4 DC.L $3EA0B759,$F50F8688
92 1.1 mycroft TANP3 DC.L $BEF2BAA5,$A8924F04
93 1.1 mycroft
94 1.1 mycroft TANQ3 DC.L $BF346F59,$B39BA65F,$00000000,$00000000
95 1.1 mycroft
96 1.1 mycroft TANP2 DC.L $3FF60000,$E073D3FC,$199C4A00,$00000000
97 1.1 mycroft
98 1.1 mycroft TANQ2 DC.L $3FF90000,$D23CD684,$15D95FA1,$00000000
99 1.1 mycroft
100 1.1 mycroft TANP1 DC.L $BFFC0000,$8895A6C5,$FB423BCA,$00000000
101 1.1 mycroft
102 1.1 mycroft TANQ1 DC.L $BFFD0000,$EEF57E0D,$A84BC8CE,$00000000
103 1.1 mycroft
104 1.1 mycroft INVTWOPI DC.L $3FFC0000,$A2F9836E,$4E44152A,$00000000
105 1.1 mycroft
106 1.1 mycroft TWOPI1 DC.L $40010000,$C90FDAA2,$00000000,$00000000
107 1.1 mycroft TWOPI2 DC.L $3FDF0000,$85A308D4,$00000000,$00000000
108 1.1 mycroft
109 1.1 mycroft *--N*PI/2, -32 <= N <= 32, IN A LEADING TERM IN EXT. AND TRAILING
110 1.1 mycroft *--TERM IN SGL. NOTE THAT PI IS 64-BIT LONG, THUS N*PI/2 IS AT
111 1.1 mycroft *--MOST 69 BITS LONG.
112 1.1 mycroft xdef PITBL
113 1.1 mycroft PITBL:
114 1.1 mycroft DC.L $C0040000,$C90FDAA2,$2168C235,$21800000
115 1.1 mycroft DC.L $C0040000,$C2C75BCD,$105D7C23,$A0D00000
116 1.1 mycroft DC.L $C0040000,$BC7EDCF7,$FF523611,$A1E80000
117 1.1 mycroft DC.L $C0040000,$B6365E22,$EE46F000,$21480000
118 1.1 mycroft DC.L $C0040000,$AFEDDF4D,$DD3BA9EE,$A1200000
119 1.1 mycroft DC.L $C0040000,$A9A56078,$CC3063DD,$21FC0000
120 1.1 mycroft DC.L $C0040000,$A35CE1A3,$BB251DCB,$21100000
121 1.1 mycroft DC.L $C0040000,$9D1462CE,$AA19D7B9,$A1580000
122 1.1 mycroft DC.L $C0040000,$96CBE3F9,$990E91A8,$21E00000
123 1.1 mycroft DC.L $C0040000,$90836524,$88034B96,$20B00000
124 1.1 mycroft DC.L $C0040000,$8A3AE64F,$76F80584,$A1880000
125 1.1 mycroft DC.L $C0040000,$83F2677A,$65ECBF73,$21C40000
126 1.1 mycroft DC.L $C0030000,$FB53D14A,$A9C2F2C2,$20000000
127 1.1 mycroft DC.L $C0030000,$EEC2D3A0,$87AC669F,$21380000
128 1.1 mycroft DC.L $C0030000,$E231D5F6,$6595DA7B,$A1300000
129 1.1 mycroft DC.L $C0030000,$D5A0D84C,$437F4E58,$9FC00000
130 1.1 mycroft DC.L $C0030000,$C90FDAA2,$2168C235,$21000000
131 1.1 mycroft DC.L $C0030000,$BC7EDCF7,$FF523611,$A1680000
132 1.1 mycroft DC.L $C0030000,$AFEDDF4D,$DD3BA9EE,$A0A00000
133 1.1 mycroft DC.L $C0030000,$A35CE1A3,$BB251DCB,$20900000
134 1.1 mycroft DC.L $C0030000,$96CBE3F9,$990E91A8,$21600000
135 1.1 mycroft DC.L $C0030000,$8A3AE64F,$76F80584,$A1080000
136 1.1 mycroft DC.L $C0020000,$FB53D14A,$A9C2F2C2,$1F800000
137 1.1 mycroft DC.L $C0020000,$E231D5F6,$6595DA7B,$A0B00000
138 1.1 mycroft DC.L $C0020000,$C90FDAA2,$2168C235,$20800000
139 1.1 mycroft DC.L $C0020000,$AFEDDF4D,$DD3BA9EE,$A0200000
140 1.1 mycroft DC.L $C0020000,$96CBE3F9,$990E91A8,$20E00000
141 1.1 mycroft DC.L $C0010000,$FB53D14A,$A9C2F2C2,$1F000000
142 1.1 mycroft DC.L $C0010000,$C90FDAA2,$2168C235,$20000000
143 1.1 mycroft DC.L $C0010000,$96CBE3F9,$990E91A8,$20600000
144 1.1 mycroft DC.L $C0000000,$C90FDAA2,$2168C235,$1F800000
145 1.1 mycroft DC.L $BFFF0000,$C90FDAA2,$2168C235,$1F000000
146 1.1 mycroft DC.L $00000000,$00000000,$00000000,$00000000
147 1.1 mycroft DC.L $3FFF0000,$C90FDAA2,$2168C235,$9F000000
148 1.1 mycroft DC.L $40000000,$C90FDAA2,$2168C235,$9F800000
149 1.1 mycroft DC.L $40010000,$96CBE3F9,$990E91A8,$A0600000
150 1.1 mycroft DC.L $40010000,$C90FDAA2,$2168C235,$A0000000
151 1.1 mycroft DC.L $40010000,$FB53D14A,$A9C2F2C2,$9F000000
152 1.1 mycroft DC.L $40020000,$96CBE3F9,$990E91A8,$A0E00000
153 1.1 mycroft DC.L $40020000,$AFEDDF4D,$DD3BA9EE,$20200000
154 1.1 mycroft DC.L $40020000,$C90FDAA2,$2168C235,$A0800000
155 1.1 mycroft DC.L $40020000,$E231D5F6,$6595DA7B,$20B00000
156 1.1 mycroft DC.L $40020000,$FB53D14A,$A9C2F2C2,$9F800000
157 1.1 mycroft DC.L $40030000,$8A3AE64F,$76F80584,$21080000
158 1.1 mycroft DC.L $40030000,$96CBE3F9,$990E91A8,$A1600000
159 1.1 mycroft DC.L $40030000,$A35CE1A3,$BB251DCB,$A0900000
160 1.1 mycroft DC.L $40030000,$AFEDDF4D,$DD3BA9EE,$20A00000
161 1.1 mycroft DC.L $40030000,$BC7EDCF7,$FF523611,$21680000
162 1.1 mycroft DC.L $40030000,$C90FDAA2,$2168C235,$A1000000
163 1.1 mycroft DC.L $40030000,$D5A0D84C,$437F4E58,$1FC00000
164 1.1 mycroft DC.L $40030000,$E231D5F6,$6595DA7B,$21300000
165 1.1 mycroft DC.L $40030000,$EEC2D3A0,$87AC669F,$A1380000
166 1.1 mycroft DC.L $40030000,$FB53D14A,$A9C2F2C2,$A0000000
167 1.1 mycroft DC.L $40040000,$83F2677A,$65ECBF73,$A1C40000
168 1.1 mycroft DC.L $40040000,$8A3AE64F,$76F80584,$21880000
169 1.1 mycroft DC.L $40040000,$90836524,$88034B96,$A0B00000
170 1.1 mycroft DC.L $40040000,$96CBE3F9,$990E91A8,$A1E00000
171 1.1 mycroft DC.L $40040000,$9D1462CE,$AA19D7B9,$21580000
172 1.1 mycroft DC.L $40040000,$A35CE1A3,$BB251DCB,$A1100000
173 1.1 mycroft DC.L $40040000,$A9A56078,$CC3063DD,$A1FC0000
174 1.1 mycroft DC.L $40040000,$AFEDDF4D,$DD3BA9EE,$21200000
175 1.1 mycroft DC.L $40040000,$B6365E22,$EE46F000,$A1480000
176 1.1 mycroft DC.L $40040000,$BC7EDCF7,$FF523611,$21E80000
177 1.1 mycroft DC.L $40040000,$C2C75BCD,$105D7C23,$20D00000
178 1.1 mycroft DC.L $40040000,$C90FDAA2,$2168C235,$A1800000
179 1.1 mycroft
180 1.1 mycroft INARG equ FP_SCR4
181 1.1 mycroft
182 1.1 mycroft TWOTO63 equ L_SCR1
183 1.1 mycroft ENDFLAG equ L_SCR2
184 1.1 mycroft N equ L_SCR3
185 1.1 mycroft
186 1.1 mycroft xref t_frcinx
187 1.1 mycroft xref t_extdnrm
188 1.1 mycroft
189 1.1 mycroft xdef stand
190 1.1 mycroft stand:
191 1.1 mycroft *--TAN(X) = X FOR DENORMALIZED X
192 1.1 mycroft
193 1.1 mycroft bra t_extdnrm
194 1.1 mycroft
195 1.1 mycroft xdef stan
196 1.1 mycroft stan:
197 1.1 mycroft FMOVE.X (a0),FP0 ...LOAD INPUT
198 1.1 mycroft
199 1.1 mycroft MOVE.L (A0),D0
200 1.1 mycroft MOVE.W 4(A0),D0
201 1.1 mycroft ANDI.L #$7FFFFFFF,D0
202 1.1 mycroft
203 1.1 mycroft CMPI.L #$3FD78000,D0 ...|X| >= 2**(-40)?
204 1.1 mycroft BGE.B TANOK1
205 1.1 mycroft BRA.W TANSM
206 1.1 mycroft TANOK1:
207 1.1 mycroft CMPI.L #$4004BC7E,D0 ...|X| < 15 PI?
208 1.1 mycroft BLT.B TANMAIN
209 1.1 mycroft BRA.W REDUCEX
210 1.1 mycroft
211 1.1 mycroft
212 1.1 mycroft TANMAIN:
213 1.1 mycroft *--THIS IS THE USUAL CASE, |X| <= 15 PI.
214 1.1 mycroft *--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.
215 1.1 mycroft FMOVE.X FP0,FP1
216 1.1 mycroft FMUL.D TWOBYPI,FP1 ...X*2/PI
217 1.1 mycroft
218 1.1 mycroft *--HIDE THE NEXT TWO INSTRUCTIONS
219 1.1 mycroft lea.l PITBL+$200,a1 ...TABLE OF N*PI/2, N = -32,...,32
220 1.1 mycroft
221 1.1 mycroft *--FP1 IS NOW READY
222 1.1 mycroft FMOVE.L FP1,D0 ...CONVERT TO INTEGER
223 1.1 mycroft
224 1.1 mycroft ASL.L #4,D0
225 1.1 mycroft ADDA.L D0,a1 ...ADDRESS N*PIBY2 IN Y1, Y2
226 1.1 mycroft
227 1.1 mycroft FSUB.X (a1)+,FP0 ...X-Y1
228 1.1 mycroft *--HIDE THE NEXT ONE
229 1.1 mycroft
230 1.1 mycroft FSUB.S (a1),FP0 ...FP0 IS R = (X-Y1)-Y2
231 1.1 mycroft
232 1.1 mycroft ROR.L #5,D0
233 1.1 mycroft ANDI.L #$80000000,D0 ...D0 WAS ODD IFF D0 < 0
234 1.1 mycroft
235 1.1 mycroft TANCONT:
236 1.1 mycroft
237 1.2 mycroft TST.L D0
238 1.1 mycroft BLT.W NODD
239 1.1 mycroft
240 1.1 mycroft FMOVE.X FP0,FP1
241 1.1 mycroft FMUL.X FP1,FP1 ...S = R*R
242 1.1 mycroft
243 1.1 mycroft FMOVE.D TANQ4,FP3
244 1.1 mycroft FMOVE.D TANP3,FP2
245 1.1 mycroft
246 1.1 mycroft FMUL.X FP1,FP3 ...SQ4
247 1.1 mycroft FMUL.X FP1,FP2 ...SP3
248 1.1 mycroft
249 1.1 mycroft FADD.D TANQ3,FP3 ...Q3+SQ4
250 1.1 mycroft FADD.X TANP2,FP2 ...P2+SP3
251 1.1 mycroft
252 1.1 mycroft FMUL.X FP1,FP3 ...S(Q3+SQ4)
253 1.1 mycroft FMUL.X FP1,FP2 ...S(P2+SP3)
254 1.1 mycroft
255 1.1 mycroft FADD.X TANQ2,FP3 ...Q2+S(Q3+SQ4)
256 1.1 mycroft FADD.X TANP1,FP2 ...P1+S(P2+SP3)
257 1.1 mycroft
258 1.1 mycroft FMUL.X FP1,FP3 ...S(Q2+S(Q3+SQ4))
259 1.1 mycroft FMUL.X FP1,FP2 ...S(P1+S(P2+SP3))
260 1.1 mycroft
261 1.1 mycroft FADD.X TANQ1,FP3 ...Q1+S(Q2+S(Q3+SQ4))
262 1.1 mycroft FMUL.X FP0,FP2 ...RS(P1+S(P2+SP3))
263 1.1 mycroft
264 1.1 mycroft FMUL.X FP3,FP1 ...S(Q1+S(Q2+S(Q3+SQ4)))
265 1.1 mycroft
266 1.1 mycroft
267 1.1 mycroft FADD.X FP2,FP0 ...R+RS(P1+S(P2+SP3))
268 1.1 mycroft
269 1.1 mycroft
270 1.1 mycroft FADD.S #:3F800000,FP1 ...1+S(Q1+...)
271 1.1 mycroft
272 1.1 mycroft FMOVE.L d1,fpcr ;restore users exceptions
273 1.1 mycroft FDIV.X FP1,FP0 ;last inst - possible exception set
274 1.1 mycroft
275 1.1 mycroft bra t_frcinx
276 1.1 mycroft
277 1.1 mycroft NODD:
278 1.1 mycroft FMOVE.X FP0,FP1
279 1.1 mycroft FMUL.X FP0,FP0 ...S = R*R
280 1.1 mycroft
281 1.1 mycroft FMOVE.D TANQ4,FP3
282 1.1 mycroft FMOVE.D TANP3,FP2
283 1.1 mycroft
284 1.1 mycroft FMUL.X FP0,FP3 ...SQ4
285 1.1 mycroft FMUL.X FP0,FP2 ...SP3
286 1.1 mycroft
287 1.1 mycroft FADD.D TANQ3,FP3 ...Q3+SQ4
288 1.1 mycroft FADD.X TANP2,FP2 ...P2+SP3
289 1.1 mycroft
290 1.1 mycroft FMUL.X FP0,FP3 ...S(Q3+SQ4)
291 1.1 mycroft FMUL.X FP0,FP2 ...S(P2+SP3)
292 1.1 mycroft
293 1.1 mycroft FADD.X TANQ2,FP3 ...Q2+S(Q3+SQ4)
294 1.1 mycroft FADD.X TANP1,FP2 ...P1+S(P2+SP3)
295 1.1 mycroft
296 1.1 mycroft FMUL.X FP0,FP3 ...S(Q2+S(Q3+SQ4))
297 1.1 mycroft FMUL.X FP0,FP2 ...S(P1+S(P2+SP3))
298 1.1 mycroft
299 1.1 mycroft FADD.X TANQ1,FP3 ...Q1+S(Q2+S(Q3+SQ4))
300 1.1 mycroft FMUL.X FP1,FP2 ...RS(P1+S(P2+SP3))
301 1.1 mycroft
302 1.1 mycroft FMUL.X FP3,FP0 ...S(Q1+S(Q2+S(Q3+SQ4)))
303 1.1 mycroft
304 1.1 mycroft
305 1.1 mycroft FADD.X FP2,FP1 ...R+RS(P1+S(P2+SP3))
306 1.1 mycroft FADD.S #:3F800000,FP0 ...1+S(Q1+...)
307 1.1 mycroft
308 1.1 mycroft
309 1.1 mycroft FMOVE.X FP1,-(sp)
310 1.1 mycroft EORI.L #$80000000,(sp)
311 1.1 mycroft
312 1.1 mycroft FMOVE.L d1,fpcr ;restore users exceptions
313 1.1 mycroft FDIV.X (sp)+,FP0 ;last inst - possible exception set
314 1.1 mycroft
315 1.1 mycroft bra t_frcinx
316 1.1 mycroft
317 1.1 mycroft TANBORS:
318 1.1 mycroft *--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT REDUCTION.
319 1.1 mycroft *--IF |X| < 2**(-40), RETURN X OR 1.
320 1.1 mycroft CMPI.L #$3FFF8000,D0
321 1.1 mycroft BGT.B REDUCEX
322 1.1 mycroft
323 1.1 mycroft TANSM:
324 1.1 mycroft
325 1.1 mycroft FMOVE.X FP0,-(sp)
326 1.1 mycroft FMOVE.L d1,fpcr ;restore users exceptions
327 1.1 mycroft FMOVE.X (sp)+,FP0 ;last inst - posibble exception set
328 1.1 mycroft
329 1.1 mycroft bra t_frcinx
330 1.1 mycroft
331 1.1 mycroft
332 1.1 mycroft REDUCEX:
333 1.1 mycroft *--WHEN REDUCEX IS USED, THE CODE WILL INEVITABLY BE SLOW.
334 1.1 mycroft *--THIS REDUCTION METHOD, HOWEVER, IS MUCH FASTER THAN USING
335 1.1 mycroft *--THE REMAINDER INSTRUCTION WHICH IS NOW IN SOFTWARE.
336 1.1 mycroft
337 1.1 mycroft FMOVEM.X FP2-FP5,-(A7) ...save FP2 through FP5
338 1.1 mycroft MOVE.L D2,-(A7)
339 1.1 mycroft FMOVE.S #:00000000,FP1
340 1.1 mycroft
341 1.1 mycroft *--If compact form of abs(arg) in d0=$7ffeffff, argument is so large that
342 1.1 mycroft *--there is a danger of unwanted overflow in first LOOP iteration. In this
343 1.1 mycroft *--case, reduce argument by one remainder step to make subsequent reduction
344 1.1 mycroft *--safe.
345 1.1 mycroft cmpi.l #$7ffeffff,d0 ;is argument dangerously large?
346 1.1 mycroft bne.b LOOP
347 1.1 mycroft move.l #$7ffe0000,FP_SCR2(a6) ;yes
348 1.1 mycroft * ;create 2**16383*PI/2
349 1.1 mycroft move.l #$c90fdaa2,FP_SCR2+4(a6)
350 1.1 mycroft clr.l FP_SCR2+8(a6)
351 1.1 mycroft ftst.x fp0 ;test sign of argument
352 1.1 mycroft move.l #$7fdc0000,FP_SCR3(a6) ;create low half of 2**16383*
353 1.1 mycroft * ;PI/2 at FP_SCR3
354 1.1 mycroft move.l #$85a308d3,FP_SCR3+4(a6)
355 1.1 mycroft clr.l FP_SCR3+8(a6)
356 1.1 mycroft fblt.w red_neg
357 1.1 mycroft or.w #$8000,FP_SCR2(a6) ;positive arg
358 1.1 mycroft or.w #$8000,FP_SCR3(a6)
359 1.1 mycroft red_neg:
360 1.1 mycroft fadd.x FP_SCR2(a6),fp0 ;high part of reduction is exact
361 1.1 mycroft fmove.x fp0,fp1 ;save high result in fp1
362 1.1 mycroft fadd.x FP_SCR3(a6),fp0 ;low part of reduction
363 1.1 mycroft fsub.x fp0,fp1 ;determine low component of result
364 1.1 mycroft fadd.x FP_SCR3(a6),fp1 ;fp0/fp1 are reduced argument.
365 1.1 mycroft
366 1.1 mycroft *--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X REM PI/2, |X| <= PI/4.
367 1.1 mycroft *--integer quotient will be stored in N
368 1.1 mycroft *--Intermeditate remainder is 66-bit long; (R,r) in (FP0,FP1)
369 1.1 mycroft
370 1.1 mycroft LOOP:
371 1.1 mycroft FMOVE.X FP0,INARG(a6) ...+-2**K * F, 1 <= F < 2
372 1.1 mycroft MOVE.W INARG(a6),D0
373 1.1 mycroft MOVE.L D0,A1 ...save a copy of D0
374 1.1 mycroft ANDI.L #$00007FFF,D0
375 1.1 mycroft SUBI.L #$00003FFF,D0 ...D0 IS K
376 1.1 mycroft CMPI.L #28,D0
377 1.1 mycroft BLE.B LASTLOOP
378 1.1 mycroft CONTLOOP:
379 1.1 mycroft SUBI.L #27,D0 ...D0 IS L := K-27
380 1.2 mycroft CLR.L ENDFLAG(a6)
381 1.1 mycroft BRA.B WORK
382 1.1 mycroft LASTLOOP:
383 1.1 mycroft CLR.L D0 ...D0 IS L := 0
384 1.1 mycroft MOVE.L #1,ENDFLAG(a6)
385 1.1 mycroft
386 1.1 mycroft WORK:
387 1.1 mycroft *--FIND THE REMAINDER OF (R,r) W.R.T. 2**L * (PI/2). L IS SO CHOSEN
388 1.1 mycroft *--THAT INT( X * (2/PI) / 2**(L) ) < 2**29.
389 1.1 mycroft
390 1.1 mycroft *--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(63),
391 1.1 mycroft *--2**L * (PIby2_1), 2**L * (PIby2_2)
392 1.1 mycroft
393 1.1 mycroft MOVE.L #$00003FFE,D2 ...BIASED EXPO OF 2/PI
394 1.1 mycroft SUB.L D0,D2 ...BIASED EXPO OF 2**(-L)*(2/PI)
395 1.1 mycroft
396 1.1 mycroft MOVE.L #$A2F9836E,FP_SCR1+4(a6)
397 1.1 mycroft MOVE.L #$4E44152A,FP_SCR1+8(a6)
398 1.1 mycroft MOVE.W D2,FP_SCR1(a6) ...FP_SCR1 is 2**(-L)*(2/PI)
399 1.1 mycroft
400 1.1 mycroft FMOVE.X FP0,FP2
401 1.1 mycroft FMUL.X FP_SCR1(a6),FP2
402 1.1 mycroft *--WE MUST NOW FIND INT(FP2). SINCE WE NEED THIS VALUE IN
403 1.1 mycroft *--FLOATING POINT FORMAT, THE TWO FMOVE'S FMOVE.L FP <--> N
404 1.1 mycroft *--WILL BE TOO INEFFICIENT. THE WAY AROUND IT IS THAT
405 1.1 mycroft *--(SIGN(INARG)*2**63 + FP2) - SIGN(INARG)*2**63 WILL GIVE
406 1.1 mycroft *--US THE DESIRED VALUE IN FLOATING POINT.
407 1.1 mycroft
408 1.1 mycroft *--HIDE SIX CYCLES OF INSTRUCTION
409 1.1 mycroft MOVE.L A1,D2
410 1.1 mycroft SWAP D2
411 1.1 mycroft ANDI.L #$80000000,D2
412 1.1 mycroft ORI.L #$5F000000,D2 ...D2 IS SIGN(INARG)*2**63 IN SGL
413 1.1 mycroft MOVE.L D2,TWOTO63(a6)
414 1.1 mycroft
415 1.1 mycroft MOVE.L D0,D2
416 1.1 mycroft ADDI.L #$00003FFF,D2 ...BIASED EXPO OF 2**L * (PI/2)
417 1.1 mycroft
418 1.1 mycroft *--FP2 IS READY
419 1.1 mycroft FADD.S TWOTO63(a6),FP2 ...THE FRACTIONAL PART OF FP1 IS ROUNDED
420 1.1 mycroft
421 1.1 mycroft *--HIDE 4 CYCLES OF INSTRUCTION; creating 2**(L)*Piby2_1 and 2**(L)*Piby2_2
422 1.1 mycroft MOVE.W D2,FP_SCR2(a6)
423 1.1 mycroft CLR.W FP_SCR2+2(a6)
424 1.1 mycroft MOVE.L #$C90FDAA2,FP_SCR2+4(a6)
425 1.1 mycroft CLR.L FP_SCR2+8(a6) ...FP_SCR2 is 2**(L) * Piby2_1
426 1.1 mycroft
427 1.1 mycroft *--FP2 IS READY
428 1.1 mycroft FSUB.S TWOTO63(a6),FP2 ...FP2 is N
429 1.1 mycroft
430 1.1 mycroft ADDI.L #$00003FDD,D0
431 1.1 mycroft MOVE.W D0,FP_SCR3(a6)
432 1.1 mycroft CLR.W FP_SCR3+2(a6)
433 1.1 mycroft MOVE.L #$85A308D3,FP_SCR3+4(a6)
434 1.1 mycroft CLR.L FP_SCR3+8(a6) ...FP_SCR3 is 2**(L) * Piby2_2
435 1.1 mycroft
436 1.1 mycroft MOVE.L ENDFLAG(a6),D0
437 1.1 mycroft
438 1.1 mycroft *--We are now ready to perform (R+r) - N*P1 - N*P2, P1 = 2**(L) * Piby2_1 and
439 1.1 mycroft *--P2 = 2**(L) * Piby2_2
440 1.1 mycroft FMOVE.X FP2,FP4
441 1.1 mycroft FMul.X FP_SCR2(a6),FP4 ...W = N*P1
442 1.1 mycroft FMove.X FP2,FP5
443 1.1 mycroft FMul.X FP_SCR3(a6),FP5 ...w = N*P2
444 1.1 mycroft FMove.X FP4,FP3
445 1.1 mycroft *--we want P+p = W+w but |p| <= half ulp of P
446 1.1 mycroft *--Then, we need to compute A := R-P and a := r-p
447 1.1 mycroft FAdd.X FP5,FP3 ...FP3 is P
448 1.1 mycroft FSub.X FP3,FP4 ...W-P
449 1.1 mycroft
450 1.1 mycroft FSub.X FP3,FP0 ...FP0 is A := R - P
451 1.1 mycroft FAdd.X FP5,FP4 ...FP4 is p = (W-P)+w
452 1.1 mycroft
453 1.1 mycroft FMove.X FP0,FP3 ...FP3 A
454 1.1 mycroft FSub.X FP4,FP1 ...FP1 is a := r - p
455 1.1 mycroft
456 1.1 mycroft *--Now we need to normalize (A,a) to "new (R,r)" where R+r = A+a but
457 1.1 mycroft *--|r| <= half ulp of R.
458 1.1 mycroft FAdd.X FP1,FP0 ...FP0 is R := A+a
459 1.1 mycroft *--No need to calculate r if this is the last loop
460 1.2 mycroft TST.L D0
461 1.1 mycroft BGT.W RESTORE
462 1.1 mycroft
463 1.1 mycroft *--Need to calculate r
464 1.1 mycroft FSub.X FP0,FP3 ...A-R
465 1.1 mycroft FAdd.X FP3,FP1 ...FP1 is r := (A-R)+a
466 1.1 mycroft BRA.W LOOP
467 1.1 mycroft
468 1.1 mycroft RESTORE:
469 1.1 mycroft FMOVE.L FP2,N(a6)
470 1.1 mycroft MOVE.L (A7)+,D2
471 1.1 mycroft FMOVEM.X (A7)+,FP2-FP5
472 1.1 mycroft
473 1.1 mycroft
474 1.1 mycroft MOVE.L N(a6),D0
475 1.1 mycroft ROR.L #1,D0
476 1.1 mycroft
477 1.1 mycroft
478 1.1 mycroft BRA.W TANCONT
479 1.1 mycroft
480 1.1 mycroft end
481