#include <config.h>
#include "asm.h"
#ifdef DO_MMX_ASM
.text
.align 8
FN_(imlib_Scale_mmx_AARGBA)
#define isi 8(%ebp)
#define dest 12(%ebp)
#define dxx 16(%ebp)
#define dyy 20(%ebp)
#define dx 24(%ebp)
#define dy 28(%ebp)
#define dw 32(%ebp)
#define dh 36(%ebp)
#define dow 40(%ebp)
#define sow 44(%ebp)
#define y -4(%ebp)
#define yp -8(%ebp)
#define yap -12(%ebp)
#define xp -16(%ebp)
#define xap -20(%ebp)
#define Cx -24(%ebp)
#define Mx -28(%ebp)
#define Cy -32(%ebp)
#define My -36(%ebp)
#define sow_4 -40(%ebp)
#define xpoints (%edx)
#define ypoints 4(%edx)
#define xapoints 8(%edx)
#define yapoints 12(%edx)
#define xup_yup 16(%edx)
PR_(imlib_Scale_mmx_AARGBA):
pushl %ebp
movl %esp, %ebp
subl $40, %esp
pushl %ebx
pushl %ecx
pushl %edx
pushl %edi
pushl %esi
movl isi, %edx
cmpl $0, dw
jle .scale_leave
cmpl $0, dh
jle .scale_leave
movl dow, %eax
imull dy, %eax
addl dx, %eax
addl dw, %eax
movl dest, %edi
leal (%edi, %eax, 4), %edi
movl dxx, %ebx
addl dw, %ebx
movl xpoints, %eax
leal (%eax, %ebx, 4), %eax
movl %eax, xp
movl xapoints, %eax
leal (%eax, %ebx, 4), %eax
movl %eax, xap
movl dh, %eax
movl %eax, y
movl dyy, %ebx
movl ypoints, %eax
leal (%eax, %ebx, 4), %eax
movl %eax, yp
movl yapoints, %eax
leal (%eax, %ebx, 4), %eax
movl %eax, yap
pxor %mm7, %mm7
movl xup_yup, %eax
sarl $1, %eax
jnc .scale_x_down
.scale_x_up:
sarl $1, %eax
jnc .scale_x_up_y_down
.scale_x_up_y_up:
movl sow, %ebx
.up_up_loop_y:
movl dw, %ecx
negl %ecx
movl yap, %eax
movl (%eax), %eax
sall $4, %eax
jz .up_up_yap_0
movd %eax, %mm1
punpcklwd %mm1, %mm1
punpckldq %mm1, %mm1
.up_up_loop1_x:
movl yp, %eax
movl (%eax), %esi
movl xp, %eax
movl (%eax, %ecx, 4), %eax
leal (%esi, %eax, 4), %esi
movl xap, %eax
movl (%eax, %ecx, 4), %eax
sall $4, %eax
jz .up_up_xap_0
movd %eax, %mm0
punpcklwd %mm0, %mm0
punpckldq %mm0, %mm0
movq (%esi), %mm2
movq (%esi, %ebx, 4), %mm4
movq %mm2, %mm3
movq %mm4, %mm5
punpcklbw %mm7, %mm2
punpcklbw %mm7, %mm4
punpckhbw %mm7, %mm3
punpckhbw %mm7, %mm5
psubw %mm2, %mm3
psubw %mm4, %mm5
psllw $4, %mm3
psllw $4, %mm5
pmulhw %mm0, %mm3
pmulhw %mm0, %mm5
paddw %mm2, %mm3
paddw %mm4, %mm5
jmp .up_up_common
.up_up_xap_0:
movd (%esi), %mm3
movd (%esi, %ebx, 4), %mm5
punpcklbw %mm7, %mm3
punpcklbw %mm7, %mm5
.up_up_common:
psubw %mm3, %mm5
psllw $4, %mm5
pmulhw %mm1, %mm5
paddw %mm3, %mm5
packuswb %mm5, %mm5
movd %mm5, (%edi, %ecx, 4)
incl %ecx
jnz .up_up_loop1_x
jmp .up_up_yap_end
.up_up_yap_0:
.up_up_loop2_x:
movl yp, %eax
movl (%eax), %esi
movl xp, %eax
movl (%eax, %ecx, 4), %eax
leal (%esi, %eax, 4), %esi
movl xap, %eax
movl (%eax, %ecx, 4), %eax
sall $4, %eax
jz .up_up_0
movd %eax, %mm0
punpcklwd %mm0, %mm0
punpckldq %mm0, %mm0
movq (%esi), %mm2
movq %mm2, %mm3
punpcklbw %mm7, %mm2
punpckhbw %mm7, %mm3
psubw %mm2, %mm3
psllw $4, %mm3
pmulhw %mm0, %mm3
paddw %mm2, %mm3
packuswb %mm3, %mm3
movd %mm3, (%edi, %ecx, 4)
jmp .up_up_1
.up_up_0:
movl (%esi), %eax
movl %eax, (%edi, %ecx, 4)
.up_up_1:
incl %ecx
jnz .up_up_loop2_x
.up_up_yap_end:
movl dow, %eax
leal (%edi, %eax, 4), %edi
addl $4, yap
addl $4, yp
decl y
jnz .up_up_loop_y
jmp .scale_leave
.scale_x_up_y_down:
movl sow, %eax
sall $2, %eax
movl %eax, sow_4
.up_down_loop_y:
movl yap, %eax
movzwl (%eax), %ebx
movl %ebx, My
movzwl 2(%eax), %eax
movl %eax, Cy
movd %eax, %mm4
punpcklwd %mm4, %mm4
punpckldq %mm4, %mm4
movd %ebx, %mm5
punpcklwd %mm5, %mm5
punpckldq %mm5, %mm5
movl dw, %ecx
negl %ecx
.up_down_loop_x:
movl yp, %eax
movl (%eax), %esi
movl xp, %eax
movl (%eax, %ecx, 4), %eax
leal (%esi, %eax, 4), %esi
movl %esi, %eax
movd (%eax), %mm0
punpcklbw %mm7, %mm0
psllw $6, %mm0
pmulhw %mm5, %mm0
movl $0x4000, %ebx
subl My, %ebx
jbe 5f
jmp 2f
1:
addl sow_4, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $6, %mm1
pmulhw %mm4, %mm1
paddw %mm1, %mm0
subl Cy, %ebx
2:
cmpl Cy, %ebx
jg 1b
movd %ebx, %mm6
punpcklwd %mm6, %mm6
punpckldq %mm6, %mm6
addl sow_4, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $6, %mm1
pmulhw %mm6, %mm1
paddw %mm1, %mm0
5:
movl xap, %eax
movl (%eax, %ecx, 4), %eax
sall $5, %eax
jz 6f
movd %eax, %mm3
punpcklwd %mm3, %mm3
punpckldq %mm3, %mm3
movl %esi, %eax
addl $4, %eax
movd (%eax), %mm2
punpcklbw %mm7, %mm2
psllw $6, %mm2
pmulhw %mm5, %mm2
movl $0x4000, %ebx
subl My, %ebx
jbe 5f
jmp 2f
1:
addl sow_4, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $6, %mm1
pmulhw %mm4, %mm1
paddw %mm1, %mm2
subl Cy, %ebx
2:
cmpl Cy, %ebx
jg 1b
addl sow_4, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $6, %mm1
pmulhw %mm6, %mm1
paddw %mm1, %mm2
5:
psubw %mm0, %mm2
psllw $3, %mm2
pmulhw %mm3, %mm2
paddw %mm2, %mm0
6:
psrlw $4, %mm0
packuswb %mm0, %mm0
movd %mm0, (%edi, %ecx, 4)
incl %ecx
jnz .up_down_loop_x
movl dow, %eax
leal (%edi, %eax, 4), %edi
addl $4, yap
addl $4, yp
decl y
jnz .up_down_loop_y
jmp .scale_leave
.scale_x_down:
sarl $1, %eax
jnc .scale_x_down_y_down
.scale_x_down_y_up:
movl sow, %eax
sall $2, %eax
movl %eax, sow_4
.down_up_loop_y:
movl yap, %eax
movl (%eax), %eax
sall $5, %eax
movd %eax, %mm3
punpcklwd %mm3, %mm3
punpckldq %mm3, %mm3
movl dw, %ecx
negl %ecx
.down_up_loop_x:
movl yp, %eax
movl (%eax), %esi
movl xp, %eax
movl (%eax, %ecx, 4), %eax
leal (%esi, %eax, 4), %esi
movl xap, %eax
movzwl (%eax, %ecx, 4), %ebx
movl %ebx, Mx
movzwl 2(%eax, %ecx, 4), %eax
movl %eax, Cx
movd %eax, %mm4
punpcklwd %mm4, %mm4
punpckldq %mm4, %mm4
movd %ebx, %mm5
punpcklwd %mm5, %mm5
punpckldq %mm5, %mm5
movl %esi, %eax
movd (%eax), %mm0
punpcklbw %mm7, %mm0
psllw $6, %mm0
pmulhw %mm5, %mm0
movl $0x4000, %ebx
subl Mx, %ebx
jbe 5f
jmp 2f
1:
addl $4, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $6, %mm1
pmulhw %mm4, %mm1
paddw %mm1, %mm0
subl Cx, %ebx
2:
cmpl Cx, %ebx
jg 1b
movd %ebx, %mm6
punpcklwd %mm6, %mm6
punpckldq %mm6, %mm6
addl $4, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $6, %mm1
pmulhw %mm6, %mm1
paddw %mm1, %mm0
5:
movd %mm3, %eax
testl %eax, %eax
jz 6f
movl %esi, %eax
addl sow_4, %eax
movd (%eax), %mm2
punpcklbw %mm7, %mm2
psllw $6, %mm2
pmulhw %mm5, %mm2
movl $0x4000, %ebx
subl Mx, %ebx
jbe 5f
jmp 2f
1:
addl $4, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $6, %mm1
pmulhw %mm4, %mm1
paddw %mm1, %mm2
subl Cx, %ebx
2:
cmpl Cx, %ebx
jg 1b
addl $4, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $6, %mm1
pmulhw %mm6, %mm1
paddw %mm1, %mm2
5:
psubw %mm0, %mm2
psllw $3, %mm2
pmulhw %mm3, %mm2
paddw %mm2, %mm0
6:
psrlw $4, %mm0
packuswb %mm0, %mm0
movd %mm0, (%edi, %ecx, 4)
incl %ecx
jnz .down_up_loop_x
movl dow, %eax
leal (%edi, %eax, 4), %edi
addl $4, yap
addl $4, yp
decl y
jnz .down_up_loop_y
jmp .scale_leave
.scale_x_down_y_down:
movl sow, %eax
sall $2, %eax
movl %eax, sow_4
.down_down_loop_y:
movl yap, %eax
movzwl (%eax), %ebx
movl %ebx, My
movzwl 2(%eax), %eax
movl %eax, Cy
movl dw, %ecx
negl %ecx
.down_down_loop_x:
movl yp, %eax
movl (%eax), %esi
movl xp, %eax
movl (%eax, %ecx, 4), %eax
leal (%esi, %eax, 4), %esi
movl xap, %eax
movzwl (%eax, %ecx, 4), %ebx
movl %ebx, Mx
movzwl 2(%eax, %ecx, 4), %eax
movl %eax, Cx
movd %eax, %mm3
punpcklwd %mm3, %mm3
punpckldq %mm3, %mm3
movd %ebx, %mm5
punpcklwd %mm5, %mm5
punpckldq %mm5, %mm5
movl %esi, %eax
movd (%eax), %mm0
punpcklbw %mm7, %mm0
psllw $7, %mm0
pmulhw %mm5, %mm0
movl $0x4000, %ebx
subl Mx, %ebx
jbe 5f
jmp 2f
1:
addl $4, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $7, %mm1
pmulhw %mm3, %mm1
paddw %mm1, %mm0
subl Cx, %ebx
2:
cmpl Cx, %ebx
jg 1b
movd %ebx, %mm6
punpcklwd %mm6, %mm6
punpckldq %mm6, %mm6
addl $4, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $7, %mm1
pmulhw %mm6, %mm1
paddw %mm1, %mm0
5:
movd My, %mm4
punpcklwd %mm4, %mm4
punpckldq %mm4, %mm4
psllw $2, %mm0
pmulhw %mm4, %mm0
movl $0x4000, %edx
subl My, %edx
jbe 6f
jmp 4f
3:
addl sow_4, %esi
movl %esi, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $7, %mm1
pmulhw %mm5, %mm1
movl $0x4000, %ebx
subl Mx, %ebx
jbe 5f
jmp 2f
1:
addl $4, %eax
movd (%eax), %mm2
punpcklbw %mm7, %mm2
psllw $7, %mm2
pmulhw %mm3, %mm2
paddw %mm2, %mm1
subl Cx, %ebx
2:
cmpl Cx, %ebx
jg 1b
addl $4, %eax
movd (%eax), %mm2
punpcklbw %mm7, %mm2
psllw $7, %mm2
pmulhw %mm6, %mm2
paddw %mm2, %mm1
5:
movd Cy, %mm4
punpcklwd %mm4, %mm4
punpckldq %mm4, %mm4
psllw $2, %mm1
pmulhw %mm4, %mm1
paddw %mm1, %mm0
subl Cy, %edx
4:
cmpl Cy, %edx
jg 3b
addl sow_4, %esi
movl %esi, %eax
movd (%eax), %mm1
punpcklbw %mm7, %mm1
psllw $7, %mm1
pmulhw %mm5, %mm1
movl $0x4000, %ebx
subl Mx, %ebx
jbe 5f
jmp 2f
1:
addl $4, %eax
movd (%eax), %mm2
punpcklbw %mm7, %mm2
psllw $7, %mm2
pmulhw %mm3, %mm2
paddw %mm2, %mm1
subl Cx, %ebx
2:
cmpl Cx, %ebx
jg 1b
addl $4, %eax
movd (%eax), %mm2
punpcklbw %mm7, %mm2
psllw $7, %mm2
pmulhw %mm6, %mm2
paddw %mm2, %mm1
5:
movd %edx, %mm4
punpcklwd %mm4, %mm4
punpckldq %mm4, %mm4
psllw $2, %mm1
pmulhw %mm4, %mm1
paddw %mm1, %mm0
6:
psrlw $5, %mm0
packuswb %mm0, %mm0
movd %mm0, (%edi, %ecx, 4)
incl %ecx
jnz .down_down_loop_x
movl dow, %eax
leal (%edi, %eax, 4), %edi
addl $4, yap
addl $4, yp
decl y
jnz .down_down_loop_y
jmp .scale_leave
.scale_leave:
emms
popl %esi
popl %edi
popl %edx
popl %ecx
popl %ebx
movl %ebp, %esp
popl %ebp
ret
SIZE(imlib_Scale_mmx_AARGBA)
#endif
#ifdef __ELF__
.section .note.GNU-stack,"",@progbits
#endif