]> git.sesse.net Git - x264/blob - common/x86/dct-64.asm
Faster avg_weight assembly
[x264] / common / x86 / dct-64.asm
1 ;*****************************************************************************
2 ;* dct-64.asm: h264 encoder library
3 ;*****************************************************************************
4 ;* Copyright (C) 2003-2008 x264 project
5 ;*
6 ;* Authors: Laurent Aimar <fenrir@via.ecp.fr> (initial version)
7 ;*          Loren Merritt <lorenm@u.washington.edu> (dct8, misc)
8 ;*          Min Chen <chenm001.163.com> (converted to nasm)
9 ;*
10 ;* This program is free software; you can redistribute it and/or modify
11 ;* it under the terms of the GNU General Public License as published by
12 ;* the Free Software Foundation; either version 2 of the License, or
13 ;* (at your option) any later version.
14 ;*
15 ;* This program is distributed in the hope that it will be useful,
16 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;* GNU General Public License for more details.
19 ;*
20 ;* You should have received a copy of the GNU General Public License
21 ;* along with this program; if not, write to the Free Software
22 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
23 ;*****************************************************************************
24
25 %include "x86inc.asm"
26 %include "x86util.asm"
27
28 SECTION_RODATA
29 pw_32: times 8 dw 32
30
31 SECTION .text
32 INIT_XMM
33
34 %macro DCT8_1D 10
35     SUMSUB_BA  m%8, m%1 ; %8=s07, %1=d07
36     SUMSUB_BA  m%7, m%2 ; %7=s16, %2=d16
37     SUMSUB_BA  m%6, m%3 ; %6=s25, %3=d25
38     SUMSUB_BA  m%5, m%4 ; %5=s34, %4=d34
39
40     SUMSUB_BA  m%5, m%8 ; %5=a0, %8=a2
41     SUMSUB_BA  m%6, m%7 ; %6=a1, %7=a3
42
43     movdqa  m%9, m%1
44     psraw   m%9, 1
45     paddw   m%9, m%1
46     paddw   m%9, m%2
47     paddw   m%9, m%3 ; %9=a4
48
49     movdqa  m%10, m%4
50     psraw   m%10, 1
51     paddw   m%10, m%4
52     paddw   m%10, m%2
53     psubw   m%10, m%3 ; %10=a7
54
55     SUMSUB_BA  m%4, m%1
56     psubw   m%1, m%3
57     psubw   m%4, m%2
58     psraw   m%3, 1
59     psraw   m%2, 1
60     psubw   m%1, m%3 ; %1=a5
61     psubw   m%4, m%2 ; %4=a6
62
63     SUMSUB_BA  m%6, m%5 ; %6=b0, %5=b4
64
65     movdqa  m%2, m%10
66     psraw   m%2, 2
67     paddw   m%2, m%9 ; %2=b1
68     psraw   m%9, 2
69     psubw   m%9, m%10 ; %9=b7
70
71     movdqa  m%3, m%7
72     psraw   m%3, 1
73     paddw   m%3, m%8 ; %3=b2
74     psraw   m%8, 1
75     psubw   m%8, m%7 ; %8=b6
76
77     movdqa  m%7, m%4
78     psraw   m%7, 2
79     paddw   m%7, m%1 ; %7=b3
80     psraw   m%1, 2
81     psubw   m%4, m%1 ; %4=b5
82
83     SWAP %1, %6, %4, %7, %8, %9
84 %endmacro
85
86 ;-----------------------------------------------------------------------------
87 ; void x264_sub8x8_dct8_sse2( int16_t dct[8][8], uint8_t *pix1, uint8_t *pix2 )
88 ;-----------------------------------------------------------------------------
89 cglobal x264_sub8x8_dct8_sse2
90     LOAD_DIFF  m0, m8, m9, [r1+0*FENC_STRIDE], [r2+0*FDEC_STRIDE]
91     LOAD_DIFF  m1, m8, m9, [r1+1*FENC_STRIDE], [r2+1*FDEC_STRIDE]
92     LOAD_DIFF  m2, m8, m9, [r1+2*FENC_STRIDE], [r2+2*FDEC_STRIDE]
93     LOAD_DIFF  m3, m8, m9, [r1+3*FENC_STRIDE], [r2+3*FDEC_STRIDE]
94     LOAD_DIFF  m4, m8, m9, [r1+4*FENC_STRIDE], [r2+4*FDEC_STRIDE]
95     LOAD_DIFF  m5, m8, m9, [r1+5*FENC_STRIDE], [r2+5*FDEC_STRIDE]
96     LOAD_DIFF  m6, m8, m9, [r1+6*FENC_STRIDE], [r2+6*FDEC_STRIDE]
97     LOAD_DIFF  m7, m8, m9, [r1+7*FENC_STRIDE], [r2+7*FDEC_STRIDE]
98
99     DCT8_1D       0,1,2,3,4,5,6,7,8,9
100     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
101     DCT8_1D       0,1,2,3,4,5,6,7,8,9
102
103     movdqa  [r0+0x00], m0
104     movdqa  [r0+0x10], m1
105     movdqa  [r0+0x20], m2
106     movdqa  [r0+0x30], m3
107     movdqa  [r0+0x40], m4
108     movdqa  [r0+0x50], m5
109     movdqa  [r0+0x60], m6
110     movdqa  [r0+0x70], m7
111     ret
112
113
114 %macro IDCT8_1D 10
115     SUMSUB_BA  m%5, m%1 ; %5=a0, %1=a2
116     movdqa  m%10, m%3
117     psraw   m%3, 1
118     psubw   m%3, m%7 ; %3=a4
119     psraw   m%7, 1
120     paddw   m%7, m%10 ; %7=a6
121
122     movdqa  m%9, m%2
123     psraw   m%9, 1
124     paddw   m%9, m%2
125     paddw   m%9, m%4
126     paddw   m%9, m%6 ; %9=a7
127
128     movdqa  m%10, m%6
129     psraw   m%10, 1
130     paddw   m%10, m%6
131     paddw   m%10, m%8
132     psubw   m%10, m%2 ; %10=a5
133
134     psubw   m%2, m%4
135     psubw   m%6, m%4
136     paddw   m%2, m%8
137     psubw   m%6, m%8
138     psraw   m%4, 1
139     psraw   m%8, 1
140     psubw   m%2, m%4 ; %2=a3
141     psubw   m%6, m%8 ; %6=a1
142
143     SUMSUB_BA m%7, m%5 ; %7=b0, %5=b6
144     SUMSUB_BA m%3, m%1 ; %3=b2, %1=b4
145
146     movdqa  m%4, m%9
147     psraw   m%4, 2
148     paddw   m%4, m%6 ; %4=b1
149     psraw   m%6, 2
150     psubw   m%9, m%6 ; %9=b7
151
152     movdqa  m%8, m%10
153     psraw   m%8, 2
154     paddw   m%8, m%2 ; %8=b3
155     psraw   m%2, 2
156     psubw   m%2, m%10 ; %2=b5
157
158     SUMSUB_BA m%9, m%7 ; %9=c0, %7=c7
159     SUMSUB_BA m%2, m%3 ; %2=c1, %3=c6
160     SUMSUB_BA m%8, m%1 ; %8=c2, %1=c5
161     SUMSUB_BA m%4, m%5 ; %4=c3, %5=c4
162
163     SWAP %1, %9, %6
164     SWAP %3, %8, %7
165 %endmacro
166
167 ;-----------------------------------------------------------------------------
168 ; void x264_add8x8_idct8_sse2( uint8_t *p_dst, int16_t dct[8][8] )
169 ;-----------------------------------------------------------------------------
170 cglobal x264_add8x8_idct8_sse2
171     movdqa  m0, [r1+0x00]
172     movdqa  m1, [r1+0x10]
173     movdqa  m2, [r1+0x20]
174     movdqa  m3, [r1+0x30]
175     movdqa  m4, [r1+0x40]
176     movdqa  m5, [r1+0x50]
177     movdqa  m6, [r1+0x60]
178     movdqa  m7, [r1+0x70]
179
180     IDCT8_1D      0,1,2,3,4,5,6,7,8,9
181     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
182     paddw         m0, [pw_32 GLOBAL] ; rounding for the >>6 at the end
183     IDCT8_1D      0,1,2,3,4,5,6,7,8,9
184
185     pxor  m9, m9
186     STORE_DIFF m0, m8, m9, [r0+0*FDEC_STRIDE]
187     STORE_DIFF m1, m8, m9, [r0+1*FDEC_STRIDE]
188     STORE_DIFF m2, m8, m9, [r0+2*FDEC_STRIDE]
189     STORE_DIFF m3, m8, m9, [r0+3*FDEC_STRIDE]
190     STORE_DIFF m4, m8, m9, [r0+4*FDEC_STRIDE]
191     STORE_DIFF m5, m8, m9, [r0+5*FDEC_STRIDE]
192     STORE_DIFF m6, m8, m9, [r0+6*FDEC_STRIDE]
193     STORE_DIFF m7, m8, m9, [r0+7*FDEC_STRIDE]
194     ret
195
196