;
; jcqntmmx.asm - sample data conversion and quantization (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"
%include "jdct.inc"

; --------------------------------------------------------------------------
	SECTION	SEG_TEXT
	BITS	32
;
; Load data into workspace, applying unsigned->signed conversion
;
; GLOBAL(void)
; jsimd_convsamp_mmx (JSAMPARRAY sample_data, JDIMENSION start_col,
;                     DCTELEM * workspace);
;

%define sample_data	ebp+8		; JSAMPARRAY sample_data
%define start_col	ebp+12		; JDIMENSION start_col
%define workspace	ebp+16		; DCTELEM * workspace

	align	16
	global	EXTN(jsimd_convsamp_mmx)

EXTN(jsimd_convsamp_mmx):
	push	ebp
	mov	ebp,esp
	push	ebx
;	push	ecx		; need not be preserved
;	push	edx		; need not be preserved
	push	esi
	push	edi

	pxor	mm6,mm6			; mm6=(all 0's)
	pcmpeqw	mm7,mm7
	psllw	mm7,7			; mm7={0xFF80 0xFF80 0xFF80 0xFF80}

	mov	esi, JSAMPARRAY [sample_data]	; (JSAMPROW *)
	mov	eax, JDIMENSION [start_col]
	mov	edi, POINTER [workspace]	; (DCTELEM *)
	mov	ecx, DCTSIZE/4
	alignx	16,7
.convloop:
	mov	ebx, JSAMPROW [esi+0*SIZEOF_JSAMPROW]	; (JSAMPLE *)
	mov	edx, JSAMPROW [esi+1*SIZEOF_JSAMPROW]	; (JSAMPLE *)

	movq	mm0, MMWORD [ebx+eax*SIZEOF_JSAMPLE]	; mm0=(01234567)
	movq	mm1, MMWORD [edx+eax*SIZEOF_JSAMPLE]	; mm1=(89ABCDEF)

	mov	ebx, JSAMPROW [esi+2*SIZEOF_JSAMPROW]	; (JSAMPLE *)
	mov	edx, JSAMPROW [esi+3*SIZEOF_JSAMPROW]	; (JSAMPLE *)

	movq	mm2, MMWORD [ebx+eax*SIZEOF_JSAMPLE]	; mm2=(GHIJKLMN)
	movq	mm3, MMWORD [edx+eax*SIZEOF_JSAMPLE]	; mm3=(OPQRSTUV)

	movq      mm4,mm0
	punpcklbw mm0,mm6		; mm0=(0123)
	punpckhbw mm4,mm6		; mm4=(4567)
	movq      mm5,mm1
	punpcklbw mm1,mm6		; mm1=(89AB)
	punpckhbw mm5,mm6		; mm5=(CDEF)

	paddw	mm0,mm7
	paddw	mm4,mm7
	paddw	mm1,mm7
	paddw	mm5,mm7

	movq	MMWORD [MMBLOCK(0,0,edi,SIZEOF_DCTELEM)], mm0
	movq	MMWORD [MMBLOCK(0,1,edi,SIZEOF_DCTELEM)], mm4
	movq	MMWORD [MMBLOCK(1,0,edi,SIZEOF_DCTELEM)], mm1
	movq	MMWORD [MMBLOCK(1,1,edi,SIZEOF_DCTELEM)], mm5

	movq      mm0,mm2
	punpcklbw mm2,mm6		; mm2=(GHIJ)
	punpckhbw mm0,mm6		; mm0=(KLMN)
	movq      mm4,mm3
	punpcklbw mm3,mm6		; mm3=(OPQR)
	punpckhbw mm4,mm6		; mm4=(STUV)

	paddw	mm2,mm7
	paddw	mm0,mm7
	paddw	mm3,mm7
	paddw	mm4,mm7

	movq	MMWORD [MMBLOCK(2,0,edi,SIZEOF_DCTELEM)], mm2
	movq	MMWORD [MMBLOCK(2,1,edi,SIZEOF_DCTELEM)], mm0
	movq	MMWORD [MMBLOCK(3,0,edi,SIZEOF_DCTELEM)], mm3
	movq	MMWORD [MMBLOCK(3,1,edi,SIZEOF_DCTELEM)], mm4

	add	esi, byte 4*SIZEOF_JSAMPROW
	add	edi, byte 4*DCTSIZE*SIZEOF_DCTELEM
	dec	ecx
	jnz	short .convloop

	emms		; empty MMX state

	pop	edi
	pop	esi
;	pop	edx		; need not be preserved
;	pop	ecx		; need not be preserved
	pop	ebx
	pop	ebp
	ret

; --------------------------------------------------------------------------
;
; Quantize/descale the coefficients, and store into coef_block
;
; This implementation is based on an algorithm described in
;   "How to optimize for the Pentium family of microprocessors"
;   (http://www.agner.org/assem/).
;
; GLOBAL(void)
; jsimd_quantize_mmx (JCOEFPTR coef_block, DCTELEM * divisors,
;                     DCTELEM * workspace);
;

%define RECIPROCAL(m,n,b) MMBLOCK(DCTSIZE*0+(m),(n),(b),SIZEOF_DCTELEM)
%define CORRECTION(m,n,b) MMBLOCK(DCTSIZE*1+(m),(n),(b),SIZEOF_DCTELEM)
%define SCALE(m,n,b)      MMBLOCK(DCTSIZE*2+(m),(n),(b),SIZEOF_DCTELEM)
%define SHIFT(m,n,b)      MMBLOCK(DCTSIZE*3+(m),(n),(b),SIZEOF_DCTELEM)

%define coef_block	ebp+8		; JCOEFPTR coef_block
%define divisors	ebp+12		; DCTELEM * divisors
%define workspace	ebp+16		; DCTELEM * workspace

	align	16
	global	EXTN(jsimd_quantize_mmx)

EXTN(jsimd_quantize_mmx):
	push	ebp
	mov	ebp,esp
;	push	ebx		; unused
;	push	ecx		; unused
;	push	edx		; need not be preserved
	push	esi
	push	edi

	mov	esi, POINTER [workspace]
	mov	edx, POINTER [divisors]
	mov	edi, JCOEFPTR [coef_block]
	mov	ah, 2
	alignx	16,7
.quantloop1:
	mov	al, DCTSIZE2/8/2
	alignx	16,7
.quantloop2:
	movq	mm2, MMWORD [MMBLOCK(0,0,esi,SIZEOF_DCTELEM)]
	movq	mm3, MMWORD [MMBLOCK(0,1,esi,SIZEOF_DCTELEM)]

	movq	mm0,mm2
	movq	mm1,mm3

	psraw	mm2,(WORD_BIT-1)  ; -1 if value < 0, 0 otherwise
	psraw	mm3,(WORD_BIT-1)

	pxor	mm0,mm2   ; val = -val
	pxor	mm1,mm3
	psubw	mm0,mm2
	psubw	mm1,mm3

	;
	; MMX is an annoyingly crappy instruction set. It has two
	; misfeatures that are causing problems here:
	;
	; - All multiplications are signed.
	;
	; - The second operand for the shifts is not treated as packed.
	;
	;
	; We work around the first problem by implementing this algorithm:
	;
	; unsigned long unsigned_multiply(unsigned short x, unsigned short y)
	; {
	;   enum { SHORT_BIT = 16 };
	;   signed short sx = (signed short) x;
	;   signed short sy = (signed short) y;
	;   signed long sz;
	; 
	;   sz = (long) sx * (long) sy;     /* signed multiply */
	; 
	;   if (sx < 0) sz += (long) sy << SHORT_BIT;
	;   if (sy < 0) sz += (long) sx << SHORT_BIT;
	; 
	;   return (unsigned long) sz;
	; }
	;
	; (note that a negative sx adds _sy_ and vice versa)
	;
	; For the second problem, we replace the shift by a multiplication.
	; Unfortunately that means we have to deal with the signed issue again.
	;

	paddw	mm0, MMWORD [CORRECTION(0,0,edx)]   ; correction + roundfactor
	paddw	mm1, MMWORD [CORRECTION(0,1,edx)]

	movq	mm4,mm0   ; store current value for later
	movq	mm5,mm1
	pmulhw	mm0, MMWORD [RECIPROCAL(0,0,edx)]   ; reciprocal
	pmulhw	mm1, MMWORD [RECIPROCAL(0,1,edx)]
	paddw	mm0,mm4		; reciprocal is always negative (MSB=1),
	paddw	mm1,mm5   ; so we always need to add the initial value
	                ; (input value is never negative as we
	                ; inverted it at the start of this routine)

	; here it gets a bit tricky as both scale
	; and mm0/mm1 can be negative
	movq	mm6, MMWORD [SCALE(0,0,edx)]	; scale
	movq	mm7, MMWORD [SCALE(0,1,edx)]
	movq	mm4,mm0
	movq	mm5,mm1
	pmulhw	mm0,mm6
	pmulhw	mm1,mm7

	psraw	mm6,(WORD_BIT-1)    ; determine if scale is negative
	psraw	mm7,(WORD_BIT-1)

	pand	mm6,mm4             ; and add input if it is
	pand	mm7,mm5
	paddw	mm0,mm6
	paddw	mm1,mm7

	psraw	mm4,(WORD_BIT-1)    ; then check if negative input 
	psraw	mm5,(WORD_BIT-1)

	pand	mm4, MMWORD [SCALE(0,0,edx)]	; and add scale if it is
	pand	mm5, MMWORD [SCALE(0,1,edx)]
	paddw	mm0,mm4
	paddw	mm1,mm5

	pxor	mm0,mm2   ; val = -val
	pxor	mm1,mm3
	psubw	mm0,mm2
	psubw	mm1,mm3

	movq	MMWORD [MMBLOCK(0,0,edi,SIZEOF_DCTELEM)], mm0
	movq	MMWORD [MMBLOCK(0,1,edi,SIZEOF_DCTELEM)], mm1

	add	esi, byte 8*SIZEOF_DCTELEM
	add	edx, byte 8*SIZEOF_DCTELEM
	add	edi, byte 8*SIZEOF_JCOEF
	dec	al
	jnz	near .quantloop2
	dec	ah
	jnz	near .quantloop1	; to avoid branch misprediction

	emms		; empty MMX state

	pop	edi
	pop	esi
;	pop	edx		; need not be preserved
;	pop	ecx		; unused
;	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
