Add P4 Northwood. (Roman Shiryaev <mih_val@mail.ru>; See <200308250434.38516.mih_val...
[mplayer/greg.git] / mp3lib / dct64_sse.s
blob3bc74cc8c03ede768a906d4a3f96182c9b1fb615
1 / This code is a translation of dct64_k7.s from MPlayer.
2 / Coded by Felix Buenemann <atmosfear at users.sourceforge.net>
4 / TODO: - fix phases 4 and 5 (sse)
5 / - optimize scalar FPU code? (interleave with sse code)
6 / - fix alignment (prohibits finishing this code)
7 / - then use faster insns for aligned data
9 / Note: currently code is disabled as I couldn't get input data aligned!
12 //.data
13 // .align 8
14 //x_plus_minus_3dnow: .long 0x00000000, 0x80000000
15 //plus_1f: .float 1.0
17 .text
19 .align 16
21 .global dct64_MMX_sse
23 dct64_MMX_sse:
24 pushl %ebx
25 pushl %esi
26 pushl %edi
27 subl $256,%esp
28 movl 280(%esp),%eax
30 leal 128(%esp),%edx
31 movl 272(%esp),%esi
32 movl 276(%esp),%edi
33 movl $costab_mmx,%ebx
34 orl %ecx,%ecx
35 movl %esp,%ecx
37 /* Phase 1 (complete, worx) */
39 // [1] Process Block A1 (16 Bytes)
40 / movq (%eax), %mm0
41 / movq 8(%eax), %mm4
42 movups (%eax), %xmm0
44 // Copy A1 to another register A2
45 / movq %mm0, %mm3
46 / movq %mm4, %mm7
47 movaps %xmm0, %xmm2
49 // Process Block B1 (last 16 bytes)
50 / movq 120(%eax), %mm1
51 / movq 112(%eax), %mm5
52 movups 112(%eax), %xmm1
54 /* The PSWAPD instruction swaps or reverses the upper and lower
55 * doublewords of the source operand. PSWAPD mmreg1, mmreg2
56 * performs the following operations:
57 * temp = mmreg2
58 * mmreg1[63:32] = temp[31:0 ]
59 * mmreg1[31:0 ] = temp[63:32]
61 / pswapd %mm1, %mm1
62 / pswapd %mm5, %mm5
63 // shufps here exchanges a,b,c,d to b,a,d,c in xmm1 (desc ia32-ref p.752)
64 //// shufps $177, %xmm1, %xmm1
65 shufps $27, %xmm1, %xmm1
67 // Add B1 to A1
68 / pfadd %mm1, %mm0
69 / pfadd %mm5, %mm4
70 addps %xmm1, %xmm0
72 // Save Block A1
73 / movq %mm0, (%edx)
74 / movq %mm4, 8(%edx)
75 movups %xmm0, (%edx)
77 // Sub B1 from A2
78 / pfsub %mm1, %mm3
79 / pfsub %mm5, %mm7
80 subps %xmm1, %xmm2
82 // Mul mem with A2
83 / pfmul (%ebx), %mm3
84 / pfmul 8(%ebx), %mm7
85 movups (%ebx), %xmm7
86 mulps %xmm7, %xmm2
88 // Shuffle A2
89 / pswapd %mm3, %mm3
90 / pswapd %mm7, %mm7
91 // I do a,b,c,d -> d,c,b,a to suit order when writing to mem (saves one shufps)
92 shufps $27, %xmm2, %xmm2
94 // Save A2 to mem (end)
95 / movq %mm3, 120(%edx)
96 / movq %mm7, 112(%edx)
97 movups %xmm2, 112(%edx)
99 // [2] Process next data block
100 / movq 16(%eax), %mm0
101 / movq 24(%eax), %mm4
102 movups 16(%eax), %xmm0
104 / movq %mm0, %mm3
105 / movq %mm4, %mm7
106 movaps %xmm0, %xmm2
108 / movq 104(%eax), %mm1
109 / movq 96(%eax), %mm5
110 movups 96(%eax), %xmm1
112 / pswapd %mm1, %mm1
113 / pswapd %mm5, %mm5
114 //// shufps $177, %xmm1, %xmm1
115 shufps $27, %xmm1, %xmm1
117 / pfadd %mm1, %mm0
118 / pfadd %mm5, %mm4
119 addps %xmm1, %xmm0
121 / movq %mm0, 16(%edx)
122 / movq %mm4, 24(%edx)
123 movups %xmm0, 16(%edx)
125 / pfsub %mm1, %mm3
126 / pfsub %mm5, %mm7
127 subps %xmm1, %xmm2
129 / pfmul 16(%ebx), %mm3
130 / pfmul 24(%ebx), %mm7
131 movups 16(%ebx), %xmm7
132 mulps %xmm7, %xmm2
134 / pswapd %mm3, %mm3
135 / pswapd %mm7, %mm7
136 shufps $27, %xmm2, %xmm2
138 / movq %mm3, 104(%edx)
139 / movq %mm7, 96(%edx)
140 movups %xmm2, 96(%edx)
142 // [3]
143 / movq 32(%eax), %mm0
144 / movq 40(%eax), %mm4
145 movups 32(%eax), %xmm0
147 / movq %mm0, %mm3
148 / movq %mm4, %mm7
149 movaps %xmm0, %xmm2
151 / movq 88(%eax), %mm1
152 / movq 80(%eax), %mm5
153 movups 80(%eax), %xmm1
155 / pswapd %mm1, %mm1
156 / pswapd %mm5, %mm5
157 //// shufps $177, %xmm1, %xmm1
158 shufps $27, %xmm1, %xmm1
160 / pfadd %mm1, %mm0
161 / pfadd %mm5, %mm4
162 addps %xmm1, %xmm0
164 / movq %mm0, 32(%edx)
165 / movq %mm4, 40(%edx)
166 movups %xmm0, 32(%edx)
168 / pfsub %mm1, %mm3
169 / pfsub %mm5, %mm7
170 subps %xmm1, %xmm2
172 / pfmul 32(%ebx), %mm3
173 / pfmul 40(%ebx), %mm7
174 movups 32(%ebx), %xmm7
175 mulps %xmm7, %xmm2
177 / pswapd %mm3, %mm3
178 / pswapd %mm7, %mm7
179 shufps $27, %xmm2, %xmm2
181 / movq %mm3, 88(%edx)
182 / movq %mm7, 80(%edx)
183 movups %xmm2, 80(%edx)
185 // [4]
186 / movq 48(%eax), %mm0
187 / movq 56(%eax), %mm4
188 movups 48(%eax), %xmm0
190 / movq %mm0, %mm3
191 / movq %mm4, %mm7
192 movaps %xmm0, %xmm2
194 / movq 72(%eax), %mm1
195 / movq 64(%eax), %mm5
196 movups 64(%eax), %xmm1
198 / pswapd %mm1, %mm1
199 / pswapd %mm5, %mm5
200 //// shufps $177, %xmm1, %xmm1
201 shufps $27, %xmm1, %xmm1
203 / pfadd %mm1, %mm0
204 / pfadd %mm5, %mm4
205 addps %xmm1, %xmm0
207 / movq %mm0, 48(%edx)
208 / movq %mm4, 56(%edx)
209 movups %xmm0, 48(%edx)
211 / pfsub %mm1, %mm3
212 / pfsub %mm5, %mm7
213 subps %xmm1, %xmm2
215 / pfmul 48(%ebx), %mm3
216 / pfmul 56(%ebx), %mm7
217 movups 48(%ebx), %xmm7
218 mulps %xmm7, %xmm2
220 / pswapd %mm3, %mm3
221 / pswapd %mm7, %mm7
222 shufps $27, %xmm2, %xmm2
224 / movq %mm3, 72(%edx)
225 / movq %mm7, 64(%edx)
226 movups %xmm2, 64(%edx)
229 // phase 1 fpu code
230 /* Phase 1*/
232 flds (%eax)
233 leal 128(%esp),%edx
234 fadds 124(%eax)
235 movl 272(%esp),%esi
236 fstps (%edx)
237 movl 276(%esp),%edi
239 flds 4(%eax)
240 movl $costab_mmx,%ebx
241 fadds 120(%eax)
242 orl %ecx,%ecx
243 fstps 4(%edx)
245 flds (%eax)
246 movl %esp,%ecx
247 fsubs 124(%eax)
248 fmuls (%ebx)
249 fstps 124(%edx)
251 flds 4(%eax)
252 fsubs 120(%eax)
253 fmuls 4(%ebx)
254 fstps 120(%edx)
256 flds 8(%eax)
257 fadds 116(%eax)
258 fstps 8(%edx)
260 flds 12(%eax)
261 fadds 112(%eax)
262 fstps 12(%edx)
264 flds 8(%eax)
265 fsubs 116(%eax)
266 fmuls 8(%ebx)
267 fstps 116(%edx)
269 flds 12(%eax)
270 fsubs 112(%eax)
271 fmuls 12(%ebx)
272 fstps 112(%edx)
274 flds 16(%eax)
275 fadds 108(%eax)
276 fstps 16(%edx)
278 flds 20(%eax)
279 fadds 104(%eax)
280 fstps 20(%edx)
282 flds 16(%eax)
283 fsubs 108(%eax)
284 fmuls 16(%ebx)
285 fstps 108(%edx)
287 flds 20(%eax)
288 fsubs 104(%eax)
289 fmuls 20(%ebx)
290 fstps 104(%edx)
292 flds 24(%eax)
293 fadds 100(%eax)
294 fstps 24(%edx)
296 flds 28(%eax)
297 fadds 96(%eax)
298 fstps 28(%edx)
300 flds 24(%eax)
301 fsubs 100(%eax)
302 fmuls 24(%ebx)
303 fstps 100(%edx)
305 flds 28(%eax)
306 fsubs 96(%eax)
307 fmuls 28(%ebx)
308 fstps 96(%edx)
310 flds 32(%eax)
311 fadds 92(%eax)
312 fstps 32(%edx)
314 flds 36(%eax)
315 fadds 88(%eax)
316 fstps 36(%edx)
318 flds 32(%eax)
319 fsubs 92(%eax)
320 fmuls 32(%ebx)
321 fstps 92(%edx)
323 flds 36(%eax)
324 fsubs 88(%eax)
325 fmuls 36(%ebx)
326 fstps 88(%edx)
328 flds 40(%eax)
329 fadds 84(%eax)
330 fstps 40(%edx)
332 flds 44(%eax)
333 fadds 80(%eax)
334 fstps 44(%edx)
336 flds 40(%eax)
337 fsubs 84(%eax)
338 fmuls 40(%ebx)
339 fstps 84(%edx)
341 flds 44(%eax)
342 fsubs 80(%eax)
343 fmuls 44(%ebx)
344 fstps 80(%edx)
346 flds 48(%eax)
347 fadds 76(%eax)
348 fstps 48(%edx)
350 flds 52(%eax)
351 fadds 72(%eax)
352 fstps 52(%edx)
354 flds 48(%eax)
355 fsubs 76(%eax)
356 fmuls 48(%ebx)
357 fstps 76(%edx)
359 flds 52(%eax)
360 fsubs 72(%eax)
361 fmuls 52(%ebx)
362 fstps 72(%edx)
364 flds 56(%eax)
365 fadds 68(%eax)
366 fstps 56(%edx)
368 flds 60(%eax)
369 fadds 64(%eax)
370 fstps 60(%edx)
372 flds 56(%eax)
373 fsubs 68(%eax)
374 fmuls 56(%ebx)
375 fstps 68(%edx)
377 flds 60(%eax)
378 fsubs 64(%eax)
379 fmuls 60(%ebx)
380 fstps 64(%edx)
382 // end phase 1 fpu code
384 /* Phase 2 (completed, worx) */
386 / movq (%edx), %mm0
387 / movq 8(%edx), %mm4
388 movups (%edx), %xmm0
390 / movq %mm0, %mm3
391 / movq %mm4, %mm7
392 movaps %xmm0, %xmm2
394 / movq 56(%edx), %mm1
395 / movq 48(%edx), %mm5
396 movups 48(%edx), %xmm1
398 / pswapd %mm1, %mm1
399 / pswapd %mm5, %mm5
400 //// shufps $177, %xmm1, %xmm1
401 shufps $27, %xmm1, %xmm1
403 / pfadd %mm1, %mm0
404 / pfadd %mm5, %mm4
405 addps %xmm1, %xmm0
407 / movq %mm0, (%ecx)
408 / movq %mm4, 8(%ecx)
409 movups %xmm0, (%ecx)
411 / pfsub %mm1, %mm3
412 / pfsub %mm5, %mm7
413 subps %xmm1, %xmm2
415 / pfmul 64(%ebx), %mm3
416 / pfmul 72(%ebx), %mm7
417 movups 64(%ebx), %xmm7
418 mulps %xmm7, %xmm2
420 / pswapd %mm3, %mm3
421 / pswapd %mm7, %mm7
422 shufps $27, %xmm2, %xmm2
424 / movq %mm3, 56(%ecx)
425 / movq %mm7, 48(%ecx)
426 movups %xmm2, 48(%ecx)
428 / movq 16(%edx), %mm0
429 / movq 24(%edx), %mm4
430 movups 16(%edx), %xmm0
432 / movq %mm0, %mm3
433 / movq %mm4, %mm7
434 movaps %xmm0, %xmm2
436 / movq 40(%edx), %mm1
437 / movq 32(%edx), %mm5
438 movups 32(%edx), %xmm1
440 / pswapd %mm1, %mm1
441 / pswapd %mm5, %mm5
442 //// shufps $177, %xmm1, %xmm1
443 shufps $27, %xmm1, %xmm1
445 / pfadd %mm1, %mm0
446 / pfadd %mm5, %mm4
447 addps %xmm1, %xmm0
449 / movq %mm0, 16(%ecx)
450 / movq %mm4, 24(%ecx)
451 movups %xmm0, 16(%ecx)
453 / pfsub %mm1, %mm3
454 / pfsub %mm5, %mm7
455 subps %xmm1, %xmm2
457 / pfmul 80(%ebx), %mm3
458 / pfmul 88(%ebx), %mm7
459 movups 80(%ebx), %xmm7
460 mulps %xmm7, %xmm2
462 / pswapd %mm3, %mm3
463 / pswapd %mm7, %mm7
464 shufps $27, %xmm2, %xmm2
466 / movq %mm3, 40(%ecx)
467 / movq %mm7, 32(%ecx)
468 movups %xmm2, 32(%ecx)
471 // phase 2 fpu
472 /* Phase 2*/
474 flds (%edx)
475 fadds 60(%edx)
476 fstps (%ecx)
478 flds 4(%edx)
479 fadds 56(%edx)
480 fstps 4(%ecx)
482 flds (%edx)
483 fsubs 60(%edx)
484 fmuls 64(%ebx)
485 fstps 60(%ecx)
487 flds 4(%edx)
488 fsubs 56(%edx)
489 fmuls 68(%ebx)
490 fstps 56(%ecx)
492 flds 8(%edx)
493 fadds 52(%edx)
494 fstps 8(%ecx)
496 flds 12(%edx)
497 fadds 48(%edx)
498 fstps 12(%ecx)
500 flds 8(%edx)
501 fsubs 52(%edx)
502 fmuls 72(%ebx)
503 fstps 52(%ecx)
505 flds 12(%edx)
506 fsubs 48(%edx)
507 fmuls 76(%ebx)
508 fstps 48(%ecx)
510 flds 16(%edx)
511 fadds 44(%edx)
512 fstps 16(%ecx)
514 flds 20(%edx)
515 fadds 40(%edx)
516 fstps 20(%ecx)
518 flds 16(%edx)
519 fsubs 44(%edx)
520 fmuls 80(%ebx)
521 fstps 44(%ecx)
523 flds 20(%edx)
524 fsubs 40(%edx)
525 fmuls 84(%ebx)
526 fstps 40(%ecx)
528 flds 24(%edx)
529 fadds 36(%edx)
530 fstps 24(%ecx)
532 flds 28(%edx)
533 fadds 32(%edx)
534 fstps 28(%ecx)
536 flds 24(%edx)
537 fsubs 36(%edx)
538 fmuls 88(%ebx)
539 fstps 36(%ecx)
541 flds 28(%edx)
542 fsubs 32(%edx)
543 fmuls 92(%ebx)
544 fstps 32(%ecx)
546 // end phase 2 fpu
548 /* Phase 3 (completed, working) */
550 / movq 64(%edx), %mm0
551 / movq 72(%edx), %mm4
552 movups 64(%edx), %xmm0
554 / movq %mm0, %mm3
555 / movq %mm4, %mm7
556 movaps %xmm0, %xmm2
558 / movq 120(%edx), %mm1
559 / movq 112(%edx), %mm5
560 movups 112(%edx), %xmm1
562 / pswapd %mm1, %mm1
563 / pswapd %mm5, %mm5
564 //// shufps $177, %xmm1, %xmm1
565 shufps $27, %xmm1, %xmm1
567 / pfadd %mm1, %mm0
568 / pfadd %mm5, %mm4
569 addps %xmm1, %xmm0
571 / movq %mm0, 64(%ecx)
572 / movq %mm4, 72(%ecx)
573 movups %xmm0, 64(%ecx)
575 / pfsubr %mm1, %mm3
576 / pfsubr %mm5, %mm7
577 // optimized (xmm1<->xmm2)
578 subps %xmm2, %xmm1
580 / pfmul 64(%ebx), %mm3
581 / pfmul 72(%ebx), %mm7
582 movups 64(%ebx), %xmm7
583 mulps %xmm7, %xmm1
585 / pswapd %mm3, %mm3
586 / pswapd %mm7, %mm7
587 shufps $27, %xmm1, %xmm1
589 / movq %mm3, 120(%ecx)
590 / movq %mm7, 112(%ecx)
591 movups %xmm1, 112(%ecx)
594 / movq 80(%edx), %mm0
595 / movq 88(%edx), %mm4
596 movups 80(%edx), %xmm0
598 / movq %mm0, %mm3
599 / movq %mm4, %mm7
600 movaps %xmm0, %xmm2
602 / movq 104(%edx), %mm1
603 / movq 96(%edx), %mm5
604 movups 96(%edx), %xmm1
606 / pswapd %mm1, %mm1
607 / pswapd %mm5, %mm5
608 //// shufps $177, %xmm1, %xmm1
609 shufps $27, %xmm1, %xmm1
611 / pfadd %mm1, %mm0
612 / pfadd %mm5, %mm4
613 addps %xmm1, %xmm0
615 / movq %mm0, 80(%ecx)
616 / movq %mm4, 88(%ecx)
617 movups %xmm0, 80(%ecx)
619 / pfsubr %mm1, %mm3
620 / pfsubr %mm5, %mm7
621 // optimized (xmm1<->xmm2)
622 subps %xmm2, %xmm1
624 / pfmul 80(%ebx), %mm3
625 / pfmul 88(%ebx), %mm7
626 movups 80(%ebx), %xmm7
627 mulps %xmm7, %xmm1
629 / pswapd %mm3, %mm3
630 / pswapd %mm7, %mm7
631 shufps $27, %xmm1, %xmm1
633 / movq %mm3, 104(%ecx)
634 / movq %mm7, 96(%ecx)
635 movups %xmm1, 96(%ecx)
638 // phase 3 fpu
639 /* Phase 3*/
641 flds 64(%edx)
642 fadds 124(%edx)
643 fstps 64(%ecx)
645 flds 68(%edx)
646 fadds 120(%edx)
647 fstps 68(%ecx)
649 flds 124(%edx)
650 fsubs 64(%edx)
651 fmuls 64(%ebx)
652 fstps 124(%ecx)
654 flds 120(%edx)
655 fsubs 68(%edx)
656 fmuls 68(%ebx)
657 fstps 120(%ecx)
659 flds 72(%edx)
660 fadds 116(%edx)
661 fstps 72(%ecx)
663 flds 76(%edx)
664 fadds 112(%edx)
665 fstps 76(%ecx)
667 flds 116(%edx)
668 fsubs 72(%edx)
669 fmuls 72(%ebx)
670 fstps 116(%ecx)
672 flds 112(%edx)
673 fsubs 76(%edx)
674 fmuls 76(%ebx)
675 fstps 112(%ecx)
677 flds 80(%edx)
678 fadds 108(%edx)
679 fstps 80(%ecx)
681 flds 84(%edx)
682 fadds 104(%edx)
683 fstps 84(%ecx)
685 flds 108(%edx)
686 fsubs 80(%edx)
687 fmuls 80(%ebx)
688 fstps 108(%ecx)
690 flds 104(%edx)
691 fsubs 84(%edx)
692 fmuls 84(%ebx)
693 fstps 104(%ecx)
695 flds 88(%edx)
696 fadds 100(%edx)
697 fstps 88(%ecx)
699 flds 92(%edx)
700 fadds 96(%edx)
701 fstps 92(%ecx)
703 flds 100(%edx)
704 fsubs 88(%edx)
705 fmuls 88(%ebx)
706 fstps 100(%ecx)
708 flds 96(%edx)
709 fsubs 92(%edx)
710 fmuls 92(%ebx)
711 fstps 96(%ecx)
713 // end phase 3 fpu
716 /* Phase 4 (completed, buggy) */
718 / movq 96(%ebx), %mm2
719 / movq 104(%ebx), %mm6
720 movups 96(%ebx), %xmm4
723 / movq (%ecx), %mm0
724 / movq 8(%ecx), %mm4
725 movups (%ecx), %xmm0
727 / movq %mm0, %mm3
728 / movq %mm4, %mm7
729 movaps %xmm0, %xmm2
731 / movq 24(%ecx), %mm1
732 / movq 16(%ecx), %mm5
733 movups 16(%ecx), %xmm1
735 / pswapd %mm1, %mm1
736 / pswapd %mm5, %mm5
737 //// shufps $177, %xmm1, %xmm1
738 shufps $27, %xmm1, %xmm1
740 / pfadd %mm1, %mm0
741 / pfadd %mm5, %mm4
742 addps %xmm1, %xmm0
744 / movq %mm0, (%edx)
745 / movq %mm4, 8(%edx)
746 movups %xmm0, (%edx)
748 / pfsub %mm1, %mm3
749 / pfsub %mm5, %mm7
750 subps %xmm1, %xmm2
752 / pfmul %mm2, %mm3
753 / pfmul %mm6, %mm7
754 mulps %xmm4, %xmm2
756 / pswapd %mm3, %mm3
757 / pswapd %mm7, %mm7
758 shufps $27, %xmm2, %xmm2
760 / movq %mm3, 24(%edx)
761 / movq %mm7, 16(%edx)
762 movups %xmm2, 16(%edx)
764 / movq 32(%ecx), %mm0
765 / movq 40(%ecx), %mm4
766 movups 32(%ecx), %xmm0
768 / movq %mm0, %mm3
769 / movq %mm4, %mm7
770 movaps %xmm0, %xmm2
772 / movq 56(%ecx), %mm1
773 / movq 48(%ecx), %mm5
774 movups 48(%ecx), %xmm1
776 / pswapd %mm1, %mm1
777 / pswapd %mm5, %mm5
778 //// shufps $177, %xmm1, %xmm1
779 shufps $27, %xmm1, %xmm1
781 / pfadd %mm1, %mm0
782 / pfadd %mm5, %mm4
783 addps %xmm1, %xmm0
785 / movq %mm0, 32(%edx)
786 / movq %mm4, 40(%edx)
787 movups %xmm0, 32(%edx)
789 / pfsubr %mm1, %mm3
790 / pfsubr %mm5, %mm7
791 // Luckily we can swap this (xmm1<->xmm2)
792 subps %xmm2, %xmm1
794 / pfmul %mm2, %mm3
795 / pfmul %mm6, %mm7
796 mulps %xmm4, %xmm1
798 / pswapd %mm3, %mm3
799 / pswapd %mm7, %mm7
800 shufps $27, %xmm1, %xmm1
802 / movq %mm3, 56(%edx)
803 / movq %mm7, 48(%edx)
804 movups %xmm1, 48(%edx)
807 / movq 64(%ecx), %mm0
808 / movq 72(%ecx), %mm4
809 movups 64(%ecx), %xmm0
811 / movq %mm0, %mm3
812 / movq %mm4, %mm7
813 movaps %xmm0, %xmm2
815 / movq 88(%ecx), %mm1
816 / movq 80(%ecx), %mm5
817 movups 80(%ecx), %xmm1
819 / pswapd %mm1, %mm1
820 / pswapd %mm5, %mm5
821 //// shufps $177, %xmm1, %xmm1
822 shufps $27, %xmm1, %xmm1
824 / pfadd %mm1, %mm0
825 / pfadd %mm5, %mm4
826 addps %xmm1, %xmm0
828 / movq %mm0, 64(%edx)
829 / movq %mm4, 72(%edx)
830 movups %xmm0, 64(%edx)
832 / pfsub %mm1, %mm3
833 / pfsub %mm5, %mm7
834 subps %xmm1, %xmm2
836 / pfmul %mm2, %mm3
837 / pfmul %mm6, %mm7
838 mulps %xmm4, %xmm2
840 / pswapd %mm3, %mm3
841 / pswapd %mm7, %mm7
842 shufps $27, %xmm2, %xmm2
844 / movq %mm3, 88(%edx)
845 / movq %mm7, 80(%edx)
846 movups %xmm2, 80(%edx)
849 / movq 96(%ecx), %mm0
850 / movq 104(%ecx), %mm4
851 movups 96(%ecx), %xmm0
853 / movq %mm0, %mm3
854 / movq %mm4, %mm7
855 movaps %xmm0, %xmm2
857 / movq 120(%ecx), %mm1
858 / movq 112(%ecx), %mm5
859 movups 112(%ecx), %xmm1
861 / pswapd %mm1, %mm1
862 / pswapd %mm5, %mm5
863 //// shufps $177, %xmm1, %xmm1
864 shufps $27, %xmm1, %xmm1
866 / pfadd %mm1, %mm0
867 / pfadd %mm5, %mm4
868 addps %xmm1, %xmm0
870 / movq %mm0, 96(%edx)
871 / movq %mm4, 104(%edx)
872 movups %xmm0, 96(%edx)
874 / pfsubr %mm1, %mm3
875 / pfsubr %mm5, %mm7
876 // This is already optimized, so xmm2 must be swapped with xmm1 for rest of phase
877 subps %xmm2, %xmm1
879 / pfmul %mm2, %mm3
880 / pfmul %mm6, %mm7
881 mulps %xmm4, %xmm1
883 / pswapd %mm3, %mm3
884 / pswapd %mm7, %mm7
885 shufps $27, %xmm1, %xmm1
887 / movq %mm3, 120(%edx)
888 / movq %mm7, 112(%edx)
889 movups %xmm1, 112(%edx)
892 // phase 4 fpu code
893 /* Phase 4*/
895 flds (%ecx)
896 fadds 28(%ecx)
897 fstps (%edx)
899 flds (%ecx)
900 fsubs 28(%ecx)
901 fmuls 96(%ebx)
902 fstps 28(%edx)
904 flds 4(%ecx)
905 fadds 24(%ecx)
906 fstps 4(%edx)
908 flds 4(%ecx)
909 fsubs 24(%ecx)
910 fmuls 100(%ebx)
911 fstps 24(%edx)
913 flds 8(%ecx)
914 fadds 20(%ecx)
915 fstps 8(%edx)
917 flds 8(%ecx)
918 fsubs 20(%ecx)
919 fmuls 104(%ebx)
920 fstps 20(%edx)
922 flds 12(%ecx)
923 fadds 16(%ecx)
924 fstps 12(%edx)
926 flds 12(%ecx)
927 fsubs 16(%ecx)
928 fmuls 108(%ebx)
929 fstps 16(%edx)
931 flds 32(%ecx)
932 fadds 60(%ecx)
933 fstps 32(%edx)
935 flds 60(%ecx)
936 fsubs 32(%ecx)
937 fmuls 96(%ebx)
938 fstps 60(%edx)
940 flds 36(%ecx)
941 fadds 56(%ecx)
942 fstps 36(%edx)
944 flds 56(%ecx)
945 fsubs 36(%ecx)
946 fmuls 100(%ebx)
947 fstps 56(%edx)
949 flds 40(%ecx)
950 fadds 52(%ecx)
951 fstps 40(%edx)
953 flds 52(%ecx)
954 fsubs 40(%ecx)
955 fmuls 104(%ebx)
956 fstps 52(%edx)
958 flds 44(%ecx)
959 fadds 48(%ecx)
960 fstps 44(%edx)
962 flds 48(%ecx)
963 fsubs 44(%ecx)
964 fmuls 108(%ebx)
965 fstps 48(%edx)
967 flds 64(%ecx)
968 fadds 92(%ecx)
969 fstps 64(%edx)
971 flds 64(%ecx)
972 fsubs 92(%ecx)
973 fmuls 96(%ebx)
974 fstps 92(%edx)
976 flds 68(%ecx)
977 fadds 88(%ecx)
978 fstps 68(%edx)
980 flds 68(%ecx)
981 fsubs 88(%ecx)
982 fmuls 100(%ebx)
983 fstps 88(%edx)
985 flds 72(%ecx)
986 fadds 84(%ecx)
987 fstps 72(%edx)
989 flds 72(%ecx)
990 fsubs 84(%ecx)
991 fmuls 104(%ebx)
992 fstps 84(%edx)
994 flds 76(%ecx)
995 fadds 80(%ecx)
996 fstps 76(%edx)
998 flds 76(%ecx)
999 fsubs 80(%ecx)
1000 fmuls 108(%ebx)
1001 fstps 80(%edx)
1003 flds 96(%ecx)
1004 fadds 124(%ecx)
1005 fstps 96(%edx)
1007 flds 124(%ecx)
1008 fsubs 96(%ecx)
1009 fmuls 96(%ebx)
1010 fstps 124(%edx)
1012 flds 100(%ecx)
1013 fadds 120(%ecx)
1014 fstps 100(%edx)
1016 flds 120(%ecx)
1017 fsubs 100(%ecx)
1018 fmuls 100(%ebx)
1019 fstps 120(%edx)
1021 flds 104(%ecx)
1022 fadds 116(%ecx)
1023 fstps 104(%edx)
1025 flds 116(%ecx)
1026 fsubs 104(%ecx)
1027 fmuls 104(%ebx)
1028 fstps 116(%edx)
1030 flds 108(%ecx)
1031 fadds 112(%ecx)
1032 fstps 108(%edx)
1034 flds 112(%ecx)
1035 fsubs 108(%ecx)
1036 fmuls 108(%ebx)
1037 fstps 112(%edx)
1039 flds (%edx)
1040 fadds 12(%edx)
1041 fstps (%ecx)
1043 flds (%edx)
1044 fsubs 12(%edx)
1045 fmuls 112(%ebx)
1046 fstps 12(%ecx)
1048 flds 4(%edx)
1049 fadds 8(%edx)
1050 fstps 4(%ecx)
1052 flds 4(%edx)
1053 fsubs 8(%edx)
1054 fmuls 116(%ebx)
1055 fstps 8(%ecx)
1057 flds 16(%edx)
1058 fadds 28(%edx)
1059 fstps 16(%ecx)
1061 flds 28(%edx)
1062 fsubs 16(%edx)
1063 fmuls 112(%ebx)
1064 fstps 28(%ecx)
1066 flds 20(%edx)
1067 fadds 24(%edx)
1068 fstps 20(%ecx)
1070 flds 24(%edx)
1071 fsubs 20(%edx)
1072 fmuls 116(%ebx)
1073 fstps 24(%ecx)
1075 flds 32(%edx)
1076 fadds 44(%edx)
1077 fstps 32(%ecx)
1079 flds 32(%edx)
1080 fsubs 44(%edx)
1081 fmuls 112(%ebx)
1082 fstps 44(%ecx)
1084 flds 36(%edx)
1085 fadds 40(%edx)
1086 fstps 36(%ecx)
1088 flds 36(%edx)
1089 fsubs 40(%edx)
1090 fmuls 116(%ebx)
1091 fstps 40(%ecx)
1093 flds 48(%edx)
1094 fadds 60(%edx)
1095 fstps 48(%ecx)
1097 flds 60(%edx)
1098 fsubs 48(%edx)
1099 fmuls 112(%ebx)
1100 fstps 60(%ecx)
1102 flds 52(%edx)
1103 fadds 56(%edx)
1104 fstps 52(%ecx)
1106 flds 56(%edx)
1107 fsubs 52(%edx)
1108 fmuls 116(%ebx)
1109 fstps 56(%ecx)
1111 flds 64(%edx)
1112 fadds 76(%edx)
1113 fstps 64(%ecx)
1115 flds 64(%edx)
1116 fsubs 76(%edx)
1117 fmuls 112(%ebx)
1118 fstps 76(%ecx)
1120 flds 68(%edx)
1121 fadds 72(%edx)
1122 fstps 68(%ecx)
1124 flds 68(%edx)
1125 fsubs 72(%edx)
1126 fmuls 116(%ebx)
1127 fstps 72(%ecx)
1129 flds 80(%edx)
1130 fadds 92(%edx)
1131 fstps 80(%ecx)
1133 flds 92(%edx)
1134 fsubs 80(%edx)
1135 fmuls 112(%ebx)
1136 fstps 92(%ecx)
1138 flds 84(%edx)
1139 fadds 88(%edx)
1140 fstps 84(%ecx)
1142 flds 88(%edx)
1143 fsubs 84(%edx)
1144 fmuls 116(%ebx)
1145 fstps 88(%ecx)
1147 flds 96(%edx)
1148 fadds 108(%edx)
1149 fstps 96(%ecx)
1151 flds 96(%edx)
1152 fsubs 108(%edx)
1153 fmuls 112(%ebx)
1154 fstps 108(%ecx)
1156 flds 100(%edx)
1157 fadds 104(%edx)
1158 fstps 100(%ecx)
1160 flds 100(%edx)
1161 fsubs 104(%edx)
1162 fmuls 116(%ebx)
1163 fstps 104(%ecx)
1165 flds 112(%edx)
1166 fadds 124(%edx)
1167 fstps 112(%ecx)
1169 flds 124(%edx)
1170 fsubs 112(%edx)
1171 fmuls 112(%ebx)
1172 fstps 124(%ecx)
1174 flds 116(%edx)
1175 fadds 120(%edx)
1176 fstps 116(%ecx)
1178 flds 120(%edx)
1179 fsubs 116(%edx)
1180 fmuls 116(%ebx)
1181 fstps 120(%ecx)
1183 // end of phase 4 fpu
1185 // below stuff needs to be finished I use FPU code for first
1186 /* Phase 5 (completed, crashing) */
1188 / movq 112(%ebx), %mm2
1189 // move 8 byte data to (low)high quadword - check this! atmos
1190 movlps 112(%ebx), %xmm4
1191 // maybe I need movhlps too to get data into correct quadword
1192 movlhps %xmm4, %xmm4
1194 / movq (%edx), %mm0
1195 / movq 16(%edx), %mm4
1196 movups (%edx), %xmm0
1198 / movq %mm0, %mm3
1199 / movq %mm4, %mm7
1200 movaps %xmm0, %xmm2
1202 // hmm? this is strange
1203 / movq 8(%edx), %mm1
1204 / movq 24(%edx), %mm5
1205 movlps 8(%edx), %xmm1
1206 movhps 24(%edx), %xmm1
1208 / pswapd %mm1, %mm1
1209 / pswapd %mm5, %mm5
1210 pshufd $177, %xmm1, %xmm1
1212 / pfadd %mm1, %mm0
1213 / pfadd %mm5, %mm4
1214 addps %xmm1, %xmm0
1216 / movq %mm0, (%ecx)
1217 / movq %mm4, 16(%ecx)
1218 movlps %xmm0, (%ecx)
1219 movhps %xmm0, 16(%ecx)
1221 / pfsub %mm1, %mm3
1222 / pfsubr %mm5, %mm7
1223 // I need to emulate pfsubr here
1224 movaps %xmm1, %xmm3
1225 subps %xmm2, %xmm3
1226 subps %xmm1, %xmm2
1227 // now move correct quadword from reverse substration in xmm3 to correct
1228 // quadword in xmm2 and leave other quadword with non-reversed substration untouched
1229 /// shufpd $2, %xmm3, %xmm2
1230 // (or $1?) (see ia32-ref p.749)
1231 // optimize
1232 movq %xmm2, %xmm3
1233 movaps %xmm3, %xmm2
1235 / pfmul %mm2, %mm3
1236 / pfmul %mm2, %mm7
1237 mulps %xmm4, %xmm2
1239 / pswapd %mm3, %mm3
1240 / pswapd %mm7, %mm7
1241 shufps $177, %xmm2, %xmm2
1243 / movq %mm3, 8(%ecx)
1244 / movq %mm7, 24(%ecx)
1245 movlps %xmm2, 8(%ecx)
1246 movhps %xmm2, 24(%ecx)
1248 / movq 32(%edx), %mm0
1249 / movq 48(%edx), %mm4
1250 movlps 32(%edx), %xmm0
1251 movhps 48(%edx), %xmm0
1253 / movq %mm0, %mm3
1254 / movq %mm4, %mm7
1255 movaps %xmm0, %xmm2
1257 / movq 40(%edx), %mm1
1258 / movq 56(%edx), %mm5
1259 movlps 40(%edx), %xmm1
1260 movhps 56(%edx), %xmm1
1262 / pswapd %mm1, %mm1
1263 / pswapd %mm5, %mm5
1264 shufps $177, %xmm1, %xmm1
1266 / pfadd %mm1, %mm0
1267 / pfadd %mm5, %mm4
1268 addps %xmm1, %xmm0
1270 / movq %mm0, 32(%ecx)
1271 / movq %mm4, 48(%ecx)
1272 movlps %xmm0, 32(%ecx)
1273 movhps %xmm0, 48(%ecx)
1275 / pfsub %mm1, %mm3
1276 / pfsubr %mm5, %mm7
1277 movaps %xmm1, %xmm3
1278 subps %xmm2, %xmm3
1279 subps %xmm1, %xmm2
1280 /// shufpd $2, %xmm3, %xmm2
1281 // (or $1?)
1282 // optimize
1283 movq %xmm2, %xmm3
1284 movaps %xmm3, %xmm2
1286 / pfmul %mm2, %mm3
1287 / pfmul %mm2, %mm7
1288 mulps %xmm4, %xmm2
1290 / pswapd %mm3, %mm3
1291 / pswapd %mm7, %mm7
1292 shufps $177, %xmm2, %xmm2
1294 / movq %mm3, 40(%ecx)
1295 / movq %mm7, 56(%ecx)
1296 movlps %xmm2, 40(%ecx)
1297 movhps %xmm2, 56(%ecx)
1300 / movq 64(%edx), %mm0
1301 / movq 80(%edx), %mm4
1302 movlps 64(%edx), %xmm0
1303 movhps 80(%edx), %xmm0
1305 / movq %mm0, %mm3
1306 / movq %mm4, %mm7
1307 movaps %xmm0, %xmm2
1309 / movq 72(%edx), %mm1
1310 / movq 88(%edx), %mm5
1311 movlps 72(%edx), %xmm1
1312 movhps 88(%edx), %xmm1
1314 / pswapd %mm1, %mm1
1315 / pswapd %mm5, %mm5
1316 shufps $177, %xmm1, %xmm1
1318 / pfadd %mm1, %mm0
1319 / pfadd %mm5, %mm4
1320 addps %xmm1, %xmm0
1322 / movq %mm0, 64(%ecx)
1323 / movq %mm4, 80(%ecx)
1324 movlps %xmm0, 64(%ecx)
1325 movhps %xmm0, 80(%ecx)
1327 / pfsub %mm1, %mm3
1328 / pfsubr %mm5, %mm7
1329 movaps %xmm1, %xmm3
1330 subps %xmm2, %xmm3
1331 subps %xmm1, %xmm2
1332 /// shufpd $2, %xmm3, %xmm2
1333 // (or $1?)
1334 // optimize
1335 movq %xmm2, %xmm3
1336 movaps %xmm3, %xmm2
1338 / pfmul %mm2, %mm3
1339 / pfmul %mm2, %mm7
1340 mulps %xmm4, %xmm2
1342 / pswapd %mm3, %mm3
1343 / pswapd %mm7, %mm7
1344 shufps $177, %xmm2, %xmm2
1346 / movq %mm3, 72(%ecx)
1347 / movq %mm7, 88(%ecx)
1348 movlps %xmm2, 72(%ecx)
1349 movhps %xmm2, 88(%ecx)
1351 / movq 96(%edx), %mm0
1352 / movq 112(%edx), %mm4
1353 movups 96(%edx), %xmm0
1355 / movq %mm0, %mm3
1356 / movq %mm4, %mm7
1357 movaps %xmm0, %xmm2
1359 / movq 104(%edx), %mm1
1360 / movq 120(%edx), %mm5
1361 movlps 104(%edx), %xmm1
1362 movhps 120(%edx), %xmm1
1364 / pswapd %mm1, %mm1
1365 / pswapd %mm5, %mm5
1366 shufps $177, %xmm1, %xmm1
1368 / pfadd %mm1, %mm0
1369 / pfadd %mm5, %mm4
1370 addps %xmm1, %xmm0
1372 / movq %mm0, 96(%ecx)
1373 / movq %mm4, 112(%ecx)
1374 movups %xmm0, 96(%ecx)
1376 / pfsub %mm1, %mm3
1377 / pfsubr %mm5, %mm7
1378 movaps %xmm1, %xmm3
1379 subps %xmm2, %xmm3
1380 subps %xmm1, %xmm2
1381 /// shufpd $2, %xmm3, %xmm2
1382 // (or $1?)
1383 // optimize
1384 movq %xmm2, %xmm3
1385 movaps %xmm3, %xmm2
1387 / pfmul %mm2, %mm3
1388 / pfmul %mm2, %mm7
1389 mulps %xmm4, %xmm2
1391 / pswapd %mm3, %mm3
1392 / pswapd %mm7, %mm7
1393 shufps $177, %xmm2, %xmm2
1395 / movq %mm3, 104(%ecx)
1396 / movq %mm7, 120(%ecx)
1397 movlps %xmm2, 104(%ecx)
1398 movhps %xmm2, 120(%ecx)
1402 /* Phase 6. This is the end of easy road. */
1403 /* Code below is coded in scalar mode. Should be optimized */
1405 // movd plus_1f, %mm6
1406 // punpckldq 120(%ebx), %mm6 /* mm6 = 1.0 | 120(%ebx)*/
1407 // movq x_plus_minus_3dnow, %mm7 /* mm7 = +1 | -1 */
1409 movq 32(%ecx), %mm0
1410 movq 64(%ecx), %mm2
1411 movq %mm0, %mm1
1412 movq %mm2, %mm3
1413 pxor %mm7, %mm1
1414 pxor %mm7, %mm3
1415 pfacc %mm1, %mm0
1416 pfacc %mm3, %mm2
1417 pfmul %mm6, %mm0
1418 pfmul %mm6, %mm2
1419 movq %mm0, 32(%edx)
1420 movq %mm2, 64(%edx)
1422 movd 44(%ecx), %mm0
1423 movd 40(%ecx), %mm2
1424 movd 120(%ebx), %mm3
1425 punpckldq 76(%ecx), %mm0
1426 punpckldq 72(%ecx), %mm2
1427 punpckldq %mm3, %mm3
1428 movq %mm0, %mm4
1429 movq %mm2, %mm5
1430 pfsub %mm2, %mm0
1431 pfmul %mm3, %mm0
1432 movq %mm0, %mm1
1433 pfadd %mm5, %mm0
1434 pfadd %mm4, %mm0
1435 movq %mm0, %mm2
1436 punpckldq %mm1, %mm0
1437 punpckhdq %mm1, %mm2
1438 movq %mm0, 40(%edx)
1439 movq %mm2, 72(%edx)
1441 movd 48(%ecx), %mm3
1442 movd 60(%ecx), %mm2
1443 pfsub 52(%ecx), %mm3
1444 pfsub 56(%ecx), %mm2
1445 pfmul 120(%ebx), %mm3
1446 pfmul 120(%ebx), %mm2
1447 movq %mm2, %mm1
1449 pfadd 56(%ecx), %mm1
1450 pfadd 60(%ecx), %mm1
1451 movq %mm1, %mm0
1453 pfadd 48(%ecx), %mm0
1454 pfadd 52(%ecx), %mm0
1455 pfadd %mm3, %mm1
1456 punpckldq %mm2, %mm1
1457 pfadd %mm3, %mm2
1458 punpckldq %mm2, %mm0
1459 movq %mm1, 56(%edx)
1460 movq %mm0, 48(%edx)
1462 /*---*/
1464 movd 92(%ecx), %mm1
1465 pfsub 88(%ecx), %mm1
1466 pfmul 120(%ebx), %mm1
1467 movd %mm1, 92(%edx)
1468 pfadd 92(%ecx), %mm1
1469 pfadd 88(%ecx), %mm1
1470 movq %mm1, %mm0
1472 pfadd 80(%ecx), %mm0
1473 pfadd 84(%ecx), %mm0
1474 movd %mm0, 80(%edx)
1476 movd 80(%ecx), %mm0
1477 pfsub 84(%ecx), %mm0
1478 pfmul 120(%ebx), %mm0
1479 pfadd %mm0, %mm1
1480 pfadd 92(%edx), %mm0
1481 punpckldq %mm1, %mm0
1482 movq %mm0, 84(%edx)
1484 movq 96(%ecx), %mm0
1485 movq %mm0, %mm1
1486 pxor %mm7, %mm1
1487 pfacc %mm1, %mm0
1488 pfmul %mm6, %mm0
1489 movq %mm0, 96(%edx)
1491 movd 108(%ecx), %mm0
1492 pfsub 104(%ecx), %mm0
1493 pfmul 120(%ebx), %mm0
1494 movd %mm0, 108(%edx)
1495 pfadd 104(%ecx), %mm0
1496 pfadd 108(%ecx), %mm0
1497 movd %mm0, 104(%edx)
1499 movd 124(%ecx), %mm1
1500 pfsub 120(%ecx), %mm1
1501 pfmul 120(%ebx), %mm1
1502 movd %mm1, 124(%edx)
1503 pfadd 120(%ecx), %mm1
1504 pfadd 124(%ecx), %mm1
1505 movq %mm1, %mm0
1507 pfadd 112(%ecx), %mm0
1508 pfadd 116(%ecx), %mm0
1509 movd %mm0, 112(%edx)
1511 movd 112(%ecx), %mm0
1512 pfsub 116(%ecx), %mm0
1513 pfmul 120(%ebx), %mm0
1514 pfadd %mm0,%mm1
1515 pfadd 124(%edx), %mm0
1516 punpckldq %mm1, %mm0
1517 movq %mm0, 116(%edx)
1519 jnz .L01
1523 /* Phase 7*/
1524 /* Code below is coded in scalar mode. Should be optimized */
1526 movd (%ecx), %mm0
1527 pfadd 4(%ecx), %mm0
1528 movd %mm0, 1024(%esi)
1530 movd (%ecx), %mm0
1531 pfsub 4(%ecx), %mm0
1532 pfmul 120(%ebx), %mm0
1533 movd %mm0, (%esi)
1534 movd %mm0, (%edi)
1536 movd 12(%ecx), %mm0
1537 pfsub 8(%ecx), %mm0
1538 pfmul 120(%ebx), %mm0
1539 movd %mm0, 512(%edi)
1540 pfadd 12(%ecx), %mm0
1541 pfadd 8(%ecx), %mm0
1542 movd %mm0, 512(%esi)
1544 movd 16(%ecx), %mm0
1545 pfsub 20(%ecx), %mm0
1546 pfmul 120(%ebx), %mm0
1547 movq %mm0, %mm3
1549 movd 28(%ecx), %mm0
1550 pfsub 24(%ecx), %mm0
1551 pfmul 120(%ebx), %mm0
1552 movd %mm0, 768(%edi)
1553 movq %mm0, %mm2
1555 pfadd 24(%ecx), %mm0
1556 pfadd 28(%ecx), %mm0
1557 movq %mm0, %mm1
1559 pfadd 16(%ecx), %mm0
1560 pfadd 20(%ecx), %mm0
1561 movd %mm0, 768(%esi)
1562 pfadd %mm3, %mm1
1563 movd %mm1, 256(%esi)
1564 pfadd %mm3, %mm2
1565 movd %mm2, 256(%edi)
1569 /* Phase 8*/
1571 movq 32(%edx), %mm0
1572 movq 48(%edx), %mm1
1573 pfadd 48(%edx), %mm0
1574 pfadd 40(%edx), %mm1
1575 movd %mm0, 896(%esi)
1576 movd %mm1, 640(%esi)
1577 psrlq $32, %mm0
1578 psrlq $32, %mm1
1579 movd %mm0, 128(%edi)
1580 movd %mm1, 384(%edi)
1582 movd 40(%edx), %mm0
1583 pfadd 56(%edx), %mm0
1584 movd %mm0, 384(%esi)
1586 movd 56(%edx), %mm0
1587 pfadd 36(%edx), %mm0
1588 movd %mm0, 128(%esi)
1590 movd 60(%edx), %mm0
1591 movd %mm0, 896(%edi)
1592 pfadd 44(%edx), %mm0
1593 movd %mm0, 640(%edi)
1595 movq 96(%edx), %mm0
1596 movq 112(%edx), %mm2
1597 movq 104(%edx), %mm4
1598 pfadd 112(%edx), %mm0
1599 pfadd 104(%edx), %mm2
1600 pfadd 120(%edx), %mm4
1601 movq %mm0, %mm1
1602 movq %mm2, %mm3
1603 movq %mm4, %mm5
1604 pfadd 64(%edx), %mm0
1605 pfadd 80(%edx), %mm2
1606 pfadd 72(%edx), %mm4
1607 movd %mm0, 960(%esi)
1608 movd %mm2, 704(%esi)
1609 movd %mm4, 448(%esi)
1610 psrlq $32, %mm0
1611 psrlq $32, %mm2
1612 psrlq $32, %mm4
1613 movd %mm0, 64(%edi)
1614 movd %mm2, 320(%edi)
1615 movd %mm4, 576(%edi)
1616 pfadd 80(%edx), %mm1
1617 pfadd 72(%edx), %mm3
1618 pfadd 88(%edx), %mm5
1619 movd %mm1, 832(%esi)
1620 movd %mm3, 576(%esi)
1621 movd %mm5, 320(%esi)
1622 psrlq $32, %mm1
1623 psrlq $32, %mm3
1624 psrlq $32, %mm5
1625 movd %mm1, 192(%edi)
1626 movd %mm3, 448(%edi)
1627 movd %mm5, 704(%edi)
1629 movd 120(%edx), %mm0
1630 pfadd 100(%edx), %mm0
1631 movq %mm0, %mm1
1632 pfadd 88(%edx), %mm0
1633 movd %mm0, 192(%esi)
1634 pfadd 68(%edx), %mm1
1635 movd %mm1, 64(%esi)
1637 movd 124(%edx), %mm0
1638 movd %mm0, 960(%edi)
1639 pfadd 92(%edx), %mm0
1640 movd %mm0, 832(%edi)
1642 jmp .L_bye
1643 .L01:
1647 /* Phase 9*/
1649 movq (%ecx), %mm0
1650 movq %mm0, %mm1
1651 pxor %mm7, %mm1
1652 pfacc %mm1, %mm0
1653 pfmul %mm6, %mm0
1654 pf2id %mm0, %mm0
1655 movd %mm0, %eax
1656 movw %ax, 512(%esi)
1657 psrlq $32, %mm0
1658 movd %mm0, %eax
1659 movw %ax, (%esi)
1661 movd 12(%ecx), %mm0
1662 pfsub 8(%ecx), %mm0
1663 pfmul 120(%ebx), %mm0
1664 pf2id %mm0, %mm7
1665 movd %mm7, %eax
1666 movw %ax, 256(%edi)
1667 pfadd 12(%ecx), %mm0
1668 pfadd 8(%ecx), %mm0
1669 pf2id %mm0, %mm0
1670 movd %mm0, %eax
1671 movw %ax, 256(%esi)
1673 movd 16(%ecx), %mm3
1674 pfsub 20(%ecx), %mm3
1675 pfmul 120(%ebx), %mm3
1676 movq %mm3, %mm2
1678 movd 28(%ecx), %mm2
1679 pfsub 24(%ecx), %mm2
1680 pfmul 120(%ebx), %mm2
1681 movq %mm2, %mm1
1683 pf2id %mm2, %mm7
1684 movd %mm7, %eax
1685 movw %ax, 384(%edi)
1687 pfadd 24(%ecx), %mm1
1688 pfadd 28(%ecx), %mm1
1689 movq %mm1, %mm0
1691 pfadd 16(%ecx), %mm0
1692 pfadd 20(%ecx), %mm0
1693 pf2id %mm0, %mm0
1694 movd %mm0, %eax
1695 movw %ax, 384(%esi)
1696 pfadd %mm3, %mm1
1697 pf2id %mm1, %mm1
1698 movd %mm1, %eax
1699 movw %ax, 128(%esi)
1700 pfadd %mm3, %mm2
1701 pf2id %mm2, %mm2
1702 movd %mm2, %eax
1703 movw %ax, 128(%edi)
1707 /* Phase 10*/
1709 movq 32(%edx), %mm0
1710 movq 48(%edx), %mm1
1711 pfadd 48(%edx), %mm0
1712 pfadd 40(%edx), %mm1
1713 pf2id %mm0, %mm0
1714 pf2id %mm1, %mm1
1715 movd %mm0, %eax
1716 movd %mm1, %ecx
1717 movw %ax, 448(%esi)
1718 movw %cx, 320(%esi)
1719 psrlq $32, %mm0
1720 psrlq $32, %mm1
1721 movd %mm0, %eax
1722 movd %mm1, %ecx
1723 movw %ax, 64(%edi)
1724 movw %cx, 192(%edi)
1726 movd 40(%edx), %mm3
1727 movd 56(%edx), %mm4
1728 movd 60(%edx), %mm0
1729 movd 44(%edx), %mm2
1730 movd 120(%edx), %mm5
1731 punpckldq %mm4, %mm3
1732 punpckldq 124(%edx), %mm0
1733 pfadd 100(%edx), %mm5
1734 punpckldq 36(%edx), %mm4
1735 punpckldq 92(%edx), %mm2
1736 movq %mm5, %mm6
1737 pfadd %mm4, %mm3
1738 pf2id %mm0, %mm1
1739 pf2id %mm3, %mm3
1740 pfadd 88(%edx), %mm5
1741 movd %mm1, %eax
1742 movd %mm3, %ecx
1743 movw %ax, 448(%edi)
1744 movw %cx, 192(%esi)
1745 pf2id %mm5, %mm5
1746 psrlq $32, %mm1
1747 psrlq $32, %mm3
1748 movd %mm5, %ebx
1749 movd %mm1, %eax
1750 movd %mm3, %ecx
1751 movw %bx, 96(%esi)
1752 movw %ax, 480(%edi)
1753 movw %cx, 64(%esi)
1754 pfadd %mm2, %mm0
1755 pf2id %mm0, %mm0
1756 movd %mm0, %eax
1757 pfadd 68(%edx), %mm6
1758 movw %ax, 320(%edi)
1759 psrlq $32, %mm0
1760 pf2id %mm6, %mm6
1761 movd %mm0, %eax
1762 movd %mm6, %ebx
1763 movw %ax, 416(%edi)
1764 movw %bx, 32(%esi)
1766 movq 96(%edx), %mm0
1767 movq 112(%edx), %mm2
1768 movq 104(%edx), %mm4
1769 pfadd %mm2, %mm0
1770 pfadd %mm4, %mm2
1771 pfadd 120(%edx), %mm4
1772 movq %mm0, %mm1
1773 movq %mm2, %mm3
1774 movq %mm4, %mm5
1775 pfadd 64(%edx), %mm0
1776 pfadd 80(%edx), %mm2
1777 pfadd 72(%edx), %mm4
1778 pf2id %mm0, %mm0
1779 pf2id %mm2, %mm2
1780 pf2id %mm4, %mm4
1781 movd %mm0, %eax
1782 movd %mm2, %ecx
1783 movd %mm4, %ebx
1784 movw %ax, 480(%esi)
1785 movw %cx, 352(%esi)
1786 movw %bx, 224(%esi)
1787 psrlq $32, %mm0
1788 psrlq $32, %mm2
1789 psrlq $32, %mm4
1790 movd %mm0, %eax
1791 movd %mm2, %ecx
1792 movd %mm4, %ebx
1793 movw %ax, 32(%edi)
1794 movw %cx, 160(%edi)
1795 movw %bx, 288(%edi)
1796 pfadd 80(%edx), %mm1
1797 pfadd 72(%edx), %mm3
1798 pfadd 88(%edx), %mm5
1799 pf2id %mm1, %mm1
1800 pf2id %mm3, %mm3
1801 pf2id %mm5, %mm5
1802 movd %mm1, %eax
1803 movd %mm3, %ecx
1804 movd %mm5, %ebx
1805 movw %ax, 416(%esi)
1806 movw %cx, 288(%esi)
1807 movw %bx, 160(%esi)
1808 psrlq $32, %mm1
1809 psrlq $32, %mm3
1810 psrlq $32, %mm5
1811 movd %mm1, %eax
1812 movd %mm3, %ecx
1813 movd %mm5, %ebx
1814 movw %ax, 96(%edi)
1815 movw %cx, 224(%edi)
1816 movw %bx, 352(%edi)
1818 movsw
1820 .L_bye:
1821 addl $256,%esp
1822 / femms
1823 emms
1824 popl %edi
1825 popl %esi
1826 popl %ebx
1827 ret $12
1830 // here comes old fashioned FPU code for the tough parts
1832 /* Phase 5*/
1834 flds 32(%ecx)
1835 fadds 36(%ecx)
1836 fstps 32(%edx)
1838 flds 32(%ecx)
1839 fsubs 36(%ecx)
1840 fmuls 120(%ebx)
1841 fstps 36(%edx)
1843 flds 44(%ecx)
1844 fsubs 40(%ecx)
1845 fmuls 120(%ebx)
1846 fsts 44(%edx)
1847 fadds 40(%ecx)
1848 fadds 44(%ecx)
1849 fstps 40(%edx)
1851 flds 48(%ecx)
1852 fsubs 52(%ecx)
1853 fmuls 120(%ebx)
1855 flds 60(%ecx)
1856 fsubs 56(%ecx)
1857 fmuls 120(%ebx)
1858 fld %st(0)
1859 fadds 56(%ecx)
1860 fadds 60(%ecx)
1861 fld %st(0)
1862 fadds 48(%ecx)
1863 fadds 52(%ecx)
1864 fstps 48(%edx)
1865 fadd %st(2)
1866 fstps 56(%edx)
1867 fsts 60(%edx)
1868 faddp %st(1)
1869 fstps 52(%edx)
1871 flds 64(%ecx)
1872 fadds 68(%ecx)
1873 fstps 64(%edx)
1875 flds 64(%ecx)
1876 fsubs 68(%ecx)
1877 fmuls 120(%ebx)
1878 fstps 68(%edx)
1880 flds 76(%ecx)
1881 fsubs 72(%ecx)
1882 fmuls 120(%ebx)
1883 fsts 76(%edx)
1884 fadds 72(%ecx)
1885 fadds 76(%ecx)
1886 fstps 72(%edx)
1888 flds 92(%ecx)
1889 fsubs 88(%ecx)
1890 fmuls 120(%ebx)
1891 fsts 92(%edx)
1892 fadds 92(%ecx)
1893 fadds 88(%ecx)
1894 fld %st(0)
1895 fadds 80(%ecx)
1896 fadds 84(%ecx)
1897 fstps 80(%edx)
1899 flds 80(%ecx)
1900 fsubs 84(%ecx)
1901 fmuls 120(%ebx)
1902 fadd %st(0), %st(1)
1903 fadds 92(%edx)
1904 fstps 84(%edx)
1905 fstps 88(%edx)
1907 flds 96(%ecx)
1908 fadds 100(%ecx)
1909 fstps 96(%edx)
1911 flds 96(%ecx)
1912 fsubs 100(%ecx)
1913 fmuls 120(%ebx)
1914 fstps 100(%edx)
1916 flds 108(%ecx)
1917 fsubs 104(%ecx)
1918 fmuls 120(%ebx)
1919 fsts 108(%edx)
1920 fadds 104(%ecx)
1921 fadds 108(%ecx)
1922 fstps 104(%edx)
1924 flds 124(%ecx)
1925 fsubs 120(%ecx)
1926 fmuls 120(%ebx)
1927 fsts 124(%edx)
1928 fadds 120(%ecx)
1929 fadds 124(%ecx)
1930 fld %st(0)
1931 fadds 112(%ecx)
1932 fadds 116(%ecx)
1933 fstps 112(%edx)
1935 flds 112(%ecx)
1936 fsubs 116(%ecx)
1937 fmuls 120(%ebx)
1938 fadd %st(0),%st(1)
1939 fadds 124(%edx)
1940 fstps 116(%edx)
1941 fstps 120(%edx)
1942 jnz .L01
1945 /* Phase 6*/
1947 flds (%ecx)
1948 fadds 4(%ecx)
1949 fstps 1024(%esi)
1951 flds (%ecx)
1952 fsubs 4(%ecx)
1953 fmuls 120(%ebx)
1954 fsts (%esi)
1955 fstps (%edi)
1957 flds 12(%ecx)
1958 fsubs 8(%ecx)
1959 fmuls 120(%ebx)
1960 fsts 512(%edi)
1961 fadds 12(%ecx)
1962 fadds 8(%ecx)
1963 fstps 512(%esi)
1965 flds 16(%ecx)
1966 fsubs 20(%ecx)
1967 fmuls 120(%ebx)
1969 flds 28(%ecx)
1970 fsubs 24(%ecx)
1971 fmuls 120(%ebx)
1972 fsts 768(%edi)
1973 fld %st(0)
1974 fadds 24(%ecx)
1975 fadds 28(%ecx)
1976 fld %st(0)
1977 fadds 16(%ecx)
1978 fadds 20(%ecx)
1979 fstps 768(%esi)
1980 fadd %st(2)
1981 fstps 256(%esi)
1982 faddp %st(1)
1983 fstps 256(%edi)
1985 /* Phase 7*/
1987 flds 32(%edx)
1988 fadds 48(%edx)
1989 fstps 896(%esi)
1991 flds 48(%edx)
1992 fadds 40(%edx)
1993 fstps 640(%esi)
1995 flds 40(%edx)
1996 fadds 56(%edx)
1997 fstps 384(%esi)
1999 flds 56(%edx)
2000 fadds 36(%edx)
2001 fstps 128(%esi)
2003 flds 36(%edx)
2004 fadds 52(%edx)
2005 fstps 128(%edi)
2007 flds 52(%edx)
2008 fadds 44(%edx)
2009 fstps 384(%edi)
2011 flds 60(%edx)
2012 fsts 896(%edi)
2013 fadds 44(%edx)
2014 fstps 640(%edi)
2016 flds 96(%edx)
2017 fadds 112(%edx)
2018 fld %st(0)
2019 fadds 64(%edx)
2020 fstps 960(%esi)
2021 fadds 80(%edx)
2022 fstps 832(%esi)
2024 flds 112(%edx)
2025 fadds 104(%edx)
2026 fld %st(0)
2027 fadds 80(%edx)
2028 fstps 704(%esi)
2029 fadds 72(%edx)
2030 fstps 576(%esi)
2032 flds 104(%edx)
2033 fadds 120(%edx)
2034 fld %st(0)
2035 fadds 72(%edx)
2036 fstps 448(%esi)
2037 fadds 88(%edx)
2038 fstps 320(%esi)
2040 flds 120(%edx)
2041 fadds 100(%edx)
2042 fld %st(0)
2043 fadds 88(%edx)
2044 fstps 192(%esi)
2045 fadds 68(%edx)
2046 fstps 64(%esi)
2048 flds 100(%edx)
2049 fadds 116(%edx)
2050 fld %st(0)
2051 fadds 68(%edx)
2052 fstps 64(%edi)
2053 fadds 84(%edx)
2054 fstps 192(%edi)
2056 flds 116(%edx)
2057 fadds 108(%edx)
2058 fld %st(0)
2059 fadds 84(%edx)
2060 fstps 320(%edi)
2061 fadds 76(%edx)
2062 fstps 448(%edi)
2064 flds 108(%edx)
2065 fadds 124(%edx)
2066 fld %st(0)
2067 fadds 76(%edx)
2068 fstps 576(%edi)
2069 fadds 92(%edx)
2070 fstps 704(%edi)
2072 flds 124(%edx)
2073 fsts 960(%edi)
2074 fadds 92(%edx)
2075 fstps 832(%edi)
2076 addl $256,%esp
2077 popl %edi
2078 popl %esi
2079 popl %ebx
2081 .L01:
2082 /* Phase 8*/
2084 flds (%ecx)
2085 fadds 4(%ecx)
2086 fistp 512(%esi)
2088 flds (%ecx)
2089 fsubs 4(%ecx)
2090 fmuls 120(%ebx)
2092 fistp (%esi)
2095 flds 12(%ecx)
2096 fsubs 8(%ecx)
2097 fmuls 120(%ebx)
2098 fist 256(%edi)
2099 fadds 12(%ecx)
2100 fadds 8(%ecx)
2101 fistp 256(%esi)
2103 flds 16(%ecx)
2104 fsubs 20(%ecx)
2105 fmuls 120(%ebx)
2107 flds 28(%ecx)
2108 fsubs 24(%ecx)
2109 fmuls 120(%ebx)
2110 fist 384(%edi)
2111 fld %st(0)
2112 fadds 24(%ecx)
2113 fadds 28(%ecx)
2114 fld %st(0)
2115 fadds 16(%ecx)
2116 fadds 20(%ecx)
2117 fistp 384(%esi)
2118 fadd %st(2)
2119 fistp 128(%esi)
2120 faddp %st(1)
2121 fistp 128(%edi)
2123 /* Phase 9*/
2125 flds 32(%edx)
2126 fadds 48(%edx)
2127 fistp 448(%esi)
2129 flds 48(%edx)
2130 fadds 40(%edx)
2131 fistp 320(%esi)
2133 flds 40(%edx)
2134 fadds 56(%edx)
2135 fistp 192(%esi)
2137 flds 56(%edx)
2138 fadds 36(%edx)
2139 fistp 64(%esi)
2141 flds 36(%edx)
2142 fadds 52(%edx)
2143 fistp 64(%edi)
2145 flds 52(%edx)
2146 fadds 44(%edx)
2147 fistp 192(%edi)
2149 flds 60(%edx)
2150 fist 448(%edi)
2151 fadds 44(%edx)
2152 fistp 320(%edi)
2154 flds 96(%edx)
2155 fadds 112(%edx)
2156 fld %st(0)
2157 fadds 64(%edx)
2158 fistp 480(%esi)
2159 fadds 80(%edx)
2160 fistp 416(%esi)
2162 flds 112(%edx)
2163 fadds 104(%edx)
2164 fld %st(0)
2165 fadds 80(%edx)
2166 fistp 352(%esi)
2167 fadds 72(%edx)
2168 fistp 288(%esi)
2170 flds 104(%edx)
2171 fadds 120(%edx)
2172 fld %st(0)
2173 fadds 72(%edx)
2174 fistp 224(%esi)
2175 fadds 88(%edx)
2176 fistp 160(%esi)
2178 flds 120(%edx)
2179 fadds 100(%edx)
2180 fld %st(0)
2181 fadds 88(%edx)
2182 fistp 96(%esi)
2183 fadds 68(%edx)
2184 fistp 32(%esi)
2186 flds 100(%edx)
2187 fadds 116(%edx)
2188 fld %st(0)
2189 fadds 68(%edx)
2190 fistp 32(%edi)
2191 fadds 84(%edx)
2192 fistp 96(%edi)
2194 flds 116(%edx)
2195 fadds 108(%edx)
2196 fld %st(0)
2197 fadds 84(%edx)
2198 fistp 160(%edi)
2199 fadds 76(%edx)
2200 fistp 224(%edi)
2202 flds 108(%edx)
2203 fadds 124(%edx)
2204 fld %st(0)
2205 fadds 76(%edx)
2206 fistp 288(%edi)
2207 fadds 92(%edx)
2208 fistp 352(%edi)
2210 flds 124(%edx)
2211 fist 480(%edi)
2212 fadds 92(%edx)
2213 fistp 416(%edi)
2214 movsw
2215 addl $256,%esp
2216 popl %edi
2217 popl %esi
2218 popl %ebx
2219 ret $12
2221 // end of FPU stuff