1f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org;
2f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; jfss2int-64.asm - accurate integer FDCT (64-bit SSE2)
3f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org;
4f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
5f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; Copyright 2009 D. R. Commander
6f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org;
7f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; Based on
8f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; x86 SIMD extension for IJG JPEG library
9f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; Copyright (C) 1999-2006, MIYASAKA Masaru.
10f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; For conditions of distribution and use, see copyright notice in jsimdext.inc
11f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org;
12f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; This file should be assembled with NASM (Netwide Assembler),
13f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; can *not* be assembled with Microsoft's MASM or any compatible
14f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; assembler (including Borland's Turbo Assembler).
15f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; NASM is available from http://nasm.sourceforge.net/ or
16f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; http://sourceforge.net/project/showfiles.php?group_id=6208
17f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org;
18f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; This file contains a slow-but-accurate integer implementation of the
19f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; forward DCT (Discrete Cosine Transform). The following code is based
20f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; directly on the IJG's original jfdctint.c; see the jfdctint.c for
21f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; more details.
22f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org;
23f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; [TAB8]
24f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
25f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%include "jsimdext.inc"
26f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%include "jdct.inc"
27f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
28f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; --------------------------------------------------------------------------
29f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
30f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%define CONST_BITS	13
31f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%define PASS1_BITS	2
32f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
33f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%define DESCALE_P1	(CONST_BITS-PASS1_BITS)
34f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%define DESCALE_P2	(CONST_BITS+PASS1_BITS)
35f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
36f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%if CONST_BITS == 13
37f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_0_298	equ	 2446		; FIX(0.298631336)
38f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_0_390	equ	 3196		; FIX(0.390180644)
39f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_0_541	equ	 4433		; FIX(0.541196100)
40f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_0_765	equ	 6270		; FIX(0.765366865)
41f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_0_899	equ	 7373		; FIX(0.899976223)
42f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_1_175	equ	 9633		; FIX(1.175875602)
43f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_1_501	equ	12299		; FIX(1.501321110)
44f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_1_847	equ	15137		; FIX(1.847759065)
45f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_1_961	equ	16069		; FIX(1.961570560)
46f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_2_053	equ	16819		; FIX(2.053119869)
47f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_2_562	equ	20995		; FIX(2.562915447)
48f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_3_072	equ	25172		; FIX(3.072711026)
49f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%else
50f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; NASM cannot do compile-time arithmetic on floating-point constants.
51f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%define DESCALE(x,n)  (((x)+(1<<((n)-1)))>>(n))
52f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_0_298	equ	DESCALE( 320652955,30-CONST_BITS)	; FIX(0.298631336)
53f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_0_390	equ	DESCALE( 418953276,30-CONST_BITS)	; FIX(0.390180644)
54f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_0_541	equ	DESCALE( 581104887,30-CONST_BITS)	; FIX(0.541196100)
55f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_0_765	equ	DESCALE( 821806413,30-CONST_BITS)	; FIX(0.765366865)
56f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_0_899	equ	DESCALE( 966342111,30-CONST_BITS)	; FIX(0.899976223)
57f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_1_175	equ	DESCALE(1262586813,30-CONST_BITS)	; FIX(1.175875602)
58f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_1_501	equ	DESCALE(1612031267,30-CONST_BITS)	; FIX(1.501321110)
59f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_1_847	equ	DESCALE(1984016188,30-CONST_BITS)	; FIX(1.847759065)
60f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_1_961	equ	DESCALE(2106220350,30-CONST_BITS)	; FIX(1.961570560)
61f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_2_053	equ	DESCALE(2204520673,30-CONST_BITS)	; FIX(2.053119869)
62f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_2_562	equ	DESCALE(2751909506,30-CONST_BITS)	; FIX(2.562915447)
63f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgF_3_072	equ	DESCALE(3299298341,30-CONST_BITS)	; FIX(3.072711026)
64f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%endif
65f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
66f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; --------------------------------------------------------------------------
67f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	SECTION	SEG_CONST
68f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
69f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	alignz	16
706863548fddb19aff300e697e2763e4beb5a5f46ahbono@chromium.org	global	EXTN(jconst_fdct_islow_sse2) PRIVATE
71f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
72f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgEXTN(jconst_fdct_islow_sse2):
73f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
74f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgPW_F130_F054	times 4 dw  (F_0_541+F_0_765), F_0_541
75f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgPW_F054_MF130	times 4 dw  F_0_541, (F_0_541-F_1_847)
76f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgPW_MF078_F117	times 4 dw  (F_1_175-F_1_961), F_1_175
77f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgPW_F117_F078	times 4 dw  F_1_175, (F_1_175-F_0_390)
78f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgPW_MF060_MF089	times 4 dw  (F_0_298-F_0_899),-F_0_899
79f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgPW_MF089_F060	times 4 dw -F_0_899, (F_1_501-F_0_899)
80f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgPW_MF050_MF256	times 4 dw  (F_2_053-F_2_562),-F_2_562
81f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgPW_MF256_F050	times 4 dw -F_2_562, (F_3_072-F_2_562)
82f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgPD_DESCALE_P1	times 4 dd  1 << (DESCALE_P1-1)
83f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgPD_DESCALE_P2	times 4 dd  1 << (DESCALE_P2-1)
84f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgPW_DESCALE_P2X	times 8 dw  1 << (PASS1_BITS-1)
85f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
86f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	alignz	16
87f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
88f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; --------------------------------------------------------------------------
89f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	SECTION	SEG_TEXT
90f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	BITS	64
91f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org;
92f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; Perform the forward DCT on one block of samples.
93f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org;
94f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; GLOBAL(void)
95f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; jsimd_fdct_islow_sse2 (DCTELEM * data)
96f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org;
97f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
98f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; r10 = DCTELEM * data
99f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
100f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%define wk(i)		rbp-(WK_NUM-(i))*SIZEOF_XMMWORD	; xmmword wk[WK_NUM]
101f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org%define WK_NUM		6
102f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
103f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	align	16
1046863548fddb19aff300e697e2763e4beb5a5f46ahbono@chromium.org	global	EXTN(jsimd_fdct_islow_sse2) PRIVATE
105f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
106f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgEXTN(jsimd_fdct_islow_sse2):
107f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	push	rbp
108f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	mov	rax,rsp				; rax = original rbp
109f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	sub	rsp, byte 4
110f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	and	rsp, byte (-SIZEOF_XMMWORD)	; align to 128 bits
111f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	mov	[rsp],rax
112f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	mov	rbp,rsp				; rbp = aligned rbp
113f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	lea	rsp, [wk(0)]
114f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	collect_args
115f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
116f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; ---- Pass 1: process rows.
117f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
118f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	mov	rdx, r10	; (DCTELEM *)
119f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
120f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm0, XMMWORD [XMMBLOCK(0,0,rdx,SIZEOF_DCTELEM)]
121f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm1, XMMWORD [XMMBLOCK(1,0,rdx,SIZEOF_DCTELEM)]
122f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm2, XMMWORD [XMMBLOCK(2,0,rdx,SIZEOF_DCTELEM)]
123f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm3, XMMWORD [XMMBLOCK(3,0,rdx,SIZEOF_DCTELEM)]
124f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
125f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; xmm0=(00 01 02 03 04 05 06 07), xmm2=(20 21 22 23 24 25 26 27)
126f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; xmm1=(10 11 12 13 14 15 16 17), xmm3=(30 31 32 33 34 35 36 37)
127f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
128f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm4,xmm0		; transpose coefficients(phase 1)
129f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm0,xmm1		; xmm0=(00 10 01 11 02 12 03 13)
130f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm4,xmm1		; xmm4=(04 14 05 15 06 16 07 17)
131f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm5,xmm2		; transpose coefficients(phase 1)
132f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm2,xmm3		; xmm2=(20 30 21 31 22 32 23 33)
133f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm5,xmm3		; xmm5=(24 34 25 35 26 36 27 37)
134f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
135f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm6, XMMWORD [XMMBLOCK(4,0,rdx,SIZEOF_DCTELEM)]
136f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm7, XMMWORD [XMMBLOCK(5,0,rdx,SIZEOF_DCTELEM)]
137f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm1, XMMWORD [XMMBLOCK(6,0,rdx,SIZEOF_DCTELEM)]
138f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm3, XMMWORD [XMMBLOCK(7,0,rdx,SIZEOF_DCTELEM)]
139f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
140f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; xmm6=( 4 12 20 28 36 44 52 60), xmm1=( 6 14 22 30 38 46 54 62)
141f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; xmm7=( 5 13 21 29 37 45 53 61), xmm3=( 7 15 23 31 39 47 55 63)
142f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
143f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(0)], xmm2	; wk(0)=(20 30 21 31 22 32 23 33)
144f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(1)], xmm5	; wk(1)=(24 34 25 35 26 36 27 37)
145f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
146f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm2,xmm6		; transpose coefficients(phase 1)
147f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm6,xmm7		; xmm6=(40 50 41 51 42 52 43 53)
148f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm2,xmm7		; xmm2=(44 54 45 55 46 56 47 57)
149f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm5,xmm1		; transpose coefficients(phase 1)
150f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm1,xmm3		; xmm1=(60 70 61 71 62 72 63 73)
151f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm5,xmm3		; xmm5=(64 74 65 75 66 76 67 77)
152f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
153f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm7,xmm6		; transpose coefficients(phase 2)
154f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckldq xmm6,xmm1		; xmm6=(40 50 60 70 41 51 61 71)
155f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhdq xmm7,xmm1		; xmm7=(42 52 62 72 43 53 63 73)
156f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm3,xmm2		; transpose coefficients(phase 2)
157f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckldq xmm2,xmm5		; xmm2=(44 54 64 74 45 55 65 75)
158f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhdq xmm3,xmm5		; xmm3=(46 56 66 76 47 57 67 77)
159f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
160f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm1, XMMWORD [wk(0)]	; xmm1=(20 30 21 31 22 32 23 33)
161f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm5, XMMWORD [wk(1)]	; xmm5=(24 34 25 35 26 36 27 37)
162f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(2)], xmm7	; wk(2)=(42 52 62 72 43 53 63 73)
163f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(3)], xmm2	; wk(3)=(44 54 64 74 45 55 65 75)
164f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
165f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm7,xmm0		; transpose coefficients(phase 2)
166f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckldq xmm0,xmm1		; xmm0=(00 10 20 30 01 11 21 31)
167f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhdq xmm7,xmm1		; xmm7=(02 12 22 32 03 13 23 33)
168f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm2,xmm4		; transpose coefficients(phase 2)
169f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckldq xmm4,xmm5		; xmm4=(04 14 24 34 05 15 25 35)
170f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhdq xmm2,xmm5		; xmm2=(06 16 26 36 07 17 27 37)
171f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
172f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa     xmm1,xmm0		; transpose coefficients(phase 3)
173f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklqdq xmm0,xmm6		; xmm0=(00 10 20 30 40 50 60 70)=data0
174f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhqdq xmm1,xmm6		; xmm1=(01 11 21 31 41 51 61 71)=data1
175f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa     xmm5,xmm2		; transpose coefficients(phase 3)
176f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklqdq xmm2,xmm3		; xmm2=(06 16 26 36 46 56 66 76)=data6
177f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhqdq xmm5,xmm3		; xmm5=(07 17 27 37 47 57 67 77)=data7
178f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
179f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm6,xmm1
180f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm3,xmm0
181f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm1,xmm2		; xmm1=data1-data6=tmp6
182f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm0,xmm5		; xmm0=data0-data7=tmp7
183f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm6,xmm2		; xmm6=data1+data6=tmp1
184f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm3,xmm5		; xmm3=data0+data7=tmp0
185f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
186f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm2, XMMWORD [wk(2)]	; xmm2=(42 52 62 72 43 53 63 73)
187f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm5, XMMWORD [wk(3)]	; xmm5=(44 54 64 74 45 55 65 75)
188f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(0)], xmm1	; wk(0)=tmp6
189f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(1)], xmm0	; wk(1)=tmp7
190f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
191f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa     xmm1,xmm7		; transpose coefficients(phase 3)
192f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklqdq xmm7,xmm2		; xmm7=(02 12 22 32 42 52 62 72)=data2
193f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhqdq xmm1,xmm2		; xmm1=(03 13 23 33 43 53 63 73)=data3
194f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa     xmm0,xmm4		; transpose coefficients(phase 3)
195f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklqdq xmm4,xmm5		; xmm4=(04 14 24 34 44 54 64 74)=data4
196f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhqdq xmm0,xmm5		; xmm0=(05 15 25 35 45 55 65 75)=data5
197f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
198f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm2,xmm1
199f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm5,xmm7
200f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm1,xmm4		; xmm1=data3+data4=tmp3
201f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm7,xmm0		; xmm7=data2+data5=tmp2
202f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm2,xmm4		; xmm2=data3-data4=tmp4
203f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm5,xmm0		; xmm5=data2-data5=tmp5
204f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
205f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; -- Even part
206f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
207f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm4,xmm3
208f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm0,xmm6
209f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm3,xmm1		; xmm3=tmp10
210f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm6,xmm7		; xmm6=tmp11
211f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm4,xmm1		; xmm4=tmp13
212f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm0,xmm7		; xmm0=tmp12
213f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
214f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm1,xmm3
215f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm3,xmm6		; xmm3=tmp10+tmp11
216f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm1,xmm6		; xmm1=tmp10-tmp11
217f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
218f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psllw	xmm3,PASS1_BITS		; xmm3=data0
219f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psllw	xmm1,PASS1_BITS		; xmm1=data4
220f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
221f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(2)], xmm3	; wk(2)=data0
222f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(3)], xmm1	; wk(3)=data4
223f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
224f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (Original)
225f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z1 = (tmp12 + tmp13) * 0.541196100;
226f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data2 = z1 + tmp13 * 0.765366865;
227f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data6 = z1 + tmp12 * -1.847759065;
228f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	;
229f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (This implementation)
230f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data2 = tmp13 * (0.541196100 + 0.765366865) + tmp12 * 0.541196100;
231f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data6 = tmp13 * 0.541196100 + tmp12 * (0.541196100 - 1.847759065);
232f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
233f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm7,xmm4		; xmm4=tmp13
234f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm6,xmm4
235f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm7,xmm0		; xmm0=tmp12
236f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm6,xmm0
237f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm4,xmm7
238f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm0,xmm6
239f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm7,[rel PW_F130_F054]	; xmm7=data2L
240f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm6,[rel PW_F130_F054]	; xmm6=data2H
241f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm4,[rel PW_F054_MF130]	; xmm4=data6L
242f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm0,[rel PW_F054_MF130]	; xmm0=data6H
243f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
244f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm7,[rel PD_DESCALE_P1]
245f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm6,[rel PD_DESCALE_P1]
246f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm7,DESCALE_P1
247f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm6,DESCALE_P1
248f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm4,[rel PD_DESCALE_P1]
249f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm0,[rel PD_DESCALE_P1]
250f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm4,DESCALE_P1
251f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm0,DESCALE_P1
252f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
253f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm7,xmm6		; xmm7=data2
254f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm4,xmm0		; xmm4=data6
255f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
256f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(4)], xmm7	; wk(4)=data2
257f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(5)], xmm4	; wk(5)=data6
258f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
259f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; -- Odd part
260f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
261f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm3, XMMWORD [wk(0)]	; xmm3=tmp6
262f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm1, XMMWORD [wk(1)]	; xmm1=tmp7
263f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
264f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm6,xmm2		; xmm2=tmp4
265f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm0,xmm5		; xmm5=tmp5
266f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm6,xmm3		; xmm6=z3
267f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm0,xmm1		; xmm0=z4
268f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
269f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (Original)
270f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z5 = (z3 + z4) * 1.175875602;
271f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z3 = z3 * -1.961570560;  z4 = z4 * -0.390180644;
272f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z3 += z5;  z4 += z5;
273f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	;
274f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (This implementation)
275f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z3 = z3 * (1.175875602 - 1.961570560) + z4 * 1.175875602;
276f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z4 = z3 * 1.175875602 + z4 * (1.175875602 - 0.390180644);
277f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
278f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm7,xmm6
279f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm4,xmm6
280f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm7,xmm0
281f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm4,xmm0
282f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm6,xmm7
283f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm0,xmm4
284f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm7,[rel PW_MF078_F117]	; xmm7=z3L
285f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm4,[rel PW_MF078_F117]	; xmm4=z3H
286f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm6,[rel PW_F117_F078]	; xmm6=z4L
287f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm0,[rel PW_F117_F078]	; xmm0=z4H
288f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
289f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(0)], xmm7	; wk(0)=z3L
290f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(1)], xmm4	; wk(1)=z3H
291f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
292f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (Original)
293f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z1 = tmp4 + tmp7;  z2 = tmp5 + tmp6;
294f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp4 = tmp4 * 0.298631336;  tmp5 = tmp5 * 2.053119869;
295f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp6 = tmp6 * 3.072711026;  tmp7 = tmp7 * 1.501321110;
296f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z1 = z1 * -0.899976223;  z2 = z2 * -2.562915447;
297f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data7 = tmp4 + z1 + z3;  data5 = tmp5 + z2 + z4;
298f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data3 = tmp6 + z2 + z3;  data1 = tmp7 + z1 + z4;
299f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	;
300f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (This implementation)
301f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp4 = tmp4 * (0.298631336 - 0.899976223) + tmp7 * -0.899976223;
302f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp5 = tmp5 * (2.053119869 - 2.562915447) + tmp6 * -2.562915447;
303f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp6 = tmp5 * -2.562915447 + tmp6 * (3.072711026 - 2.562915447);
304f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp7 = tmp4 * -0.899976223 + tmp7 * (1.501321110 - 0.899976223);
305f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data7 = tmp4 + z3;  data5 = tmp5 + z4;
306f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data3 = tmp6 + z3;  data1 = tmp7 + z4;
307f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
308f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm7,xmm2
309f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm4,xmm2
310f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm7,xmm1
311f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm4,xmm1
312f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm2,xmm7
313f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm1,xmm4
314f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm7,[rel PW_MF060_MF089]	; xmm7=tmp4L
315f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm4,[rel PW_MF060_MF089]	; xmm4=tmp4H
316f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm2,[rel PW_MF089_F060]	; xmm2=tmp7L
317f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm1,[rel PW_MF089_F060]	; xmm1=tmp7H
318f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
319f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm7, XMMWORD [wk(0)]	; xmm7=data7L
320f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm4, XMMWORD [wk(1)]	; xmm4=data7H
321f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm2,xmm6		; xmm2=data1L
322f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm1,xmm0		; xmm1=data1H
323f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
324f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm7,[rel PD_DESCALE_P1]
325f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm4,[rel PD_DESCALE_P1]
326f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm7,DESCALE_P1
327f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm4,DESCALE_P1
328f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm2,[rel PD_DESCALE_P1]
329f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm1,[rel PD_DESCALE_P1]
330f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm2,DESCALE_P1
331f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm1,DESCALE_P1
332f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
333f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm7,xmm4		; xmm7=data7
334f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm2,xmm1		; xmm2=data1
335f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
336f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm4,xmm5
337f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm1,xmm5
338f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm4,xmm3
339f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm1,xmm3
340f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm5,xmm4
341f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm3,xmm1
342f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm4,[rel PW_MF050_MF256]	; xmm4=tmp5L
343f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm1,[rel PW_MF050_MF256]	; xmm1=tmp5H
344f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm5,[rel PW_MF256_F050]	; xmm5=tmp6L
345f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm3,[rel PW_MF256_F050]	; xmm3=tmp6H
346f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
347f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm4,xmm6		; xmm4=data5L
348f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm1,xmm0		; xmm1=data5H
349f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm5, XMMWORD [wk(0)]	; xmm5=data3L
350f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm3, XMMWORD [wk(1)]	; xmm3=data3H
351f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
352f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm4,[rel PD_DESCALE_P1]
353f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm1,[rel PD_DESCALE_P1]
354f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm4,DESCALE_P1
355f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm1,DESCALE_P1
356f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm5,[rel PD_DESCALE_P1]
357f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm3,[rel PD_DESCALE_P1]
358f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm5,DESCALE_P1
359f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm3,DESCALE_P1
360f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
361f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm4,xmm1		; xmm4=data5
362f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm5,xmm3		; xmm5=data3
363f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
364f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; ---- Pass 2: process columns.
365f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
366f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm6, XMMWORD [wk(2)]	; xmm6=col0
367f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm0, XMMWORD [wk(4)]	; xmm0=col2
368f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
369f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; xmm6=(00 10 20 30 40 50 60 70), xmm0=(02 12 22 32 42 52 62 72)
370f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; xmm2=(01 11 21 31 41 51 61 71), xmm5=(03 13 23 33 43 53 63 73)
371f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
372f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm1,xmm6		; transpose coefficients(phase 1)
373f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm6,xmm2		; xmm6=(00 01 10 11 20 21 30 31)
374f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm1,xmm2		; xmm1=(40 41 50 51 60 61 70 71)
375f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm3,xmm0		; transpose coefficients(phase 1)
376f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm0,xmm5		; xmm0=(02 03 12 13 22 23 32 33)
377f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm3,xmm5		; xmm3=(42 43 52 53 62 63 72 73)
378f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
379f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm2, XMMWORD [wk(3)]	; xmm2=col4
380f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm5, XMMWORD [wk(5)]	; xmm5=col6
381f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
382f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; xmm2=(04 14 24 34 44 54 64 74), xmm5=(06 16 26 36 46 56 66 76)
383f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; xmm4=(05 15 25 35 45 55 65 75), xmm7=(07 17 27 37 47 57 67 77)
384f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
385f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(0)], xmm0	; wk(0)=(02 03 12 13 22 23 32 33)
386f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(1)], xmm3	; wk(1)=(42 43 52 53 62 63 72 73)
387f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
388f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm0,xmm2		; transpose coefficients(phase 1)
389f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm2,xmm4		; xmm2=(04 05 14 15 24 25 34 35)
390f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm0,xmm4		; xmm0=(44 45 54 55 64 65 74 75)
391f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm3,xmm5		; transpose coefficients(phase 1)
392f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm5,xmm7		; xmm5=(06 07 16 17 26 27 36 37)
393f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm3,xmm7		; xmm3=(46 47 56 57 66 67 76 77)
394f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
395f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm4,xmm2		; transpose coefficients(phase 2)
396f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckldq xmm2,xmm5		; xmm2=(04 05 06 07 14 15 16 17)
397f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhdq xmm4,xmm5		; xmm4=(24 25 26 27 34 35 36 37)
398f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm7,xmm0		; transpose coefficients(phase 2)
399f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckldq xmm0,xmm3		; xmm0=(44 45 46 47 54 55 56 57)
400f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhdq xmm7,xmm3		; xmm7=(64 65 66 67 74 75 76 77)
401f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
402f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm5, XMMWORD [wk(0)]	; xmm5=(02 03 12 13 22 23 32 33)
403f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm3, XMMWORD [wk(1)]	; xmm3=(42 43 52 53 62 63 72 73)
404f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(2)], xmm4	; wk(2)=(24 25 26 27 34 35 36 37)
405f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(3)], xmm0	; wk(3)=(44 45 46 47 54 55 56 57)
406f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
407f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm4,xmm6		; transpose coefficients(phase 2)
408f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckldq xmm6,xmm5		; xmm6=(00 01 02 03 10 11 12 13)
409f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhdq xmm4,xmm5		; xmm4=(20 21 22 23 30 31 32 33)
410f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm0,xmm1		; transpose coefficients(phase 2)
411f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckldq xmm1,xmm3		; xmm1=(40 41 42 43 50 51 52 53)
412f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhdq xmm0,xmm3		; xmm0=(60 61 62 63 70 71 72 73)
413f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
414f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa     xmm5,xmm6		; transpose coefficients(phase 3)
415f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklqdq xmm6,xmm2		; xmm6=(00 01 02 03 04 05 06 07)=data0
416f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhqdq xmm5,xmm2		; xmm5=(10 11 12 13 14 15 16 17)=data1
417f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa     xmm3,xmm0		; transpose coefficients(phase 3)
418f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklqdq xmm0,xmm7		; xmm0=(60 61 62 63 64 65 66 67)=data6
419f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhqdq xmm3,xmm7		; xmm3=(70 71 72 73 74 75 76 77)=data7
420f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
421f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm2,xmm5
422f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm7,xmm6
423f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm5,xmm0		; xmm5=data1-data6=tmp6
424f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm6,xmm3		; xmm6=data0-data7=tmp7
425f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm2,xmm0		; xmm2=data1+data6=tmp1
426f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm7,xmm3		; xmm7=data0+data7=tmp0
427f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
428f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm0, XMMWORD [wk(2)]	; xmm0=(24 25 26 27 34 35 36 37)
429f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm3, XMMWORD [wk(3)]	; xmm3=(44 45 46 47 54 55 56 57)
430f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(0)], xmm5	; wk(0)=tmp6
431f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(1)], xmm6	; wk(1)=tmp7
432f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
433f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa     xmm5,xmm4		; transpose coefficients(phase 3)
434f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklqdq xmm4,xmm0		; xmm4=(20 21 22 23 24 25 26 27)=data2
435f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhqdq xmm5,xmm0		; xmm5=(30 31 32 33 34 35 36 37)=data3
436f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa     xmm6,xmm1		; transpose coefficients(phase 3)
437f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklqdq xmm1,xmm3		; xmm1=(40 41 42 43 44 45 46 47)=data4
438f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhqdq xmm6,xmm3		; xmm6=(50 51 52 53 54 55 56 57)=data5
439f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
440f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm0,xmm5
441f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm3,xmm4
442f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm5,xmm1		; xmm5=data3+data4=tmp3
443f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm4,xmm6		; xmm4=data2+data5=tmp2
444f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm0,xmm1		; xmm0=data3-data4=tmp4
445f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm3,xmm6		; xmm3=data2-data5=tmp5
446f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
447f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; -- Even part
448f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
449f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm1,xmm7
450f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm6,xmm2
451f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm7,xmm5		; xmm7=tmp10
452f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm2,xmm4		; xmm2=tmp11
453f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm1,xmm5		; xmm1=tmp13
454f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm6,xmm4		; xmm6=tmp12
455f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
456f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm5,xmm7
457f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm7,xmm2		; xmm7=tmp10+tmp11
458f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psubw	xmm5,xmm2		; xmm5=tmp10-tmp11
459f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
460f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm7,[rel PW_DESCALE_P2X]
461f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm5,[rel PW_DESCALE_P2X]
462f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psraw	xmm7,PASS1_BITS		; xmm7=data0
463f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psraw	xmm5,PASS1_BITS		; xmm5=data4
464f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
465f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [XMMBLOCK(0,0,rdx,SIZEOF_DCTELEM)], xmm7
466f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [XMMBLOCK(4,0,rdx,SIZEOF_DCTELEM)], xmm5
467f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
468f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (Original)
469f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z1 = (tmp12 + tmp13) * 0.541196100;
470f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data2 = z1 + tmp13 * 0.765366865;
471f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data6 = z1 + tmp12 * -1.847759065;
472f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	;
473f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (This implementation)
474f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data2 = tmp13 * (0.541196100 + 0.765366865) + tmp12 * 0.541196100;
475f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data6 = tmp13 * 0.541196100 + tmp12 * (0.541196100 - 1.847759065);
476f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
477f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm4,xmm1		; xmm1=tmp13
478f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm2,xmm1
479f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm4,xmm6		; xmm6=tmp12
480f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm2,xmm6
481f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm1,xmm4
482f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm6,xmm2
483f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm4,[rel PW_F130_F054]	; xmm4=data2L
484f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm2,[rel PW_F130_F054]	; xmm2=data2H
485f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm1,[rel PW_F054_MF130]	; xmm1=data6L
486f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm6,[rel PW_F054_MF130]	; xmm6=data6H
487f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
488f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm4,[rel PD_DESCALE_P2]
489f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm2,[rel PD_DESCALE_P2]
490f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm4,DESCALE_P2
491f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm2,DESCALE_P2
492f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm1,[rel PD_DESCALE_P2]
493f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm6,[rel PD_DESCALE_P2]
494f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm1,DESCALE_P2
495f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm6,DESCALE_P2
496f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
497f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm4,xmm2		; xmm4=data2
498f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm1,xmm6		; xmm1=data6
499f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
500f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [XMMBLOCK(2,0,rdx,SIZEOF_DCTELEM)], xmm4
501f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [XMMBLOCK(6,0,rdx,SIZEOF_DCTELEM)], xmm1
502f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
503f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; -- Odd part
504f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
505f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm7, XMMWORD [wk(0)]	; xmm7=tmp6
506f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm5, XMMWORD [wk(1)]	; xmm5=tmp7
507f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
508f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm2,xmm0		; xmm0=tmp4
509f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	xmm6,xmm3		; xmm3=tmp5
510f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm2,xmm7		; xmm2=z3
511f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddw	xmm6,xmm5		; xmm6=z4
512f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
513f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (Original)
514f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z5 = (z3 + z4) * 1.175875602;
515f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z3 = z3 * -1.961570560;  z4 = z4 * -0.390180644;
516f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z3 += z5;  z4 += z5;
517f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	;
518f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (This implementation)
519f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z3 = z3 * (1.175875602 - 1.961570560) + z4 * 1.175875602;
520f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z4 = z3 * 1.175875602 + z4 * (1.175875602 - 0.390180644);
521f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
522f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm4,xmm2
523f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm1,xmm2
524f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm4,xmm6
525f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm1,xmm6
526f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm2,xmm4
527f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm6,xmm1
528f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm4,[rel PW_MF078_F117]	; xmm4=z3L
529f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm1,[rel PW_MF078_F117]	; xmm1=z3H
530f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm2,[rel PW_F117_F078]	; xmm2=z4L
531f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm6,[rel PW_F117_F078]	; xmm6=z4H
532f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
533f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(0)], xmm4	; wk(0)=z3L
534f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [wk(1)], xmm1	; wk(1)=z3H
535f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
536f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (Original)
537f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z1 = tmp4 + tmp7;  z2 = tmp5 + tmp6;
538f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp4 = tmp4 * 0.298631336;  tmp5 = tmp5 * 2.053119869;
539f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp6 = tmp6 * 3.072711026;  tmp7 = tmp7 * 1.501321110;
540f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; z1 = z1 * -0.899976223;  z2 = z2 * -2.562915447;
541f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data7 = tmp4 + z1 + z3;  data5 = tmp5 + z2 + z4;
542f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data3 = tmp6 + z2 + z3;  data1 = tmp7 + z1 + z4;
543f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	;
544f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; (This implementation)
545f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp4 = tmp4 * (0.298631336 - 0.899976223) + tmp7 * -0.899976223;
546f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp5 = tmp5 * (2.053119869 - 2.562915447) + tmp6 * -2.562915447;
547f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp6 = tmp5 * -2.562915447 + tmp6 * (3.072711026 - 2.562915447);
548f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; tmp7 = tmp4 * -0.899976223 + tmp7 * (1.501321110 - 0.899976223);
549f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data7 = tmp4 + z3;  data5 = tmp5 + z4;
550f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	; data3 = tmp6 + z3;  data1 = tmp7 + z4;
551f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
552f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm4,xmm0
553f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm1,xmm0
554f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm4,xmm5
555f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm1,xmm5
556f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm0,xmm4
557f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm5,xmm1
558f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm4,[rel PW_MF060_MF089]	; xmm4=tmp4L
559f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm1,[rel PW_MF060_MF089]	; xmm1=tmp4H
560f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm0,[rel PW_MF089_F060]	; xmm0=tmp7L
561f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm5,[rel PW_MF089_F060]	; xmm5=tmp7H
562f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
563f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm4, XMMWORD [wk(0)]	; xmm4=data7L
564f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm1, XMMWORD [wk(1)]	; xmm1=data7H
565f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm0,xmm2		; xmm0=data1L
566f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm5,xmm6		; xmm5=data1H
567f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
568f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm4,[rel PD_DESCALE_P2]
569f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm1,[rel PD_DESCALE_P2]
570f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm4,DESCALE_P2
571f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm1,DESCALE_P2
572f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm0,[rel PD_DESCALE_P2]
573f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm5,[rel PD_DESCALE_P2]
574f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm0,DESCALE_P2
575f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm5,DESCALE_P2
576f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
577f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm4,xmm1		; xmm4=data7
578f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm0,xmm5		; xmm0=data1
579f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
580f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [XMMBLOCK(7,0,rdx,SIZEOF_DCTELEM)], xmm4
581f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [XMMBLOCK(1,0,rdx,SIZEOF_DCTELEM)], xmm0
582f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
583f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm1,xmm3
584f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm5,xmm3
585f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpcklwd xmm1,xmm7
586f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	punpckhwd xmm5,xmm7
587f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm3,xmm1
588f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa    xmm7,xmm5
589f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm1,[rel PW_MF050_MF256]	; xmm1=tmp5L
590f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm5,[rel PW_MF050_MF256]	; xmm5=tmp5H
591f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm3,[rel PW_MF256_F050]	; xmm3=tmp6L
592f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pmaddwd   xmm7,[rel PW_MF256_F050]	; xmm7=tmp6H
593f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
594f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm1,xmm2		; xmm1=data5L
595f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm5,xmm6		; xmm5=data5H
596f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm3, XMMWORD [wk(0)]	; xmm3=data3L
597f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm7, XMMWORD [wk(1)]	; xmm7=data3H
598f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
599f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm1,[rel PD_DESCALE_P2]
600f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm5,[rel PD_DESCALE_P2]
601f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm1,DESCALE_P2
602f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm5,DESCALE_P2
603f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm3,[rel PD_DESCALE_P2]
604f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	paddd	xmm7,[rel PD_DESCALE_P2]
605f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm3,DESCALE_P2
606f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	psrad	xmm7,DESCALE_P2
607f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
608f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm1,xmm5		; xmm1=data5
609f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	packssdw  xmm3,xmm7		; xmm3=data3
610f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
611f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [XMMBLOCK(5,0,rdx,SIZEOF_DCTELEM)], xmm1
612f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	movdqa	XMMWORD [XMMBLOCK(3,0,rdx,SIZEOF_DCTELEM)], xmm3
613f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
614f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	uncollect_args
615f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	mov	rsp,rbp		; rsp <- aligned rbp
616f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pop	rsp		; rsp <- original rbp
617f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	pop	rbp
618f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	ret
619f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
620f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; For some reason, the OS X linker does not honor the request to align the
621f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org; segment unless we do this.
622f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	align	16
623