;
; jquanti.asm - sample data conversion and quantization (SSE2)
;
; Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
;
; Based on the 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_sse2 (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_sse2) PRIVATE

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

        pxor    xmm6,xmm6               ; xmm6=(all 0's)
        pcmpeqw xmm7,xmm7
        psllw   xmm7,7                  ; xmm7={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    xmm0, XMM_MMWORD [ebx+eax*SIZEOF_JSAMPLE]       ; xmm0=(01234567)
        movq    xmm1, XMM_MMWORD [edx+eax*SIZEOF_JSAMPLE]       ; xmm1=(89ABCDEF)

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

        movq    xmm2, XMM_MMWORD [ebx+eax*SIZEOF_JSAMPLE]       ; xmm2=(GHIJKLMN)
        movq    xmm3, XMM_MMWORD [edx+eax*SIZEOF_JSAMPLE]       ; xmm3=(OPQRSTUV)

        punpcklbw xmm0,xmm6             ; xmm0=(01234567)
        punpcklbw xmm1,xmm6             ; xmm1=(89ABCDEF)
        paddw     xmm0,xmm7
        paddw     xmm1,xmm7
        punpcklbw xmm2,xmm6             ; xmm2=(GHIJKLMN)
        punpcklbw xmm3,xmm6             ; xmm3=(OPQRSTUV)
        paddw     xmm2,xmm7
        paddw     xmm3,xmm7

        movdqa  XMMWORD [XMMBLOCK(0,0,edi,SIZEOF_DCTELEM)], xmm0
        movdqa  XMMWORD [XMMBLOCK(1,0,edi,SIZEOF_DCTELEM)], xmm1
        movdqa  XMMWORD [XMMBLOCK(2,0,edi,SIZEOF_DCTELEM)], xmm2
        movdqa  XMMWORD [XMMBLOCK(3,0,edi,SIZEOF_DCTELEM)], xmm3

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

        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_sse2 (JCOEFPTR coef_block, DCTELEM *divisors,
;                      DCTELEM *workspace);
;

%define RECIPROCAL(m,n,b) XMMBLOCK(DCTSIZE*0+(m),(n),(b),SIZEOF_DCTELEM)
%define CORRECTION(m,n,b) XMMBLOCK(DCTSIZE*1+(m),(n),(b),SIZEOF_DCTELEM)
%define SCALE(m,n,b)      XMMBLOCK(DCTSIZE*2+(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_sse2) PRIVATE

EXTN(jsimd_quantize_sse2):
        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     eax, DCTSIZE2/32
        alignx  16,7
.quantloop:
        movdqa  xmm4, XMMWORD [XMMBLOCK(0,0,esi,SIZEOF_DCTELEM)]
        movdqa  xmm5, XMMWORD [XMMBLOCK(1,0,esi,SIZEOF_DCTELEM)]
        movdqa  xmm6, XMMWORD [XMMBLOCK(2,0,esi,SIZEOF_DCTELEM)]
        movdqa  xmm7, XMMWORD [XMMBLOCK(3,0,esi,SIZEOF_DCTELEM)]
        movdqa  xmm0,xmm4
        movdqa  xmm1,xmm5
        movdqa  xmm2,xmm6
        movdqa  xmm3,xmm7
        psraw   xmm4,(WORD_BIT-1)
        psraw   xmm5,(WORD_BIT-1)
        psraw   xmm6,(WORD_BIT-1)
        psraw   xmm7,(WORD_BIT-1)
        pxor    xmm0,xmm4
        pxor    xmm1,xmm5
        pxor    xmm2,xmm6
        pxor    xmm3,xmm7
        psubw   xmm0,xmm4               ; if (xmm0 < 0) xmm0 = -xmm0;
        psubw   xmm1,xmm5               ; if (xmm1 < 0) xmm1 = -xmm1;
        psubw   xmm2,xmm6               ; if (xmm2 < 0) xmm2 = -xmm2;
        psubw   xmm3,xmm7               ; if (xmm3 < 0) xmm3 = -xmm3;

        paddw   xmm0, XMMWORD [CORRECTION(0,0,edx)]  ; correction + roundfactor
        paddw   xmm1, XMMWORD [CORRECTION(1,0,edx)]
        paddw   xmm2, XMMWORD [CORRECTION(2,0,edx)]
        paddw   xmm3, XMMWORD [CORRECTION(3,0,edx)]
        pmulhuw xmm0, XMMWORD [RECIPROCAL(0,0,edx)]  ; reciprocal
        pmulhuw xmm1, XMMWORD [RECIPROCAL(1,0,edx)]
        pmulhuw xmm2, XMMWORD [RECIPROCAL(2,0,edx)]
        pmulhuw xmm3, XMMWORD [RECIPROCAL(3,0,edx)]
        pmulhuw xmm0, XMMWORD [SCALE(0,0,edx)]  ; scale
        pmulhuw xmm1, XMMWORD [SCALE(1,0,edx)]
        pmulhuw xmm2, XMMWORD [SCALE(2,0,edx)]
        pmulhuw xmm3, XMMWORD [SCALE(3,0,edx)]

        pxor    xmm0,xmm4
        pxor    xmm1,xmm5
        pxor    xmm2,xmm6
        pxor    xmm3,xmm7
        psubw   xmm0,xmm4
        psubw   xmm1,xmm5
        psubw   xmm2,xmm6
        psubw   xmm3,xmm7
        movdqa  XMMWORD [XMMBLOCK(0,0,edi,SIZEOF_DCTELEM)], xmm0
        movdqa  XMMWORD [XMMBLOCK(1,0,edi,SIZEOF_DCTELEM)], xmm1
        movdqa  XMMWORD [XMMBLOCK(2,0,edi,SIZEOF_DCTELEM)], xmm2
        movdqa  XMMWORD [XMMBLOCK(3,0,edi,SIZEOF_DCTELEM)], xmm3

        add     esi, byte 32*SIZEOF_DCTELEM
        add     edx, byte 32*SIZEOF_DCTELEM
        add     edi, byte 32*SIZEOF_JCOEF
        dec     eax
        jnz     near .quantloop

        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
