2 ; Copyright (c) 2014 The WebM project authors. All Rights Reserved.
4 ; Use of this source code is governed by a BSD-style license
5 ; that can be found in the LICENSE file in the root of the source
6 ; tree. An additional intellectual property rights grant can be found
7 ; in the file PATENTS. All contributing project authors may
8 ; be found in the AUTHORS file in the root of the source tree.
10 %include "third_party/x86inc/x86inc.asm"
12 ; This file provides SSSE3 version of the inverse transformation. Part
13 ; of the functions are originally derived from the ffmpeg project.
14 ; Note that the current version applies to x86 64-bit only.
18 pw_11585x2: times 8 dw 23170
19 pd_8192: times 4 dd 8192
22 %macro TRANSFORM_COEFFS 2
23 pw_%1_%2: dw %1, %2, %1, %2, %1, %2, %1, %2
24 pw_m%2_%1: dw -%2, %1, -%2, %1, -%2, %1, -%2, %1
27 TRANSFORM_COEFFS 6270, 15137
28 TRANSFORM_COEFFS 3196, 16069
29 TRANSFORM_COEFFS 13623, 9102
31 %macro PAIR_PP_COEFFS 2
32 dpw_%1_%2: dw %1, %1, %1, %1, %2, %2, %2, %2
35 %macro PAIR_MP_COEFFS 2
36 dpw_m%1_%2: dw -%1, -%1, -%1, -%1, %2, %2, %2, %2
39 %macro PAIR_MM_COEFFS 2
40 dpw_m%1_m%2: dw -%1, -%1, -%1, -%1, -%2, -%2, -%2, -%2
43 PAIR_PP_COEFFS 30274, 12540
44 PAIR_PP_COEFFS 6392, 32138
45 PAIR_MP_COEFFS 18204, 27246
47 PAIR_PP_COEFFS 12540, 12540
48 PAIR_PP_COEFFS 30274, 30274
49 PAIR_PP_COEFFS 6392, 6392
50 PAIR_PP_COEFFS 32138, 32138
51 PAIR_MM_COEFFS 18204, 18204
52 PAIR_PP_COEFFS 27246, 27246
64 %macro MUL_ADD_2X 6 ; dst1, dst2, src, round, coefs1, coefs2
73 %macro BUTTERFLY_4X 7 ; dst1, dst2, coef1, coef2, round, tmp1, tmp2
74 punpckhwd m%6, m%2, m%1
75 MUL_ADD_2X %7, %6, %6, %5, [pw_m%4_%3], [pw_%3_%4]
77 MUL_ADD_2X %1, %2, %2, %5, [pw_m%4_%3], [pw_%3_%4]
83 %macro INTERLEAVE_2X 4
84 punpckh%1 m%4, m%2, m%3
90 INTERLEAVE_2X wd, %1, %2, %9
91 INTERLEAVE_2X wd, %3, %4, %9
92 INTERLEAVE_2X wd, %5, %6, %9
93 INTERLEAVE_2X wd, %7, %8, %9
95 INTERLEAVE_2X dq, %1, %3, %9
96 INTERLEAVE_2X dq, %2, %4, %9
97 INTERLEAVE_2X dq, %5, %7, %9
98 INTERLEAVE_2X dq, %6, %8, %9
100 INTERLEAVE_2X qdq, %1, %5, %9
101 INTERLEAVE_2X qdq, %3, %7, %9
102 INTERLEAVE_2X qdq, %2, %6, %9
103 INTERLEAVE_2X qdq, %4, %8, %9
111 BUTTERFLY_4X 2, 6, 6270, 15137, m8, 9, 10
114 BUTTERFLY_4X 1, 7, 3196, 16069, m8, 9, 10
115 BUTTERFLY_4X 5, 3, 13623, 9102, m8, 9, 10
134 ; This macro handles 8 pixels per line
135 %macro ADD_STORE_8P_2X 5; src1, src2, tmp1, tmp2, zero
142 movh m%4, [outputq + strideq]
150 movh [outputq + strideq], m%4
154 ; full inverse 8x8 2D-DCT transform
155 cglobal idct8x8_64_add, 3, 5, 13, input, output, stride
158 mova m12, [pw_11585x2]
160 lea r3, [2 * strideq]
162 mova m0, [inputq + 0]
163 mova m1, [inputq + 16]
164 mova m2, [inputq + 32]
165 mova m3, [inputq + 48]
166 mova m4, [inputq + 64]
167 mova m5, [inputq + 80]
168 mova m6, [inputq + 96]
169 mova m7, [inputq + 112]
171 TRANSPOSE8X8 0, 1, 2, 3, 4, 5, 6, 7, 9
173 TRANSPOSE8X8 0, 1, 2, 3, 4, 5, 6, 7, 9
177 ADD_STORE_8P_2X 0, 1, 9, 10, 12
178 lea outputq, [outputq + r3]
179 ADD_STORE_8P_2X 2, 3, 9, 10, 12
180 lea outputq, [outputq + r3]
181 ADD_STORE_8P_2X 4, 5, 9, 10, 12
182 lea outputq, [outputq + r3]
183 ADD_STORE_8P_2X 6, 7, 9, 10, 12
187 ; inverse 8x8 2D-DCT transform with only first 10 coeffs non-zero
188 cglobal idct8x8_12_add, 3, 5, 13, input, output, stride
191 mova m12, [pw_11585x2]
193 lea r3, [2 * strideq]
195 mova m0, [inputq + 0]
196 mova m1, [inputq + 16]
197 mova m2, [inputq + 32]
198 mova m3, [inputq + 48]
210 punpckhqdq m10, m0, m0
212 punpckhqdq m9, m2, m2
218 pmulhrsw m2, [dpw_30274_12540]
219 pmulhrsw m1, [dpw_6392_32138]
220 pmulhrsw m3, [dpw_m18204_27246]
225 punpcklqdq m9, m3, m3
226 punpckhqdq m5, m3, m9
232 punpckhqdq m9, m1, m5
239 punpckhqdq m3, m0, m0
240 punpckhqdq m4, m1, m1
241 punpckhqdq m6, m5, m5
242 punpckhqdq m7, m2, m2
251 punpckhdq m10, m1, m6
254 punpckhqdq m1, m0, m5
256 punpckhqdq m3, m4, m10
257 punpcklqdq m2, m4, m10
261 pmulhrsw m6, m2, [dpw_30274_30274]
262 pmulhrsw m4, m2, [dpw_12540_12540]
264 pmulhrsw m7, m1, [dpw_32138_32138]
265 pmulhrsw m1, [dpw_6392_6392]
266 pmulhrsw m5, m3, [dpw_m18204_m18204]
267 pmulhrsw m3, [dpw_27246_27246]
290 ADD_STORE_8P_2X 0, 1, 9, 10, 12
291 lea outputq, [outputq + r3]
292 ADD_STORE_8P_2X 2, 3, 9, 10, 12
293 lea outputq, [outputq + r3]
294 ADD_STORE_8P_2X 4, 5, 9, 10, 12
295 lea outputq, [outputq + r3]
296 ADD_STORE_8P_2X 6, 7, 9, 10, 12