| Index: simd/jdsamss2.asm
 | 
| diff --git a/simd/jdsamss2.asm b/simd/jdsamss2.asm
 | 
| deleted file mode 100644
 | 
| index c91a863b9af0e949a62f1fb6c3386d3a615f50f0..0000000000000000000000000000000000000000
 | 
| --- a/simd/jdsamss2.asm
 | 
| +++ /dev/null
 | 
| @@ -1,729 +0,0 @@
 | 
| -;
 | 
| -; jdsamss2.asm - upsampling (SSE2)
 | 
| -;
 | 
| -; Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
 | 
| -;
 | 
| -; Based on
 | 
| -; x86 SIMD extension for IJG JPEG library
 | 
| -; Copyright (C) 1999-2006, MIYASAKA Masaru.
 | 
| -; For conditions of distribution and use, see copyright notice in jsimdext.inc
 | 
| -;
 | 
| -; This file should be assembled with NASM (Netwide Assembler),
 | 
| -; can *not* be assembled with Microsoft's MASM or any compatible
 | 
| -; assembler (including Borland's Turbo Assembler).
 | 
| -; NASM is available from http://nasm.sourceforge.net/ or
 | 
| -; http://sourceforge.net/project/showfiles.php?group_id=6208
 | 
| -;
 | 
| -; [TAB8]
 | 
| -
 | 
| -%include "jsimdext.inc"
 | 
| -
 | 
| -; --------------------------------------------------------------------------
 | 
| -	SECTION	SEG_CONST
 | 
| -
 | 
| -	alignz	16
 | 
| -	global	EXTN(jconst_fancy_upsample_sse2) PRIVATE
 | 
| -
 | 
| -EXTN(jconst_fancy_upsample_sse2):
 | 
| -
 | 
| -PW_ONE		times 8 dw  1
 | 
| -PW_TWO		times 8 dw  2
 | 
| -PW_THREE	times 8 dw  3
 | 
| -PW_SEVEN	times 8 dw  7
 | 
| -PW_EIGHT	times 8 dw  8
 | 
| -
 | 
| -	alignz	16
 | 
| -
 | 
| -; --------------------------------------------------------------------------
 | 
| -	SECTION	SEG_TEXT
 | 
| -	BITS	32
 | 
| -;
 | 
| -; Fancy processing for the common case of 2:1 horizontal and 1:1 vertical.
 | 
| -;
 | 
| -; The upsampling algorithm is linear interpolation between pixel centers,
 | 
| -; also known as a "triangle filter".  This is a good compromise between
 | 
| -; speed and visual quality.  The centers of the output pixels are 1/4 and 3/4
 | 
| -; of the way between input pixel centers.
 | 
| -;
 | 
| -; GLOBAL(void)
 | 
| -; jsimd_h2v1_fancy_upsample_sse2 (int max_v_samp_factor,
 | 
| -;                                 JDIMENSION downsampled_width,
 | 
| -;                                 JSAMPARRAY input_data,
 | 
| -;                                 JSAMPARRAY * output_data_ptr);
 | 
| -;
 | 
| -
 | 
| -%define max_v_samp(b)		(b)+8			; int max_v_samp_factor
 | 
| -%define downsamp_width(b)	(b)+12	; JDIMENSION downsampled_width
 | 
| -%define input_data(b)		(b)+16		; JSAMPARRAY input_data
 | 
| -%define output_data_ptr(b)	(b)+20		; JSAMPARRAY * output_data_ptr
 | 
| -
 | 
| -	align	16
 | 
| -	global	EXTN(jsimd_h2v1_fancy_upsample_sse2) PRIVATE
 | 
| -
 | 
| -EXTN(jsimd_h2v1_fancy_upsample_sse2):
 | 
| -	push	ebp
 | 
| -	mov	ebp,esp
 | 
| -	pushpic	ebx
 | 
| -;	push	ecx		; need not be preserved
 | 
| -;	push	edx		; need not be preserved
 | 
| -	push	esi
 | 
| -	push	edi
 | 
| -
 | 
| -	get_GOT	ebx		; get GOT address
 | 
| -
 | 
| -	mov	eax, JDIMENSION [downsamp_width(ebp)]  ; colctr
 | 
| -	test	eax,eax
 | 
| -	jz	near .return
 | 
| -
 | 
| -	mov	ecx, INT [max_v_samp(ebp)]	; rowctr
 | 
| -	test	ecx,ecx
 | 
| -	jz	near .return
 | 
| -
 | 
| -	mov	esi, JSAMPARRAY [input_data(ebp)]	; input_data
 | 
| -	mov	edi, POINTER [output_data_ptr(ebp)]
 | 
| -	mov	edi, JSAMPARRAY [edi]			; output_data
 | 
| -	alignx	16,7
 | 
| -.rowloop:
 | 
| -	push	eax			; colctr
 | 
| -	push	edi
 | 
| -	push	esi
 | 
| -
 | 
| -	mov	esi, JSAMPROW [esi]	; inptr
 | 
| -	mov	edi, JSAMPROW [edi]	; outptr
 | 
| -
 | 
| -	test	eax, SIZEOF_XMMWORD-1
 | 
| -	jz	short .skip
 | 
| -	mov	dl, JSAMPLE [esi+(eax-1)*SIZEOF_JSAMPLE]
 | 
| -	mov	JSAMPLE [esi+eax*SIZEOF_JSAMPLE], dl	; insert a dummy sample
 | 
| -.skip:
 | 
| -	pxor	xmm0,xmm0		; xmm0=(all 0's)
 | 
| -	pcmpeqb	xmm7,xmm7
 | 
| -	psrldq	xmm7,(SIZEOF_XMMWORD-1)
 | 
| -	pand	xmm7, XMMWORD [esi+0*SIZEOF_XMMWORD]
 | 
| -
 | 
| -	add	eax, byte SIZEOF_XMMWORD-1
 | 
| -	and	eax, byte -SIZEOF_XMMWORD
 | 
| -	cmp	eax, byte SIZEOF_XMMWORD
 | 
| -	ja	short .columnloop
 | 
| -	alignx	16,7
 | 
| -
 | 
| -.columnloop_last:
 | 
| -	pcmpeqb	xmm6,xmm6
 | 
| -	pslldq	xmm6,(SIZEOF_XMMWORD-1)
 | 
| -	pand	xmm6, XMMWORD [esi+0*SIZEOF_XMMWORD]
 | 
| -	jmp	short .upsample
 | 
| -	alignx	16,7
 | 
| -
 | 
| -.columnloop:
 | 
| -	movdqa	xmm6, XMMWORD [esi+1*SIZEOF_XMMWORD]
 | 
| -	pslldq	xmm6,(SIZEOF_XMMWORD-1)
 | 
| -
 | 
| -.upsample:
 | 
| -	movdqa	xmm1, XMMWORD [esi+0*SIZEOF_XMMWORD]
 | 
| -	movdqa	xmm2,xmm1
 | 
| -	movdqa	xmm3,xmm1		; xmm1=( 0  1  2 ... 13 14 15)
 | 
| -	pslldq	xmm2,1			; xmm2=(--  0  1 ... 12 13 14)
 | 
| -	psrldq	xmm3,1			; xmm3=( 1  2  3 ... 14 15 --)
 | 
| -
 | 
| -	por	xmm2,xmm7		; xmm2=(-1  0  1 ... 12 13 14)
 | 
| -	por	xmm3,xmm6		; xmm3=( 1  2  3 ... 14 15 16)
 | 
| -
 | 
| -	movdqa	xmm7,xmm1
 | 
| -	psrldq	xmm7,(SIZEOF_XMMWORD-1)	; xmm7=(15 -- -- ... -- -- --)
 | 
| -
 | 
| -	movdqa    xmm4,xmm1
 | 
| -	punpcklbw xmm1,xmm0		; xmm1=( 0  1  2  3  4  5  6  7)
 | 
| -	punpckhbw xmm4,xmm0		; xmm4=( 8  9 10 11 12 13 14 15)
 | 
| -	movdqa    xmm5,xmm2
 | 
| -	punpcklbw xmm2,xmm0		; xmm2=(-1  0  1  2  3  4  5  6)
 | 
| -	punpckhbw xmm5,xmm0		; xmm5=( 7  8  9 10 11 12 13 14)
 | 
| -	movdqa    xmm6,xmm3
 | 
| -	punpcklbw xmm3,xmm0		; xmm3=( 1  2  3  4  5  6  7  8)
 | 
| -	punpckhbw xmm6,xmm0		; xmm6=( 9 10 11 12 13 14 15 16)
 | 
| -
 | 
| -	pmullw	xmm1,[GOTOFF(ebx,PW_THREE)]
 | 
| -	pmullw	xmm4,[GOTOFF(ebx,PW_THREE)]
 | 
| -	paddw	xmm2,[GOTOFF(ebx,PW_ONE)]
 | 
| -	paddw	xmm5,[GOTOFF(ebx,PW_ONE)]
 | 
| -	paddw	xmm3,[GOTOFF(ebx,PW_TWO)]
 | 
| -	paddw	xmm6,[GOTOFF(ebx,PW_TWO)]
 | 
| -
 | 
| -	paddw	xmm2,xmm1
 | 
| -	paddw	xmm5,xmm4
 | 
| -	psrlw	xmm2,2			; xmm2=OutLE=( 0  2  4  6  8 10 12 14)
 | 
| -	psrlw	xmm5,2			; xmm5=OutHE=(16 18 20 22 24 26 28 30)
 | 
| -	paddw	xmm3,xmm1
 | 
| -	paddw	xmm6,xmm4
 | 
| -	psrlw	xmm3,2			; xmm3=OutLO=( 1  3  5  7  9 11 13 15)
 | 
| -	psrlw	xmm6,2			; xmm6=OutHO=(17 19 21 23 25 27 29 31)
 | 
| -
 | 
| -	psllw	xmm3,BYTE_BIT
 | 
| -	psllw	xmm6,BYTE_BIT
 | 
| -	por	xmm2,xmm3		; xmm2=OutL=( 0  1  2 ... 13 14 15)
 | 
| -	por	xmm5,xmm6		; xmm5=OutH=(16 17 18 ... 29 30 31)
 | 
| -
 | 
| -	movdqa	XMMWORD [edi+0*SIZEOF_XMMWORD], xmm2
 | 
| -	movdqa	XMMWORD [edi+1*SIZEOF_XMMWORD], xmm5
 | 
| -
 | 
| -	sub	eax, byte SIZEOF_XMMWORD
 | 
| -	add	esi, byte 1*SIZEOF_XMMWORD	; inptr
 | 
| -	add	edi, byte 2*SIZEOF_XMMWORD	; outptr
 | 
| -	cmp	eax, byte SIZEOF_XMMWORD
 | 
| -	ja	near .columnloop
 | 
| -	test	eax,eax
 | 
| -	jnz	near .columnloop_last
 | 
| -
 | 
| -	pop	esi
 | 
| -	pop	edi
 | 
| -	pop	eax
 | 
| -
 | 
| -	add	esi, byte SIZEOF_JSAMPROW	; input_data
 | 
| -	add	edi, byte SIZEOF_JSAMPROW	; output_data
 | 
| -	dec	ecx				; rowctr
 | 
| -	jg	near .rowloop
 | 
| -
 | 
| -.return:
 | 
| -	pop	edi
 | 
| -	pop	esi
 | 
| -;	pop	edx		; need not be preserved
 | 
| -;	pop	ecx		; need not be preserved
 | 
| -	poppic	ebx
 | 
| -	pop	ebp
 | 
| -	ret
 | 
| -
 | 
| -; --------------------------------------------------------------------------
 | 
| -;
 | 
| -; Fancy processing for the common case of 2:1 horizontal and 2:1 vertical.
 | 
| -; Again a triangle filter; see comments for h2v1 case, above.
 | 
| -;
 | 
| -; GLOBAL(void)
 | 
| -; jsimd_h2v2_fancy_upsample_sse2 (int max_v_samp_factor,
 | 
| -;                                 JDIMENSION downsampled_width,
 | 
| -;                                 JSAMPARRAY input_data,
 | 
| -;                                 JSAMPARRAY * output_data_ptr);
 | 
| -;
 | 
| -
 | 
| -%define max_v_samp(b)		(b)+8			; int max_v_samp_factor
 | 
| -%define downsamp_width(b)	(b)+12	; JDIMENSION downsampled_width
 | 
| -%define input_data(b)		(b)+16		; JSAMPARRAY input_data
 | 
| -%define output_data_ptr(b)	(b)+20		; JSAMPARRAY * output_data_ptr
 | 
| -
 | 
| -%define original_ebp	ebp+0
 | 
| -%define wk(i)		ebp-(WK_NUM-(i))*SIZEOF_XMMWORD	; xmmword wk[WK_NUM]
 | 
| -%define WK_NUM		4
 | 
| -%define gotptr		wk(0)-SIZEOF_POINTER	; void * gotptr
 | 
| -
 | 
| -	align	16
 | 
| -	global	EXTN(jsimd_h2v2_fancy_upsample_sse2) PRIVATE
 | 
| -
 | 
| -EXTN(jsimd_h2v2_fancy_upsample_sse2):
 | 
| -	push	ebp
 | 
| -	mov	eax,esp				; eax = original ebp
 | 
| -	sub	esp, byte 4
 | 
| -	and	esp, byte (-SIZEOF_XMMWORD)	; align to 128 bits
 | 
| -	mov	[esp],eax
 | 
| -	mov	ebp,esp				; ebp = aligned ebp
 | 
| -	lea	esp, [wk(0)]
 | 
| -	pushpic	eax		; make a room for GOT address
 | 
| -	push	ebx
 | 
| -;	push	ecx		; need not be preserved
 | 
| -;	push	edx		; need not be preserved
 | 
| -	push	esi
 | 
| -	push	edi
 | 
| -
 | 
| -	get_GOT	ebx			; get GOT address
 | 
| -	movpic	POINTER [gotptr], ebx	; save GOT address
 | 
| -
 | 
| -	mov	edx,eax				; edx = original ebp
 | 
| -	mov	eax, JDIMENSION [downsamp_width(edx)]  ; colctr
 | 
| -	test	eax,eax
 | 
| -	jz	near .return
 | 
| -
 | 
| -	mov	ecx, INT [max_v_samp(edx)]	; rowctr
 | 
| -	test	ecx,ecx
 | 
| -	jz	near .return
 | 
| -
 | 
| -	mov	esi, JSAMPARRAY [input_data(edx)]	; input_data
 | 
| -	mov	edi, POINTER [output_data_ptr(edx)]
 | 
| -	mov	edi, JSAMPARRAY [edi]			; output_data
 | 
| -	alignx	16,7
 | 
| -.rowloop:
 | 
| -	push	eax					; colctr
 | 
| -	push	ecx
 | 
| -	push	edi
 | 
| -	push	esi
 | 
| -
 | 
| -	mov	ecx, JSAMPROW [esi-1*SIZEOF_JSAMPROW]	; inptr1(above)
 | 
| -	mov	ebx, JSAMPROW [esi+0*SIZEOF_JSAMPROW]	; inptr0
 | 
| -	mov	esi, JSAMPROW [esi+1*SIZEOF_JSAMPROW]	; inptr1(below)
 | 
| -	mov	edx, JSAMPROW [edi+0*SIZEOF_JSAMPROW]	; outptr0
 | 
| -	mov	edi, JSAMPROW [edi+1*SIZEOF_JSAMPROW]	; outptr1
 | 
| -
 | 
| -	test	eax, SIZEOF_XMMWORD-1
 | 
| -	jz	short .skip
 | 
| -	push	edx
 | 
| -	mov	dl, JSAMPLE [ecx+(eax-1)*SIZEOF_JSAMPLE]
 | 
| -	mov	JSAMPLE [ecx+eax*SIZEOF_JSAMPLE], dl
 | 
| -	mov	dl, JSAMPLE [ebx+(eax-1)*SIZEOF_JSAMPLE]
 | 
| -	mov	JSAMPLE [ebx+eax*SIZEOF_JSAMPLE], dl
 | 
| -	mov	dl, JSAMPLE [esi+(eax-1)*SIZEOF_JSAMPLE]
 | 
| -	mov	JSAMPLE [esi+eax*SIZEOF_JSAMPLE], dl	; insert a dummy sample
 | 
| -	pop	edx
 | 
| -.skip:
 | 
| -	; -- process the first column block
 | 
| -
 | 
| -	movdqa	xmm0, XMMWORD [ebx+0*SIZEOF_XMMWORD]	; xmm0=row[ 0][0]
 | 
| -	movdqa	xmm1, XMMWORD [ecx+0*SIZEOF_XMMWORD]	; xmm1=row[-1][0]
 | 
| -	movdqa	xmm2, XMMWORD [esi+0*SIZEOF_XMMWORD]	; xmm2=row[+1][0]
 | 
| -
 | 
| -	pushpic	ebx
 | 
| -	movpic	ebx, POINTER [gotptr]	; load GOT address
 | 
| -
 | 
| -	pxor      xmm3,xmm3		; xmm3=(all 0's)
 | 
| -	movdqa    xmm4,xmm0
 | 
| -	punpcklbw xmm0,xmm3		; xmm0=row[ 0]( 0  1  2  3  4  5  6  7)
 | 
| -	punpckhbw xmm4,xmm3		; xmm4=row[ 0]( 8  9 10 11 12 13 14 15)
 | 
| -	movdqa    xmm5,xmm1
 | 
| -	punpcklbw xmm1,xmm3		; xmm1=row[-1]( 0  1  2  3  4  5  6  7)
 | 
| -	punpckhbw xmm5,xmm3		; xmm5=row[-1]( 8  9 10 11 12 13 14 15)
 | 
| -	movdqa    xmm6,xmm2
 | 
| -	punpcklbw xmm2,xmm3		; xmm2=row[+1]( 0  1  2  3  4  5  6  7)
 | 
| -	punpckhbw xmm6,xmm3		; xmm6=row[+1]( 8  9 10 11 12 13 14 15)
 | 
| -
 | 
| -	pmullw	xmm0,[GOTOFF(ebx,PW_THREE)]
 | 
| -	pmullw	xmm4,[GOTOFF(ebx,PW_THREE)]
 | 
| -
 | 
| -	pcmpeqb	xmm7,xmm7
 | 
| -	psrldq	xmm7,(SIZEOF_XMMWORD-2)
 | 
| -
 | 
| -	paddw	xmm1,xmm0		; xmm1=Int0L=( 0  1  2  3  4  5  6  7)
 | 
| -	paddw	xmm5,xmm4		; xmm5=Int0H=( 8  9 10 11 12 13 14 15)
 | 
| -	paddw	xmm2,xmm0		; xmm2=Int1L=( 0  1  2  3  4  5  6  7)
 | 
| -	paddw	xmm6,xmm4		; xmm6=Int1H=( 8  9 10 11 12 13 14 15)
 | 
| -
 | 
| -	movdqa	XMMWORD [edx+0*SIZEOF_XMMWORD], xmm1	; temporarily save
 | 
| -	movdqa	XMMWORD [edx+1*SIZEOF_XMMWORD], xmm5	; the intermediate data
 | 
| -	movdqa	XMMWORD [edi+0*SIZEOF_XMMWORD], xmm2
 | 
| -	movdqa	XMMWORD [edi+1*SIZEOF_XMMWORD], xmm6
 | 
| -
 | 
| -	pand	xmm1,xmm7		; xmm1=( 0 -- -- -- -- -- -- --)
 | 
| -	pand	xmm2,xmm7		; xmm2=( 0 -- -- -- -- -- -- --)
 | 
| -
 | 
| -	movdqa	XMMWORD [wk(0)], xmm1
 | 
| -	movdqa	XMMWORD [wk(1)], xmm2
 | 
| -
 | 
| -	poppic	ebx
 | 
| -
 | 
| -	add	eax, byte SIZEOF_XMMWORD-1
 | 
| -	and	eax, byte -SIZEOF_XMMWORD
 | 
| -	cmp	eax, byte SIZEOF_XMMWORD
 | 
| -	ja	short .columnloop
 | 
| -	alignx	16,7
 | 
| -
 | 
| -.columnloop_last:
 | 
| -	; -- process the last column block
 | 
| -
 | 
| -	pushpic	ebx
 | 
| -	movpic	ebx, POINTER [gotptr]	; load GOT address
 | 
| -
 | 
| -	pcmpeqb	xmm1,xmm1
 | 
| -	pslldq	xmm1,(SIZEOF_XMMWORD-2)
 | 
| -	movdqa	xmm2,xmm1
 | 
| -
 | 
| -	pand	xmm1, XMMWORD [edx+1*SIZEOF_XMMWORD]
 | 
| -	pand	xmm2, XMMWORD [edi+1*SIZEOF_XMMWORD]
 | 
| -
 | 
| -	movdqa	XMMWORD [wk(2)], xmm1	; xmm1=(-- -- -- -- -- -- -- 15)
 | 
| -	movdqa	XMMWORD [wk(3)], xmm2	; xmm2=(-- -- -- -- -- -- -- 15)
 | 
| -
 | 
| -	jmp	near .upsample
 | 
| -	alignx	16,7
 | 
| -
 | 
| -.columnloop:
 | 
| -	; -- process the next column block
 | 
| -
 | 
| -	movdqa	xmm0, XMMWORD [ebx+1*SIZEOF_XMMWORD]	; xmm0=row[ 0][1]
 | 
| -	movdqa	xmm1, XMMWORD [ecx+1*SIZEOF_XMMWORD]	; xmm1=row[-1][1]
 | 
| -	movdqa	xmm2, XMMWORD [esi+1*SIZEOF_XMMWORD]	; xmm2=row[+1][1]
 | 
| -
 | 
| -	pushpic	ebx
 | 
| -	movpic	ebx, POINTER [gotptr]	; load GOT address
 | 
| -
 | 
| -	pxor      xmm3,xmm3		; xmm3=(all 0's)
 | 
| -	movdqa    xmm4,xmm0
 | 
| -	punpcklbw xmm0,xmm3		; xmm0=row[ 0]( 0  1  2  3  4  5  6  7)
 | 
| -	punpckhbw xmm4,xmm3		; xmm4=row[ 0]( 8  9 10 11 12 13 14 15)
 | 
| -	movdqa    xmm5,xmm1
 | 
| -	punpcklbw xmm1,xmm3		; xmm1=row[-1]( 0  1  2  3  4  5  6  7)
 | 
| -	punpckhbw xmm5,xmm3		; xmm5=row[-1]( 8  9 10 11 12 13 14 15)
 | 
| -	movdqa    xmm6,xmm2
 | 
| -	punpcklbw xmm2,xmm3		; xmm2=row[+1]( 0  1  2  3  4  5  6  7)
 | 
| -	punpckhbw xmm6,xmm3		; xmm6=row[+1]( 8  9 10 11 12 13 14 15)
 | 
| -
 | 
| -	pmullw	xmm0,[GOTOFF(ebx,PW_THREE)]
 | 
| -	pmullw	xmm4,[GOTOFF(ebx,PW_THREE)]
 | 
| -
 | 
| -	paddw	xmm1,xmm0		; xmm1=Int0L=( 0  1  2  3  4  5  6  7)
 | 
| -	paddw	xmm5,xmm4		; xmm5=Int0H=( 8  9 10 11 12 13 14 15)
 | 
| -	paddw	xmm2,xmm0		; xmm2=Int1L=( 0  1  2  3  4  5  6  7)
 | 
| -	paddw	xmm6,xmm4		; xmm6=Int1H=( 8  9 10 11 12 13 14 15)
 | 
| -
 | 
| -	movdqa	XMMWORD [edx+2*SIZEOF_XMMWORD], xmm1	; temporarily save
 | 
| -	movdqa	XMMWORD [edx+3*SIZEOF_XMMWORD], xmm5	; the intermediate data
 | 
| -	movdqa	XMMWORD [edi+2*SIZEOF_XMMWORD], xmm2
 | 
| -	movdqa	XMMWORD [edi+3*SIZEOF_XMMWORD], xmm6
 | 
| -
 | 
| -	pslldq	xmm1,(SIZEOF_XMMWORD-2)	; xmm1=(-- -- -- -- -- -- --  0)
 | 
| -	pslldq	xmm2,(SIZEOF_XMMWORD-2)	; xmm2=(-- -- -- -- -- -- --  0)
 | 
| -
 | 
| -	movdqa	XMMWORD [wk(2)], xmm1
 | 
| -	movdqa	XMMWORD [wk(3)], xmm2
 | 
| -
 | 
| -.upsample:
 | 
| -	; -- process the upper row
 | 
| -
 | 
| -	movdqa	xmm7, XMMWORD [edx+0*SIZEOF_XMMWORD]
 | 
| -	movdqa	xmm3, XMMWORD [edx+1*SIZEOF_XMMWORD]
 | 
| -
 | 
| -	movdqa	xmm0,xmm7		; xmm7=Int0L=( 0  1  2  3  4  5  6  7)
 | 
| -	movdqa	xmm4,xmm3		; xmm3=Int0H=( 8  9 10 11 12 13 14 15)
 | 
| -	psrldq	xmm0,2			; xmm0=( 1  2  3  4  5  6  7 --)
 | 
| -	pslldq	xmm4,(SIZEOF_XMMWORD-2)	; xmm4=(-- -- -- -- -- -- --  8)
 | 
| -	movdqa	xmm5,xmm7
 | 
| -	movdqa	xmm6,xmm3
 | 
| -	psrldq	xmm5,(SIZEOF_XMMWORD-2)	; xmm5=( 7 -- -- -- -- -- -- --)
 | 
| -	pslldq	xmm6,2			; xmm6=(--  8  9 10 11 12 13 14)
 | 
| -
 | 
| -	por	xmm0,xmm4		; xmm0=( 1  2  3  4  5  6  7  8)
 | 
| -	por	xmm5,xmm6		; xmm5=( 7  8  9 10 11 12 13 14)
 | 
| -
 | 
| -	movdqa	xmm1,xmm7
 | 
| -	movdqa	xmm2,xmm3
 | 
| -	pslldq	xmm1,2			; xmm1=(--  0  1  2  3  4  5  6)
 | 
| -	psrldq	xmm2,2			; xmm2=( 9 10 11 12 13 14 15 --)
 | 
| -	movdqa	xmm4,xmm3
 | 
| -	psrldq	xmm4,(SIZEOF_XMMWORD-2)	; xmm4=(15 -- -- -- -- -- -- --)
 | 
| -
 | 
| -	por	xmm1, XMMWORD [wk(0)]	; xmm1=(-1  0  1  2  3  4  5  6)
 | 
| -	por	xmm2, XMMWORD [wk(2)]	; xmm2=( 9 10 11 12 13 14 15 16)
 | 
| -
 | 
| -	movdqa	XMMWORD [wk(0)], xmm4
 | 
| -
 | 
| -	pmullw	xmm7,[GOTOFF(ebx,PW_THREE)]
 | 
| -	pmullw	xmm3,[GOTOFF(ebx,PW_THREE)]
 | 
| -	paddw	xmm1,[GOTOFF(ebx,PW_EIGHT)]
 | 
| -	paddw	xmm5,[GOTOFF(ebx,PW_EIGHT)]
 | 
| -	paddw	xmm0,[GOTOFF(ebx,PW_SEVEN)]
 | 
| -	paddw	xmm2,[GOTOFF(ebx,PW_SEVEN)]
 | 
| -
 | 
| -	paddw	xmm1,xmm7
 | 
| -	paddw	xmm5,xmm3
 | 
| -	psrlw	xmm1,4			; xmm1=Out0LE=( 0  2  4  6  8 10 12 14)
 | 
| -	psrlw	xmm5,4			; xmm5=Out0HE=(16 18 20 22 24 26 28 30)
 | 
| -	paddw	xmm0,xmm7
 | 
| -	paddw	xmm2,xmm3
 | 
| -	psrlw	xmm0,4			; xmm0=Out0LO=( 1  3  5  7  9 11 13 15)
 | 
| -	psrlw	xmm2,4			; xmm2=Out0HO=(17 19 21 23 25 27 29 31)
 | 
| -
 | 
| -	psllw	xmm0,BYTE_BIT
 | 
| -	psllw	xmm2,BYTE_BIT
 | 
| -	por	xmm1,xmm0		; xmm1=Out0L=( 0  1  2 ... 13 14 15)
 | 
| -	por	xmm5,xmm2		; xmm5=Out0H=(16 17 18 ... 29 30 31)
 | 
| -
 | 
| -	movdqa	XMMWORD [edx+0*SIZEOF_XMMWORD], xmm1
 | 
| -	movdqa	XMMWORD [edx+1*SIZEOF_XMMWORD], xmm5
 | 
| -
 | 
| -	; -- process the lower row
 | 
| -
 | 
| -	movdqa	xmm6, XMMWORD [edi+0*SIZEOF_XMMWORD]
 | 
| -	movdqa	xmm4, XMMWORD [edi+1*SIZEOF_XMMWORD]
 | 
| -
 | 
| -	movdqa	xmm7,xmm6		; xmm6=Int1L=( 0  1  2  3  4  5  6  7)
 | 
| -	movdqa	xmm3,xmm4		; xmm4=Int1H=( 8  9 10 11 12 13 14 15)
 | 
| -	psrldq	xmm7,2			; xmm7=( 1  2  3  4  5  6  7 --)
 | 
| -	pslldq	xmm3,(SIZEOF_XMMWORD-2)	; xmm3=(-- -- -- -- -- -- --  8)
 | 
| -	movdqa	xmm0,xmm6
 | 
| -	movdqa	xmm2,xmm4
 | 
| -	psrldq	xmm0,(SIZEOF_XMMWORD-2)	; xmm0=( 7 -- -- -- -- -- -- --)
 | 
| -	pslldq	xmm2,2			; xmm2=(--  8  9 10 11 12 13 14)
 | 
| -
 | 
| -	por	xmm7,xmm3		; xmm7=( 1  2  3  4  5  6  7  8)
 | 
| -	por	xmm0,xmm2		; xmm0=( 7  8  9 10 11 12 13 14)
 | 
| -
 | 
| -	movdqa	xmm1,xmm6
 | 
| -	movdqa	xmm5,xmm4
 | 
| -	pslldq	xmm1,2			; xmm1=(--  0  1  2  3  4  5  6)
 | 
| -	psrldq	xmm5,2			; xmm5=( 9 10 11 12 13 14 15 --)
 | 
| -	movdqa	xmm3,xmm4
 | 
| -	psrldq	xmm3,(SIZEOF_XMMWORD-2)	; xmm3=(15 -- -- -- -- -- -- --)
 | 
| -
 | 
| -	por	xmm1, XMMWORD [wk(1)]	; xmm1=(-1  0  1  2  3  4  5  6)
 | 
| -	por	xmm5, XMMWORD [wk(3)]	; xmm5=( 9 10 11 12 13 14 15 16)
 | 
| -
 | 
| -	movdqa	XMMWORD [wk(1)], xmm3
 | 
| -
 | 
| -	pmullw	xmm6,[GOTOFF(ebx,PW_THREE)]
 | 
| -	pmullw	xmm4,[GOTOFF(ebx,PW_THREE)]
 | 
| -	paddw	xmm1,[GOTOFF(ebx,PW_EIGHT)]
 | 
| -	paddw	xmm0,[GOTOFF(ebx,PW_EIGHT)]
 | 
| -	paddw	xmm7,[GOTOFF(ebx,PW_SEVEN)]
 | 
| -	paddw	xmm5,[GOTOFF(ebx,PW_SEVEN)]
 | 
| -
 | 
| -	paddw	xmm1,xmm6
 | 
| -	paddw	xmm0,xmm4
 | 
| -	psrlw	xmm1,4			; xmm1=Out1LE=( 0  2  4  6  8 10 12 14)
 | 
| -	psrlw	xmm0,4			; xmm0=Out1HE=(16 18 20 22 24 26 28 30)
 | 
| -	paddw	xmm7,xmm6
 | 
| -	paddw	xmm5,xmm4
 | 
| -	psrlw	xmm7,4			; xmm7=Out1LO=( 1  3  5  7  9 11 13 15)
 | 
| -	psrlw	xmm5,4			; xmm5=Out1HO=(17 19 21 23 25 27 29 31)
 | 
| -
 | 
| -	psllw	xmm7,BYTE_BIT
 | 
| -	psllw	xmm5,BYTE_BIT
 | 
| -	por	xmm1,xmm7		; xmm1=Out1L=( 0  1  2 ... 13 14 15)
 | 
| -	por	xmm0,xmm5		; xmm0=Out1H=(16 17 18 ... 29 30 31)
 | 
| -
 | 
| -	movdqa	XMMWORD [edi+0*SIZEOF_XMMWORD], xmm1
 | 
| -	movdqa	XMMWORD [edi+1*SIZEOF_XMMWORD], xmm0
 | 
| -
 | 
| -	poppic	ebx
 | 
| -
 | 
| -	sub	eax, byte SIZEOF_XMMWORD
 | 
| -	add	ecx, byte 1*SIZEOF_XMMWORD	; inptr1(above)
 | 
| -	add	ebx, byte 1*SIZEOF_XMMWORD	; inptr0
 | 
| -	add	esi, byte 1*SIZEOF_XMMWORD	; inptr1(below)
 | 
| -	add	edx, byte 2*SIZEOF_XMMWORD	; outptr0
 | 
| -	add	edi, byte 2*SIZEOF_XMMWORD	; outptr1
 | 
| -	cmp	eax, byte SIZEOF_XMMWORD
 | 
| -	ja	near .columnloop
 | 
| -	test	eax,eax
 | 
| -	jnz	near .columnloop_last
 | 
| -
 | 
| -	pop	esi
 | 
| -	pop	edi
 | 
| -	pop	ecx
 | 
| -	pop	eax
 | 
| -
 | 
| -	add	esi, byte 1*SIZEOF_JSAMPROW	; input_data
 | 
| -	add	edi, byte 2*SIZEOF_JSAMPROW	; output_data
 | 
| -	sub	ecx, byte 2			; rowctr
 | 
| -	jg	near .rowloop
 | 
| -
 | 
| -.return:
 | 
| -	pop	edi
 | 
| -	pop	esi
 | 
| -;	pop	edx		; need not be preserved
 | 
| -;	pop	ecx		; need not be preserved
 | 
| -	pop	ebx
 | 
| -	mov	esp,ebp		; esp <- aligned ebp
 | 
| -	pop	esp		; esp <- original ebp
 | 
| -	pop	ebp
 | 
| -	ret
 | 
| -
 | 
| -; --------------------------------------------------------------------------
 | 
| -;
 | 
| -; Fast processing for the common case of 2:1 horizontal and 1:1 vertical.
 | 
| -; It's still a box filter.
 | 
| -;
 | 
| -; GLOBAL(void)
 | 
| -; jsimd_h2v1_upsample_sse2 (int max_v_samp_factor,
 | 
| -;                           JDIMENSION output_width,
 | 
| -;                           JSAMPARRAY input_data,
 | 
| -;                           JSAMPARRAY * output_data_ptr);
 | 
| -;
 | 
| -
 | 
| -%define max_v_samp(b)		(b)+8			; int max_v_samp_factor
 | 
| -%define output_width(b)	(b)+12		; JDIMENSION output_width
 | 
| -%define input_data(b)		(b)+16		; JSAMPARRAY input_data
 | 
| -%define output_data_ptr(b)	(b)+20		; JSAMPARRAY * output_data_ptr
 | 
| -
 | 
| -	align	16
 | 
| -	global	EXTN(jsimd_h2v1_upsample_sse2) PRIVATE
 | 
| -
 | 
| -EXTN(jsimd_h2v1_upsample_sse2):
 | 
| -	push	ebp
 | 
| -	mov	ebp,esp
 | 
| -;	push	ebx		; unused
 | 
| -;	push	ecx		; need not be preserved
 | 
| -;	push	edx		; need not be preserved
 | 
| -	push	esi
 | 
| -	push	edi
 | 
| -
 | 
| -	mov	edx, JDIMENSION [output_width(ebp)]
 | 
| -	add	edx, byte (2*SIZEOF_XMMWORD)-1
 | 
| -	and	edx, byte -(2*SIZEOF_XMMWORD)
 | 
| -	jz	short .return
 | 
| -
 | 
| -	mov	ecx, INT [max_v_samp(ebp)]	; rowctr
 | 
| -	test	ecx,ecx
 | 
| -	jz	short .return
 | 
| -
 | 
| -	mov	esi, JSAMPARRAY [input_data(ebp)]	; input_data
 | 
| -	mov	edi, POINTER [output_data_ptr(ebp)]
 | 
| -	mov	edi, JSAMPARRAY [edi]			; output_data
 | 
| -	alignx	16,7
 | 
| -.rowloop:
 | 
| -	push	edi
 | 
| -	push	esi
 | 
| -
 | 
| -	mov	esi, JSAMPROW [esi]		; inptr
 | 
| -	mov	edi, JSAMPROW [edi]		; outptr
 | 
| -	mov	eax,edx				; colctr
 | 
| -	alignx	16,7
 | 
| -.columnloop:
 | 
| -
 | 
| -	movdqa	xmm0, XMMWORD [esi+0*SIZEOF_XMMWORD]
 | 
| -
 | 
| -	movdqa    xmm1,xmm0
 | 
| -	punpcklbw xmm0,xmm0
 | 
| -	punpckhbw xmm1,xmm1
 | 
| -
 | 
| -	movdqa	XMMWORD [edi+0*SIZEOF_XMMWORD], xmm0
 | 
| -	movdqa	XMMWORD [edi+1*SIZEOF_XMMWORD], xmm1
 | 
| -
 | 
| -	sub	eax, byte 2*SIZEOF_XMMWORD
 | 
| -	jz	short .nextrow
 | 
| -
 | 
| -	movdqa	xmm2, XMMWORD [esi+1*SIZEOF_XMMWORD]
 | 
| -
 | 
| -	movdqa    xmm3,xmm2
 | 
| -	punpcklbw xmm2,xmm2
 | 
| -	punpckhbw xmm3,xmm3
 | 
| -
 | 
| -	movdqa	XMMWORD [edi+2*SIZEOF_XMMWORD], xmm2
 | 
| -	movdqa	XMMWORD [edi+3*SIZEOF_XMMWORD], xmm3
 | 
| -
 | 
| -	sub	eax, byte 2*SIZEOF_XMMWORD
 | 
| -	jz	short .nextrow
 | 
| -
 | 
| -	add	esi, byte 2*SIZEOF_XMMWORD	; inptr
 | 
| -	add	edi, byte 4*SIZEOF_XMMWORD	; outptr
 | 
| -	jmp	short .columnloop
 | 
| -	alignx	16,7
 | 
| -
 | 
| -.nextrow:
 | 
| -	pop	esi
 | 
| -	pop	edi
 | 
| -
 | 
| -	add	esi, byte SIZEOF_JSAMPROW	; input_data
 | 
| -	add	edi, byte SIZEOF_JSAMPROW	; output_data
 | 
| -	dec	ecx				; rowctr
 | 
| -	jg	short .rowloop
 | 
| -
 | 
| -.return:
 | 
| -	pop	edi
 | 
| -	pop	esi
 | 
| -;	pop	edx		; need not be preserved
 | 
| -;	pop	ecx		; need not be preserved
 | 
| -;	pop	ebx		; unused
 | 
| -	pop	ebp
 | 
| -	ret
 | 
| -
 | 
| -; --------------------------------------------------------------------------
 | 
| -;
 | 
| -; Fast processing for the common case of 2:1 horizontal and 2:1 vertical.
 | 
| -; It's still a box filter.
 | 
| -;
 | 
| -; GLOBAL(void)
 | 
| -; jsimd_h2v2_upsample_sse2 (nt max_v_samp_factor,
 | 
| -;                           JDIMENSION output_width,
 | 
| -;                           JSAMPARRAY input_data,
 | 
| -;                           JSAMPARRAY * output_data_ptr);
 | 
| -;
 | 
| -
 | 
| -%define max_v_samp(b)		(b)+8			; int max_v_samp_factor
 | 
| -%define output_width(b)	(b)+12		; JDIMENSION output_width
 | 
| -%define input_data(b)		(b)+16		; JSAMPARRAY input_data
 | 
| -%define output_data_ptr(b)	(b)+20		; JSAMPARRAY * output_data_ptr
 | 
| -
 | 
| -	align	16
 | 
| -	global	EXTN(jsimd_h2v2_upsample_sse2) PRIVATE
 | 
| -
 | 
| -EXTN(jsimd_h2v2_upsample_sse2):
 | 
| -	push	ebp
 | 
| -	mov	ebp,esp
 | 
| -	push	ebx
 | 
| -;	push	ecx		; need not be preserved
 | 
| -;	push	edx		; need not be preserved
 | 
| -	push	esi
 | 
| -	push	edi
 | 
| -
 | 
| -	mov	edx, JDIMENSION [output_width(ebp)]
 | 
| -	add	edx, byte (2*SIZEOF_XMMWORD)-1
 | 
| -	and	edx, byte -(2*SIZEOF_XMMWORD)
 | 
| -	jz	near .return
 | 
| -
 | 
| -	mov	ecx, INT [max_v_samp(ebp)]	; rowctr
 | 
| -	test	ecx,ecx
 | 
| -	jz	near .return
 | 
| -
 | 
| -	mov	esi, JSAMPARRAY [input_data(ebp)]	; input_data
 | 
| -	mov	edi, POINTER [output_data_ptr(ebp)]
 | 
| -	mov	edi, JSAMPARRAY [edi]			; output_data
 | 
| -	alignx	16,7
 | 
| -.rowloop:
 | 
| -	push	edi
 | 
| -	push	esi
 | 
| -
 | 
| -	mov	esi, JSAMPROW [esi]			; inptr
 | 
| -	mov	ebx, JSAMPROW [edi+0*SIZEOF_JSAMPROW]	; outptr0
 | 
| -	mov	edi, JSAMPROW [edi+1*SIZEOF_JSAMPROW]	; outptr1
 | 
| -	mov	eax,edx					; colctr
 | 
| -	alignx	16,7
 | 
| -.columnloop:
 | 
| -
 | 
| -	movdqa	xmm0, XMMWORD [esi+0*SIZEOF_XMMWORD]
 | 
| -
 | 
| -	movdqa    xmm1,xmm0
 | 
| -	punpcklbw xmm0,xmm0
 | 
| -	punpckhbw xmm1,xmm1
 | 
| -
 | 
| -	movdqa	XMMWORD [ebx+0*SIZEOF_XMMWORD], xmm0
 | 
| -	movdqa	XMMWORD [ebx+1*SIZEOF_XMMWORD], xmm1
 | 
| -	movdqa	XMMWORD [edi+0*SIZEOF_XMMWORD], xmm0
 | 
| -	movdqa	XMMWORD [edi+1*SIZEOF_XMMWORD], xmm1
 | 
| -
 | 
| -	sub	eax, byte 2*SIZEOF_XMMWORD
 | 
| -	jz	short .nextrow
 | 
| -
 | 
| -	movdqa	xmm2, XMMWORD [esi+1*SIZEOF_XMMWORD]
 | 
| -
 | 
| -	movdqa    xmm3,xmm2
 | 
| -	punpcklbw xmm2,xmm2
 | 
| -	punpckhbw xmm3,xmm3
 | 
| -
 | 
| -	movdqa	XMMWORD [ebx+2*SIZEOF_XMMWORD], xmm2
 | 
| -	movdqa	XMMWORD [ebx+3*SIZEOF_XMMWORD], xmm3
 | 
| -	movdqa	XMMWORD [edi+2*SIZEOF_XMMWORD], xmm2
 | 
| -	movdqa	XMMWORD [edi+3*SIZEOF_XMMWORD], xmm3
 | 
| -
 | 
| -	sub	eax, byte 2*SIZEOF_XMMWORD
 | 
| -	jz	short .nextrow
 | 
| -
 | 
| -	add	esi, byte 2*SIZEOF_XMMWORD	; inptr
 | 
| -	add	ebx, byte 4*SIZEOF_XMMWORD	; outptr0
 | 
| -	add	edi, byte 4*SIZEOF_XMMWORD	; outptr1
 | 
| -	jmp	short .columnloop
 | 
| -	alignx	16,7
 | 
| -
 | 
| -.nextrow:
 | 
| -	pop	esi
 | 
| -	pop	edi
 | 
| -
 | 
| -	add	esi, byte 1*SIZEOF_JSAMPROW	; input_data
 | 
| -	add	edi, byte 2*SIZEOF_JSAMPROW	; output_data
 | 
| -	sub	ecx, byte 2			; rowctr
 | 
| -	jg	short .rowloop
 | 
| -
 | 
| -.return:
 | 
| -	pop	edi
 | 
| -	pop	esi
 | 
| -;	pop	edx		; need not be preserved
 | 
| -;	pop	ecx		; need not be preserved
 | 
| -	pop	ebx
 | 
| -	pop	ebp
 | 
| -	ret
 | 
| -
 | 
| -; For some reason, the OS X linker does not honor the request to align the
 | 
| -; segment unless we do this.
 | 
| -	align	16
 | 
| 
 |