sd: remove 'ssd' driver support
[unleashed/tickless.git] / usr / src / lib / libmvec / common / vis / __vsin.S
blob50f3279de6c4d7a7996afbc4c68a8f3687053f34
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
22  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
23  */
25  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
26  * Use is subject to license terms.
27  */
29         .file   "__vsin.S"
31 #include "libm.h"
33         RO_DATA
34         .align  64
35 constants:
36         .word   0x3ec718e3,0xa6972785
37         .word   0x3ef9fd39,0x94293940
38         .word   0xbf2a019f,0x75ee4be1
39         .word   0xbf56c16b,0xba552569
40         .word   0x3f811111,0x1108c703
41         .word   0x3fa55555,0x554f5b35
42         .word   0xbfc55555,0x555554d0
43         .word   0xbfdfffff,0xffffff85
44         .word   0x3ff00000,0x00000000
45         .word   0xbfc55555,0x5551fc28
46         .word   0x3f811107,0x62eacc9d
47         .word   0xbfdfffff,0xffff6328
48         .word   0x3fa55551,0x5f7acf0c
49         .word   0x3fe45f30,0x6dc9c883
50         .word   0x43380000,0x00000000
51         .word   0x3ff921fb,0x54400000
52         .word   0x3dd0b461,0x1a600000
53         .word   0x3ba3198a,0x2e000000
54         .word   0x397b839a,0x252049c1
55         .word   0x80000000,0x00004000
56         .word   0xffff8000,0x00000000   ! N.B.: low-order words used
57         .word   0x3fc90000,0x80000000   ! for sign bit hacking; see
58         .word   0x3fc40000,0x00000000   ! references to "thresh" below
60 #define p4              0x0
61 #define q4              0x08
62 #define p3              0x10
63 #define q3              0x18
64 #define p2              0x20
65 #define q2              0x28
66 #define p1              0x30
67 #define q1              0x38
68 #define one             0x40
69 #define pp1             0x48
70 #define pp2             0x50
71 #define qq1             0x58
72 #define qq2             0x60
73 #define invpio2         0x68
74 #define round           0x70
75 #define pio2_1          0x78
76 #define pio2_2          0x80
77 #define pio2_3          0x88
78 #define pio2_3t         0x90
79 #define f30val          0x98
80 #define mask            0xa0
81 #define thresh          0xa8
83 ! local storage indices
85 #define xsave           STACK_BIAS-0x8
86 #define ysave           STACK_BIAS-0x10
87 #define nsave           STACK_BIAS-0x14
88 #define sxsave          STACK_BIAS-0x18
89 #define sysave          STACK_BIAS-0x1c
90 #define biguns          STACK_BIAS-0x20
91 #define n2              STACK_BIAS-0x24
92 #define n1              STACK_BIAS-0x28
93 #define n0              STACK_BIAS-0x2c
94 #define x2_1            STACK_BIAS-0x40
95 #define x1_1            STACK_BIAS-0x50
96 #define x0_1            STACK_BIAS-0x60
97 #define y2_0            STACK_BIAS-0x70
98 #define y1_0            STACK_BIAS-0x80
99 #define y0_0            STACK_BIAS-0x90
100 ! sizeof temp storage - must be a multiple of 16 for V9
101 #define tmps            0x90
103 !--------------------------------------------------------------
104 !       Some defines to keep code more readable
105 #define LIM_l6          %l6
106 !       in primary range, contains |x| upper limit when cos(x)=1.
107 !       in transferring to medium range, denotes what loop was active.
108 !--------------------------------------------------------------
110         ENTRY(__vsin)
111         save    %sp,-SA(MINFRAME)-tmps,%sp
112         PIC_SETUP(g5)
113         PIC_SET(g5,__vlibm_TBL_sincos_hi,l3)
114         PIC_SET(g5,__vlibm_TBL_sincos_lo,l4)
115         PIC_SET(g5,constants,l5)
116         mov     %l5,%g1
117         wr      %g0,0x82,%asi           ! set %asi for non-faulting loads
119 ! ========== primary range ==========
121 ! register use
123 ! i0  n
124 ! i1  x
125 ! i2  stridex
126 ! i3  y
127 ! i4  stridey
128 ! i5  0x80000000
130 ! l0  hx0
131 ! l1  hx1
132 ! l2  hx2
133 ! l3  __vlibm_TBL_sincos_hi
134 ! l4  __vlibm_TBL_sincos_lo
135 ! l5  0x3fc90000
136 ! l6  0x3e400000
137 ! l7  0x3fe921fb
139 ! the following are 64-bit registers in both V8+ and V9
141 ! g1  scratch
142 ! g5  
144 ! o0  py0
145 ! o1  py1
146 ! o2  py2
147 ! o3  oy0
148 ! o4  oy1
149 ! o5  oy2
150 ! o7  scratch
152 ! f0  x0
153 ! f2  
154 ! f4  
155 ! f6  
156 ! f8  scratch for table base
157 ! f9  signbit0
158 ! f10 x1
159 ! f12 
160 ! f14 
161 ! f16 
162 ! f18 scratch for table base
163 ! f19 signbit1
164 ! f20 x2
165 ! f22 
166 ! f24 
167 ! f26 
168 ! f28 scratch for table base
169 ! f29 signbit2
170 ! f30 0x80000000
171 ! f31 0x4000
172 ! f32 
173 ! f34 
174 ! f36 
175 ! f38 
176 ! f40 
177 ! f42 
178 ! f44 0xffff800000000000
179 ! f46 p1
180 ! f48 p2
181 ! f50 p3
182 ! f52 p4
183 ! f54 one
184 ! f56 pp1
185 ! f58 pp2
186 ! f60 qq1
187 ! f62 qq2
189 #ifdef __sparcv9
190         stx     %i1,[%fp+xsave]         ! save arguments
191         stx     %i3,[%fp+ysave]
192 #else
193         st      %i1,[%fp+xsave]         ! save arguments
194         st      %i3,[%fp+ysave]
195 #endif
196         st      %i0,[%fp+nsave]
197         st      %i2,[%fp+sxsave]
198         st      %i4,[%fp+sysave]
199         sethi   %hi(0x80000000),%i5     ! load/set up constants
200         sethi   %hi(0x3fc90000),%l5
201         sethi   %hi(0x3e400000),LIM_l6
202         sethi   %hi(0x3fe921fb),%l7
203         or      %l7,%lo(0x3fe921fb),%l7
204         ldd     [%g1+f30val],%f30
205         ldd     [%g1+mask],%f44
206         ldd     [%g1+p1],%f46
207         ldd     [%g1+p2],%f48
208         ldd     [%g1+p3],%f50
209         ldd     [%g1+p4],%f52
210         ldd     [%g1+one],%f54
211         ldd     [%g1+pp1],%f56
212         ldd     [%g1+pp2],%f58
213         ldd     [%g1+qq1],%f60
214         ldd     [%g1+qq2],%f62
215         sll     %i2,3,%i2               ! scale strides
216         sll     %i4,3,%i4
217         add     %fp,x0_1,%o3            ! precondition loop
218         add     %fp,x0_1,%o4
219         add     %fp,x0_1,%o5
220         ld      [%i1],%l0               ! hx = *x
221         ld      [%i1],%f0
222         ld      [%i1+4],%f1
223         andn    %l0,%i5,%l0             ! hx &= ~0x80000000
224         add     %i1,%i2,%i1             ! x += stridex
226         ba,pt   %icc,.loop0
227 ! delay slot
228         nop
230         .align 32
231 .loop0:
232         lda     [%i1]%asi,%l1           ! preload next argument
233         sub     %l0,LIM_l6,%g1
234         sub     %l7,%l0,%o7
235         fands   %f0,%f30,%f9            ! save signbit
237         lda     [%i1]%asi,%f10
238         orcc    %o7,%g1,%g0
239         mov     %i3,%o0                 ! py0 = y
240         bl,pn   %icc,.range0            ! if hx < 0x3e400000 or > 0x3fe921fb
242 ! delay slot
243         lda     [%i1+4]%asi,%f11
244         addcc   %i0,-1,%i0
245         add     %i3,%i4,%i3             ! y += stridey
246         ble,pn  %icc,.endloop1
248 ! delay slot
249         andn    %l1,%i5,%l1
250         add     %i1,%i2,%i1             ! x += stridex
251         fabsd   %f0,%f0
252         fmuld   %f54,%f54,%f54          ! one*one; a nop for alignment only
254 .loop1:
255         lda     [%i1]%asi,%l2           ! preload next argument
256         sub     %l1,LIM_l6,%g1
257         sub     %l7,%l1,%o7
258         fands   %f10,%f30,%f19          ! save signbit
260         lda     [%i1]%asi,%f20
261         orcc    %o7,%g1,%g0
262         mov     %i3,%o1                 ! py1 = y
263         bl,pn   %icc,.range1            ! if hx < 0x3e400000 or > 0x3fe921fb
265 ! delay slot
266         lda     [%i1+4]%asi,%f21
267         addcc   %i0,-1,%i0
268         add     %i3,%i4,%i3             ! y += stridey
269         ble,pn  %icc,.endloop2
271 ! delay slot
272         andn    %l2,%i5,%l2
273         add     %i1,%i2,%i1             ! x += stridex
274         fabsd   %f10,%f10
275         fmuld   %f54,%f54,%f54          ! one*one; a nop for alignment only
277 .loop2:
278         st      %f6,[%o3]
279         sub     %l2,LIM_l6,%g1
280         sub     %l7,%l2,%o7
281         fands   %f20,%f30,%f29          ! save signbit
283         st      %f7,[%o3+4]
284         orcc    %g1,%o7,%g0
285         mov     %i3,%o2                 ! py2 = y
286         bl,pn   %icc,.range2            ! if hx < 0x3e400000 or > 0x3fe921fb
288 ! delay slot
289         add     %i3,%i4,%i3             ! y += stridey
290         cmp     %l0,%l5
291         fabsd   %f20,%f20
292         bl,pn   %icc,.case4
294 ! delay slot
295         st      %f16,[%o4]
296         cmp     %l1,%l5
297         fpadd32s %f0,%f31,%f8
298         bl,pn   %icc,.case2
300 ! delay slot
301         st      %f17,[%o4+4]
302         cmp     %l2,%l5
303         fpadd32s %f10,%f31,%f18
304         bl,pn   %icc,.case1
306 ! delay slot
307         st      %f26,[%o5]
308         mov     %o0,%o3
309         sethi   %hi(0x3fc3c000),%o7
310         fpadd32s %f20,%f31,%f28
312         st      %f27,[%o5+4]
313         fand    %f8,%f44,%f2
314         mov     %o1,%o4
316         fand    %f18,%f44,%f12
317         mov     %o2,%o5
318         sub     %l0,%o7,%l0
320         fand    %f28,%f44,%f22
321         sub     %l1,%o7,%l1
322         sub     %l2,%o7,%l2
324         fsubd   %f0,%f2,%f0
325         srl     %l0,10,%l0
326         add     %l3,8,%g1
328         fsubd   %f10,%f12,%f10
329         srl     %l1,10,%l1
331         fsubd   %f20,%f22,%f20
332         srl     %l2,10,%l2
334         fmuld   %f0,%f0,%f2
335         andn    %l0,0x1f,%l0
337         fmuld   %f10,%f10,%f12
338         andn    %l1,0x1f,%l1
340         fmuld   %f20,%f20,%f22
341         andn    %l2,0x1f,%l2
343         fmuld   %f2,%f58,%f6
344         ldd     [%l3+%l0],%f32
346         fmuld   %f12,%f58,%f16
347         ldd     [%l3+%l1],%f36
349         fmuld   %f22,%f58,%f26
350         ldd     [%l3+%l2],%f40
352         faddd   %f6,%f56,%f6
353         fmuld   %f2,%f62,%f4
354         ldd     [%g1+%l0],%f34
356         faddd   %f16,%f56,%f16
357         fmuld   %f12,%f62,%f14
358         ldd     [%g1+%l1],%f38
360         faddd   %f26,%f56,%f26
361         fmuld   %f22,%f62,%f24
362         ldd     [%g1+%l2],%f42
364         fmuld   %f2,%f6,%f6
365         faddd   %f4,%f60,%f4
367         fmuld   %f12,%f16,%f16
368         faddd   %f14,%f60,%f14
370         fmuld   %f22,%f26,%f26
371         faddd   %f24,%f60,%f24
373         faddd   %f6,%f54,%f6
374         fmuld   %f2,%f4,%f4
376         faddd   %f16,%f54,%f16
377         fmuld   %f12,%f14,%f14
379         faddd   %f26,%f54,%f26
380         fmuld   %f22,%f24,%f24
382         fmuld   %f0,%f6,%f6
383         ldd     [%l4+%l0],%f2
385         fmuld   %f10,%f16,%f16
386         ldd     [%l4+%l1],%f12
388         fmuld   %f20,%f26,%f26
389         ldd     [%l4+%l2],%f22
391         fmuld   %f4,%f32,%f4
392         lda     [%i1]%asi,%l0           ! preload next argument
394         fmuld   %f14,%f36,%f14
395         lda     [%i1]%asi,%f0
397         fmuld   %f24,%f40,%f24
398         lda     [%i1+4]%asi,%f1
400         fmuld   %f6,%f34,%f6
401         add     %i1,%i2,%i1             ! x += stridex
403         fmuld   %f16,%f38,%f16
405         fmuld   %f26,%f42,%f26
407         faddd   %f6,%f4,%f6
409         faddd   %f16,%f14,%f16
411         faddd   %f26,%f24,%f26
413         faddd   %f6,%f2,%f6
415         faddd   %f16,%f12,%f16
417         faddd   %f26,%f22,%f26
419         faddd   %f6,%f32,%f6
421         faddd   %f16,%f36,%f16
423         faddd   %f26,%f40,%f26
424         andn    %l0,%i5,%l0             ! hx &= ~0x80000000
426         fors    %f6,%f9,%f6
427         addcc   %i0,-1,%i0
429         fors    %f16,%f19,%f16
430         bg,pt   %icc,.loop0
432 ! delay slot
433         fors    %f26,%f29,%f26
435         ba,pt   %icc,.endloop0
436 ! delay slot
437         nop
439         .align  32
440 .case1:
441         st      %f27,[%o5+4]
442         sethi   %hi(0x3fc3c000),%o7
443         add     %l3,8,%g1
444         fand    %f8,%f44,%f2
446         sub     %l0,%o7,%l0
447         sub     %l1,%o7,%l1
448         fand    %f18,%f44,%f12
449         fmuld   %f20,%f20,%f22
451         fsubd   %f0,%f2,%f0
452         srl     %l0,10,%l0
453         mov     %o0,%o3
455         fsubd   %f10,%f12,%f10
456         srl     %l1,10,%l1
457         mov     %o1,%o4
459         fmuld   %f22,%f52,%f24
460         mov     %o2,%o5
462         fmuld   %f0,%f0,%f2
463         andn    %l0,0x1f,%l0
465         fmuld   %f10,%f10,%f12
466         andn    %l1,0x1f,%l1
468         faddd   %f24,%f50,%f24
470         fmuld   %f2,%f58,%f6
471         ldd     [%l3+%l0],%f32
473         fmuld   %f12,%f58,%f16
474         ldd     [%l3+%l1],%f36
476         fmuld   %f22,%f24,%f24
478         faddd   %f6,%f56,%f6
479         fmuld   %f2,%f62,%f4
480         ldd     [%g1+%l0],%f34
482         faddd   %f16,%f56,%f16
483         fmuld   %f12,%f62,%f14
484         ldd     [%g1+%l1],%f38
486         faddd   %f24,%f48,%f24
488         fmuld   %f2,%f6,%f6
489         faddd   %f4,%f60,%f4
491         fmuld   %f12,%f16,%f16
492         faddd   %f14,%f60,%f14
494         fmuld   %f22,%f24,%f24
496         faddd   %f6,%f54,%f6
497         fmuld   %f2,%f4,%f4
499         faddd   %f16,%f54,%f16
500         fmuld   %f12,%f14,%f14
502         faddd   %f24,%f46,%f24
504         fmuld   %f0,%f6,%f6
505         ldd     [%l4+%l0],%f2
507         fmuld   %f10,%f16,%f16
508         ldd     [%l4+%l1],%f12
510         fmuld   %f4,%f32,%f4
511         lda     [%i1]%asi,%l0           ! preload next argument
513         fmuld   %f14,%f36,%f14
514         lda     [%i1]%asi,%f0
516         fmuld   %f6,%f34,%f6
517         lda     [%i1+4]%asi,%f1
519         fmuld   %f16,%f38,%f16
520         add     %i1,%i2,%i1             ! x += stridex
522         fmuld   %f22,%f24,%f24
524         faddd   %f6,%f4,%f6
526         faddd   %f16,%f14,%f16
528         fmuld   %f20,%f24,%f24
530         faddd   %f6,%f2,%f6
532         faddd   %f16,%f12,%f16
534         faddd   %f20,%f24,%f26
536         faddd   %f6,%f32,%f6
538         faddd   %f16,%f36,%f16
539         andn    %l0,%i5,%l0             ! hx &= ~0x80000000
541         fors    %f26,%f29,%f26
542         addcc   %i0,-1,%i0
544         fors    %f6,%f9,%f6
545         bg,pt   %icc,.loop0
547 ! delay slot
548         fors    %f16,%f19,%f16
550         ba,pt   %icc,.endloop0
551 ! delay slot
552         nop
554         .align  32
555 .case2:
556         st      %f26,[%o5]
557         cmp     %l2,%l5
558         fpadd32s %f20,%f31,%f28
559         bl,pn   %icc,.case3
561 ! delay slot
562         st      %f27,[%o5+4]
563         sethi   %hi(0x3fc3c000),%o7
564         add     %l3,8,%g1
565         fand    %f8,%f44,%f2
567         sub     %l0,%o7,%l0
568         sub     %l2,%o7,%l2
569         fand    %f28,%f44,%f22
570         fmuld   %f10,%f10,%f12
572         fsubd   %f0,%f2,%f0
573         srl     %l0,10,%l0
574         mov     %o0,%o3
576         fsubd   %f20,%f22,%f20
577         srl     %l2,10,%l2
578         mov     %o2,%o5
580         fmuld   %f12,%f52,%f14
581         mov     %o1,%o4
583         fmuld   %f0,%f0,%f2
584         andn    %l0,0x1f,%l0
586         fmuld   %f20,%f20,%f22
587         andn    %l2,0x1f,%l2
589         faddd   %f14,%f50,%f14
591         fmuld   %f2,%f58,%f6
592         ldd     [%l3+%l0],%f32
594         fmuld   %f22,%f58,%f26
595         ldd     [%l3+%l2],%f40
597         fmuld   %f12,%f14,%f14
599         faddd   %f6,%f56,%f6
600         fmuld   %f2,%f62,%f4
601         ldd     [%g1+%l0],%f34
603         faddd   %f26,%f56,%f26
604         fmuld   %f22,%f62,%f24
605         ldd     [%g1+%l2],%f42
607         faddd   %f14,%f48,%f14
609         fmuld   %f2,%f6,%f6
610         faddd   %f4,%f60,%f4
612         fmuld   %f22,%f26,%f26
613         faddd   %f24,%f60,%f24
615         fmuld   %f12,%f14,%f14
617         faddd   %f6,%f54,%f6
618         fmuld   %f2,%f4,%f4
620         faddd   %f26,%f54,%f26
621         fmuld   %f22,%f24,%f24
623         faddd   %f14,%f46,%f14
625         fmuld   %f0,%f6,%f6
626         ldd     [%l4+%l0],%f2
628         fmuld   %f20,%f26,%f26
629         ldd     [%l4+%l2],%f22
631         fmuld   %f4,%f32,%f4
632         lda     [%i1]%asi,%l0           ! preload next argument
634         fmuld   %f24,%f40,%f24
635         lda     [%i1]%asi,%f0
637         fmuld   %f6,%f34,%f6
638         lda     [%i1+4]%asi,%f1
640         fmuld   %f26,%f42,%f26
641         add     %i1,%i2,%i1             ! x += stridex
643         fmuld   %f12,%f14,%f14
645         faddd   %f6,%f4,%f6
647         faddd   %f26,%f24,%f26
649         fmuld   %f10,%f14,%f14
651         faddd   %f6,%f2,%f6
653         faddd   %f26,%f22,%f26
655         faddd   %f10,%f14,%f16
657         faddd   %f6,%f32,%f6
659         faddd   %f26,%f40,%f26
660         andn    %l0,%i5,%l0             ! hx &= ~0x80000000
662         fors    %f16,%f19,%f16
663         addcc   %i0,-1,%i0
665         fors    %f6,%f9,%f6
666         bg,pt   %icc,.loop0
668 ! delay slot
669         fors    %f26,%f29,%f26
671         ba,pt   %icc,.endloop0
672 ! delay slot
673         nop
675         .align  32
676 .case3:
677         sethi   %hi(0x3fc3c000),%o7
678         add     %l3,8,%g1
679         fand    %f8,%f44,%f2
680         fmuld   %f10,%f10,%f12
682         sub     %l0,%o7,%l0
683         fmuld   %f20,%f20,%f22
685         fsubd   %f0,%f2,%f0
686         srl     %l0,10,%l0
687         mov     %o0,%o3
689         fmuld   %f12,%f52,%f14
690         mov     %o1,%o4
692         fmuld   %f22,%f52,%f24
693         mov     %o2,%o5
695         fmuld   %f0,%f0,%f2
696         andn    %l0,0x1f,%l0
698         faddd   %f14,%f50,%f14
700         faddd   %f24,%f50,%f24
702         fmuld   %f2,%f58,%f6
703         ldd     [%l3+%l0],%f32
705         fmuld   %f12,%f14,%f14
707         fmuld   %f22,%f24,%f24
709         faddd   %f6,%f56,%f6
710         fmuld   %f2,%f62,%f4
711         ldd     [%g1+%l0],%f34
713         faddd   %f14,%f48,%f14
715         faddd   %f24,%f48,%f24
717         fmuld   %f2,%f6,%f6
718         faddd   %f4,%f60,%f4
720         fmuld   %f12,%f14,%f14
722         fmuld   %f22,%f24,%f24
724         faddd   %f6,%f54,%f6
725         fmuld   %f2,%f4,%f4
727         faddd   %f14,%f46,%f14
729         faddd   %f24,%f46,%f24
731         fmuld   %f0,%f6,%f6
732         ldd     [%l4+%l0],%f2
734         fmuld   %f4,%f32,%f4
735         lda     [%i1]%asi,%l0           ! preload next argument
737         fmuld   %f12,%f14,%f14
738         lda     [%i1]%asi,%f0
740         fmuld   %f6,%f34,%f6
741         lda     [%i1+4]%asi,%f1
743         fmuld   %f22,%f24,%f24
744         add     %i1,%i2,%i1             ! x += stridex
746         fmuld   %f10,%f14,%f14
748         faddd   %f6,%f4,%f6
750         fmuld   %f20,%f24,%f24
752         faddd   %f10,%f14,%f16
754         faddd   %f6,%f2,%f6
756         faddd   %f20,%f24,%f26
758         fors    %f16,%f19,%f16
759         andn    %l0,%i5,%l0             ! hx &= ~0x80000000
761         faddd   %f6,%f32,%f6
762         addcc   %i0,-1,%i0
764         fors    %f26,%f29,%f26
765         bg,pt   %icc,.loop0
767 ! delay slot
768         fors    %f6,%f9,%f6
770         ba,pt   %icc,.endloop0
771 ! delay slot
772         nop
774         .align  32
775 .case4:
776         st      %f17,[%o4+4]
777         cmp     %l1,%l5
778         fpadd32s %f10,%f31,%f18
779         bl,pn   %icc,.case6
781 ! delay slot
782         st      %f26,[%o5]
783         cmp     %l2,%l5
784         fpadd32s %f20,%f31,%f28
785         bl,pn   %icc,.case5
787 ! delay slot
788         st      %f27,[%o5+4]
789         sethi   %hi(0x3fc3c000),%o7
790         add     %l3,8,%g1
791         fand    %f18,%f44,%f12
793         sub     %l1,%o7,%l1
794         sub     %l2,%o7,%l2
795         fand    %f28,%f44,%f22
796         fmuld   %f0,%f0,%f2
798         fsubd   %f10,%f12,%f10
799         srl     %l1,10,%l1
800         mov     %o1,%o4
802         fsubd   %f20,%f22,%f20
803         srl     %l2,10,%l2
804         mov     %o2,%o5
806         fmovd   %f0,%f6
807         fmuld   %f2,%f52,%f4
808         mov     %o0,%o3
810         fmuld   %f10,%f10,%f12
811         andn    %l1,0x1f,%l1
813         fmuld   %f20,%f20,%f22
814         andn    %l2,0x1f,%l2
816         faddd   %f4,%f50,%f4
818         fmuld   %f12,%f58,%f16
819         ldd     [%l3+%l1],%f36
821         fmuld   %f22,%f58,%f26
822         ldd     [%l3+%l2],%f40
824         fmuld   %f2,%f4,%f4
826         faddd   %f16,%f56,%f16
827         fmuld   %f12,%f62,%f14
828         ldd     [%g1+%l1],%f38
830         faddd   %f26,%f56,%f26
831         fmuld   %f22,%f62,%f24
832         ldd     [%g1+%l2],%f42
834         faddd   %f4,%f48,%f4
836         fmuld   %f12,%f16,%f16
837         faddd   %f14,%f60,%f14
839         fmuld   %f22,%f26,%f26
840         faddd   %f24,%f60,%f24
842         fmuld   %f2,%f4,%f4
844         faddd   %f16,%f54,%f16
845         fmuld   %f12,%f14,%f14
847         faddd   %f26,%f54,%f26
848         fmuld   %f22,%f24,%f24
850         faddd   %f4,%f46,%f4
852         fmuld   %f10,%f16,%f16
853         ldd     [%l4+%l1],%f12
855         fmuld   %f20,%f26,%f26
856         ldd     [%l4+%l2],%f22
858         fmuld   %f14,%f36,%f14
859         lda     [%i1]%asi,%l0           ! preload next argument
861         fmuld   %f24,%f40,%f24
862         lda     [%i1]%asi,%f0
864         fmuld   %f16,%f38,%f16
865         lda     [%i1+4]%asi,%f1
867         fmuld   %f26,%f42,%f26
868         add     %i1,%i2,%i1             ! x += stridex
870         fmuld   %f2,%f4,%f4
872         faddd   %f16,%f14,%f16
874         faddd   %f26,%f24,%f26
876         fmuld   %f6,%f4,%f4
878         faddd   %f16,%f12,%f16
880         faddd   %f26,%f22,%f26
882         faddd   %f6,%f4,%f6
884         faddd   %f16,%f36,%f16
886         faddd   %f26,%f40,%f26
887         andn    %l0,%i5,%l0             ! hx &= ~0x80000000
889         fors    %f6,%f9,%f6
890         addcc   %i0,-1,%i0
892         fors    %f16,%f19,%f16
893         bg,pt   %icc,.loop0
895 ! delay slot
896         fors    %f26,%f29,%f26
898         ba,pt   %icc,.endloop0
899 ! delay slot
900         nop
902         .align  32
903 .case5:
904         sethi   %hi(0x3fc3c000),%o7
905         add     %l3,8,%g1
906         fand    %f18,%f44,%f12
907         fmuld   %f0,%f0,%f2
909         sub     %l1,%o7,%l1
910         fmuld   %f20,%f20,%f22
912         fsubd   %f10,%f12,%f10
913         srl     %l1,10,%l1
914         mov     %o1,%o4
916         fmovd   %f0,%f6
917         fmuld   %f2,%f52,%f4
918         mov     %o0,%o3
920         fmuld   %f22,%f52,%f24
921         mov     %o2,%o5
923         fmuld   %f10,%f10,%f12
924         andn    %l1,0x1f,%l1
926         faddd   %f4,%f50,%f4
928         faddd   %f24,%f50,%f24
930         fmuld   %f12,%f58,%f16
931         ldd     [%l3+%l1],%f36
933         fmuld   %f2,%f4,%f4
935         fmuld   %f22,%f24,%f24
937         faddd   %f16,%f56,%f16
938         fmuld   %f12,%f62,%f14
939         ldd     [%g1+%l1],%f38
941         faddd   %f4,%f48,%f4
943         faddd   %f24,%f48,%f24
945         fmuld   %f12,%f16,%f16
946         faddd   %f14,%f60,%f14
948         fmuld   %f2,%f4,%f4
950         fmuld   %f22,%f24,%f24
952         faddd   %f16,%f54,%f16
953         fmuld   %f12,%f14,%f14
955         faddd   %f4,%f46,%f4
957         faddd   %f24,%f46,%f24
959         fmuld   %f10,%f16,%f16
960         ldd     [%l4+%l1],%f12
962         fmuld   %f14,%f36,%f14
963         lda     [%i1]%asi,%l0           ! preload next argument
965         fmuld   %f2,%f4,%f4
966         lda     [%i1]%asi,%f0
968         fmuld   %f16,%f38,%f16
969         lda     [%i1+4]%asi,%f1
971         fmuld   %f22,%f24,%f24
972         add     %i1,%i2,%i1             ! x += stridex
974         fmuld   %f6,%f4,%f4
976         faddd   %f16,%f14,%f16
978         fmuld   %f20,%f24,%f24
980         faddd   %f6,%f4,%f6
982         faddd   %f16,%f12,%f16
984         faddd   %f20,%f24,%f26
986         fors    %f6,%f9,%f6
987         andn    %l0,%i5,%l0             ! hx &= ~0x80000000
989         faddd   %f16,%f36,%f16
990         addcc   %i0,-1,%i0
992         fors    %f26,%f29,%f26
993         bg,pt   %icc,.loop0
995 ! delay slot
996         fors    %f16,%f19,%f16
998         ba,pt   %icc,.endloop0
999 ! delay slot
1000         nop
1002         .align  32
1003 .case6:
1004         st      %f27,[%o5+4]
1005         cmp     %l2,%l5
1006         fpadd32s %f20,%f31,%f28
1007         bl,pn   %icc,.case7
1009 ! delay slot
1010         sethi   %hi(0x3fc3c000),%o7
1011         add     %l3,8,%g1
1012         fand    %f28,%f44,%f22
1013         fmuld   %f0,%f0,%f2
1015         sub     %l2,%o7,%l2
1016         fmuld   %f10,%f10,%f12
1018         fsubd   %f20,%f22,%f20
1019         srl     %l2,10,%l2
1020         mov     %o2,%o5
1022         fmovd   %f0,%f6
1023         fmuld   %f2,%f52,%f4
1024         mov     %o0,%o3
1026         fmuld   %f12,%f52,%f14
1027         mov     %o1,%o4
1029         fmuld   %f20,%f20,%f22
1030         andn    %l2,0x1f,%l2
1032         faddd   %f4,%f50,%f4
1034         faddd   %f14,%f50,%f14
1036         fmuld   %f22,%f58,%f26
1037         ldd     [%l3+%l2],%f40
1039         fmuld   %f2,%f4,%f4
1041         fmuld   %f12,%f14,%f14
1043         faddd   %f26,%f56,%f26
1044         fmuld   %f22,%f62,%f24
1045         ldd     [%g1+%l2],%f42
1047         faddd   %f4,%f48,%f4
1049         faddd   %f14,%f48,%f14
1051         fmuld   %f22,%f26,%f26
1052         faddd   %f24,%f60,%f24
1054         fmuld   %f2,%f4,%f4
1056         fmuld   %f12,%f14,%f14
1058         faddd   %f26,%f54,%f26
1059         fmuld   %f22,%f24,%f24
1061         faddd   %f4,%f46,%f4
1063         faddd   %f14,%f46,%f14
1065         fmuld   %f20,%f26,%f26
1066         ldd     [%l4+%l2],%f22
1068         fmuld   %f24,%f40,%f24
1069         lda     [%i1]%asi,%l0           ! preload next argument
1071         fmuld   %f2,%f4,%f4
1072         lda     [%i1]%asi,%f0
1074         fmuld   %f26,%f42,%f26
1075         lda     [%i1+4]%asi,%f1
1077         fmuld   %f12,%f14,%f14
1078         add     %i1,%i2,%i1             ! x += stridex
1080         fmuld   %f6,%f4,%f4
1082         faddd   %f26,%f24,%f26
1084         fmuld   %f10,%f14,%f14
1086         faddd   %f6,%f4,%f6
1088         faddd   %f26,%f22,%f26
1090         faddd   %f10,%f14,%f16
1092         fors    %f6,%f9,%f6
1093         andn    %l0,%i5,%l0             ! hx &= ~0x80000000
1095         faddd   %f26,%f40,%f26
1096         addcc   %i0,-1,%i0
1098         fors    %f16,%f19,%f16
1099         bg,pt   %icc,.loop0
1101 ! delay slot
1102         fors    %f26,%f29,%f26
1104         ba,pt   %icc,.endloop0
1105 ! delay slot
1106         nop
1108         .align  32
1109 .case7:
1110         fmuld   %f0,%f0,%f2
1111         fmovd   %f0,%f6
1112         mov     %o0,%o3
1114         fmuld   %f10,%f10,%f12
1115         mov     %o1,%o4
1117         fmuld   %f20,%f20,%f22
1118         mov     %o2,%o5
1120         fmuld   %f2,%f52,%f4
1121         lda     [%i1]%asi,%l0           ! preload next argument
1123         fmuld   %f12,%f52,%f14
1124         lda     [%i1]%asi,%f0
1126         fmuld   %f22,%f52,%f24
1127         lda     [%i1+4]%asi,%f1
1129         faddd   %f4,%f50,%f4
1130         add     %i1,%i2,%i1             ! x += stridex
1132         faddd   %f14,%f50,%f14
1134         faddd   %f24,%f50,%f24
1136         fmuld   %f2,%f4,%f4
1138         fmuld   %f12,%f14,%f14
1140         fmuld   %f22,%f24,%f24
1142         faddd   %f4,%f48,%f4
1144         faddd   %f14,%f48,%f14
1146         faddd   %f24,%f48,%f24
1148         fmuld   %f2,%f4,%f4
1150         fmuld   %f12,%f14,%f14
1152         fmuld   %f22,%f24,%f24
1154         faddd   %f4,%f46,%f4
1156         faddd   %f14,%f46,%f14
1158         faddd   %f24,%f46,%f24
1160         fmuld   %f2,%f4,%f4
1162         fmuld   %f12,%f14,%f14
1164         fmuld   %f22,%f24,%f24
1166         fmuld   %f6,%f4,%f4
1168         fmuld   %f10,%f14,%f14
1170         fmuld   %f20,%f24,%f24
1172         faddd   %f6,%f4,%f6
1174         faddd   %f10,%f14,%f16
1176         faddd   %f20,%f24,%f26
1177         andn    %l0,%i5,%l0             ! hx &= ~0x80000000
1179         fors    %f6,%f9,%f6
1180         addcc   %i0,-1,%i0
1182         fors    %f16,%f19,%f16
1183         bg,pt   %icc,.loop0
1185 ! delay slot
1186         fors    %f26,%f29,%f26
1188         ba,pt   %icc,.endloop0
1189 ! delay slot
1190         nop
1193         .align  32
1194 .endloop2:
1195         cmp     %l1,%l5
1196         bl,pn   %icc,1f
1197 ! delay slot
1198         fabsd   %f10,%f10
1199         sethi   %hi(0x3fc3c000),%o7
1200         fpadd32s %f10,%f31,%f18
1201         add     %l3,8,%g1
1202         fand    %f18,%f44,%f12
1203         sub     %l1,%o7,%l1
1204         fsubd   %f10,%f12,%f10
1205         srl     %l1,10,%l1
1206         fmuld   %f10,%f10,%f12
1207         andn    %l1,0x1f,%l1
1208         fmuld   %f12,%f58,%f20
1209         ldd     [%l3+%l1],%f36
1210         faddd   %f20,%f56,%f20
1211         fmuld   %f12,%f62,%f14
1212         ldd     [%g1+%l1],%f38
1213         fmuld   %f12,%f20,%f20
1214         faddd   %f14,%f60,%f14
1215         faddd   %f20,%f54,%f20
1216         fmuld   %f12,%f14,%f14
1217         fmuld   %f10,%f20,%f20
1218         ldd     [%l4+%l1],%f12
1219         fmuld   %f14,%f36,%f14
1220         fmuld   %f20,%f38,%f20
1221         faddd   %f20,%f14,%f20
1222         faddd   %f20,%f12,%f20
1223         ba,pt   %icc,2f
1224 ! delay slot
1225         faddd   %f20,%f36,%f20
1227         fmuld   %f10,%f10,%f12
1228         fmuld   %f12,%f52,%f14
1229         faddd   %f14,%f50,%f14
1230         fmuld   %f12,%f14,%f14
1231         faddd   %f14,%f48,%f14
1232         fmuld   %f12,%f14,%f14
1233         faddd   %f14,%f46,%f14
1234         fmuld   %f12,%f14,%f14
1235         fmuld   %f10,%f14,%f14
1236         faddd   %f10,%f14,%f20
1238         fors    %f20,%f19,%f20
1239         st      %f20,[%o1]
1240         st      %f21,[%o1+4]
1242 .endloop1:
1243         cmp     %l0,%l5
1244         bl,pn   %icc,1f
1245 ! delay slot
1246         fabsd   %f0,%f0
1247         sethi   %hi(0x3fc3c000),%o7
1248         fpadd32s %f0,%f31,%f8
1249         add     %l3,8,%g1
1250         fand    %f8,%f44,%f2
1251         sub     %l0,%o7,%l0
1252         fsubd   %f0,%f2,%f0
1253         srl     %l0,10,%l0
1254         fmuld   %f0,%f0,%f2
1255         andn    %l0,0x1f,%l0
1256         fmuld   %f2,%f58,%f20
1257         ldd     [%l3+%l0],%f32
1258         faddd   %f20,%f56,%f20
1259         fmuld   %f2,%f62,%f4
1260         ldd     [%g1+%l0],%f34
1261         fmuld   %f2,%f20,%f20
1262         faddd   %f4,%f60,%f4
1263         faddd   %f20,%f54,%f20
1264         fmuld   %f2,%f4,%f4
1265         fmuld   %f0,%f20,%f20
1266         ldd     [%l4+%l0],%f2
1267         fmuld   %f4,%f32,%f4
1268         fmuld   %f20,%f34,%f20
1269         faddd   %f20,%f4,%f20
1270         faddd   %f20,%f2,%f20
1271         ba,pt   %icc,2f
1272 ! delay slot
1273         faddd   %f20,%f32,%f20
1275         fmuld   %f0,%f0,%f2
1276         fmuld   %f2,%f52,%f4
1277         faddd   %f4,%f50,%f4
1278         fmuld   %f2,%f4,%f4
1279         faddd   %f4,%f48,%f4
1280         fmuld   %f2,%f4,%f4
1281         faddd   %f4,%f46,%f4
1282         fmuld   %f2,%f4,%f4
1283         fmuld   %f0,%f4,%f4
1284         faddd   %f0,%f4,%f20
1286         fors    %f20,%f9,%f20
1287         st      %f20,[%o0]
1288         st      %f21,[%o0+4]
1290 .endloop0:
1291         st      %f6,[%o3]
1292         st      %f7,[%o3+4]
1293         st      %f16,[%o4]
1294         st      %f17,[%o4+4]
1295         st      %f26,[%o5]
1296         st      %f27,[%o5+4]
1298 ! return.  finished off with only primary range arguments.
1300         ret
1301         restore
1304         .align  32
1305 .range0:
1306         cmp     %l0,LIM_l6
1307         bg,a,pt %icc,.MEDIUM            ! branch if x is not tiny
1308 ! delay slot, annulled if branch not taken
1309         mov     0x1,LIM_l6              ! set "processing loop0"
1310         st      %f0,[%o0]               ! *y = *x with inexact if x nonzero
1311         st      %f1,[%o0+4]
1312         fdtoi   %f0,%f2
1313         addcc   %i0,-1,%i0
1314         ble,pn  %icc,.endloop0
1315 ! delay slot, harmless if branch taken
1316         add     %i3,%i4,%i3             ! y += stridey
1317         andn    %l1,%i5,%l0             ! hx &= ~0x80000000
1318         fmovd   %f10,%f0
1319         ba,pt   %icc,.loop0
1320 ! delay slot
1321         add     %i1,%i2,%i1             ! x += stridex
1324         .align  32
1325 .range1:
1326         cmp     %l1,LIM_l6
1327         bg,a,pt %icc,.MEDIUM            ! branch if x is not tiny
1328 ! delay slot, annulled if branch not taken
1329         mov     0x2,LIM_l6              ! set "processing loop1"
1330         st      %f10,[%o1]              ! *y = *x with inexact if x nonzero
1331         st      %f11,[%o1+4]
1332         fdtoi   %f10,%f12
1333         addcc   %i0,-1,%i0
1334         ble,pn  %icc,.endloop1
1335 ! delay slot, harmless if branch taken
1336         add     %i3,%i4,%i3             ! y += stridey
1337         andn    %l2,%i5,%l1             ! hx &= ~0x80000000
1338         fmovd   %f20,%f10
1339         ba,pt   %icc,.loop1
1340 ! delay slot
1341         add     %i1,%i2,%i1             ! x += stridex
1344         .align  32
1345 .range2:
1346         cmp     %l2,LIM_l6
1347         bg,a,pt %icc,.MEDIUM            ! branch if x is not tiny
1348 ! delay slot, annulled if branch not taken
1349         mov     0x3,LIM_l6              ! set "processing loop2"
1350         st      %f20,[%o2]              ! *y = *x with inexact if x nonzero
1351         st      %f21,[%o2+4]
1352         fdtoi   %f20,%f22
1354         addcc   %i0,-1,%i0
1355         ble,pn  %icc,.endloop2
1356 ! delay slot
1357         nop
1358         ld      [%i1],%l2
1359         ld      [%i1],%f20
1360         ld      [%i1+4],%f21
1361         andn    %l2,%i5,%l2             ! hx &= ~0x80000000
1362         ba,pt   %icc,.loop2
1363 ! delay slot
1364         add     %i1,%i2,%i1             ! x += stridex
1367         .align  32
1368 .MEDIUM:
1370 ! ========== medium range ==========
1372 ! register use
1374 ! i0  n
1375 ! i1  x
1376 ! i2  stridex
1377 ! i3  y
1378 ! i4  stridey
1379 ! i5  0x80000000
1381 ! l0  hx0
1382 ! l1  hx1
1383 ! l2  hx2
1384 ! l3  __vlibm_TBL_sincos_hi
1385 ! l4  __vlibm_TBL_sincos_lo
1386 ! l5  constants
1387 ! l6  in transition from pri-range and here, use for biguns
1388 ! l7  0x413921fb
1390 ! the following are 64-bit registers in both V8+ and V9
1392 ! g1  scratch
1393 ! g5  
1395 ! o0  py0
1396 ! o1  py1
1397 ! o2  py2
1398 ! o3  n0
1399 ! o4  n1
1400 ! o5  n2
1401 ! o7  scratch
1403 ! f0  x0
1404 ! f2  n0,y0
1405 ! f4  
1406 ! f6  
1407 ! f8  scratch for table base
1408 ! f9  signbit0
1409 ! f10 x1
1410 ! f12 n1,y1
1411 ! f14 
1412 ! f16 
1413 ! f18 scratch for table base
1414 ! f19 signbit1
1415 ! f20 x2
1416 ! f22 n2,y2
1417 ! f24 
1418 ! f26 
1419 ! f28 scratch for table base
1420 ! f29 signbit2
1421 ! f30 0x80000000
1422 ! f31 0x4000
1423 ! f32 
1424 ! f34 
1425 ! f36 
1426 ! f38 
1427 ! f40 invpio2
1428 ! f42 round
1429 ! f44 0xffff800000000000
1430 ! f46 pio2_1
1431 ! f48 pio2_2
1432 ! f50 pio2_3
1433 ! f52 pio2_3t
1434 ! f54 one
1435 ! f56 pp1
1436 ! f58 pp2
1437 ! f60 qq1
1438 ! f62 qq2
1440         PIC_SET(g5,constants,l5)
1442         ! %o3,%o4,%o5 need to be stored
1443         st      %f6,[%o3]
1444         sethi   %hi(0x413921fb),%l7
1445         st      %f7,[%o3+4]
1446         or      %l7,%lo(0x413921fb),%l7
1447         st      %f16,[%o4]
1448         st      %f17,[%o4+4]
1449         st      %f26,[%o5]
1450         st      %f27,[%o5+4]
1451         ldd     [%l5+invpio2],%f40
1452         ldd     [%l5+round],%f42
1453         ldd     [%l5+pio2_1],%f46
1454         ldd     [%l5+pio2_2],%f48
1455         ldd     [%l5+pio2_3],%f50
1456         ldd     [%l5+pio2_3t],%f52
1457         std     %f54,[%fp+x0_1+8]       ! set up stack data
1458         std     %f54,[%fp+x1_1+8]
1459         std     %f54,[%fp+x2_1+8]
1460         stx     %g0,[%fp+y0_0+8]
1461         stx     %g0,[%fp+y1_0+8]
1462         stx     %g0,[%fp+y2_0+8]
1464 !       branched here in the middle of the array.  Need to adjust 
1465 !       for the members of the triple that were selected in the primary
1466 !       loop.
1468 !       no adjustment since all three selected here
1469         subcc   LIM_l6,0x1,%g0          ! continue in LOOP0?
1470         bz,a    %icc,.LOOP0
1471         mov     0x0,LIM_l6              ! delay slot set biguns=0
1473 !       ajust 1st triple since 2d and 3d done here
1474         subcc   LIM_l6,0x2,%g0          ! continue in LOOP1?
1475         fors    %f0,%f9,%f0             ! restore sign bit
1476         fmuld   %f0,%f40,%f2            ! adj LOOP0
1477         bz,a    %icc,.LOOP1
1478         mov     0x0,LIM_l6              ! delay slot set biguns=0
1480 !       ajust 1st and 2d triple since 3d done here
1481         subcc   LIM_l6,0x3,%g0          ! continue in LOOP2?
1482         !done fmuld     %f0,%f40,%f2            ! adj LOOP0
1483         sub     %i3,%i4,%i3             ! adjust to not double increment
1484         fors    %f10,%f19,%f10          ! restore sign bit
1485         fmuld   %f10,%f40,%f12          ! adj LOOP1
1486         faddd   %f2,%f42,%f2            ! adj LOOP1
1487         bz,a    %icc,.LOOP2
1488         mov     0x0,LIM_l6              ! delay slot set biguns=0
1490         .align 32
1491 .LOOP0:
1492         lda     [%i1]%asi,%l1           ! preload next argument
1493         mov     %i3,%o0                 ! py0 = y
1494         lda     [%i1]%asi,%f10
1495         cmp     %l0,%l7
1496         add     %i3,%i4,%i3             ! y += stridey
1497         bg,pn   %icc,.BIG0              ! if hx > 0x413921fb
1499 ! delay slot
1500         lda     [%i1+4]%asi,%f11
1501         addcc   %i0,-1,%i0
1502         add     %i1,%i2,%i1             ! x += stridex
1503         ble,pn  %icc,.ENDLOOP1
1505 ! delay slot
1506         andn    %l1,%i5,%l1
1507         nop
1508         fmuld   %f0,%f40,%f2
1509         fabsd   %f54,%f54               ! a nop for alignment only
1511 .LOOP1:
1512         lda     [%i1]%asi,%l2           ! preload next argument
1513         mov     %i3,%o1                 ! py1 = y
1515         lda     [%i1]%asi,%f20
1516         cmp     %l1,%l7
1517         add     %i3,%i4,%i3             ! y += stridey
1518         bg,pn   %icc,.BIG1              ! if hx > 0x413921fb
1520 ! delay slot
1521         lda     [%i1+4]%asi,%f21
1522         addcc   %i0,-1,%i0
1523         add     %i1,%i2,%i1             ! x += stridex
1524         ble,pn  %icc,.ENDLOOP2
1526 ! delay slot
1527         andn    %l2,%i5,%l2
1528         nop
1529         fmuld   %f10,%f40,%f12
1530         faddd   %f2,%f42,%f2
1532 .LOOP2:
1533         st      %f3,[%fp+n0]
1534         mov     %i3,%o2                 ! py2 = y
1536         cmp     %l2,%l7
1537         add     %i3,%i4,%i3             ! y += stridey
1538         fmuld   %f20,%f40,%f22
1539         bg,pn   %icc,.BIG2              ! if hx > 0x413921fb
1541 ! delay slot
1542         add     %l5,thresh+4,%o7
1543         faddd   %f12,%f42,%f12
1544         st      %f13,[%fp+n1]
1546 ! -
1548         add     %l5,thresh,%g1
1549         faddd   %f22,%f42,%f22
1550         st      %f23,[%fp+n2]
1552         fsubd   %f2,%f42,%f2            ! n
1554         fsubd   %f12,%f42,%f12          ! n
1556         fsubd   %f22,%f42,%f22          ! n
1558         fmuld   %f2,%f46,%f4
1560         fmuld   %f12,%f46,%f14
1562         fmuld   %f22,%f46,%f24
1564         fsubd   %f0,%f4,%f4
1565         fmuld   %f2,%f48,%f6
1567         fsubd   %f10,%f14,%f14
1568         fmuld   %f12,%f48,%f16
1570         fsubd   %f20,%f24,%f24
1571         fmuld   %f22,%f48,%f26
1573         fsubd   %f4,%f6,%f0
1574         ld      [%fp+n0],%o3
1576         fsubd   %f14,%f16,%f10
1577         ld      [%fp+n1],%o4
1579         fsubd   %f24,%f26,%f20
1580         ld      [%fp+n2],%o5
1582         fsubd   %f4,%f0,%f32
1583         and     %o3,1,%o3
1585         fsubd   %f14,%f10,%f34
1586         and     %o4,1,%o4
1588         fsubd   %f24,%f20,%f36
1589         and     %o5,1,%o5
1591         fsubd   %f32,%f6,%f32
1592         fmuld   %f2,%f50,%f8
1593         sll     %o3,3,%o3
1595         fsubd   %f34,%f16,%f34
1596         fmuld   %f12,%f50,%f18
1597         sll     %o4,3,%o4
1599         fsubd   %f36,%f26,%f36
1600         fmuld   %f22,%f50,%f28
1601         sll     %o5,3,%o5
1603         fsubd   %f8,%f32,%f8
1604         ld      [%g1+%o3],%f6
1606         fsubd   %f18,%f34,%f18
1607         ld      [%g1+%o4],%f16
1609         fsubd   %f28,%f36,%f28
1610         ld      [%g1+%o5],%f26
1612         fsubd   %f0,%f8,%f4
1614         fsubd   %f10,%f18,%f14
1616         fsubd   %f20,%f28,%f24
1618         fsubd   %f0,%f4,%f32
1620         fsubd   %f10,%f14,%f34
1622         fsubd   %f20,%f24,%f36
1624         fsubd   %f32,%f8,%f32
1625         fmuld   %f2,%f52,%f2
1627         fsubd   %f34,%f18,%f34
1628         fmuld   %f12,%f52,%f12
1630         fsubd   %f36,%f28,%f36
1631         fmuld   %f22,%f52,%f22
1633         fsubd   %f2,%f32,%f2
1634         ld      [%o7+%o3],%f8
1636         fsubd   %f12,%f34,%f12
1637         ld      [%o7+%o4],%f18
1639         fsubd   %f22,%f36,%f22
1640         ld      [%o7+%o5],%f28
1642         fsubd   %f4,%f2,%f0             ! x
1644         fsubd   %f14,%f12,%f10          ! x
1646         fsubd   %f24,%f22,%f20          ! x
1648         fsubd   %f4,%f0,%f4
1650         fsubd   %f14,%f10,%f14
1652         fsubd   %f24,%f20,%f24
1654         fands   %f0,%f30,%f9            ! save signbit
1656         fands   %f10,%f30,%f19          ! save signbit
1658         fands   %f20,%f30,%f29          ! save signbit
1660         fabsd   %f0,%f0
1661         std     %f0,[%fp+x0_1]
1663         fabsd   %f10,%f10
1664         std     %f10,[%fp+x1_1]
1666         fabsd   %f20,%f20
1667         std     %f20,[%fp+x2_1]
1669         fsubd   %f4,%f2,%f2             ! y
1671         fsubd   %f14,%f12,%f12          ! y
1673         fsubd   %f24,%f22,%f22          ! y
1675         fcmpgt32 %f6,%f0,%l0
1677         fcmpgt32 %f16,%f10,%l1
1679         fcmpgt32 %f26,%f20,%l2
1681 ! -- 16 byte aligned
1682         fxors   %f2,%f9,%f2
1684         fxors   %f12,%f19,%f12
1686         fxors   %f22,%f29,%f22
1688         fands   %f9,%f8,%f9             ! if (n & 1) clear sign bit
1689         andcc   %l0,2,%g0
1690         bne,pn  %icc,.CASE4
1692 ! delay slot
1693         fands   %f19,%f18,%f19          ! if (n & 1) clear sign bit
1694         andcc   %l1,2,%g0
1695         bne,pn  %icc,.CASE2
1697 ! delay slot
1698         fands   %f29,%f28,%f29          ! if (n & 1) clear sign bit
1699         andcc   %l2,2,%g0
1700         bne,pn  %icc,.CASE1
1702 ! delay slot
1703         fpadd32s %f0,%f31,%f8
1704         sethi   %hi(0x3fc3c000),%o7
1705         ld      [%fp+x0_1],%l0
1707         fpadd32s %f10,%f31,%f18
1708         add     %l3,8,%g1
1709         ld      [%fp+x1_1],%l1
1711         fpadd32s %f20,%f31,%f28
1712         ld      [%fp+x2_1],%l2
1714         fand    %f8,%f44,%f4
1715         sub     %l0,%o7,%l0
1717         fand    %f18,%f44,%f14
1718         sub     %l1,%o7,%l1
1720         fand    %f28,%f44,%f24
1721         sub     %l2,%o7,%l2
1723         fsubd   %f0,%f4,%f0
1724         srl     %l0,10,%l0
1726         fsubd   %f10,%f14,%f10
1727         srl     %l1,10,%l1
1729         fsubd   %f20,%f24,%f20
1730         srl     %l2,10,%l2
1732         faddd   %f0,%f2,%f0
1733         andn    %l0,0x1f,%l0
1735         faddd   %f10,%f12,%f10
1736         andn    %l1,0x1f,%l1
1738         faddd   %f20,%f22,%f20
1739         andn    %l2,0x1f,%l2
1741         fmuld   %f0,%f0,%f2
1742         add     %l0,%o3,%l0
1744         fmuld   %f10,%f10,%f12
1745         add     %l1,%o4,%l1
1747         fmuld   %f20,%f20,%f22
1748         add     %l2,%o5,%l2
1750         fmuld   %f2,%f58,%f6
1751         ldd     [%l3+%l0],%f32
1753         fmuld   %f12,%f58,%f16
1754         ldd     [%l3+%l1],%f34
1756         fmuld   %f22,%f58,%f26
1757         ldd     [%l3+%l2],%f36
1759         faddd   %f6,%f56,%f6
1760         fmuld   %f2,%f62,%f4
1762         faddd   %f16,%f56,%f16
1763         fmuld   %f12,%f62,%f14
1765         faddd   %f26,%f56,%f26
1766         fmuld   %f22,%f62,%f24
1768         fmuld   %f2,%f6,%f6
1769         faddd   %f4,%f60,%f4
1771         fmuld   %f12,%f16,%f16
1772         faddd   %f14,%f60,%f14
1774         fmuld   %f22,%f26,%f26
1775         faddd   %f24,%f60,%f24
1777         faddd   %f6,%f54,%f6
1778         fmuld   %f2,%f4,%f4
1780         faddd   %f16,%f54,%f16
1781         fmuld   %f12,%f14,%f14
1783         faddd   %f26,%f54,%f26
1784         fmuld   %f22,%f24,%f24
1786         fmuld   %f0,%f6,%f6
1787         ldd     [%g1+%l0],%f2
1789         fmuld   %f10,%f16,%f16
1790         ldd     [%g1+%l1],%f12
1792         fmuld   %f20,%f26,%f26
1793         ldd     [%g1+%l2],%f22
1795         fmuld   %f4,%f32,%f4
1796         ldd     [%l4+%l0],%f0
1798         fmuld   %f14,%f34,%f14
1799         ldd     [%l4+%l1],%f10
1801         fmuld   %f24,%f36,%f24
1802         ldd     [%l4+%l2],%f20
1804         fmuld   %f6,%f2,%f6
1806         fmuld   %f16,%f12,%f16
1808         fmuld   %f26,%f22,%f26
1810         faddd   %f6,%f4,%f6
1812         faddd   %f16,%f14,%f16
1814         faddd   %f26,%f24,%f26
1816         faddd   %f6,%f0,%f6
1818         faddd   %f16,%f10,%f16
1820         faddd   %f26,%f20,%f26
1822         faddd   %f6,%f32,%f6
1824         faddd   %f16,%f34,%f16
1826         faddd   %f26,%f36,%f26
1828 .FIXSIGN:
1829         ld      [%fp+n0],%o3
1830         add     %l5,thresh-4,%g1
1832         ld      [%fp+n1],%o4
1834         ld      [%fp+n2],%o5
1835         and     %o3,2,%o3
1837         sll     %o3,2,%o3
1838         and     %o4,2,%o4
1839         lda     [%i1]%asi,%l0           ! preload next argument
1841         sll     %o4,2,%o4
1842         and     %o5,2,%o5
1843         ld      [%g1+%o3],%f8
1845         sll     %o5,2,%o5
1846         ld      [%g1+%o4],%f18
1848         ld      [%g1+%o5],%f28
1849         fxors   %f9,%f8,%f9
1851         lda     [%i1]%asi,%f0
1852         fxors   %f29,%f28,%f29
1854         lda     [%i1+4]%asi,%f1
1855         fxors   %f19,%f18,%f19
1857         fors    %f6,%f9,%f6             ! tack on sign
1858         add     %i1,%i2,%i1             ! x += stridex
1859         st      %f6,[%o0]
1861         fors    %f26,%f29,%f26          ! tack on sign
1862         st      %f7,[%o0+4]
1864         fors    %f16,%f19,%f16          ! tack on sign
1865         st      %f26,[%o2]
1867         st      %f27,[%o2+4]
1868         addcc   %i0,-1,%i0
1870         st      %f16,[%o1]
1871         andn    %l0,%i5,%l0             ! hx &= ~0x80000000
1872         bg,pt   %icc,.LOOP0
1874 ! delay slot
1875         st      %f17,[%o1+4]
1877         ba,pt   %icc,.ENDLOOP0
1878 ! delay slot
1879         nop
1881         .align  32
1882 .CASE1:
1883         fpadd32s %f10,%f31,%f18
1884         sethi   %hi(0x3fc3c000),%o7
1885         ld      [%fp+x0_1],%l0
1887         fand    %f8,%f44,%f4
1888         add     %l3,8,%g1
1889         ld      [%fp+x1_1],%l1
1891         fand    %f18,%f44,%f14
1892         sub     %l0,%o7,%l0
1894         fsubd   %f0,%f4,%f0
1895         srl     %l0,10,%l0
1896         sub     %l1,%o7,%l1
1898         fsubd   %f10,%f14,%f10
1899         srl     %l1,10,%l1
1901         fmuld   %f20,%f20,%f20
1902         ldd     [%l5+%o5],%f36
1903         add     %l5,%o5,%l2
1905         faddd   %f0,%f2,%f0
1906         andn    %l0,0x1f,%l0
1908         faddd   %f10,%f12,%f10
1909         andn    %l1,0x1f,%l1
1911         fmuld   %f20,%f36,%f24
1912         ldd     [%l2+0x10],%f26
1913         add     %fp,%o5,%o5
1915         fmuld   %f0,%f0,%f2
1916         add     %l0,%o3,%l0
1918         fmuld   %f10,%f10,%f12
1919         add     %l1,%o4,%l1
1921         faddd   %f24,%f26,%f24
1922         ldd     [%l2+0x20],%f36
1924         fmuld   %f2,%f58,%f6
1925         ldd     [%l3+%l0],%f32
1927         fmuld   %f12,%f58,%f16
1928         ldd     [%l3+%l1],%f34
1930         fmuld   %f20,%f24,%f24
1931         ldd     [%l2+0x30],%f26
1933         faddd   %f6,%f56,%f6
1934         fmuld   %f2,%f62,%f4
1936         faddd   %f16,%f56,%f16
1937         fmuld   %f12,%f62,%f14
1939         faddd   %f24,%f36,%f24
1940         ldd     [%o5+x2_1],%f36
1942         fmuld   %f2,%f6,%f6
1943         faddd   %f4,%f60,%f4
1945         fmuld   %f12,%f16,%f16
1946         faddd   %f14,%f60,%f14
1948         fmuld   %f20,%f24,%f24
1950         faddd   %f6,%f54,%f6
1951         fmuld   %f2,%f4,%f4
1952         ldd     [%g1+%l0],%f2
1954         faddd   %f16,%f54,%f16
1955         fmuld   %f12,%f14,%f14
1956         ldd     [%g1+%l1],%f12
1958         faddd   %f24,%f26,%f24
1960         fmuld   %f0,%f6,%f6
1961         ldd     [%l4+%l0],%f0
1963         fmuld   %f10,%f16,%f16
1964         ldd     [%l4+%l1],%f10
1966         fmuld   %f4,%f32,%f4
1967         std     %f22,[%fp+y2_0]
1969         fmuld   %f14,%f34,%f14
1971         fmuld   %f6,%f2,%f6
1973         fmuld   %f16,%f12,%f16
1975         fmuld   %f20,%f24,%f24
1977         faddd   %f6,%f4,%f6
1979         faddd   %f16,%f14,%f16
1981         fmuld   %f36,%f24,%f24
1982         ldd     [%o5+y2_0],%f22
1984         faddd   %f6,%f0,%f6
1986         faddd   %f16,%f10,%f16
1988         faddd   %f24,%f22,%f24
1990         faddd   %f6,%f32,%f6
1992         faddd   %f16,%f34,%f16
1993         ba,pt   %icc,.FIXSIGN
1995 ! delay slot
1996         faddd   %f36,%f24,%f26
1998         .align  32
1999 .CASE2:
2000         fpadd32s %f0,%f31,%f8
2001         ld      [%fp+x0_1],%l0
2002         andcc   %l2,2,%g0
2003         bne,pn  %icc,.CASE3
2005 ! delay slot
2006         sethi   %hi(0x3fc3c000),%o7
2007         fpadd32s %f20,%f31,%f28
2008         ld      [%fp+x2_1],%l2
2010         fand    %f8,%f44,%f4
2011         sub     %l0,%o7,%l0
2012         add     %l3,8,%g1
2014         fand    %f28,%f44,%f24
2015         sub     %l2,%o7,%l2
2017         fsubd   %f0,%f4,%f0
2018         srl     %l0,10,%l0
2020         fsubd   %f20,%f24,%f20
2021         srl     %l2,10,%l2
2023         fmuld   %f10,%f10,%f10
2024         ldd     [%l5+%o4],%f34
2025         add     %l5,%o4,%l1
2027         faddd   %f0,%f2,%f0
2028         andn    %l0,0x1f,%l0
2030         faddd   %f20,%f22,%f20
2031         andn    %l2,0x1f,%l2
2033         fmuld   %f10,%f34,%f14
2034         ldd     [%l1+0x10],%f16
2035         add     %fp,%o4,%o4
2037         fmuld   %f0,%f0,%f2
2038         add     %l0,%o3,%l0
2040         fmuld   %f20,%f20,%f22
2041         add     %l2,%o5,%l2
2043         faddd   %f14,%f16,%f14
2044         ldd     [%l1+0x20],%f34
2046         fmuld   %f2,%f58,%f6
2047         ldd     [%l3+%l0],%f32
2049         fmuld   %f22,%f58,%f26
2050         ldd     [%l3+%l2],%f36
2052         fmuld   %f10,%f14,%f14
2053         ldd     [%l1+0x30],%f16
2055         faddd   %f6,%f56,%f6
2056         fmuld   %f2,%f62,%f4
2058         faddd   %f26,%f56,%f26
2059         fmuld   %f22,%f62,%f24
2061         faddd   %f14,%f34,%f14
2062         ldd     [%o4+x1_1],%f34
2064         fmuld   %f2,%f6,%f6
2065         faddd   %f4,%f60,%f4
2067         fmuld   %f22,%f26,%f26
2068         faddd   %f24,%f60,%f24
2070         fmuld   %f10,%f14,%f14
2072         faddd   %f6,%f54,%f6
2073         fmuld   %f2,%f4,%f4
2074         ldd     [%g1+%l0],%f2
2076         faddd   %f26,%f54,%f26
2077         fmuld   %f22,%f24,%f24
2078         ldd     [%g1+%l2],%f22
2080         faddd   %f14,%f16,%f14
2082         fmuld   %f0,%f6,%f6
2083         ldd     [%l4+%l0],%f0
2085         fmuld   %f20,%f26,%f26
2086         ldd     [%l4+%l2],%f20
2088         fmuld   %f4,%f32,%f4
2089         std     %f12,[%fp+y1_0]
2091         fmuld   %f24,%f36,%f24
2093         fmuld   %f6,%f2,%f6
2095         fmuld   %f26,%f22,%f26
2097         fmuld   %f10,%f14,%f14
2099         faddd   %f6,%f4,%f6
2101         faddd   %f26,%f24,%f26
2103         fmuld   %f34,%f14,%f14
2104         ldd     [%o4+y1_0],%f12
2106         faddd   %f6,%f0,%f6
2108         faddd   %f26,%f20,%f26
2110         faddd   %f14,%f12,%f14
2112         faddd   %f6,%f32,%f6
2114         faddd   %f26,%f36,%f26
2115         ba,pt   %icc,.FIXSIGN
2117 ! delay slot
2118         faddd   %f34,%f14,%f16
2120         .align  32
2121 .CASE3:
2122         fand    %f8,%f44,%f4
2123         add     %l3,8,%g1
2124         sub     %l0,%o7,%l0
2126         fmuld   %f10,%f10,%f10
2127         ldd     [%l5+%o4],%f34
2128         add     %l5,%o4,%l1
2130         fsubd   %f0,%f4,%f0
2131         srl     %l0,10,%l0
2133         fmuld   %f20,%f20,%f20
2134         ldd     [%l5+%o5],%f36
2135         add     %l5,%o5,%l2
2137         fmuld   %f10,%f34,%f14
2138         ldd     [%l1+0x10],%f16
2139         add     %fp,%o4,%o4
2141         faddd   %f0,%f2,%f0
2142         andn    %l0,0x1f,%l0
2144         fmuld   %f20,%f36,%f24
2145         ldd     [%l2+0x10],%f26
2146         add     %fp,%o5,%o5
2148         faddd   %f14,%f16,%f14
2149         ldd     [%l1+0x20],%f34
2151         fmuld   %f0,%f0,%f2
2152         add     %l0,%o3,%l0
2154         faddd   %f24,%f26,%f24
2155         ldd     [%l2+0x20],%f36
2157         fmuld   %f10,%f14,%f14
2158         ldd     [%l1+0x30],%f16
2160         fmuld   %f2,%f58,%f6
2161         ldd     [%l3+%l0],%f32
2163         fmuld   %f20,%f24,%f24
2164         ldd     [%l2+0x30],%f26
2166         faddd   %f14,%f34,%f14
2167         ldd     [%o4+x1_1],%f34
2169         faddd   %f6,%f56,%f6
2170         fmuld   %f2,%f62,%f4
2172         faddd   %f24,%f36,%f24
2173         ldd     [%o5+x2_1],%f36
2175         fmuld   %f10,%f14,%f14
2176         std     %f12,[%fp+y1_0]
2178         fmuld   %f2,%f6,%f6
2179         faddd   %f4,%f60,%f4
2181         fmuld   %f20,%f24,%f24
2182         std     %f22,[%fp+y2_0]
2184         faddd   %f14,%f16,%f14
2186         faddd   %f6,%f54,%f6
2187         fmuld   %f2,%f4,%f4
2188         ldd     [%g1+%l0],%f2
2190         faddd   %f24,%f26,%f24
2192         fmuld   %f10,%f14,%f14
2194         fmuld   %f0,%f6,%f6
2195         ldd     [%l4+%l0],%f0
2197         fmuld   %f4,%f32,%f4
2199         fmuld   %f20,%f24,%f24
2201         fmuld   %f6,%f2,%f6
2203         fmuld   %f34,%f14,%f14
2204         ldd     [%o4+y1_0],%f12
2206         fmuld   %f36,%f24,%f24
2207         ldd     [%o5+y2_0],%f22
2209         faddd   %f6,%f4,%f6
2211         faddd   %f14,%f12,%f14
2213         faddd   %f24,%f22,%f24
2215         faddd   %f6,%f0,%f6
2217         faddd   %f34,%f14,%f16
2219         faddd   %f36,%f24,%f26
2220         ba,pt   %icc,.FIXSIGN
2222 ! delay slot
2223         faddd   %f6,%f32,%f6
2225         .align  32
2226 .CASE4:
2227         fands   %f29,%f28,%f29          ! if (n & 1) clear sign bit
2228         sethi   %hi(0x3fc3c000),%o7
2229         andcc   %l1,2,%g0
2230         bne,pn  %icc,.CASE6
2232 ! delay slot
2233         andcc   %l2,2,%g0
2234         fpadd32s %f10,%f31,%f18
2235         ld      [%fp+x1_1],%l1
2236         bne,pn  %icc,.CASE5
2238 ! delay slot
2239         add     %l3,8,%g1
2240         ld      [%fp+x2_1],%l2
2241         fpadd32s %f20,%f31,%f28
2243         fand    %f18,%f44,%f14
2244         sub     %l1,%o7,%l1
2246         fand    %f28,%f44,%f24
2247         sub     %l2,%o7,%l2
2249         fsubd   %f10,%f14,%f10
2250         srl     %l1,10,%l1
2252         fsubd   %f20,%f24,%f20
2253         srl     %l2,10,%l2
2255         fmuld   %f0,%f0,%f0
2256         ldd     [%l5+%o3],%f32
2257         add     %l5,%o3,%l0
2259         faddd   %f10,%f12,%f10
2260         andn    %l1,0x1f,%l1
2262         faddd   %f20,%f22,%f20
2263         andn    %l2,0x1f,%l2
2265         fmuld   %f0,%f32,%f4
2266         ldd     [%l0+0x10],%f6
2267         add     %fp,%o3,%o3
2269         fmuld   %f10,%f10,%f12
2270         add     %l1,%o4,%l1
2272         fmuld   %f20,%f20,%f22
2273         add     %l2,%o5,%l2
2275         faddd   %f4,%f6,%f4
2276         ldd     [%l0+0x20],%f32
2278         fmuld   %f12,%f58,%f16
2279         ldd     [%l3+%l1],%f34
2281         fmuld   %f22,%f58,%f26
2282         ldd     [%l3+%l2],%f36
2284         fmuld   %f0,%f4,%f4
2285         ldd     [%l0+0x30],%f6
2287         faddd   %f16,%f56,%f16
2288         fmuld   %f12,%f62,%f14
2290         faddd   %f26,%f56,%f26
2291         fmuld   %f22,%f62,%f24
2293         faddd   %f4,%f32,%f4
2294         ldd     [%o3+x0_1],%f32
2296         fmuld   %f12,%f16,%f16
2297         faddd   %f14,%f60,%f14
2299         fmuld   %f22,%f26,%f26
2300         faddd   %f24,%f60,%f24
2302         fmuld   %f0,%f4,%f4
2304         faddd   %f16,%f54,%f16
2305         fmuld   %f12,%f14,%f14
2306         ldd     [%g1+%l1],%f12
2308         faddd   %f26,%f54,%f26
2309         fmuld   %f22,%f24,%f24
2310         ldd     [%g1+%l2],%f22
2312         faddd   %f4,%f6,%f4
2314         fmuld   %f10,%f16,%f16
2315         ldd     [%l4+%l1],%f10
2317         fmuld   %f20,%f26,%f26
2318         ldd     [%l4+%l2],%f20
2320         fmuld   %f14,%f34,%f14
2321         std     %f2,[%fp+y0_0]
2323         fmuld   %f24,%f36,%f24
2325         fmuld   %f0,%f4,%f4
2327         fmuld   %f16,%f12,%f16
2329         fmuld   %f26,%f22,%f26
2331         fmuld   %f32,%f4,%f4
2332         ldd     [%o3+y0_0],%f2
2334         faddd   %f16,%f14,%f16
2336         faddd   %f26,%f24,%f26
2338         faddd   %f4,%f2,%f4
2340         faddd   %f16,%f10,%f16
2342         faddd   %f26,%f20,%f26
2344         faddd   %f32,%f4,%f6
2346         faddd   %f16,%f34,%f16
2347         ba,pt   %icc,.FIXSIGN
2349 ! delay slot
2350         faddd   %f26,%f36,%f26
2352         .align  32
2353 .CASE5:
2354         fand    %f18,%f44,%f14
2355         sub     %l1,%o7,%l1
2357         fmuld   %f0,%f0,%f0
2358         ldd     [%l5+%o3],%f32
2359         add     %l5,%o3,%l0
2361         fsubd   %f10,%f14,%f10
2362         srl     %l1,10,%l1
2364         fmuld   %f20,%f20,%f20
2365         ldd     [%l5+%o5],%f36
2366         add     %l5,%o5,%l2
2368         fmuld   %f0,%f32,%f4
2369         ldd     [%l0+0x10],%f6
2370         add     %fp,%o3,%o3
2372         faddd   %f10,%f12,%f10
2373         andn    %l1,0x1f,%l1
2375         fmuld   %f20,%f36,%f24
2376         ldd     [%l2+0x10],%f26
2377         add     %fp,%o5,%o5
2379         faddd   %f4,%f6,%f4
2380         ldd     [%l0+0x20],%f32
2382         fmuld   %f10,%f10,%f12
2383         add     %l1,%o4,%l1
2385         faddd   %f24,%f26,%f24
2386         ldd     [%l2+0x20],%f36
2388         fmuld   %f0,%f4,%f4
2389         ldd     [%l0+0x30],%f6
2391         fmuld   %f12,%f58,%f16
2392         ldd     [%l3+%l1],%f34
2394         fmuld   %f20,%f24,%f24
2395         ldd     [%l2+0x30],%f26
2397         faddd   %f4,%f32,%f4
2398         ldd     [%o3+x0_1],%f32
2400         faddd   %f16,%f56,%f16
2401         fmuld   %f12,%f62,%f14
2403         faddd   %f24,%f36,%f24
2404         ldd     [%o5+x2_1],%f36
2406         fmuld   %f0,%f4,%f4
2407         std     %f2,[%fp+y0_0]
2409         fmuld   %f12,%f16,%f16
2410         faddd   %f14,%f60,%f14
2412         fmuld   %f20,%f24,%f24
2413         std     %f22,[%fp+y2_0]
2415         faddd   %f4,%f6,%f4
2417         faddd   %f16,%f54,%f16
2418         fmuld   %f12,%f14,%f14
2419         ldd     [%g1+%l1],%f12
2421         faddd   %f24,%f26,%f24
2423         fmuld   %f0,%f4,%f4
2425         fmuld   %f10,%f16,%f16
2426         ldd     [%l4+%l1],%f10
2428         fmuld   %f14,%f34,%f14
2430         fmuld   %f20,%f24,%f24
2432         fmuld   %f16,%f12,%f16
2434         fmuld   %f32,%f4,%f4
2435         ldd     [%o3+y0_0],%f2
2437         fmuld   %f36,%f24,%f24
2438         ldd     [%o5+y2_0],%f22
2440         faddd   %f16,%f14,%f16
2442         faddd   %f4,%f2,%f4
2444         faddd   %f24,%f22,%f24
2446         faddd   %f16,%f10,%f16
2448         faddd   %f32,%f4,%f6
2450         faddd   %f36,%f24,%f26
2451         ba,pt   %icc,.FIXSIGN
2453 ! delay slot
2454         faddd   %f16,%f34,%f16
2456         .align  32
2457 .CASE6:
2458         ld      [%fp+x2_1],%l2
2459         add     %l3,8,%g1
2460         bne,pn  %icc,.CASE7
2461 ! delay slot
2462         fpadd32s %f20,%f31,%f28
2464         fand    %f28,%f44,%f24
2465         ldd     [%l5+%o3],%f32
2466         add     %l5,%o3,%l0
2468         fmuld   %f0,%f0,%f0
2469         sub     %l2,%o7,%l2
2471         fsubd   %f20,%f24,%f20
2472         srl     %l2,10,%l2
2474         fmuld   %f10,%f10,%f10
2475         ldd     [%l5+%o4],%f34
2476         add     %l5,%o4,%l1
2478         fmuld   %f0,%f32,%f4
2479         ldd     [%l0+0x10],%f6
2480         add     %fp,%o3,%o3
2482         faddd   %f20,%f22,%f20
2483         andn    %l2,0x1f,%l2
2485         fmuld   %f10,%f34,%f14
2486         ldd     [%l1+0x10],%f16
2487         add     %fp,%o4,%o4
2489         faddd   %f4,%f6,%f4
2490         ldd     [%l0+0x20],%f32
2492         fmuld   %f20,%f20,%f22
2493         add     %l2,%o5,%l2
2495         faddd   %f14,%f16,%f14
2496         ldd     [%l1+0x20],%f34
2498         fmuld   %f0,%f4,%f4
2499         ldd     [%l0+0x30],%f6
2501         fmuld   %f22,%f58,%f26
2502         ldd     [%l3+%l2],%f36
2504         fmuld   %f10,%f14,%f14
2505         ldd     [%l1+0x30],%f16
2507         faddd   %f4,%f32,%f4
2508         ldd     [%o3+x0_1],%f32
2510         faddd   %f26,%f56,%f26
2511         fmuld   %f22,%f62,%f24
2513         faddd   %f14,%f34,%f14
2514         ldd     [%o4+x1_1],%f34
2516         fmuld   %f0,%f4,%f4
2517         std     %f2,[%fp+y0_0]
2519         fmuld   %f22,%f26,%f26
2520         faddd   %f24,%f60,%f24
2522         fmuld   %f10,%f14,%f14
2523         std     %f12,[%fp+y1_0]
2525         faddd   %f4,%f6,%f4
2527         faddd   %f26,%f54,%f26
2528         fmuld   %f22,%f24,%f24
2529         ldd     [%g1+%l2],%f22
2531         faddd   %f14,%f16,%f14
2533         fmuld   %f0,%f4,%f4
2535         fmuld   %f20,%f26,%f26
2536         ldd     [%l4+%l2],%f20
2538         fmuld   %f24,%f36,%f24
2540         fmuld   %f10,%f14,%f14
2542         fmuld   %f26,%f22,%f26
2544         fmuld   %f32,%f4,%f4
2545         ldd     [%o3+y0_0],%f2
2547         fmuld   %f34,%f14,%f14
2548         ldd     [%o4+y1_0],%f12
2550         faddd   %f26,%f24,%f26
2552         faddd   %f4,%f2,%f4
2554         faddd   %f14,%f12,%f14
2556         faddd   %f26,%f20,%f26
2558         faddd   %f32,%f4,%f6
2560         faddd   %f34,%f14,%f16
2561         ba,pt   %icc,.FIXSIGN
2563 ! delay slot
2564         faddd   %f26,%f36,%f26
2566         .align  32
2567 .CASE7:
2568         fmuld   %f0,%f0,%f0
2569         ldd     [%l5+%o3],%f32
2570         add     %l5,%o3,%l0
2572         fmuld   %f10,%f10,%f10
2573         ldd     [%l5+%o4],%f34
2574         add     %l5,%o4,%l1
2576         fmuld   %f20,%f20,%f20
2577         ldd     [%l5+%o5],%f36
2578         add     %l5,%o5,%l2
2580         fmuld   %f0,%f32,%f4
2581         ldd     [%l0+0x10],%f6
2582         add     %fp,%o3,%o3
2584         fmuld   %f10,%f34,%f14
2585         ldd     [%l1+0x10],%f16
2586         add     %fp,%o4,%o4
2588         fmuld   %f20,%f36,%f24
2589         ldd     [%l2+0x10],%f26
2590         add     %fp,%o5,%o5
2592         faddd   %f4,%f6,%f4
2593         ldd     [%l0+0x20],%f32
2595         faddd   %f14,%f16,%f14
2596         ldd     [%l1+0x20],%f34
2598         faddd   %f24,%f26,%f24
2599         ldd     [%l2+0x20],%f36
2601         fmuld   %f0,%f4,%f4
2602         ldd     [%l0+0x30],%f6
2604         fmuld   %f10,%f14,%f14
2605         ldd     [%l1+0x30],%f16
2607         fmuld   %f20,%f24,%f24
2608         ldd     [%l2+0x30],%f26
2610         faddd   %f4,%f32,%f4
2611         ldd     [%o3+x0_1],%f32
2613         faddd   %f14,%f34,%f14
2614         ldd     [%o4+x1_1],%f34
2616         faddd   %f24,%f36,%f24
2617         ldd     [%o5+x2_1],%f36
2619         fmuld   %f0,%f4,%f4
2620         std     %f2,[%fp+y0_0]
2622         fmuld   %f10,%f14,%f14
2623         std     %f12,[%fp+y1_0]
2625         fmuld   %f20,%f24,%f24
2626         std     %f22,[%fp+y2_0]
2628         faddd   %f4,%f6,%f4
2630         faddd   %f14,%f16,%f14
2632         faddd   %f24,%f26,%f24
2634         fmuld   %f0,%f4,%f4
2636         fmuld   %f10,%f14,%f14
2638         fmuld   %f20,%f24,%f24
2640         fmuld   %f32,%f4,%f4
2641         ldd     [%o3+y0_0],%f2
2643         fmuld   %f34,%f14,%f14
2644         ldd     [%o4+y1_0],%f12
2646         fmuld   %f36,%f24,%f24
2647         ldd     [%o5+y2_0],%f22
2649         faddd   %f4,%f2,%f4
2651         faddd   %f14,%f12,%f14
2653         faddd   %f24,%f22,%f24
2655         faddd   %f32,%f4,%f6
2657         faddd   %f34,%f14,%f16
2658         ba,pt   %icc,.FIXSIGN
2660 ! delay slot
2661         faddd   %f36,%f24,%f26
2664         .align  32
2665 .ENDLOOP2:
2666         fmuld   %f10,%f40,%f12
2667         add     %l5,thresh,%g1
2668         faddd   %f12,%f42,%f12
2669         st      %f13,[%fp+n1]
2670         fsubd   %f12,%f42,%f12          ! n
2671         fmuld   %f12,%f46,%f14
2672         fsubd   %f10,%f14,%f14
2673         fmuld   %f12,%f48,%f16
2674         fsubd   %f14,%f16,%f10
2675         ld      [%fp+n1],%o4
2676         fsubd   %f14,%f10,%f34
2677         and     %o4,1,%o4
2678         fsubd   %f34,%f16,%f34
2679         fmuld   %f12,%f50,%f18
2680         sll     %o4,3,%o4
2681         fsubd   %f18,%f34,%f18
2682         ld      [%g1+%o4],%f16
2683         fsubd   %f10,%f18,%f14
2684         fsubd   %f10,%f14,%f34
2685         add     %l5,thresh+4,%o7
2686         fsubd   %f34,%f18,%f34
2687         fmuld   %f12,%f52,%f12
2688         fsubd   %f12,%f34,%f12
2689         ld      [%o7+%o4],%f18
2690         fsubd   %f14,%f12,%f10          ! x
2691         fsubd   %f14,%f10,%f14
2692         fands   %f10,%f30,%f19          ! save signbit
2693         fabsd   %f10,%f10
2694         std     %f10,[%fp+x1_1]
2695         fsubd   %f14,%f12,%f12          ! y
2696         fcmpgt32 %f16,%f10,%l1
2697         fxors   %f12,%f19,%f12
2698         fands   %f19,%f18,%f19          ! if (n & 1) clear sign bit
2699         andcc   %l1,2,%g0
2700         bne,pn  %icc,1f
2701 ! delay slot
2702         nop
2703         fpadd32s %f10,%f31,%f18
2704         ld      [%fp+x1_1],%l1
2705         fand    %f18,%f44,%f14
2706         sethi   %hi(0x3fc3c000),%o7
2707         add     %l3,8,%g1
2708         fsubd   %f10,%f14,%f10
2709         sub     %l1,%o7,%l1
2710         srl     %l1,10,%l1
2711         faddd   %f10,%f12,%f10
2712         andn    %l1,0x1f,%l1
2713         fmuld   %f10,%f10,%f12
2714         add     %l1,%o4,%l1
2715         fmuld   %f12,%f58,%f16
2716         ldd     [%l3+%l1],%f34
2717         faddd   %f16,%f56,%f16
2718         fmuld   %f12,%f62,%f14
2719         fmuld   %f12,%f16,%f16
2720         faddd   %f14,%f60,%f14
2721         faddd   %f16,%f54,%f16
2722         fmuld   %f12,%f14,%f14
2723         ldd     [%g1+%l1],%f12
2724         fmuld   %f10,%f16,%f16
2725         ldd     [%l4+%l1],%f10
2726         fmuld   %f14,%f34,%f14
2727         fmuld   %f16,%f12,%f16
2728         faddd   %f16,%f14,%f16
2729         faddd   %f16,%f10,%f16
2730         ba,pt   %icc,2f
2731         faddd   %f16,%f34,%f16
2733         fmuld   %f10,%f10,%f10
2734         ldd     [%l5+%o4],%f34
2735         add     %l5,%o4,%l1
2736         fmuld   %f10,%f34,%f14
2737         ldd     [%l1+0x10],%f16
2738         add     %fp,%o4,%o4
2739         faddd   %f14,%f16,%f14
2740         ldd     [%l1+0x20],%f34
2741         fmuld   %f10,%f14,%f14
2742         ldd     [%l1+0x30],%f16
2743         faddd   %f14,%f34,%f14
2744         ldd     [%o4+x1_1],%f34
2745         fmuld   %f10,%f14,%f14
2746         std     %f12,[%fp+y1_0]
2747         faddd   %f14,%f16,%f14
2748         fmuld   %f10,%f14,%f14
2749         fmuld   %f34,%f14,%f14
2750         ldd     [%o4+y1_0],%f12
2751         faddd   %f14,%f12,%f14
2752         faddd   %f34,%f14,%f16
2754         add     %l5,thresh-4,%g1
2755         ld      [%fp+n1],%o4
2756         and     %o4,2,%o4
2757         sll     %o4,2,%o4
2758         ld      [%g1+%o4],%f18
2759         fxors   %f19,%f18,%f19
2760         fors    %f16,%f19,%f16          ! tack on sign
2761         st      %f16,[%o1]
2762         st      %f17,[%o1+4]
2764 .ENDLOOP1:
2765         fmuld   %f0,%f40,%f2
2766         add     %l5,thresh,%g1
2767         faddd   %f2,%f42,%f2
2768         st      %f3,[%fp+n0]
2769         fsubd   %f2,%f42,%f2            ! n
2770         fmuld   %f2,%f46,%f4
2771         fsubd   %f0,%f4,%f4
2772         fmuld   %f2,%f48,%f6
2773         fsubd   %f4,%f6,%f0
2774         ld      [%fp+n0],%o3
2775         fsubd   %f4,%f0,%f32
2776         and     %o3,1,%o3
2777         fsubd   %f32,%f6,%f32
2778         fmuld   %f2,%f50,%f8
2779         sll     %o3,3,%o3
2780         fsubd   %f8,%f32,%f8
2781         ld      [%g1+%o3],%f6
2782         fsubd   %f0,%f8,%f4
2783         fsubd   %f0,%f4,%f32
2784         add     %l5,thresh+4,%o7
2785         fsubd   %f32,%f8,%f32
2786         fmuld   %f2,%f52,%f2
2787         fsubd   %f2,%f32,%f2
2788         ld      [%o7+%o3],%f8
2789         fsubd   %f4,%f2,%f0             ! x
2790         fsubd   %f4,%f0,%f4
2791         fands   %f0,%f30,%f9            ! save signbit
2792         fabsd   %f0,%f0
2793         std     %f0,[%fp+x0_1]
2794         fsubd   %f4,%f2,%f2             ! y
2795         fcmpgt32 %f6,%f0,%l0
2796         fxors   %f2,%f9,%f2
2797         fands   %f9,%f8,%f9             ! if (n & 1) clear sign bit
2798         andcc   %l0,2,%g0
2799         bne,pn  %icc,1f
2800 ! delay slot
2801         nop
2802         fpadd32s %f0,%f31,%f8
2803         ld      [%fp+x0_1],%l0
2804         fand    %f8,%f44,%f4
2805         sethi   %hi(0x3fc3c000),%o7
2806         add     %l3,8,%g1
2807         fsubd   %f0,%f4,%f0
2808         sub     %l0,%o7,%l0
2809         srl     %l0,10,%l0
2810         faddd   %f0,%f2,%f0
2811         andn    %l0,0x1f,%l0
2812         fmuld   %f0,%f0,%f2
2813         add     %l0,%o3,%l0
2814         fmuld   %f2,%f58,%f6
2815         ldd     [%l3+%l0],%f32
2816         faddd   %f6,%f56,%f6
2817         fmuld   %f2,%f62,%f4
2818         fmuld   %f2,%f6,%f6
2819         faddd   %f4,%f60,%f4
2820         faddd   %f6,%f54,%f6
2821         fmuld   %f2,%f4,%f4
2822         ldd     [%g1+%l0],%f2
2823         fmuld   %f0,%f6,%f6
2824         ldd     [%l4+%l0],%f0
2825         fmuld   %f4,%f32,%f4
2826         fmuld   %f6,%f2,%f6
2827         faddd   %f6,%f4,%f6
2828         faddd   %f6,%f0,%f6
2829         ba,pt   %icc,2f
2830         faddd   %f6,%f32,%f6
2832         fmuld   %f0,%f0,%f0
2833         ldd     [%l5+%o3],%f32
2834         add     %l5,%o3,%l0
2835         fmuld   %f0,%f32,%f4
2836         ldd     [%l0+0x10],%f6
2837         add     %fp,%o3,%o3
2838         faddd   %f4,%f6,%f4
2839         ldd     [%l0+0x20],%f32
2840         fmuld   %f0,%f4,%f4
2841         ldd     [%l0+0x30],%f6
2842         faddd   %f4,%f32,%f4
2843         ldd     [%o3+x0_1],%f32
2844         fmuld   %f0,%f4,%f4
2845         std     %f2,[%fp+y0_0]
2846         faddd   %f4,%f6,%f4
2847         fmuld   %f0,%f4,%f4
2848         fmuld   %f32,%f4,%f4
2849         ldd     [%o3+y0_0],%f2
2850         faddd   %f4,%f2,%f4
2851         faddd   %f32,%f4,%f6
2853         add     %l5,thresh-4,%g1
2854         ld      [%fp+n0],%o3
2855         and     %o3,2,%o3
2856         sll     %o3,2,%o3
2857         ld      [%g1+%o3],%f8
2858         fxors   %f9,%f8,%f9
2859         fors    %f6,%f9,%f6             ! tack on sign
2860         st      %f6,[%o0]
2861         st      %f7,[%o0+4]
2863 .ENDLOOP0:
2865 ! check for huge arguments remaining
2867         tst     LIM_l6
2868         be,pt   %icc,.exit
2869 ! delay slot
2870         nop
2872 ! ========== huge range (use C code) ==========
2874 #ifdef __sparcv9
2875         ldx     [%fp+xsave],%o1
2876         ldx     [%fp+ysave],%o3
2877 #else
2878         ld      [%fp+xsave],%o1
2879         ld      [%fp+ysave],%o3
2880 #endif
2881         ld      [%fp+nsave],%o0
2882         ld      [%fp+sxsave],%o2
2883         ld      [%fp+sysave],%o4
2884         sra     %o2,0,%o2               ! sign-extend for V9
2885         sra     %o4,0,%o4
2886         call    __vlibm_vsin_big
2887         mov     %l7,%o5                 ! delay slot
2889 .exit:
2890         ret
2891         restore
2894         .align  32
2895 .SKIP0:
2896         addcc   %i0,-1,%i0
2897         ble,pn  %icc,.ENDLOOP0
2898 ! delay slot, harmless if branch taken
2899         add     %i3,%i4,%i3             ! y += stridey
2900         andn    %l1,%i5,%l0             ! hx &= ~0x80000000
2901         fmovs   %f10,%f0
2902         ld      [%i1+4],%f1
2903         ba,pt   %icc,.LOOP0
2904 ! delay slot
2905         add     %i1,%i2,%i1             ! x += stridex
2908         .align  32
2909 .SKIP1:
2910         addcc   %i0,-1,%i0
2911         ble,pn  %icc,.ENDLOOP1
2912 ! delay slot, harmless if branch taken
2913         add     %i3,%i4,%i3             ! y += stridey
2914         andn    %l2,%i5,%l1             ! hx &= ~0x80000000
2915         fmovs   %f20,%f10
2916         ld      [%i1+4],%f11
2917         ba,pt   %icc,.LOOP1
2918 ! delay slot
2919         add     %i1,%i2,%i1             ! x += stridex
2922         .align  32
2923 .SKIP2:
2924         addcc   %i0,-1,%i0
2925         ble,pn  %icc,.ENDLOOP2
2926 ! delay slot, harmless if branch taken
2927         add     %i3,%i4,%i3             ! y += stridey
2928         ld      [%i1],%l2
2929         ld      [%i1],%f20
2930         ld      [%i1+4],%f21
2931         andn    %l2,%i5,%l2             ! hx &= ~0x80000000
2932         ba,pt   %icc,.LOOP2
2933 ! delay slot
2934         add     %i1,%i2,%i1             ! x += stridex
2937         .align  32
2938 .BIG0:
2939         sethi   %hi(0x7ff00000),%o7
2940         cmp     %l0,%o7
2941         bl,a,pt %icc,1f                 ! if hx < 0x7ff00000
2942 ! delay slot, annulled if branch not taken
2943         mov     %l7,LIM_l6              ! set biguns flag or
2944         fsubd   %f0,%f0,%f0             ! y = x - x
2945         st      %f0,[%o0]
2946         st      %f1,[%o0+4]
2948         addcc   %i0,-1,%i0
2949         ble,pn  %icc,.ENDLOOP0
2950 ! delay slot, harmless if branch taken
2951         andn    %l1,%i5,%l0             ! hx &= ~0x80000000
2952         fmovd   %f10,%f0
2953         ba,pt   %icc,.LOOP0
2954 ! delay slot
2955         add     %i1,%i2,%i1             ! x += stridex
2958         .align  32
2959 .BIG1:
2960         sethi   %hi(0x7ff00000),%o7
2961         cmp     %l1,%o7
2962         bl,a,pt %icc,1f                 ! if hx < 0x7ff00000
2963 ! delay slot, annulled if branch not taken
2964         mov     %l7,LIM_l6              ! set biguns flag or
2965         fsubd   %f10,%f10,%f10          ! y = x - x
2966         st      %f10,[%o1]
2967         st      %f11,[%o1+4]
2969         addcc   %i0,-1,%i0
2970         ble,pn  %icc,.ENDLOOP1
2971 ! delay slot, harmless if branch taken
2972         andn    %l2,%i5,%l1             ! hx &= ~0x80000000
2973         fmovd   %f20,%f10
2974         ba,pt   %icc,.LOOP1
2975 ! delay slot
2976         add     %i1,%i2,%i1             ! x += stridex
2979         .align  32
2980 .BIG2:
2981         sethi   %hi(0x7ff00000),%o7
2982         cmp     %l2,%o7
2983         bl,a,pt %icc,1f                 ! if hx < 0x7ff00000
2984 ! delay slot, annulled if branch not taken
2985         mov     %l7,LIM_l6              ! set biguns flag or
2986         fsubd   %f20,%f20,%f20          ! y = x - x
2987         st      %f20,[%o2]
2988         st      %f21,[%o2+4]
2990         addcc   %i0,-1,%i0
2991         ble,pn  %icc,.ENDLOOP2
2992 ! delay slot
2993         nop
2994         ld      [%i1],%l2
2995         ld      [%i1],%f20
2996         ld      [%i1+4],%f21
2997         andn    %l2,%i5,%l2             ! hx &= ~0x80000000
2998         ba,pt   %icc,.LOOP2
2999 ! delay slot
3000         add     %i1,%i2,%i1             ! x += stridex
3002         SET_SIZE(__vsin)