;
; jcsammmx.asm - downsampling (MMX)
;
; 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_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)
; jsimd_h2v1_downsample_mmx (JDIMENSION image_width, int max_v_samp_factor,
;                            JDIMENSION v_samp_factor, JDIMENSION width_blocks,
;                            JSAMPARRAY input_data, JSAMPARRAY output_data);
;

%define img_width(b)	(b)+8			; JDIMENSION image_width
%define max_v_samp(b)	(b)+12		; int max_v_samp_factor
%define v_samp(b)			(b)+16		; JDIMENSION v_samp_factor
%define width_blks(b)	(b)+20		; JDIMENSION width_blocks
%define input_data(b)	(b)+24		; JSAMPARRAY input_data
%define output_data(b)	(b)+28	; JSAMPARRAY output_data

	align	16
	global	EXTN(jsimd_h2v1_downsample_mmx)

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

	mov	edx, JDIMENSION [img_width(ebp)]

	; -- expand_right_edge

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

	mov	eax, INT [max_v_samp(ebp)]
	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, JDIMENSION [v_samp(ebp)]	; rowctr
	test	eax,eax
	jle	near .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)
; jsimd_h2v2_downsample_mmx (JDIMENSION image_width, int max_v_samp_factor,
;                            JDIMENSION v_samp_factor, JDIMENSION width_blocks,
;                            JSAMPARRAY input_data, JSAMPARRAY output_data);
;

%define img_width(b)	(b)+8			; JDIMENSION image_width
%define max_v_samp(b)	(b)+12		; int max_v_samp_factor
%define v_samp(b)			(b)+16		; JDIMENSION v_samp_factor
%define width_blks(b)	(b)+20		; JDIMENSION width_blocks
%define input_data(b)	(b)+24		; JSAMPARRAY input_data
%define output_data(b)	(b)+28	; JSAMPARRAY output_data

	align	16
	global	EXTN(jsimd_h2v2_downsample_mmx)

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

	mov	edx, JDIMENSION [img_width(ebp)]

	; -- expand_right_edge

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

	mov	eax, INT [max_v_samp(ebp)]
	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, JDIMENSION [v_samp(ebp)]	; 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

; For some reason, the OS X linker does not honor the request to align the
; segment unless we do this.
	align	16
