;
; jcsammmx.asm - downsampling (MMX)
;
; 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_MMX_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_mmx (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_mmx)

EXTN(jpeg_h2v1_downsample_mmx):
	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	short .return

	mov       edx, 0x00010000	; bias pattern
	movd      mm7,edx
	pcmpeqw   mm6,mm6
	punpckldq mm7,mm7		; mm7={0, 1, 0, 1}
	psrlw     mm6,BYTE_BIT		; mm6={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
	alignx	16,7
.columnloop:

	movq	mm0, MMWORD [esi+0*SIZEOF_MMWORD]
	movq	mm1, MMWORD [esi+1*SIZEOF_MMWORD]
	movq	mm2,mm0
	movq	mm3,mm1

	pand	mm0,mm6
	psrlw	mm2,BYTE_BIT
	pand	mm1,mm6
	psrlw	mm3,BYTE_BIT

	paddw	mm0,mm2
	paddw	mm1,mm3
	paddw	mm0,mm7
	paddw	mm1,mm7
	psrlw	mm0,1
	psrlw	mm1,1

	packuswb mm0,mm1

	movq	MMWORD [edi+0*SIZEOF_MMWORD], mm0

	add	esi, byte 2*SIZEOF_MMWORD	; inptr
	add	edi, byte 1*SIZEOF_MMWORD	; outptr
	sub	ecx, byte SIZEOF_MMWORD		; outcol
	jnz	short .columnloop

	pop	esi
	pop	edi
	pop	ecx

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

	emms		; empty MMX state

.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_mmx (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_mmx)

EXTN(jpeg_h2v2_downsample_mmx):
	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      mm7,edx
	pcmpeqw   mm6,mm6
	punpckldq mm7,mm7		; mm7={1, 2, 1, 2}
	psrlw     mm6,BYTE_BIT		; mm6={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
	alignx	16,7
.columnloop:

	movq	mm0, MMWORD [edx+0*SIZEOF_MMWORD]
	movq	mm1, MMWORD [esi+0*SIZEOF_MMWORD]
	movq	mm2, MMWORD [edx+1*SIZEOF_MMWORD]
	movq	mm3, MMWORD [esi+1*SIZEOF_MMWORD]

	movq	mm4,mm0
	movq	mm5,mm1
	pand	mm0,mm6
	psrlw	mm4,BYTE_BIT
	pand	mm1,mm6
	psrlw	mm5,BYTE_BIT
	paddw	mm0,mm4
	paddw	mm1,mm5

	movq	mm4,mm2
	movq	mm5,mm3
	pand	mm2,mm6
	psrlw	mm4,BYTE_BIT
	pand	mm3,mm6
	psrlw	mm5,BYTE_BIT
	paddw	mm2,mm4
	paddw	mm3,mm5

	paddw	mm0,mm1
	paddw	mm2,mm3
	paddw	mm0,mm7
	paddw	mm2,mm7
	psrlw	mm0,2
	psrlw	mm2,2

	packuswb mm0,mm2

	movq	MMWORD [edi+0*SIZEOF_MMWORD], mm0

	add	edx, byte 2*SIZEOF_MMWORD	; inptr0
	add	esi, byte 2*SIZEOF_MMWORD	; inptr1
	add	edi, byte 1*SIZEOF_MMWORD	; outptr
	sub	ecx, byte SIZEOF_MMWORD		; outcol
	jnz	near .columnloop

	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

	emms		; empty MMX state

.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_MMX_SUPPORTED
