not quite so much needs to be delayed to the init() function
[personal-kdebase.git] / workspace / ksplash / ksplashx / asm_scale.S
blobbec050ad1bda190ad97ad51dc51cf7e6f812a4fd
1 #ifdef __EMX__
2 /* Due to strange behaviour of as.exe we use this macros */
3 /* For all OS/2 coders - please use PGCC to compile this code */
4 #define PR_(foo) ___##foo
5 #define PT_(foo,func) ___##foo,func
6 #define SIZE(sym)                              \
7         .___end_##sym:;                        \
8         .size ___##sym,.___end_##sym-___##sym; \
9         .align 8;
10 #else
11 #define PR_(foo) __##foo
12 #define PT_(foo,func) __##foo,func
13 #define SIZE(sym)                           \
14         .__end_##sym:;                      \
15         .size __##sym,.__end_##sym-__##sym; \
16         .align 8;
17 #endif
19 /*\ 
20 |*| MMX assembly scaling routine for Imlib2
21 |*| Written by Willem Monsuwe <willem@stack.nl>
22 \*/
24 .text
25         .align 8
26 .globl PR_(mimageScale_mmx_AARGBA)
27 /*      .type PT_(mimageScale_mmx_AARGBA,@function) */ 
30 /*\ Prototype: __mimageScale_mmx_AARGBA(ImlibScaleInfo *isi, DATA32 *dest,
31 |*|     int dxx, int dyy, int dx, int dy, int dw, int dh, int dow, int sow)
32 \*/
34 #define isi     8(%ebp)
35 #define dest    12(%ebp)
36 #define dxx     16(%ebp)
37 #define dyy     20(%ebp)
38 #define dx      24(%ebp)
39 #define dy      28(%ebp)
40 #define dw      32(%ebp)
41 #define dh      36(%ebp)
42 #define dow     40(%ebp)
43 #define sow     44(%ebp)
45 /*\ Local variables that didn't fit in registers \*/
46 #define y       -4(%ebp)
47 #define yp      -8(%ebp)
48 #define yap     -12(%ebp)
49 #define xp      -16(%ebp)
50 #define xap     -20(%ebp)
51 #define Cx      -24(%ebp)
52 #define Mx      -28(%ebp)
53 #define Cy      -32(%ebp)
54 #define My      -36(%ebp)
55 #define sow_4   -40(%ebp)
57 /*\ When %edx points to ImlibScaleInfo, these are the members \*/
58 #define xpoints         (%edx)
59 #define ypoints         4(%edx)
60 #define xapoints        8(%edx)
61 #define yapoints        12(%edx)
62 #define xup_yup         16(%edx)
64 PR_(mimageScale_mmx_AARGBA):
65         pushl %ebp
66         movl %esp, %ebp
67         subl $40, %esp
68         pushl %ebx
69         pushl %ecx
70         pushl %edx
71         pushl %edi
72         pushl %esi
73         movl isi, %edx
75         /*\ Check (dw > 0) && (dh > 0) \*/
76         cmpl $0, dw
77         jle .scale_leave
78         cmpl $0, dh
79         jle .scale_leave
81         /*\ X-based array pointers point to the end; we're looping up to 0 \*/
82         /*\ %edi = dest + dow * dy + dx + dw \*/
83         movl dow, %eax
84         imull dy, %eax
85         addl dx, %eax
86         addl dw, %eax
87         movl dest, %edi
88         leal (%edi, %eax, 4), %edi
89         /*\ xp = xpoints + dxx + dw \*/
90         movl dxx, %ebx
91         addl dw, %ebx
92         movl xpoints, %eax
93         leal (%eax, %ebx, 4), %eax
94         movl %eax, xp
95         /*\ xap = xapoints + dxx + dw \*/
96         movl xapoints, %eax
97         leal (%eax, %ebx, 4), %eax
98         movl %eax, xap
99         /*\ y = dh \*/
100         movl dh, %eax
101         movl %eax, y
102         /*\ yp = ypoints + dyy \*/
103         movl dyy, %ebx
104         movl ypoints, %eax
105         leal (%eax, %ebx, 4), %eax
106         movl %eax, yp
107         /*\ yap = yapoints + dyy \*/
108         movl yapoints, %eax
109         leal (%eax, %ebx, 4), %eax
110         movl %eax, yap
112         pxor %mm7, %mm7
114         /*\ Test xup bit \*/
115         movl xup_yup, %eax
116         sarl $1, %eax
117         jnc .scale_x_down
119 .scale_x_up:
120         /*\ Test yup bit \*/
121         sarl $1, %eax
122         jnc .scale_x_up_y_down
125 /*\ Scaling up both ways \*/
127 .scale_x_up_y_up:
128         movl sow, %ebx
130 .up_up_loop_y:
132         /*\ x = -dw \*/
133         movl dw, %ecx
134         negl %ecx
136         /*\ %eax = *yap << 4 \*/
137         movl yap, %eax
138         movl (%eax), %eax
139         sall $4, %eax
140         jz .up_up_yap_0
141         movd %eax, %mm1
142         punpcklwd %mm1, %mm1
143         punpckldq %mm1, %mm1
145 .up_up_loop1_x:
146         /*\ %esi = *yp + xp[x] \*/
147         movl yp, %eax
148         movl (%eax), %esi
149         movl xp, %eax
150         movl (%eax, %ecx, 4), %eax
151         leal (%esi, %eax, 4), %esi
153         /*\ %eax = xap[x] << 4 \*/
154         movl xap, %eax
155         movl (%eax, %ecx, 4), %eax
156         sall $4, %eax
157         jz .up_up_xap_0
159         /*\ %mm0 = xap[x] << 4 \*/
160         movd %eax, %mm0
161         punpcklwd %mm0, %mm0
162         punpckldq %mm0, %mm0
164         /*\ Load and unpack four pixels in parralel
165         |*| %mm2 = ptr[0],   %mm3 = ptr[1]
166         |*| %mm4 = ptr[sow], %mm5 = ptr[sow + 1]
167         \*/
168         movq (%esi), %mm2
169         movq (%esi, %ebx, 4), %mm4
170         movq %mm2, %mm3
171         movq %mm4, %mm5
172         punpcklbw %mm7, %mm2
173         punpcklbw %mm7, %mm4
174         punpckhbw %mm7, %mm3
175         punpckhbw %mm7, %mm5
177         /*\ X interpolation: r = l + (r - l) * xap \*/
178         psubw %mm2, %mm3
179         psubw %mm4, %mm5
180         psllw $4, %mm3
181         psllw $4, %mm5
182         pmulhw %mm0, %mm3
183         pmulhw %mm0, %mm5
184         paddw %mm2, %mm3
185         paddw %mm4, %mm5
186         /*\ Now %mm3 = I(ptr[0], ptr[1]), %mm5 = I(ptr[sow], ptr[sow + 1]) \*/
187         jmp .up_up_common
188 .up_up_xap_0:
189         /*\ Load and unpack two pixels
190         |*| %mm3 = ptr[0], %mm5 = ptr[sow]
191         \*/
192         movd (%esi), %mm3
193         movd (%esi, %ebx, 4), %mm5
194         punpcklbw %mm7, %mm3
195         punpcklbw %mm7, %mm5
196 .up_up_common:
197         /*\ Y interpolation: d = u + (d - u) * yap \*/
198         psubw %mm3, %mm5
199         psllw $4, %mm5
200         pmulhw %mm1, %mm5
201         paddw %mm3, %mm5
202         packuswb %mm5, %mm5
203         movd %mm5, (%edi, %ecx, 4)
205         /*\ while (++x) \*/
206         incl %ecx
207         jnz .up_up_loop1_x
208         jmp .up_up_yap_end
209 .up_up_yap_0:
211 .up_up_loop2_x:
212         /*\ %esi = *yp + xp[x] \*/
213         movl yp, %eax
214         movl (%eax), %esi
215         movl xp, %eax
216         movl (%eax, %ecx, 4), %eax
217         leal (%esi, %eax, 4), %esi
219         /*\ %eax = xap[x] << 4 \*/
220         movl xap, %eax
221         movl (%eax, %ecx, 4), %eax
222         sall $4, %eax
223         jz .up_up_0
225         /*\ %mm0 = xap[x] << 4 \*/
226         movd %eax, %mm0
227         punpcklwd %mm0, %mm0
228         punpckldq %mm0, %mm0
230         /*\ Load and unpack two pixels in parralel
231         |*| %mm2 = ptr[0], %mm3 = ptr[1]
232         \*/
233         movq (%esi), %mm2
234         movq %mm2, %mm3
235         punpcklbw %mm7, %mm2
236         punpckhbw %mm7, %mm3
238         /*\ X interpolation: r = l + (r - l) * xap \*/
239         psubw %mm2, %mm3
240         psllw $4, %mm3
241         pmulhw %mm0, %mm3
242         paddw %mm2, %mm3
243         packuswb %mm3, %mm3
244         movd %mm3, (%edi, %ecx, 4)
245         jmp .up_up_1
246 .up_up_0:
247         /*\ dptr[x] = *sptr \*/
248         movl (%esi), %eax
249         movl %eax, (%edi, %ecx, 4)
250 .up_up_1:
251         incl %ecx
252         jnz .up_up_loop2_x
254 .up_up_yap_end:
255         /*\ dptr += dow \*/
256         movl dow, %eax
257         leal (%edi, %eax, 4), %edi
258         /*\ yap++; yp++ \*/
259         addl $4, yap
260         addl $4, yp
261         /*\ while (y--) \*/
262         decl y
263         jnz .up_up_loop_y
265         jmp .scale_leave
268 /*\ Scaling down vertically \*/
270 .scale_x_up_y_down:
271         /*\ sow_4 = sow * 4 \*/
272         movl sow, %eax
273         sall $2, %eax
274         movl %eax, sow_4
276 .up_down_loop_y:
278         /*\ Setup My and Cy \*/
279         movl yap, %eax
280         movzwl (%eax), %ebx
281         movl %ebx, My
282         movzwl 2(%eax), %eax
283         movl %eax, Cy
285         /*\ mm4 = Cy \*/
286         movd %eax, %mm4
287         punpcklwd %mm4, %mm4
288         punpckldq %mm4, %mm4
289         /*\ mm5 = My \*/
290         movd %ebx, %mm5
291         punpcklwd %mm5, %mm5
292         punpckldq %mm5, %mm5
294         /*\ x = -dw \*/
295         movl dw, %ecx
296         negl %ecx
297 .up_down_loop_x:
298         /*\ %esi = *yp + xp[x] \*/
299         movl yp, %eax
300         movl (%eax), %esi
301         movl xp, %eax
302         movl (%eax, %ecx, 4), %eax
303         leal (%esi, %eax, 4), %esi
305         movl %esi, %eax
306         /*\ v = (*p * My) >> 10 \*/
307         movd (%eax), %mm0
308         punpcklbw %mm7, %mm0
309         psllw $6, %mm0
310         pmulhw %mm5, %mm0
311         
312         /*\ i = 0x4000 - My \*/
313         movl $0x4000, %ebx
314         subl My, %ebx
315         jbe 5f
316         jmp 2f
318         /*\ p += sow; v += (*p * Cy) >> 10 \*/
319         addl sow_4, %eax
320         movd (%eax), %mm1
321         punpcklbw %mm7, %mm1
322         psllw $6, %mm1
323         pmulhw %mm4, %mm1
324         paddw %mm1, %mm0
325         
326         /*\ i -= Cy; while (i > Cy) \*/
327         subl Cy, %ebx
329         cmpl Cy, %ebx
330         jg 1b
331         
332         /*\ mm6 = i \*/
333         movd %ebx, %mm6
334         punpcklwd %mm6, %mm6
335         punpckldq %mm6, %mm6
336         
337         /*\ p += sow; v += (*p * i) >> 10 \*/
338         addl sow_4, %eax
339         movd (%eax), %mm1
340         punpcklbw %mm7, %mm1
341         psllw $6, %mm1
342         pmulhw %mm6, %mm1
343         paddw %mm1, %mm0
345         /*\ %eax = xap[x] << 5 \*/
346         movl xap, %eax
347         movl (%eax, %ecx, 4), %eax
348         sall $5, %eax
349         jz 6f
350         /*\ mm3 = xap[x] << 5 \*/
351         movd %eax, %mm3
352         punpcklwd %mm3, %mm3
353         punpckldq %mm3, %mm3
354         
355         /*\ p + 1 \*/
356         movl %esi, %eax
357         addl $4, %eax
358         /*\ vv = (*p * My) >> 10 \*/
359         movd (%eax), %mm2
360         punpcklbw %mm7, %mm2
361         psllw $6, %mm2
362         pmulhw %mm5, %mm2
363         
364         /*\ i = 0x4000 - My \*/
365         movl $0x4000, %ebx
366         subl My, %ebx
367         jbe 5f
368         jmp 2f
370         /*\ p += sow; vv += (*p * Cy) >> 10 \*/
371         addl sow_4, %eax
372         movd (%eax), %mm1
373         punpcklbw %mm7, %mm1
374         psllw $6, %mm1
375         pmulhw %mm4, %mm1
376         paddw %mm1, %mm2
377         
378         /*\ i -= Cy; while (i > Cy) \*/
379         subl Cy, %ebx
381         cmpl Cy, %ebx
382         jg 1b
383         
384         /*\ p += sow; v += (*p * i) >> 10 \*/
385         addl sow_4, %eax
386         movd (%eax), %mm1
387         punpcklbw %mm7, %mm1
388         psllw $6, %mm1
389         pmulhw %mm6, %mm1
390         paddw %mm1, %mm2
392         /*\ v = v + (vv - v) * xap \*/
393         psubw %mm0, %mm2
394         psllw $3, %mm2
395         pmulhw %mm3, %mm2
396         paddw %mm2, %mm0
398         /*\ dest[x] = v >> 4 \*/
399         psrlw $4, %mm0
400         packuswb %mm0, %mm0
401         movd %mm0, (%edi, %ecx, 4)
403         /*\ while (++x) \*/
404         incl %ecx
405         jnz .up_down_loop_x
407         /*\ dptr += dow \*/
408         movl dow, %eax
409         leal (%edi, %eax, 4), %edi
410         /*\ yap++; yp++ \*/
411         addl $4, yap
412         addl $4, yp
413         /*\ while (y--) \*/
414         decl y
415         jnz .up_down_loop_y
417         jmp .scale_leave
419 .scale_x_down:
420         /*\ Test yup bit \*/
421         sarl $1, %eax
422         jnc .scale_x_down_y_down
425 /*\ Scaling down horizontally \*/
427 .scale_x_down_y_up:
428         /*\ sow_4 = sow * 4 \*/
429         movl sow, %eax
430         sall $2, %eax
431         movl %eax, sow_4
433 .down_up_loop_y:
435         /*\ %eax = *yap << 5 \*/
436         movl yap, %eax
437         movl (%eax), %eax
438         sall $5, %eax
439         /*\ mm3 = *yap << 5 \*/
440         movd %eax, %mm3
441         punpcklwd %mm3, %mm3
442         punpckldq %mm3, %mm3
443         
444         /*\ x = -dw \*/
445         movl dw, %ecx
446         negl %ecx
447 .down_up_loop_x:
448         /*\ %esi = *yp + xp[x] \*/
449         movl yp, %eax
450         movl (%eax), %esi
451         movl xp, %eax
452         movl (%eax, %ecx, 4), %eax
453         leal (%esi, %eax, 4), %esi
455         /*\ Setup Mx and Cx \*/
456         movl xap, %eax
457         movzwl (%eax, %ecx, 4), %ebx
458         movl %ebx, Mx
459         movzwl 2(%eax, %ecx, 4), %eax
460         movl %eax, Cx
462         /*\ mm4 = Cx \*/
463         movd %eax, %mm4
464         punpcklwd %mm4, %mm4
465         punpckldq %mm4, %mm4
466         /*\ mm5 = Mx \*/
467         movd %ebx, %mm5
468         punpcklwd %mm5, %mm5
469         punpckldq %mm5, %mm5
471         movl %esi, %eax
472         /*\ v = (*p * Mx) >> 10 \*/
473         movd (%eax), %mm0
474         punpcklbw %mm7, %mm0
475         psllw $6, %mm0
476         pmulhw %mm5, %mm0
477         
478         /*\ i = 0x4000 - Mx \*/
479         movl $0x4000, %ebx
480         subl Mx, %ebx
481         jbe 5f
482         jmp 2f
484         /*\ p += sow; v += (*p * Cx) >> 10 \*/
485         addl $4, %eax
486         movd (%eax), %mm1
487         punpcklbw %mm7, %mm1
488         psllw $6, %mm1
489         pmulhw %mm4, %mm1
490         paddw %mm1, %mm0
491         
492         /*\ i -= Cx; while (i > Cx) \*/
493         subl Cx, %ebx
495         cmpl Cx, %ebx
496         jg 1b
497         
498         /*\ mm6 = i \*/
499         movd %ebx, %mm6
500         punpcklwd %mm6, %mm6
501         punpckldq %mm6, %mm6
502         
503         /*\ p += sow; v += (*p * i) >> 10 \*/
504         addl $4, %eax
505         movd (%eax), %mm1
506         punpcklbw %mm7, %mm1
507         psllw $6, %mm1
508         pmulhw %mm6, %mm1
509         paddw %mm1, %mm0
511         movd %mm3, %eax
512         testl %eax, %eax
513         jz 6f
514         /*\ p + sow \*/
515         movl %esi, %eax
516         addl sow_4, %eax
517         /*\ vv = (*p * Mx) >> 10 \*/
518         movd (%eax), %mm2
519         punpcklbw %mm7, %mm2
520         psllw $6, %mm2
521         pmulhw %mm5, %mm2
522         
523         /*\ i = 0x4000 - Mx \*/
524         movl $0x4000, %ebx
525         subl Mx, %ebx
526         jbe 5f
527         jmp 2f
529         /*\ p += sow; vv += (*p * Cx) >> 10 \*/
530         addl $4, %eax
531         movd (%eax), %mm1
532         punpcklbw %mm7, %mm1
533         psllw $6, %mm1
534         pmulhw %mm4, %mm1
535         paddw %mm1, %mm2
536         
537         /*\ i -= Cx; while (i > Cx) \*/
538         subl Cx, %ebx
540         cmpl Cx, %ebx
541         jg 1b
542         
543         /*\ p += sow; v += (*p * i) >> 10 \*/
544         addl $4, %eax
545         movd (%eax), %mm1
546         punpcklbw %mm7, %mm1
547         psllw $6, %mm1
548         pmulhw %mm6, %mm1
549         paddw %mm1, %mm2
551         /*\ v = v + (vv - v) * yap \*/
552         psubw %mm0, %mm2
553         psllw $3, %mm2
554         pmulhw %mm3, %mm2
555         paddw %mm2, %mm0
557         /*\ dest[x] = v >> 4 \*/
558         psrlw $4, %mm0
559         packuswb %mm0, %mm0
560         movd %mm0, (%edi, %ecx, 4)
562         /*\ while (++x) \*/
563         incl %ecx
564         jnz .down_up_loop_x
566         /*\ dptr += dow \*/
567         movl dow, %eax
568         leal (%edi, %eax, 4), %edi
569         /*\ yap++; yp++ \*/
570         addl $4, yap
571         addl $4, yp
572         /*\ while (y--) \*/
573         decl y
574         jnz .down_up_loop_y
576         jmp .scale_leave
579 /*\ Scaling down both ways \*/
581 .scale_x_down_y_down:
582         /*\ sow_4 = sow * 4 \*/
583         movl sow, %eax
584         sall $2, %eax
585         movl %eax, sow_4
587 .down_down_loop_y:
589         /*\ Setup My and Cy \*/
590         movl yap, %eax
591         movzwl (%eax), %ebx
592         movl %ebx, My
593         movzwl 2(%eax), %eax
594         movl %eax, Cy
596         /*\ x = -dw \*/
597         movl dw, %ecx
598         negl %ecx
599 .down_down_loop_x:
600         /*\ %esi = *yp + xp[x] \*/
601         movl yp, %eax
602         movl (%eax), %esi
603         movl xp, %eax
604         movl (%eax, %ecx, 4), %eax
605         leal (%esi, %eax, 4), %esi
607         /*\ Setup Mx and Cx \*/
608         movl xap, %eax
609         movzwl (%eax, %ecx, 4), %ebx
610         movl %ebx, Mx
611         movzwl 2(%eax, %ecx, 4), %eax
612         movl %eax, Cx
614         /*\ mm3 = Cx \*/
615         movd %eax, %mm3
616         punpcklwd %mm3, %mm3
617         punpckldq %mm3, %mm3
618         /*\ mm5 = Mx \*/
619         movd %ebx, %mm5
620         punpcklwd %mm5, %mm5
621         punpckldq %mm5, %mm5
622         
623         /*\ p = sptr; v = (*p * Mx) >> 9 \*/
624         movl %esi, %eax
625         movd (%eax), %mm0
626         punpcklbw %mm7, %mm0
627         psllw $7, %mm0
628         pmulhw %mm5, %mm0
629         
630         /*\ i = 0x4000 - Mx \*/
631         movl $0x4000, %ebx
632         subl Mx, %ebx
633         jbe 5f
634         jmp 2f
636         /*\ v += (*++p * Cx) >> 9 \*/
637         addl $4, %eax
638         movd (%eax), %mm1
639         punpcklbw %mm7, %mm1
640         psllw $7, %mm1
641         pmulhw %mm3, %mm1
642         paddw %mm1, %mm0
643         
644         /*\ i -= Cx; while (i > Cx) \*/
645         subl Cx, %ebx
647         cmpl Cx, %ebx
648         jg 1b
649         
650         /*\ mm6 = i \*/
651         movd %ebx, %mm6
652         punpcklwd %mm6, %mm6
653         punpckldq %mm6, %mm6
654         
655         /*\ v += (*++p * i) >> 9 \*/
656         addl $4, %eax
657         movd (%eax), %mm1
658         punpcklbw %mm7, %mm1
659         psllw $7, %mm1
660         pmulhw %mm6, %mm1
661         paddw %mm1, %mm0
663         /*\ v *= My \*/
664         movd My, %mm4
665         punpcklwd %mm4, %mm4
666         punpckldq %mm4, %mm4
667         psllw $2, %mm0
668         pmulhw %mm4, %mm0
669         
670         /*\ j = 0x4000 - My \*/
671         movl $0x4000, %edx
672         subl My, %edx
673         jbe 6f
674         jmp 4f
676         /*\ sptr += sow; p = sptr \*/
677         addl sow_4, %esi
678         movl %esi, %eax
679         /*\ vx = (*p * Mx) >> 9 \*/
680         movd (%eax), %mm1
681         punpcklbw %mm7, %mm1
682         psllw $7, %mm1
683         pmulhw %mm5, %mm1
684         
685         /*\ i = 0x4000 - Mx \*/
686         movl $0x4000, %ebx
687         subl Mx, %ebx
688         jbe 5f
689         jmp 2f
691         /*\ vx += (*++p * Cx) >> 9 \*/
692         addl $4, %eax
693         movd (%eax), %mm2
694         punpcklbw %mm7, %mm2
695         psllw $7, %mm2
696         pmulhw %mm3, %mm2
697         paddw %mm2, %mm1
698         
699         /*\ i -= Cx; while (i > Cx) \*/
700         subl Cx, %ebx
702         cmpl Cx, %ebx
703         jg 1b
704         
705         /*\ vx += (*++p * i) >> 9 \*/
706         addl $4, %eax
707         movd (%eax), %mm2
708         punpcklbw %mm7, %mm2
709         psllw $7, %mm2
710         pmulhw %mm6, %mm2
711         paddw %mm2, %mm1
713         /*\ v += (vx * Cy) >> 14 \*/
714         movd Cy, %mm4
715         punpcklwd %mm4, %mm4
716         punpckldq %mm4, %mm4
717         psllw $2, %mm1
718         pmulhw %mm4, %mm1
719         paddw %mm1, %mm0
720         
721         /*\ j -= Cy; while (j > Cy) \*/
722         subl Cy, %edx
724         cmpl Cy, %edx
725         jg 3b
726         
727         /*\ sptr += sow; p = sptr \*/
728         addl sow_4, %esi
729         movl %esi, %eax
730         /*\ vx = (*p * Mx) >> 9 \*/
731         movd (%eax), %mm1
732         punpcklbw %mm7, %mm1
733         psllw $7, %mm1
734         pmulhw %mm5, %mm1
735         
736         /*\ i = 0x4000 - Mx \*/
737         movl $0x4000, %ebx
738         subl Mx, %ebx
739         jbe 5f
740         jmp 2f
742         /*\ vx += (*++p * Cx) >> 9 \*/
743         addl $4, %eax
744         movd (%eax), %mm2
745         punpcklbw %mm7, %mm2
746         psllw $7, %mm2
747         pmulhw %mm3, %mm2
748         paddw %mm2, %mm1
749         
750         /*\ i -= Cx; while (i > Cx) \*/
751         subl Cx, %ebx
753         cmpl Cx, %ebx
754         jg 1b
755         
756         /*\ vx += (*++p * i) >> 9 \*/
757         addl $4, %eax
758         movd (%eax), %mm2
759         punpcklbw %mm7, %mm2
760         psllw $7, %mm2
761         pmulhw %mm6, %mm2
762         paddw %mm2, %mm1
764         /*\ v += (vx * j) >> 14 \*/
765         movd %edx, %mm4
766         punpcklwd %mm4, %mm4
767         punpckldq %mm4, %mm4
768         psllw $2, %mm1
769         pmulhw %mm4, %mm1
770         paddw %mm1, %mm0
772         /*\ dptr[x] = mm0 >> 5 \*/
773         psrlw $5, %mm0
774         packuswb %mm0, %mm0
775         movd %mm0, (%edi, %ecx, 4)
777         /*\ while (++x) \*/
778         incl %ecx
779         jnz .down_down_loop_x
781         /*\ dptr += dow \*/
782         movl dow, %eax
783         leal (%edi, %eax, 4), %edi
784         /*\ yap++; yp++ \*/
785         addl $4, yap
786         addl $4, yp
787         /*\ while (y--) \*/
788         decl y
789         jnz .down_down_loop_y
791         jmp .scale_leave
793 .scale_leave:
794         emms
795         popl %esi
796         popl %edi
797         popl %edx
798         popl %ecx
799         popl %ebx
800         movl %ebp, %esp
801         popl %ebp
802         ret
804 SIZE(mimageScale_mmx_AARGBA)
806         .section .note.GNU-stack,"",@progbits