mirror of
https://gitlab.gnome.org/GNOME/gimp
synced 2024-10-22 20:41:43 +00:00
1571 lines
24 KiB
ArmAsm
1571 lines
24 KiB
ArmAsm
/*
|
|
MMX code to supplement some functions in paint_funcs.c
|
|
for the Gimp.
|
|
|
|
Copyright (C) 1999, 2001 David Monniaux
|
|
*/
|
|
|
|
.text
|
|
.align 4
|
|
|
|
.alpha_mask_1a: .int 0xFF00FF00, 0xFF00FF00
|
|
.mult_shift: .int 0x00800080, 0x00800080
|
|
.alpha_mask_3a: .int 0xFF000000, 0xFF000000
|
|
|
|
|
|
|
|
/* min(a,b) = a - max(a-b, 0) */
|
|
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl add_pixels_3a_3a
|
|
.type add_pixels_3a_3a,@function
|
|
add_pixels_3a_3a:
|
|
|
|
#else
|
|
|
|
.globl _add_pixels_3a_3a
|
|
_add_pixels_3a_3a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_3a, %mm0
|
|
|
|
subl $ 2, %ecx
|
|
jl .add_pixels_3a_3a_last
|
|
movl $ 8, %ebx
|
|
.add_pixels_3a_3a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
paddusb %mm3, %mm4
|
|
movq %mm0, %mm1
|
|
pandn %mm4, %mm1
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 2, %ecx
|
|
jge .add_pixels_3a_3a_loop
|
|
.add_pixels_3a_3a_last:
|
|
test $ 1, %ecx
|
|
jz .add_pixels_3a_3a_end
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
paddusb %mm3, %mm4
|
|
movq %mm0, %mm1
|
|
pandn %mm4, %mm1
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movd %mm1, (%edi)
|
|
.add_pixels_3a_3a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl add_pixels_1a_1a
|
|
.type add_pixels_1a_1a,@function
|
|
add_pixels_1a_1a:
|
|
|
|
#else
|
|
|
|
.globl _add_pixels_1a_1a
|
|
_add_pixels_1a_1a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_1a, %mm0
|
|
subl $ 4, %ecx
|
|
jl .add_pixels_1a_1a_last3
|
|
movl $ 8, %ebx
|
|
.add_pixels_1a_1a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
paddusb %mm3, %mm4
|
|
movq %mm0, %mm1
|
|
pandn %mm4, %mm1
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 4, %ecx
|
|
jge .add_pixels_1a_1a_loop
|
|
|
|
.add_pixels_1a_1a_last3:
|
|
test $ 2, %ecx
|
|
jz .add_pixels_1a_1a_last1
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
paddusb %mm3, %mm4
|
|
movq %mm0, %mm1
|
|
pandn %mm4, %mm1
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
addl $ 4, %eax
|
|
addl $ 4, %edx
|
|
addl $ 4, %edi
|
|
|
|
.add_pixels_1a_1a_last1:
|
|
test $ 1, %ecx
|
|
jz .add_pixels_1a_1a_end
|
|
|
|
movw (%eax), %bx
|
|
movd %ebx, %mm2
|
|
movw (%edx), %bx
|
|
movd %ebx, %mm3
|
|
|
|
movq %mm2, %mm4
|
|
paddusb %mm3, %mm4
|
|
movq %mm0, %mm1
|
|
pandn %mm4, %mm1
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movd %mm1, %ebx
|
|
movw %bx, (%edi)
|
|
|
|
.add_pixels_1a_1a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl substract_pixels_3a_3a
|
|
.type substract_pixels_3a_3a,@function
|
|
substract_pixels_3a_3a:
|
|
|
|
#else
|
|
|
|
.globl _substract_pixels_3a_3a
|
|
_substract_pixels_3a_3a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_3a, %mm0
|
|
|
|
subl $ 2, %ecx
|
|
jl .substract_pixels_3a_3a_last
|
|
movl $ 8, %ebx
|
|
.substract_pixels_3a_3a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
movq %mm0, %mm1
|
|
pandn %mm4, %mm1
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 2, %ecx
|
|
jge .substract_pixels_3a_3a_loop
|
|
.substract_pixels_3a_3a_last:
|
|
test $ 1, %ecx
|
|
jz .substract_pixels_3a_3a_end
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
movq %mm0, %mm1
|
|
pandn %mm4, %mm1
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movd %mm1, (%edi)
|
|
.substract_pixels_3a_3a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl substract_pixels_1a_1a
|
|
.type substract_pixels_1a_1a,@function
|
|
substract_pixels_1a_1a:
|
|
|
|
#else
|
|
|
|
.globl _substract_pixels_1a_1a
|
|
_substract_pixels_1a_1a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_1a, %mm0
|
|
subl $ 4, %ecx
|
|
jl .substract_pixels_1a_1a_last3
|
|
movl $ 8, %ebx
|
|
.substract_pixels_1a_1a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
movq %mm0, %mm1
|
|
pandn %mm4, %mm1
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 4, %ecx
|
|
jge .substract_pixels_1a_1a_loop
|
|
|
|
.substract_pixels_1a_1a_last3:
|
|
test $ 2, %ecx
|
|
jz .substract_pixels_1a_1a_last1
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
movq %mm0, %mm1
|
|
pandn %mm4, %mm1
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
addl $ 4, %eax
|
|
addl $ 4, %edx
|
|
addl $ 4, %edi
|
|
|
|
.substract_pixels_1a_1a_last1:
|
|
test $ 1, %ecx
|
|
jz .substract_pixels_1a_1a_end
|
|
|
|
movw (%eax), %bx
|
|
movd %ebx, %mm2
|
|
movw (%edx), %bx
|
|
movd %ebx, %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
movq %mm0, %mm1
|
|
pandn %mm4, %mm1
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movd %mm1, %ebx
|
|
movw %bx, (%edi)
|
|
|
|
.substract_pixels_1a_1a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl difference_pixels_3a_3a
|
|
.type difference_pixels_3a_3a,@function
|
|
difference_pixels_3a_3a:
|
|
|
|
#else
|
|
|
|
.globl _difference_pixels_3a_3a
|
|
_difference_pixels_3a_3a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_3a, %mm0
|
|
|
|
subl $ 2, %ecx
|
|
jl .difference_pixels_3a_3a_last
|
|
movl $ 8, %ebx
|
|
.difference_pixels_3a_3a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
movq %mm3, %mm5
|
|
psubusb %mm3, %mm4
|
|
psubusb %mm2, %mm5
|
|
movq %mm0, %mm1
|
|
paddb %mm5, %mm4
|
|
pandn %mm4, %mm1
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 2, %ecx
|
|
jge .difference_pixels_3a_3a_loop
|
|
.difference_pixels_3a_3a_last:
|
|
test $ 1, %ecx
|
|
jz .difference_pixels_3a_3a_end
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
movq %mm3, %mm5
|
|
psubusb %mm3, %mm4
|
|
psubusb %mm2, %mm5
|
|
movq %mm0, %mm1
|
|
paddb %mm5, %mm4
|
|
pandn %mm4, %mm1
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movd %mm1, (%edi)
|
|
.difference_pixels_3a_3a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl difference_pixels_1a_1a
|
|
.type difference_pixels_1a_1a,@function
|
|
difference_pixels_1a_1a:
|
|
|
|
#else
|
|
|
|
.globl _difference_pixels_1a_1a
|
|
_difference_pixels_1a_1a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_1a, %mm0
|
|
subl $ 4, %ecx
|
|
jl .difference_pixels_1a_1a_last3
|
|
movl $ 8, %ebx
|
|
.difference_pixels_1a_1a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
movq %mm3, %mm5
|
|
psubusb %mm3, %mm4
|
|
psubusb %mm2, %mm5
|
|
movq %mm0, %mm1
|
|
paddb %mm5, %mm4
|
|
pandn %mm4, %mm1
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 4, %ecx
|
|
jge .difference_pixels_1a_1a_loop
|
|
|
|
.difference_pixels_1a_1a_last3:
|
|
test $ 2, %ecx
|
|
jz .difference_pixels_1a_1a_last1
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
movq %mm3, %mm5
|
|
psubusb %mm3, %mm4
|
|
psubusb %mm2, %mm5
|
|
movq %mm0, %mm1
|
|
paddb %mm5, %mm4
|
|
pandn %mm4, %mm1
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
addl $ 4, %eax
|
|
addl $ 4, %edx
|
|
addl $ 4, %edi
|
|
|
|
.difference_pixels_1a_1a_last1:
|
|
test $ 1, %ecx
|
|
jz .difference_pixels_1a_1a_end
|
|
|
|
movw (%eax), %bx
|
|
movd %ebx, %mm2
|
|
movw (%edx), %bx
|
|
movd %ebx, %mm3
|
|
|
|
movq %mm2, %mm4
|
|
movq %mm3, %mm5
|
|
psubusb %mm3, %mm4
|
|
psubusb %mm2, %mm5
|
|
movq %mm0, %mm1
|
|
paddb %mm5, %mm4
|
|
pandn %mm4, %mm1
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movd %mm1, %ebx
|
|
movw %bx, (%edi)
|
|
|
|
.difference_pixels_1a_1a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl multiply_pixels_3a_3a
|
|
.type multiply_pixels_3a_3a,@function
|
|
multiply_pixels_3a_3a:
|
|
|
|
#else
|
|
|
|
.globl _multiply_pixels_3a_3a
|
|
_multiply_pixels_3a_3a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_3a, %mm0
|
|
|
|
movq .mult_shift, %mm7
|
|
pxor %mm6, %mm6
|
|
subl $ 2, %ecx
|
|
jl .multiply_pixels_3a_3a_last
|
|
movl $ 8, %ebx
|
|
.multiply_pixels_3a_3a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
|
|
movq %mm2, %mm1
|
|
punpcklbw %mm6, %mm1
|
|
movq %mm3, %mm5
|
|
punpcklbw %mm6, %mm5
|
|
pmullw %mm5, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
punpckhbw %mm6, %mm4
|
|
movq %mm3, %mm5
|
|
punpckhbw %mm6, %mm5
|
|
pmullw %mm5, %mm4
|
|
paddw %mm7, %mm4
|
|
movq %mm4, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm4
|
|
psrlw $ 8, %mm4
|
|
|
|
packuswb %mm4, %mm1
|
|
|
|
movq %mm0, %mm4
|
|
pandn %mm1, %mm4
|
|
movq %mm4, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 2, %ecx
|
|
jge .multiply_pixels_3a_3a_loop
|
|
.multiply_pixels_3a_3a_last:
|
|
test $ 1, %ecx
|
|
jz .multiply_pixels_3a_3a_end
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
|
|
movq %mm2, %mm1
|
|
punpcklbw %mm6, %mm1
|
|
movq %mm3, %mm5
|
|
punpcklbw %mm6, %mm5
|
|
pmullw %mm5, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
punpckhbw %mm6, %mm4
|
|
movq %mm3, %mm5
|
|
punpckhbw %mm6, %mm5
|
|
pmullw %mm5, %mm4
|
|
paddw %mm7, %mm4
|
|
movq %mm4, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm4
|
|
psrlw $ 8, %mm4
|
|
|
|
packuswb %mm4, %mm1
|
|
|
|
movq %mm0, %mm4
|
|
pandn %mm1, %mm4
|
|
movq %mm4, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movd %mm1, (%edi)
|
|
.multiply_pixels_3a_3a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl multiply_pixels_1a_1a
|
|
.type multiply_pixels_1a_1a,@function
|
|
multiply_pixels_1a_1a:
|
|
|
|
#else
|
|
|
|
.globl _multiply_pixels_1a_1a
|
|
_multiply_pixels_1a_1a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_1a, %mm0
|
|
subl $ 4, %ecx
|
|
jl .multiply_pixels_1a_1a_last3
|
|
movl $ 8, %ebx
|
|
.multiply_pixels_1a_1a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
|
|
movq %mm2, %mm1
|
|
punpcklbw %mm6, %mm1
|
|
movq %mm3, %mm5
|
|
punpcklbw %mm6, %mm5
|
|
pmullw %mm5, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
punpckhbw %mm6, %mm4
|
|
movq %mm3, %mm5
|
|
punpckhbw %mm6, %mm5
|
|
pmullw %mm5, %mm4
|
|
paddw %mm7, %mm4
|
|
movq %mm4, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm4
|
|
psrlw $ 8, %mm4
|
|
|
|
packuswb %mm4, %mm1
|
|
|
|
movq %mm0, %mm4
|
|
pandn %mm1, %mm4
|
|
movq %mm4, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 4, %ecx
|
|
jge .multiply_pixels_1a_1a_loop
|
|
|
|
.multiply_pixels_1a_1a_last3:
|
|
test $ 2, %ecx
|
|
jz .multiply_pixels_1a_1a_last1
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
|
|
movq %mm2, %mm1
|
|
punpcklbw %mm6, %mm1
|
|
movq %mm3, %mm5
|
|
punpcklbw %mm6, %mm5
|
|
pmullw %mm5, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
punpckhbw %mm6, %mm4
|
|
movq %mm3, %mm5
|
|
punpckhbw %mm6, %mm5
|
|
pmullw %mm5, %mm4
|
|
paddw %mm7, %mm4
|
|
movq %mm4, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm4
|
|
psrlw $ 8, %mm4
|
|
|
|
packuswb %mm4, %mm1
|
|
|
|
movq %mm0, %mm4
|
|
pandn %mm1, %mm4
|
|
movq %mm4, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
addl $ 4, %eax
|
|
addl $ 4, %edx
|
|
addl $ 4, %edi
|
|
|
|
.multiply_pixels_1a_1a_last1:
|
|
test $ 1, %ecx
|
|
jz .multiply_pixels_1a_1a_end
|
|
|
|
movw (%eax), %bx
|
|
movd %ebx, %mm2
|
|
movw (%edx), %bx
|
|
movd %ebx, %mm3
|
|
|
|
|
|
movq %mm2, %mm1
|
|
punpcklbw %mm6, %mm1
|
|
movq %mm3, %mm5
|
|
punpcklbw %mm6, %mm5
|
|
pmullw %mm5, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
punpckhbw %mm6, %mm4
|
|
movq %mm3, %mm5
|
|
punpckhbw %mm6, %mm5
|
|
pmullw %mm5, %mm4
|
|
paddw %mm7, %mm4
|
|
movq %mm4, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm4
|
|
psrlw $ 8, %mm4
|
|
|
|
packuswb %mm4, %mm1
|
|
|
|
movq %mm0, %mm4
|
|
pandn %mm1, %mm4
|
|
movq %mm4, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movd %mm1, %ebx
|
|
movw %bx, (%edi)
|
|
|
|
.multiply_pixels_1a_1a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
/* Could be perhaps more optimized */
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl darken_pixels_3a_3a
|
|
.type darken_pixels_3a_3a,@function
|
|
darken_pixels_3a_3a:
|
|
|
|
#else
|
|
|
|
.globl _darken_pixels_3a_3a
|
|
_darken_pixels_3a_3a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_3a, %mm0
|
|
|
|
subl $ 2, %ecx
|
|
jl .darken_pixels_3a_3a_last
|
|
movl $ 8, %ebx
|
|
.darken_pixels_3a_3a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
movq %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 2, %ecx
|
|
jge .darken_pixels_3a_3a_loop
|
|
.darken_pixels_3a_3a_last:
|
|
test $ 1, %ecx
|
|
jz .darken_pixels_3a_3a_end
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
movq %mm2, %mm1
|
|
movd %mm1, (%edi)
|
|
.darken_pixels_3a_3a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl darken_pixels_1a_1a
|
|
.type darken_pixels_1a_1a,@function
|
|
darken_pixels_1a_1a:
|
|
|
|
#else
|
|
|
|
.globl _darken_pixels_1a_1a
|
|
_darken_pixels_1a_1a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_1a, %mm0
|
|
subl $ 4, %ecx
|
|
jl .darken_pixels_1a_1a_last3
|
|
movl $ 8, %ebx
|
|
.darken_pixels_1a_1a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
movq %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 4, %ecx
|
|
jge .darken_pixels_1a_1a_loop
|
|
|
|
.darken_pixels_1a_1a_last3:
|
|
test $ 2, %ecx
|
|
jz .darken_pixels_1a_1a_last1
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
movq %mm2, %mm1
|
|
addl $ 4, %eax
|
|
addl $ 4, %edx
|
|
addl $ 4, %edi
|
|
|
|
.darken_pixels_1a_1a_last1:
|
|
test $ 1, %ecx
|
|
jz .darken_pixels_1a_1a_end
|
|
|
|
movw (%eax), %bx
|
|
movd %ebx, %mm2
|
|
movw (%edx), %bx
|
|
movd %ebx, %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
movq %mm2, %mm1
|
|
movd %mm1, %ebx
|
|
movw %bx, (%edi)
|
|
|
|
.darken_pixels_1a_1a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl lighten_pixels_3a_3a
|
|
.type lighten_pixels_3a_3a,@function
|
|
lighten_pixels_3a_3a:
|
|
|
|
#else
|
|
|
|
.globl _lighten_pixels_3a_3a
|
|
_lighten_pixels_3a_3a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_3a, %mm0
|
|
|
|
subl $ 2, %ecx
|
|
jl .lighten_pixels_3a_3a_last
|
|
movl $ 8, %ebx
|
|
.lighten_pixels_3a_3a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
paddb %mm4, %mm3
|
|
movq %mm0, %mm1
|
|
pandn %mm3, %mm1
|
|
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 2, %ecx
|
|
jge .lighten_pixels_3a_3a_loop
|
|
.lighten_pixels_3a_3a_last:
|
|
test $ 1, %ecx
|
|
jz .lighten_pixels_3a_3a_end
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
paddb %mm4, %mm3
|
|
movq %mm0, %mm1
|
|
pandn %mm3, %mm1
|
|
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movd %mm1, (%edi)
|
|
.lighten_pixels_3a_3a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl lighten_pixels_1a_1a
|
|
.type lighten_pixels_1a_1a,@function
|
|
lighten_pixels_1a_1a:
|
|
|
|
#else
|
|
|
|
.globl _lighten_pixels_1a_1a
|
|
_lighten_pixels_1a_1a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_1a, %mm0
|
|
subl $ 4, %ecx
|
|
jl .lighten_pixels_1a_1a_last3
|
|
movl $ 8, %ebx
|
|
.lighten_pixels_1a_1a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
paddb %mm4, %mm3
|
|
movq %mm0, %mm1
|
|
pandn %mm3, %mm1
|
|
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 4, %ecx
|
|
jge .lighten_pixels_1a_1a_loop
|
|
|
|
.lighten_pixels_1a_1a_last3:
|
|
test $ 2, %ecx
|
|
jz .lighten_pixels_1a_1a_last1
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
paddb %mm4, %mm3
|
|
movq %mm0, %mm1
|
|
pandn %mm3, %mm1
|
|
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
addl $ 4, %eax
|
|
addl $ 4, %edx
|
|
addl $ 4, %edi
|
|
|
|
.lighten_pixels_1a_1a_last1:
|
|
test $ 1, %ecx
|
|
jz .lighten_pixels_1a_1a_end
|
|
|
|
movw (%eax), %bx
|
|
movd %ebx, %mm2
|
|
movw (%edx), %bx
|
|
movd %ebx, %mm3
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
paddb %mm4, %mm3
|
|
movq %mm0, %mm1
|
|
pandn %mm3, %mm1
|
|
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
movd %mm1, %ebx
|
|
movw %bx, (%edi)
|
|
|
|
.lighten_pixels_1a_1a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl screen_pixels_3a_3a
|
|
.type screen_pixels_3a_3a,@function
|
|
screen_pixels_3a_3a:
|
|
|
|
#else
|
|
|
|
.globl _screen_pixels_3a_3a
|
|
_screen_pixels_3a_3a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_3a, %mm0
|
|
|
|
movq .mult_shift, %mm7
|
|
pxor %mm6, %mm6
|
|
subl $ 2, %ecx
|
|
jl .screen_pixels_3a_3a_last
|
|
movl $ 8, %ebx
|
|
.screen_pixels_3a_3a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
|
|
pcmpeqb %mm4, %mm4
|
|
psubb %mm2, %mm4
|
|
pcmpeqb %mm5, %mm5
|
|
psubb %mm3, %mm5
|
|
|
|
movq %mm4, %mm1
|
|
punpcklbw %mm6, %mm1
|
|
movq %mm5, %mm3
|
|
punpcklbw %mm6, %mm3
|
|
pmullw %mm3, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm3
|
|
psrlw $ 8, %mm3
|
|
paddw %mm3, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
movq %mm4, %mm2
|
|
punpckhbw %mm6, %mm2
|
|
movq %mm5, %mm3
|
|
punpckhbw %mm6, %mm3
|
|
pmullw %mm3, %mm2
|
|
paddw %mm7, %mm2
|
|
movq %mm2, %mm3
|
|
psrlw $ 8, %mm3
|
|
paddw %mm3, %mm2
|
|
psrlw $ 8, %mm2
|
|
|
|
packuswb %mm2, %mm1
|
|
|
|
pcmpeqb %mm3, %mm3
|
|
psubb %mm1, %mm3
|
|
|
|
movq %mm0, %mm1
|
|
pandn %mm3, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm5, %mm2
|
|
paddb %mm2, %mm5
|
|
pcmpeqb %mm3, %mm3
|
|
psubb %mm5, %mm3
|
|
|
|
pand %mm0, %mm3
|
|
por %mm3, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 2, %ecx
|
|
jge .screen_pixels_3a_3a_loop
|
|
.screen_pixels_3a_3a_last:
|
|
test $ 1, %ecx
|
|
jz .screen_pixels_3a_3a_end
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
|
|
pcmpeqb %mm4, %mm4
|
|
psubb %mm2, %mm4
|
|
pcmpeqb %mm5, %mm5
|
|
psubb %mm3, %mm5
|
|
|
|
movq %mm4, %mm1
|
|
punpcklbw %mm6, %mm1
|
|
movq %mm5, %mm3
|
|
punpcklbw %mm6, %mm3
|
|
pmullw %mm3, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm3
|
|
psrlw $ 8, %mm3
|
|
paddw %mm3, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
movq %mm4, %mm2
|
|
punpckhbw %mm6, %mm2
|
|
movq %mm5, %mm3
|
|
punpckhbw %mm6, %mm3
|
|
pmullw %mm3, %mm2
|
|
paddw %mm7, %mm2
|
|
movq %mm2, %mm3
|
|
psrlw $ 8, %mm3
|
|
paddw %mm3, %mm2
|
|
psrlw $ 8, %mm2
|
|
|
|
packuswb %mm2, %mm1
|
|
|
|
pcmpeqb %mm3, %mm3
|
|
psubb %mm1, %mm3
|
|
|
|
movq %mm0, %mm1
|
|
pandn %mm3, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm5, %mm2
|
|
paddb %mm2, %mm5
|
|
pcmpeqb %mm3, %mm3
|
|
psubb %mm5, %mm3
|
|
|
|
pand %mm0, %mm3
|
|
por %mm3, %mm1
|
|
movd %mm1, (%edi)
|
|
.screen_pixels_3a_3a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl screen_pixels_1a_1a
|
|
.type screen_pixels_1a_1a,@function
|
|
screen_pixels_1a_1a:
|
|
|
|
#else
|
|
|
|
.globl _screen_pixels_1a_1a
|
|
_screen_pixels_1a_1a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_1a, %mm0
|
|
subl $ 4, %ecx
|
|
jl .screen_pixels_1a_1a_last3
|
|
movl $ 8, %ebx
|
|
.screen_pixels_1a_1a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
|
|
|
|
pcmpeqb %mm4, %mm4
|
|
psubb %mm2, %mm4
|
|
pcmpeqb %mm5, %mm5
|
|
psubb %mm3, %mm5
|
|
|
|
movq %mm4, %mm1
|
|
punpcklbw %mm6, %mm1
|
|
movq %mm5, %mm3
|
|
punpcklbw %mm6, %mm3
|
|
pmullw %mm3, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm3
|
|
psrlw $ 8, %mm3
|
|
paddw %mm3, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
movq %mm4, %mm2
|
|
punpckhbw %mm6, %mm2
|
|
movq %mm5, %mm3
|
|
punpckhbw %mm6, %mm3
|
|
pmullw %mm3, %mm2
|
|
paddw %mm7, %mm2
|
|
movq %mm2, %mm3
|
|
psrlw $ 8, %mm3
|
|
paddw %mm3, %mm2
|
|
psrlw $ 8, %mm2
|
|
|
|
packuswb %mm2, %mm1
|
|
|
|
pcmpeqb %mm3, %mm3
|
|
psubb %mm1, %mm3
|
|
|
|
movq %mm0, %mm1
|
|
pandn %mm3, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm5, %mm2
|
|
paddb %mm2, %mm5
|
|
pcmpeqb %mm3, %mm3
|
|
psubb %mm5, %mm3
|
|
|
|
pand %mm0, %mm3
|
|
por %mm3, %mm1
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 4, %ecx
|
|
jge .screen_pixels_1a_1a_loop
|
|
|
|
.screen_pixels_1a_1a_last3:
|
|
test $ 2, %ecx
|
|
jz .screen_pixels_1a_1a_last1
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
|
|
|
|
pcmpeqb %mm4, %mm4
|
|
psubb %mm2, %mm4
|
|
pcmpeqb %mm5, %mm5
|
|
psubb %mm3, %mm5
|
|
|
|
movq %mm4, %mm1
|
|
punpcklbw %mm6, %mm1
|
|
movq %mm5, %mm3
|
|
punpcklbw %mm6, %mm3
|
|
pmullw %mm3, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm3
|
|
psrlw $ 8, %mm3
|
|
paddw %mm3, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
movq %mm4, %mm2
|
|
punpckhbw %mm6, %mm2
|
|
movq %mm5, %mm3
|
|
punpckhbw %mm6, %mm3
|
|
pmullw %mm3, %mm2
|
|
paddw %mm7, %mm2
|
|
movq %mm2, %mm3
|
|
psrlw $ 8, %mm3
|
|
paddw %mm3, %mm2
|
|
psrlw $ 8, %mm2
|
|
|
|
packuswb %mm2, %mm1
|
|
|
|
pcmpeqb %mm3, %mm3
|
|
psubb %mm1, %mm3
|
|
|
|
movq %mm0, %mm1
|
|
pandn %mm3, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm5, %mm2
|
|
paddb %mm2, %mm5
|
|
pcmpeqb %mm3, %mm3
|
|
psubb %mm5, %mm3
|
|
|
|
pand %mm0, %mm3
|
|
por %mm3, %mm1
|
|
addl $ 4, %eax
|
|
addl $ 4, %edx
|
|
addl $ 4, %edi
|
|
|
|
.screen_pixels_1a_1a_last1:
|
|
test $ 1, %ecx
|
|
jz .screen_pixels_1a_1a_end
|
|
|
|
movw (%eax), %bx
|
|
movd %ebx, %mm2
|
|
movw (%edx), %bx
|
|
movd %ebx, %mm3
|
|
|
|
|
|
pcmpeqb %mm4, %mm4
|
|
psubb %mm2, %mm4
|
|
pcmpeqb %mm5, %mm5
|
|
psubb %mm3, %mm5
|
|
|
|
movq %mm4, %mm1
|
|
punpcklbw %mm6, %mm1
|
|
movq %mm5, %mm3
|
|
punpcklbw %mm6, %mm3
|
|
pmullw %mm3, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm3
|
|
psrlw $ 8, %mm3
|
|
paddw %mm3, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
movq %mm4, %mm2
|
|
punpckhbw %mm6, %mm2
|
|
movq %mm5, %mm3
|
|
punpckhbw %mm6, %mm3
|
|
pmullw %mm3, %mm2
|
|
paddw %mm7, %mm2
|
|
movq %mm2, %mm3
|
|
psrlw $ 8, %mm3
|
|
paddw %mm3, %mm2
|
|
psrlw $ 8, %mm2
|
|
|
|
packuswb %mm2, %mm1
|
|
|
|
pcmpeqb %mm3, %mm3
|
|
psubb %mm1, %mm3
|
|
|
|
movq %mm0, %mm1
|
|
pandn %mm3, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm5, %mm2
|
|
paddb %mm2, %mm5
|
|
pcmpeqb %mm3, %mm3
|
|
psubb %mm5, %mm3
|
|
|
|
pand %mm0, %mm3
|
|
por %mm3, %mm1
|
|
movd %mm1, %ebx
|
|
movw %bx, (%edi)
|
|
|
|
.screen_pixels_1a_1a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
.lower_ff: .int 0x00FF00FF, 0x00FF00FF
|
|
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl overlay_pixels_3a_3a
|
|
.type overlay_pixels_3a_3a,@function
|
|
overlay_pixels_3a_3a:
|
|
|
|
#else
|
|
|
|
.globl _overlay_pixels_3a_3a
|
|
_overlay_pixels_3a_3a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_3a, %mm0
|
|
|
|
movq .mult_shift, %mm7
|
|
pxor %mm6, %mm6
|
|
subl $ 2, %ecx
|
|
jl .overlay_pixels_3a_3a_last
|
|
movl $ 8, %ebx
|
|
.overlay_pixels_3a_3a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
call op_overlay
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 2, %ecx
|
|
jge .overlay_pixels_3a_3a_loop
|
|
.overlay_pixels_3a_3a_last:
|
|
test $ 1, %ecx
|
|
jz .overlay_pixels_3a_3a_end
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
call op_overlay
|
|
movd %mm1, (%edi)
|
|
.overlay_pixels_3a_3a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
#ifndef __MINGW32__
|
|
|
|
.globl overlay_pixels_1a_1a
|
|
.type overlay_pixels_1a_1a,@function
|
|
overlay_pixels_1a_1a:
|
|
|
|
#else
|
|
|
|
.globl _overlay_pixels_1a_1a
|
|
_overlay_pixels_1a_1a:
|
|
|
|
#endif
|
|
|
|
.align 16
|
|
pushl %edi
|
|
pushl %ebx
|
|
movl 12(%esp), %edi
|
|
movq .alpha_mask_1a, %mm0
|
|
subl $ 4, %ecx
|
|
jl .overlay_pixels_1a_1a_last3
|
|
movl $ 8, %ebx
|
|
.overlay_pixels_1a_1a_loop:
|
|
movq (%eax), %mm2
|
|
movq (%edx), %mm3
|
|
call op_overlay
|
|
movq %mm1, (%edi)
|
|
addl %ebx, %eax
|
|
addl %ebx, %edx
|
|
addl %ebx, %edi
|
|
subl $ 4, %ecx
|
|
jge .overlay_pixels_1a_1a_loop
|
|
|
|
.overlay_pixels_1a_1a_last3:
|
|
test $ 2, %ecx
|
|
jz .overlay_pixels_1a_1a_last1
|
|
movd (%eax), %mm2
|
|
movd (%edx), %mm3
|
|
call op_overlay
|
|
addl $ 4, %eax
|
|
addl $ 4, %edx
|
|
addl $ 4, %edi
|
|
|
|
.overlay_pixels_1a_1a_last1:
|
|
test $ 1, %ecx
|
|
jz .overlay_pixels_1a_1a_end
|
|
|
|
movw (%eax), %bx
|
|
movd %ebx, %mm2
|
|
movw (%edx), %bx
|
|
movd %ebx, %mm3
|
|
call op_overlay
|
|
movd %mm1, %ebx
|
|
movw %bx, (%edi)
|
|
|
|
.overlay_pixels_1a_1a_end:
|
|
|
|
emms
|
|
popl %ebx
|
|
popl %edi
|
|
ret
|
|
|
|
op_overlay:
|
|
movq %mm2, %mm1
|
|
punpcklbw %mm6, %mm1
|
|
movq %mm3, %mm5
|
|
punpcklbw %mm6, %mm5
|
|
pmullw %mm5, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
pcmpeqb %mm4, %mm4
|
|
psubb %mm2, %mm4
|
|
punpcklbw %mm6, %mm4
|
|
pcmpeqb %mm5, %mm5
|
|
psubb %mm3, %mm5
|
|
punpcklbw %mm6, %mm5
|
|
pmullw %mm5, %mm4
|
|
paddw %mm7, %mm4
|
|
movq %mm4, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm4
|
|
psrlw $ 8, %mm4
|
|
|
|
movq .lower_ff, %mm5
|
|
psubw %mm4, %mm5
|
|
|
|
psubw %mm1, %mm5
|
|
movq %mm2, %mm4
|
|
punpcklbw %mm6, %mm4
|
|
pmullw %mm4, %mm5
|
|
paddw %mm7, %mm5
|
|
movq %mm5, %mm4
|
|
psrlw $ 8, %mm4
|
|
paddw %mm4, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm1, %mm5
|
|
|
|
subl $ 8, %esp
|
|
movq %mm5, (%esp)
|
|
|
|
movq %mm2, %mm1
|
|
punpckhbw %mm6, %mm1
|
|
movq %mm3, %mm5
|
|
punpckhbw %mm6, %mm5
|
|
pmullw %mm5, %mm1
|
|
paddw %mm7, %mm1
|
|
movq %mm1, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm1
|
|
psrlw $ 8, %mm1
|
|
|
|
pcmpeqb %mm4, %mm4
|
|
psubb %mm2, %mm4
|
|
punpckhbw %mm6, %mm4
|
|
pcmpeqb %mm5, %mm5
|
|
psubb %mm3, %mm5
|
|
punpckhbw %mm6, %mm5
|
|
pmullw %mm5, %mm4
|
|
paddw %mm7, %mm4
|
|
movq %mm4, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm5, %mm4
|
|
psrlw $ 8, %mm4
|
|
|
|
movq .lower_ff, %mm5
|
|
psubw %mm4, %mm5
|
|
|
|
psubw %mm1, %mm5
|
|
movq %mm2, %mm4
|
|
punpckhbw %mm6, %mm4
|
|
pmullw %mm4, %mm5
|
|
paddw %mm7, %mm5
|
|
movq %mm5, %mm4
|
|
psrlw $ 8, %mm4
|
|
paddw %mm4, %mm5
|
|
psrlw $ 8, %mm5
|
|
paddw %mm1, %mm5
|
|
|
|
movq (%esp), %mm4
|
|
addl $ 8, %esp
|
|
|
|
packuswb %mm5, %mm4
|
|
movq %mm0, %mm1
|
|
pandn %mm4, %mm1
|
|
|
|
movq %mm2, %mm4
|
|
psubusb %mm3, %mm4
|
|
psubb %mm4, %mm2
|
|
pand %mm0, %mm2
|
|
por %mm2, %mm1
|
|
ret
|