;
; jcsamss2.asm - downsampling (SSE2)
;
; 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
;
; Last Modified : January 23, 2006
;
; [TAB8]

%include "jsimdext.inc"
%include "jcolsamp.inc"

%ifdef JCSAMPLE_SSE2_SUPPORTED

; --------------------------------------------------------------------------
	SECTION	SEG_TEXT
	BITS	32
;
; Downsample pixel values of a single component.
; This version handles the common case of 2:1 horizontal and 1:1 vertical,
; without smoothing.
;
; GLOBAL(void)
; jpeg_h2v1_downsample_sse2 (j_compress_ptr cinfo,
;                            jpeg_component_info * compptr,
;                            JSAMPARRAY input_data, JSAMPARRAY output_data);
;

%define cinfo(b)	(b)+8		; j_compress_ptr cinfo
%define compptr(b)	(b)+12		; jpeg_component_info * compptr
%define input_data(b)	(b)+16		; JSAMPARRAY input_data
%define output_data(b)	(b)+20		; JSAMPARRAY output_data

	align	16
	global	EXTN(jpeg_h2v1_downsample_sse2)

EXTN(jpeg_h2v1_downsample_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	ecx, POINTER [compptr(ebp)]
	mov	ecx, JDIMENSION [jcompinfo_width_in_blocks(ecx)]
	shl	ecx,3			; imul ecx,DCTSIZE (ecx = output_cols)
	jz	near .return

	mov	edx, POINTER [cinfo(ebp)]
	mov	edx, JDIMENSION [jcstruct_image_width(edx)]

	; -- expand_right_edge

	push	ecx
	shl	ecx,1				; output_cols * 2
	sub	ecx,edx
	jle	short .expand_end

	mov	eax, POINTER [cinfo(ebp)]
	mov	eax, INT [jcstruct_max_v_samp_factor(eax)]
	test	eax,eax
	jle	short .expand_end

	cld
	mov	esi, JSAMPARRAY [input_data(ebp)]	; input_data
	alignx	16,7
.expandloop:
	push	eax
	push	ecx

	mov	edi, JSAMPROW [esi]
	add	edi,edx
	mov	al, JSAMPLE [edi-1]

	rep stosb

	pop	ecx
	pop	eax

	add	esi, byte SIZEOF_JSAMPROW
	dec	eax
	jg	short .expandloop

.expand_end:
	pop	ecx				; output_cols

	; -- h2v1_downsample

	mov	eax, POINTER [compptr(ebp)]
	mov	eax, JDIMENSION [jcompinfo_v_samp_factor(eax)]	; rowctr
	test	eax,eax
	jle	near .return

	mov	edx, 0x00010000		; bias pattern
	movd	xmm7,edx
	pcmpeqw	xmm6,xmm6
	pshufd	xmm7,xmm7,0x00		; xmm7={0, 1, 0, 1, 0, 1, 0, 1}
	psrlw	xmm6,BYTE_BIT		; xmm6={0xFF 0x00 0xFF 0x00 ..}

	mov	esi, JSAMPARRAY [input_data(ebp)]	; input_data
	mov	edi, JSAMPARRAY [output_data(ebp)]	; output_data
	alignx	16,7
.rowloop:
	push	ecx
	push	edi
	push	esi

	mov	esi, JSAMPROW [esi]		; inptr
	mov	edi, JSAMPROW [edi]		; outptr

	cmp	ecx, byte SIZEOF_XMMWORD
	jae	short .columnloop
	alignx	16,7

.columnloop_r8:
	movdqa	xmm0, XMMWORD [esi+0*SIZEOF_XMMWORD]
	pxor	xmm1,xmm1
	mov	ecx, SIZEOF_XMMWORD
	jmp	short .downsample
	alignx	16,7

.columnloop:
	movdqa	xmm0, XMMWORD [esi+0*SIZEOF_XMMWORD]
	movdqa	xmm1, XMMWORD [esi+1*SIZEOF_XMMWORD]

.downsample:
	movdqa	xmm2,xmm0
	movdqa	xmm3,xmm1

	pand	xmm0,xmm6
	psrlw	xmm2,BYTE_BIT
	pand	xmm1,xmm6
	psrlw	xmm3,BYTE_BIT

	paddw	xmm0,xmm2
	paddw	xmm1,xmm3
	paddw	xmm0,xmm7
	paddw	xmm1,xmm7
	psrlw	xmm0,1
	psrlw	xmm1,1

	packuswb xmm0,xmm1

	movdqa	XMMWORD [edi+0*SIZEOF_XMMWORD], xmm0

	sub	ecx, byte SIZEOF_XMMWORD	; outcol
	add	esi, byte 2*SIZEOF_XMMWORD	; inptr
	add	edi, byte 1*SIZEOF_XMMWORD	; outptr
	cmp	ecx, byte SIZEOF_XMMWORD
	jae	short .columnloop
	test	ecx,ecx
	jnz	short .columnloop_r8

	pop	esi
	pop	edi
	pop	ecx

	add	esi, byte SIZEOF_JSAMPROW	; input_data
	add	edi, byte SIZEOF_JSAMPROW	; output_data
	dec	eax				; rowctr
	jg	near .rowloop

.return:
	pop	edi
	pop	esi
;	pop	edx		; need not be preserved
;	pop	ecx		; need not be preserved
;	pop	ebx		; unused
	pop	ebp
	ret

; --------------------------------------------------------------------------
;
; Downsample pixel values of a single component.
; This version handles the standard case of 2:1 horizontal and 2:1 vertical,
; without smoothing.
;
; GLOBAL(void)
; jpeg_h2v2_downsample_sse2 (j_compress_ptr cinfo,
;                            jpeg_component_info * compptr,
;                            JSAMPARRAY input_data, JSAMPARRAY output_data);
;

%define cinfo(b)	(b)+8		; j_compress_ptr cinfo
%define compptr(b)	(b)+12		; jpeg_component_info * compptr
%define input_data(b)	(b)+16		; JSAMPARRAY input_data
%define output_data(b)	(b)+20		; JSAMPARRAY output_data

	align	16
	global	EXTN(jpeg_h2v2_downsample_sse2)

EXTN(jpeg_h2v2_downsample_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	ecx, POINTER [compptr(ebp)]
	mov	ecx, JDIMENSION [jcompinfo_width_in_blocks(ecx)]
	shl	ecx,3			; imul ecx,DCTSIZE (ecx = output_cols)
	jz	near .return

	mov	edx, POINTER [cinfo(ebp)]
	mov	edx, JDIMENSION [jcstruct_image_width(edx)]

	; -- expand_right_edge

	push	ecx
	shl	ecx,1				; output_cols * 2
	sub	ecx,edx
	jle	short .expand_end

	mov	eax, POINTER [cinfo(ebp)]
	mov	eax, INT [jcstruct_max_v_samp_factor(eax)]
	test	eax,eax
	jle	short .expand_end

	cld
	mov	esi, JSAMPARRAY [input_data(ebp)]	; input_data
	alignx	16,7
.expandloop:
	push	eax
	push	ecx

	mov	edi, JSAMPROW [esi]
	add	edi,edx
	mov	al, JSAMPLE [edi-1]

	rep stosb

	pop	ecx
	pop	eax

	add	esi, byte SIZEOF_JSAMPROW
	dec	eax
	jg	short .expandloop

.expand_end:
	pop	ecx				; output_cols

	; -- h2v2_downsample

	mov	eax, POINTER [compptr(ebp)]
	mov	eax, JDIMENSION [jcompinfo_v_samp_factor(eax)]	; rowctr
	test	eax,eax
	jle	near .return

	mov	edx, 0x00020001		; bias pattern
	movd	xmm7,edx
	pcmpeqw	xmm6,xmm6
	pshufd	xmm7,xmm7,0x00		; xmm7={1, 2, 1, 2, 1, 2, 1, 2}
	psrlw	xmm6,BYTE_BIT		; xmm6={0xFF 0x00 0xFF 0x00 ..}

	mov	esi, JSAMPARRAY [input_data(ebp)]	; input_data
	mov	edi, JSAMPARRAY [output_data(ebp)]	; output_data
	alignx	16,7
.rowloop:
	push	ecx
	push	edi
	push	esi

	mov	edx, JSAMPROW [esi+0*SIZEOF_JSAMPROW]	; inptr0
	mov	esi, JSAMPROW [esi+1*SIZEOF_JSAMPROW]	; inptr1
	mov	edi, JSAMPROW [edi]			; outptr

	cmp	ecx, byte SIZEOF_XMMWORD
	jae	short .columnloop
	alignx	16,7

.columnloop_r8:
	movdqa	xmm0, XMMWORD [edx+0*SIZEOF_XMMWORD]
	movdqa	xmm1, XMMWORD [esi+0*SIZEOF_XMMWORD]
	pxor	xmm2,xmm2
	pxor	xmm3,xmm3
	mov	ecx, SIZEOF_XMMWORD
	jmp	short .downsample
	alignx	16,7

.columnloop:
	movdqa	xmm0, XMMWORD [edx+0*SIZEOF_XMMWORD]
	movdqa	xmm1, XMMWORD [esi+0*SIZEOF_XMMWORD]
	movdqa	xmm2, XMMWORD [edx+1*SIZEOF_XMMWORD]
	movdqa	xmm3, XMMWORD [esi+1*SIZEOF_XMMWORD]

.downsample:
	movdqa	xmm4,xmm0
	movdqa	xmm5,xmm1
	pand	xmm0,xmm6
	psrlw	xmm4,BYTE_BIT
	pand	xmm1,xmm6
	psrlw	xmm5,BYTE_BIT
	paddw	xmm0,xmm4
	paddw	xmm1,xmm5

	movdqa	xmm4,xmm2
	movdqa	xmm5,xmm3
	pand	xmm2,xmm6
	psrlw	xmm4,BYTE_BIT
	pand	xmm3,xmm6
	psrlw	xmm5,BYTE_BIT
	paddw	xmm2,xmm4
	paddw	xmm3,xmm5

	paddw	xmm0,xmm1
	paddw	xmm2,xmm3
	paddw	xmm0,xmm7
	paddw	xmm2,xmm7
	psrlw	xmm0,2
	psrlw	xmm2,2

	packuswb xmm0,xmm2

	movdqa	XMMWORD [edi+0*SIZEOF_XMMWORD], xmm0

	sub	ecx, byte SIZEOF_XMMWORD	; outcol
	add	edx, byte 2*SIZEOF_XMMWORD	; inptr0
	add	esi, byte 2*SIZEOF_XMMWORD	; inptr1
	add	edi, byte 1*SIZEOF_XMMWORD	; outptr
	cmp	ecx, byte SIZEOF_XMMWORD
	jae	near .columnloop
	test	ecx,ecx
	jnz	near .columnloop_r8

	pop	esi
	pop	edi
	pop	ecx

	add	esi, byte 2*SIZEOF_JSAMPROW	; input_data
	add	edi, byte 1*SIZEOF_JSAMPROW	; output_data
	dec	eax				; rowctr
	jg	near .rowloop

.return:
	pop	edi
	pop	esi
;	pop	edx		; need not be preserved
;	pop	ecx		; need not be preserved
;	pop	ebx		; unused
	pop	ebp
	ret

%endif ; JCSAMPLE_SSE2_SUPPORTED
