| @@ -0,0 +1,1165 @@ |
| | 1 | ;****************************************************************************** |
| | 2 | ;* VP9 IDCT SIMD optimizations |
| | 3 | ;* |
| | 4 | ;* Copyright (C) 2025 Two Orioles, LLC |
| | 5 | ;* |
| | 6 | ;* This file is part of FFmpeg. |
| | 7 | ;* |
| | 8 | ;* FFmpeg is free software; you can redistribute it and/or |
| | 9 | ;* modify it under the terms of the GNU Lesser General Public |
| | 10 | ;* License as published by the Free Software Foundation; either |
| | 11 | ;* version 2.1 of the License, or (at your option) any later version. |
| | 12 | ;* |
| | 13 | ;* FFmpeg is distributed in the hope that it will be useful, |
| | 14 | ;* but WITHOUT ANY WARRANTY; without even the implied warranty of |
| | 15 | ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| | 16 | ;* Lesser General Public License for more details. |
| | 17 | ;* |
| | 18 | ;* You should have received a copy of the GNU Lesser General Public |
| | 19 | ;* License along with FFmpeg; if not, write to the Free Software |
| | 20 | ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| | 21 | ;****************************************************************************** |
| | 22 | |
| | 23 | %include "libavutil/x86/x86util.asm" |
| | 24 | |
| | 25 | %if ARCH_X86_64 && HAVE_AVX512ICL_EXTERNAL |
| | 26 | |
| | 27 | SECTION_RODATA 64 |
| | 28 | |
| | 29 | ; Thw following set of constants are ordered to form the |
| | 30 | ; qword shuffle mask { 0, 2, 4, 6, 1, 3, 5, 7 } |
| | 31 | %define deintq_perm pd_5520 |
| | 32 | pd_5520: dd 5520 |
| | 33 | pd_9760: dd 9760 |
| | 34 | pd_10394: dd 10394 |
| | 35 | pd_15426: dd 15426 |
| | 36 | pd_804: dd 804 |
| | 37 | pd_2404: dd 2404 |
| | 38 | pd_6270: dd 6270 |
| | 39 | pd_9102: dd 9102 |
| | 40 | pd_11585: dd 11585 |
| | 41 | pd_12665: dd 12665 |
| | 42 | pd_7723: dd 7723 |
| | 43 | pd_14811: dd 14811 |
| | 44 | pd_7005: dd 7005 |
| | 45 | pd_14053: dd 14053 |
| | 46 | pd_8423: dd 8423 |
| | 47 | pd_13623: dd 13623 |
| | 48 | |
| | 49 | pixel_clip: times 2 dw 0x7c00 |
| | 50 | pixel_clip6: dd 2031648 ; 32 + (pixel_clip << 6) |
| | 51 | pd_532480: dd 532480 ; 8192 + (32 << 14) |
| | 52 | pd_8192: dd 8192 |
| | 53 | |
| | 54 | pd_1606: dd 1606 |
| | 55 | pd_3196: dd 3196 |
| | 56 | pd_3981: dd 3981 |
| | 57 | pd_4756: dd 4756 |
| | 58 | pd_11003: dd 11003 |
| | 59 | pd_12140: dd 12140 |
| | 60 | pd_13160: dd 13160 |
| | 61 | pd_14449: dd 14449 |
| | 62 | pd_15137: dd 15137 |
| | 63 | pd_15679: dd 15679 |
| | 64 | pd_15893: dd 15893 |
| | 65 | pd_16069: dd 16069 |
| | 66 | pd_16207: dd 16207 |
| | 67 | pd_16305: dd 16305 |
| | 68 | pd_16364: dd 16364 |
| | 69 | |
| | 70 | SECTION .text |
| | 71 | |
| | 72 | %define o_base (deintq_perm+128) |
| | 73 | %define o(x) (r5 - o_base + (x)) |
| | 74 | %define m(x) mangle(private_prefix %+ _ %+ x %+ SUFFIX) |
| | 75 | |
| | 76 | ; dst1 = (src1 * coef1 - src2 * coef2 + rnd) >> 12 |
| | 77 | ; dst2 = (src1 * coef2 + src2 * coef1 + rnd) >> 12 |
| | 78 | ; skip round/shift if rnd is not a number |
| | 79 | %macro ITX_MULSUB_2D 8-9 0 ; dst/src[1-2], tmp[1-3], rnd, coef[1-2], inv_dst2 |
| | 80 | %if %8 < 32 |
| | 81 | pmulld m%4, m%1, m%8 |
| | 82 | pmulld m%3, m%2, m%8 |
| | 83 | %else |
| | 84 | vpbroadcastd m%3, [o(pd_%8)] |
| | 85 | pmulld m%4, m%1, m%3 |
| | 86 | pmulld m%3, m%2 |
| | 87 | %endif |
| | 88 | %if %7 < 32 |
| | 89 | pmulld m%1, m%7 |
| | 90 | pmulld m%2, m%7 |
| | 91 | %else |
| | 92 | vpbroadcastd m%5, [o(pd_%7)] |
| | 93 | pmulld m%1, m%5 |
| | 94 | pmulld m%2, m%5 |
| | 95 | %endif |
| | 96 | %if %9 |
| | 97 | psubd m%4, m%6, m%4 |
| | 98 | psubd m%2, m%4, m%2 |
| | 99 | %else |
| | 100 | %ifnum %6 |
| | 101 | paddd m%4, m%6 |
| | 102 | %endif |
| | 103 | paddd m%2, m%4 |
| | 104 | %endif |
| | 105 | %ifnum %6 |
| | 106 | paddd m%1, m%6 |
| | 107 | %endif |
| | 108 | psubd m%1, m%3 |
| | 109 | %ifnum %6 |
| | 110 | psrad m%2, 14 |
| | 111 | psrad m%1, 14 |
| | 112 | %endif |
| | 113 | %endmacro |
| | 114 | |
| | 115 | %macro WRAP_YMM 1+ |
| | 116 | INIT_YMM cpuname |
| | 117 | %1 |
| | 118 | INIT_ZMM cpuname |
| | 119 | %endmacro |
| | 120 | |
| | 121 | %macro TRANSPOSE_4D 5 ; in[1-4], tmp |
| | 122 | punpckhdq m%5, m%3, m%4 ; c2 d2 c3 d3 |
| | 123 | punpckldq m%3, m%4 ; c0 d0 c1 d1 |
| | 124 | punpckhdq m%4, m%1, m%2 ; a2 b2 a3 b3 |
| | 125 | punpckldq m%1, m%2 ; a0 b0 a1 b1 |
| | 126 | punpckhqdq m%2, m%1, m%3 ; a1 b1 c1 d1 |
| | 127 | punpcklqdq m%1, m%3 ; a0 b0 c0 d0 |
| | 128 | punpcklqdq m%3, m%4, m%5 ; a2 b2 c2 d2 |
| | 129 | punpckhqdq m%4, m%5 ; a3 b3 c3 d3 |
| | 130 | %endmacro |
| | 131 | |
| | 132 | %macro TRANSPOSE_4DQ 5 ; in[1-4], tmp |
| | 133 | vshufi32x4 m%5, m%3, m%4, q3232 ; c2 c3 d2 d3 |
| | 134 | vinserti32x8 m%3, ym%4, 1 ; c0 c1 d0 d1 |
| | 135 | vshufi32x4 m%4, m%1, m%2, q3232 ; a2 a3 b2 b3 |
| | 136 | vinserti32x8 m%1, ym%2, 1 ; a0 a1 b0 b1 |
| | 137 | vshufi32x4 m%2, m%1, m%3, q3131 ; a1 b1 c1 d1 |
| | 138 | vshufi32x4 m%1, m%3, q2020 ; a0 b0 c0 d0 |
| | 139 | vshufi32x4 m%3, m%4, m%5, q2020 ; a2 b2 c2 d2 |
| | 140 | vshufi32x4 m%4, m%5, q3131 ; a3 b3 c3 d3 |
| | 141 | %endmacro |
| | 142 | |
| | 143 | %macro INV_TXFM_FN 3-4 0 ; type1, type2, size, eob_offset |
| | 144 | cglobal vp9_i%1_i%2_%3_add_10, 4, 5, 0, dst, stride, c, eob, tx2 |
| | 145 | %define %%p1 m(vp9_i%1_%3_internal_10) |
| | 146 | lea r5, [o_base] |
| | 147 | ; Jump to the 1st txfm function if we're not taking the fast path, which |
| | 148 | ; in turn performs an indirect jump to the 2nd txfm function. |
| | 149 | lea tx2q, [m(vp9_i%2_%3_internal_10).pass2] |
| | 150 | %ifidn %1_%2, dct_dct |
| | 151 | dec eobd |
| | 152 | jnz %%p1 |
| | 153 | %else |
| | 154 | %if %4 |
| | 155 | add eobd, %4 |
| | 156 | %endif |
| | 157 | ; jump to the 1st txfm function unless it's located directly after this |
| | 158 | times ((%%end - %%p1) >> 31) & 1 jmp %%p1 |
| | 159 | ALIGN function_align |
| | 160 | %%end: |
| | 161 | %endif |
| | 162 | %endmacro |
| | 163 | |
| | 164 | %macro INV_TXFM_16X16_FN 2-3 0 ; type1, type2, eob_offset |
| | 165 | INV_TXFM_FN %1, %2, 16x16, %3 |
| | 166 | %ifidn %1_%2, dct_dct |
| | 167 | imul r6d, [cq], 11585 |
| | 168 | vpbroadcastd ym3, [o(pixel_clip)] |
| | 169 | mov [cq], r3d |
| | 170 | add r6d, 8192 |
| | 171 | sar r6d, 14 |
| | 172 | imul r6d, 11585 |
| | 173 | or r3d, 8 |
| | 174 | add r6d, 532480 |
| | 175 | sar r6d, 20 |
| | 176 | vpbroadcastw ym2, r6d |
| | 177 | paddsw ym2, ym3 |
| | 178 | .dconly_loop: |
| | 179 | paddsw ym0, ym2, [dstq+strideq*0] |
| | 180 | paddsw ym1, ym2, [dstq+strideq*1] |
| | 181 | psubusw ym0, ym3 |
| | 182 | psubusw ym1, ym3 |
| | 183 | mova [dstq+strideq*0], ym0 |
| | 184 | mova [dstq+strideq*1], ym1 |
| | 185 | lea dstq, [dstq+strideq*2] |
| | 186 | dec r3d |
| | 187 | jg .dconly_loop |
| | 188 | RET |
| | 189 | %endif |
| | 190 | %endmacro |
| | 191 | |
| | 192 | %macro IDCT16_PART1 0 |
| | 193 | %if mmsize == 64 |
| | 194 | .main_part1_fast: |
| | 195 | %endif |
| | 196 | pmulld m15, m1, [o(pd_16305)] {bcstd} ; t15a |
| | 197 | pmulld m1, [o(pd_1606)] {bcstd} ; t8a |
| | 198 | pmulld m9, m7, [o(pd_10394)] {bcstd} ; t9a |
| | 199 | pmulld m7, [o(pd_12665)] {bcstd} ; t14a |
| | 200 | pmulld m11, m5, [o(pd_14449)] {bcstd} ; t13a |
| | 201 | pmulld m5, [o(pd_7723)] {bcstd} ; t10a |
| | 202 | pmulld m13, m3, [o(pd_4756)] {bcstd} ; t11a |
| | 203 | pmulld m3, [o(pd_15679)] {bcstd} ; t12a |
| | 204 | pmulld m10, m6, [o(pd_9102)] {bcstd} ; t5a |
| | 205 | pmulld m6, [o(pd_13623)] {bcstd} ; t6a |
| | 206 | pmulld m14, m2, [o(pd_16069)] {bcstd} ; t7a |
| | 207 | pmulld m2, [o(pd_3196)] {bcstd} ; t4a |
| | 208 | pmulld m12, m4, [o(pd_15137)] {bcstd} ; t3 |
| | 209 | pmulld m4, [o(pd_6270)] {bcstd} ; t2 |
| | 210 | pmulld m0, m21 |
| | 211 | REPX {psubd x, m20, x}, m9, m13, m10 |
| | 212 | paddd m0, m20 |
| | 213 | mova m18, m0 |
| | 214 | %if mmsize == 64 ; for the ymm variant we only ever use the fast path |
| | 215 | jmp %%main_part1b |
| | 216 | .main_part1: |
| | 217 | ITX_MULSUB_2D 1, 15, 16, 17, 18, _, 1606, 16305 ; t8a, t15a |
| | 218 | ITX_MULSUB_2D 9, 7, 16, 17, 18, _, 12665, 10394 ; t9a, t14a |
| | 219 | ITX_MULSUB_2D 5, 11, 16, 17, 18, _, 7723, 14449 ; t10a, t13a |
| | 220 | ITX_MULSUB_2D 13, 3, 16, 17, 18, _, 15679, 4756 ; t11a, t12a |
| | 221 | ITX_MULSUB_2D 10, 6, 16, 17, 18, _, 13623, 9102 ; t5a, t6a |
| | 222 | ITX_MULSUB_2D 2, 14, 16, 17, 18, _, 3196, 16069 ; t4a, t7a |
| | 223 | ITX_MULSUB_2D 4, 12, 16, 17, 18, _, 6270, 15137 ; t2, t3 |
| | 224 | pmulld m0, m21 |
| | 225 | pmulld m8, m21 |
| | 226 | REPX {paddd x, m20}, m0, m9, m13, m10 |
| | 227 | psubd m18, m0, m8 ; t1 |
| | 228 | paddd m0, m8 ; t0 |
| | 229 | %%main_part1b: |
| | 230 | %endif |
| | 231 | vpbroadcastd m19, [o(pd_15137)] |
| | 232 | vpbroadcastd m16, [o(pd_6270)] |
| | 233 | REPX {paddd x, m20}, m15, m7, m1, m11, m3, m5 |
| | 234 | REPX {psrad x, 14 }, m15, m7, m1, m9, m11, m3, m5, m13 |
| | 235 | paddd m17, m15, m7 ; t15 |
| | 236 | psubd m15, m7 ; t14 |
| | 237 | psubd m7, m3, m11 ; t13 |
| | 238 | paddd m3, m11 ; t12 |
| | 239 | psubd m11, m13, m5 ; t10 |
| | 240 | paddd m5, m13 ; t11 |
| | 241 | psubd m13, m1, m9 ; t9 |
| | 242 | paddd m1, m9 ; t8 |
| | 243 | ITX_MULSUB_2D 15, 13, 8, 9, _, 20, 16, 19 ; t9a, t14a |
| | 244 | ITX_MULSUB_2D 7, 11, 8, 9, _, 20, 16, 19, 2 ; t13a, t10a |
| | 245 | paddd m16, m1, m5 ; t8a |
| | 246 | psubd m1, m5 ; t11a |
| | 247 | paddd m8, m15, m11 ; t9 |
| | 248 | psubd m15, m11 ; t10 |
| | 249 | psubd m11, m17, m3 ; t12a |
| | 250 | paddd m17, m3 ; t15a |
| | 251 | psubd m9, m13, m7 ; t13 |
| | 252 | paddd m13, m7 ; t14 |
| | 253 | REPX {pmulld x, m21}, m11, m9, m1, m15 |
| | 254 | REPX {paddd x, m20}, m2, m6, m14 |
| | 255 | REPX {psrad x, 14 }, m10, m2, m6, m14 |
| | 256 | psubd m3, m2, m10 ; t5a |
| | 257 | paddd m10, m2 ; t4 |
| | 258 | paddd m11, m20 |
| | 259 | psubd m5, m11, m1 ; t11 |
| | 260 | paddd m11, m1 ; t12 |
| | 261 | psubd m1, m14, m6 ; t6a |
| | 262 | paddd m14, m6 ; t7 |
| | 263 | pmulld m1, m21 |
| | 264 | pmulld m3, m21 |
| | 265 | paddd m4, m20 |
| | 266 | paddd m12, m20 |
| | 267 | REPX {psrad x, 14 }, m4, m12, m0, m18 |
| | 268 | paddd m9, m20 |
| | 269 | paddd m2, m9, m15 ; t13a |
| | 270 | psubd m9, m15 ; t10a |
| | 271 | paddd m1, m20 |
| | 272 | psubd m6, m1, m3 ; t5 |
| | 273 | paddd m1, m3 ; t6 |
| | 274 | REPX {psrad x, 14}, m6, m1, m11, m5, m2, m9 |
| | 275 | %endmacro |
| | 276 | |
| | 277 | %macro IDCT16_PART2 0 |
| | 278 | psubd m3, m0, m12 ; t3 |
| | 279 | paddd m0, m12 ; t0 |
| | 280 | psubd m12, m18, m4 ; t2 |
| | 281 | paddd m18, m4 ; t1 |
| | 282 | psubd m4, m3, m10 ; t4 |
| | 283 | paddd m3, m10 ; t3 |
| | 284 | psubd m10, m12, m6 ; t5 |
| | 285 | paddd m12, m6 ; t2 |
| | 286 | psubd m6, m18, m1 ; t6 |
| | 287 | paddd m1, m18 ; t1 |
| | 288 | psubd m7, m0, m14 ; t7 |
| | 289 | paddd m0, m14 ; t0 |
| | 290 | psubd m15, m0, m17 ; out15 |
| | 291 | paddd m0, m17 ; out0 |
| | 292 | psubd m14, m1, m13 ; out14 |
| | 293 | paddd m1, m13 ; out1 |
| | 294 | psubd m13, m12, m2 ; out13 |
| | 295 | paddd m2, m12 ; out2 |
| | 296 | psubd m12, m3, m11 ; out12 |
| | 297 | paddd m3, m11 ; out3 |
| | 298 | psubd m11, m4, m5 ; out11 |
| | 299 | paddd m4, m5 ; out4 |
| | 300 | paddd m5, m10, m9 ; out5 |
| | 301 | psubd m10, m9 ; out10 |
| | 302 | psubd m9, m6, m8 ; out9 |
| | 303 | paddd m6, m8 ; out6 |
| | 304 | psubd m8, m7, m16 ; out8 |
| | 305 | paddd m7, m16 ; out7 |
| | 306 | %endmacro |
| | 307 | |
| | 308 | INIT_ZMM avx512icl |
| | 309 | INV_TXFM_16X16_FN dct, dct |
| | 310 | INV_TXFM_16X16_FN dct, adst, 39-23-1 |
| | 311 | |
| | 312 | cglobal vp9_idct_16x16_internal_10, 0, 7, 22, dst, stride, c, eob, tx2 |
| | 313 | mova m0, [cq+64* 0] |
| | 314 | mova m1, [cq+64* 1] |
| | 315 | mova m2, [cq+64* 2] |
| | 316 | mova m3, [cq+64* 3] |
| | 317 | mova m4, [cq+64* 4] |
| | 318 | mova m5, [cq+64* 5] |
| | 319 | mova m6, [cq+64* 6] |
| | 320 | mova m7, [cq+64* 7] |
| | 321 | vpbroadcastd m20, [o(pd_8192)] |
| | 322 | vpbroadcastd m21, [o(pd_11585)] |
| | 323 | sub eobd, 38 |
| | 324 | jl .pass1_fast |
| | 325 | mova m8, [cq+64* 8] |
| | 326 | mova m9, [cq+64* 9] |
| | 327 | mova m10, [cq+64*10] |
| | 328 | mova m11, [cq+64*11] |
| | 329 | mova m12, [cq+64*12] |
| | 330 | mova m13, [cq+64*13] |
| | 331 | mova m14, [cq+64*14] |
| | 332 | mova m15, [cq+64*15] |
| | 333 | call .main_part1 |
| | 334 | call .main_part2 |
| | 335 | .pass1_end: |
| | 336 | TRANSPOSE_4DQ 0, 4, 8, 12, 16 |
| | 337 | TRANSPOSE_4DQ 1, 5, 9, 13, 16 |
| | 338 | TRANSPOSE_4DQ 2, 6, 10, 14, 16 |
| | 339 | TRANSPOSE_4DQ 3, 7, 11, 15, 16 |
| | 340 | TRANSPOSE_4D 8, 9, 10, 11, 16 |
| | 341 | TRANSPOSE_4D 12, 13, 14, 15, 16 |
| | 342 | mov r6d, 64*12 |
| | 343 | jmp .pass1_transpose_end |
| | 344 | .pass1_fast: |
| | 345 | WRAP_YMM IDCT16_PART1 |
| | 346 | WRAP_YMM IDCT16_PART2 |
| | 347 | .pass1_fast_end: |
| | 348 | vinserti32x8 m0, ym4, 1 |
| | 349 | vinserti32x8 m8, ym12, 1 |
| | 350 | vinserti32x8 m1, ym5, 1 |
| | 351 | vinserti32x8 m9, ym13, 1 |
| | 352 | vinserti32x8 m2, ym6, 1 |
| | 353 | vinserti32x8 m10, ym14, 1 |
| | 354 | vinserti32x8 m3, ym7, 1 |
| | 355 | vinserti32x8 m11, ym15, 1 |
| | 356 | vshufi32x4 m4, m0, m8, q3131 |
| | 357 | vshufi32x4 m0, m8, q2020 |
| | 358 | vshufi32x4 m5, m1, m9, q3131 |
| | 359 | vshufi32x4 m1, m9, q2020 |
| | 360 | vshufi32x4 m6, m2, m10, q3131 |
| | 361 | vshufi32x4 m2, m10, q2020 |
| | 362 | vshufi32x4 m7, m3, m11, q3131 |
| | 363 | vshufi32x4 m3, m11, q2020 |
| | 364 | mov r6d, 64*4 |
| | 365 | .pass1_transpose_end: |
| | 366 | pxor m16, m16 |
| | 367 | .zero_loop: |
| | 368 | mova [cq+r6+64*0], m16 |
| | 369 | mova [cq+r6+64*1], m16 |
| | 370 | mova [cq+r6+64*2], m16 |
| | 371 | mova [cq+r6+64*3], m16 |
| | 372 | sub r6d, 64*4 |
| | 373 | jge .zero_loop |
| | 374 | TRANSPOSE_4D 0, 1, 2, 3, 16 |
| | 375 | TRANSPOSE_4D 4, 5, 6, 7, 16 |
| | 376 | jmp tx2q |
| | 377 | .pass2: |
| | 378 | test eobd, eobd |
| | 379 | jl .pass2_fast |
| | 380 | call .main_part1 |
| | 381 | jmp .pass2_end |
| | 382 | .pass2_fast: |
| | 383 | call .main_part1_fast |
| | 384 | .pass2_end: |
| | 385 | vpbroadcastd m3, [o(pixel_clip6)] |
| | 386 | paddd m0, m3 |
| | 387 | paddd m18, m3 |
| | 388 | call .main_part2 |
| | 389 | REPX {psrad x, 6}, m0, m1, m2, m3 |
| | 390 | packssdw m0, m1 |
| | 391 | lea r6, [strideq*3] |
| | 392 | packssdw m1, m2, m3 |
| | 393 | mova m2, [o(deintq_perm)] |
| | 394 | vpbroadcastd m3, [o(pixel_clip)] |
| | 395 | REPX {psrad x, 6}, m4, m5, m6, m7 |
| | 396 | call .write_16x4 |
| | 397 | packssdw m0, m4, m5 |
| | 398 | packssdw m1, m6, m7 |
| | 399 | REPX {psrad x, 6}, m8, m9, m10, m11 |
| | 400 | call .write_16x4 |
| | 401 | packssdw m0, m8, m9 |
| | 402 | packssdw m1, m10, m11 |
| | 403 | .pass2_end2: |
| | 404 | REPX {psrad x, 6}, m12, m13, m14, m15 |
| | 405 | call .write_16x4 |
| | 406 | packssdw m0, m12, m13 |
| | 407 | packssdw m1, m14, m15 |
| | 408 | call .write_16x4 |
| | 409 | RET |
| | 410 | ALIGN function_align |
| | 411 | .write_16x4: |
| | 412 | mova ym16, [dstq+strideq*0] |
| | 413 | vinserti32x8 m16, [dstq+strideq*1], 1 |
| | 414 | mova ym17, [dstq+strideq*2] |
| | 415 | vinserti32x8 m17, [dstq+r6 ], 1 |
| | 416 | vpermq m0, m2, m0 |
| | 417 | vpermq m1, m2, m1 |
| | 418 | paddsw m16, m0 |
| | 419 | paddsw m17, m1 |
| | 420 | psubusw m16, m3 |
| | 421 | psubusw m17, m3 |
| | 422 | mova [dstq+strideq*0], ym16 |
| | 423 | vextracti32x8 [dstq+strideq*1], m16, 1 |
| | 424 | mova [dstq+strideq*2], ym17 |
| | 425 | vextracti32x8 [dstq+r6 ], m17, 1 |
| | 426 | lea dstq, [dstq+strideq*4] |
| | 427 | ret |
| | 428 | ALIGN function_align |
| | 429 | IDCT16_PART1 |
| | 430 | ret |
| | 431 | ALIGN function_align |
| | 432 | .main_part2: |
| | 433 | IDCT16_PART2 |
| | 434 | ret |
| | 435 | |
| | 436 | %macro IADST16_PART1 0 |
| | 437 | %if mmsize == 64 |
| | 438 | .main_part1_fast: |
| | 439 | %endif |
| | 440 | pmulld m15, m0, [o(pd_16364)] {bcstd} ; t1 |
| | 441 | pmulld m0, [o(pd_804)] {bcstd} ; t0 |
| | 442 | pmulld m13, m2, [o(pd_15893)] {bcstd} ; t3 |
| | 443 | pmulld m2, [o(pd_3981)] {bcstd} ; t2 |
| | 444 | pmulld m11, m4, [o(pd_14811)] {bcstd} ; t5 |
| | 445 | pmulld m4, [o(pd_7005)] {bcstd} ; t4 |
| | 446 | pmulld m9, m6, [o(pd_13160)] {bcstd} ; t7 |
| | 447 | pmulld m6, [o(pd_9760)] {bcstd} ; t6 |
| | 448 | pmulld m8, m7, [o(pd_11003)] {bcstd} ; t8 |
| | 449 | pmulld m7, [o(pd_12140)] {bcstd} ; t9 |
| | 450 | pmulld m10, m5, [o(pd_8423)] {bcstd} ; t10 |
| | 451 | pmulld m5, [o(pd_14053)] {bcstd} ; t11 |
| | 452 | pmulld m12, m3, [o(pd_5520)] {bcstd} ; t12 |
| | 453 | pmulld m3, [o(pd_15426)] {bcstd} ; t13 |
| | 454 | pmulld m14, m1, [o(pd_2404)] {bcstd} ; t14 |
| | 455 | pmulld m1, [o(pd_16207)] {bcstd} ; t15 |
| | 456 | REPX {psubd x, m20, x}, m15, m13, m11, m9 |
| | 457 | %if mmsize == 64 ; for the ymm variant we only ever use the fast path |
| | 458 | jmp %%main_part1b |
| | 459 | ALIGN function_align |
| | 460 | .main_part1: |
| | 461 | ITX_MULSUB_2D 15, 0, 16, 17, 18, _, 804, 16364 ; t1, t0 |
| | 462 | ITX_MULSUB_2D 13, 2, 16, 17, 18, _, 3981, 15893 ; t3, t2 |
| | 463 | ITX_MULSUB_2D 11, 4, 16, 17, 18, _, 7005, 14811 ; t5, t4 |
| | 464 | ITX_MULSUB_2D 9, 6, 16, 17, 18, _, 9760, 13160 ; t7, t6 |
| | 465 | ITX_MULSUB_2D 7, 8, 16, 17, 18, _, 12140, 11003 ; t9, t8 |
| | 466 | ITX_MULSUB_2D 5, 10, 16, 17, 18, _, 14053, 8423 ; t11, t10 |
| | 467 | ITX_MULSUB_2D 3, 12, 16, 17, 18, _, 15426, 5520 ; t13, t12 |
| | 468 | ITX_MULSUB_2D 1, 14, 16, 17, 18, _, 16207, 2404 ; t15, t14 |
| | 469 | REPX {paddd x, m20}, m15, m13, m11, m9 |
| | 470 | %%main_part1b: |
| | 471 | %endif |
| | 472 | REPX {paddd x, m20}, m0, m2, m4, m6 |
| | 473 | psubd m16, m2, m10 ; t10a |
| | 474 | paddd m2, m10 ; t2a |
| | 475 | psubd m10, m9, m1 ; t15a |
| | 476 | paddd m9, m1 ; t7a |
| | 477 | psubd m1, m13, m5 ; t11a |
| | 478 | paddd m13, m5 ; t3a |
| | 479 | psubd m5, m6, m14 ; t14a |
| | 480 | paddd m6, m14 ; t6a |
| | 481 | REPX {psrad x, 14}, m16, m10, m1, m5 |
| | 482 | psubd m14, m0, m8 ; t8a |
| | 483 | paddd m0, m8 ; t0a |
| | 484 | psubd m8, m15, m7 ; t9a |
| | 485 | paddd m15, m7 ; t1a |
| | 486 | psubd m7, m4, m12 ; t12a |
| | 487 | paddd m4, m12 ; t4a |
| | 488 | paddd m12, m11, m3 ; t5a |
| | 489 | psubd m11, m3 ; t13a |
| | 490 | REPX {psrad x, 14}, m14, m8, m7, m11 |
| | 491 | vpbroadcastd m19, [o(pd_9102)] |
| | 492 | vpbroadcastd m18, [o(pd_13623)] |
| | 493 | ITX_MULSUB_2D 16, 1, 3, 17, _, _, 18, 19 ; t11, t10 |
| | 494 | ITX_MULSUB_2D 10, 5, 3, 17, _, _, 19, 18 ; t14, t15 |
| | 495 | vpbroadcastd m19, [o(pd_16069)] |
| | 496 | vpbroadcastd m18, [o(pd_3196)] |
| | 497 | ITX_MULSUB_2D 14, 8, 3, 17, _, _, 18, 19 ; t9, t8 |
| | 498 | ITX_MULSUB_2D 11, 7, 3, 17, _, _, 19, 18 ; t12, t13 |
| | 499 | vpbroadcastd m19, [o(pd_6270)] |
| | 500 | vpbroadcastd m18, [o(pd_15137)] |
| | 501 | REPX {psrad x, 14}, m15, m12, m0, m4 |
| | 502 | psubd m3, m15, m12 ; t5 |
| | 503 | paddd m15, m12 ; t1 |
| | 504 | psubd m12, m0, m4 ; t4 |
| | 505 | paddd m0, m4 ; t0 |
| | 506 | REPX {psrad x, 14}, m2, m6, m13, m9 |
| | 507 | psubd m4, m2, m6 ; t6 |
| | 508 | paddd m2, m6 ; t2 |
| | 509 | psubd m6, m13, m9 ; t7 |
| | 510 | paddd m9, m13 ; t3 |
| | 511 | REPX {paddd x, m20}, m8, m14, m1, m16 |
| | 512 | psubd m13, m8, m11 ; t12a |
| | 513 | paddd m8, m11 ; t8a |
| | 514 | psubd m11, m14, m7 ; t13a |
| | 515 | paddd m14, m7 ; t9a |
| | 516 | psubd m7, m1, m10 ; t14a |
| | 517 | paddd m1, m10 ; t10a |
| | 518 | psubd m10, m16, m5 ; t15a |
| | 519 | paddd m16, m5 ; t11a |
| | 520 | REPX {psrad x, 14}, m13, m11, m7, m10 |
| | 521 | ITX_MULSUB_2D 12, 3, 5, 17, _, _, 19, 18 ; t5a, t4a |
| | 522 | ITX_MULSUB_2D 6, 4, 5, 17, _, _, 18, 19 ; t6a, t7a |
| | 523 | ITX_MULSUB_2D 13, 11, 5, 17, _, _, 19, 18 ; t13, t12 |
| | 524 | ITX_MULSUB_2D 10, 7, 5, 17, _, _, 18, 19 ; t14, t15 |
| | 525 | REPX {psrad x, 14}, m8, m1, m14, m16 |
| | 526 | psubd m5, m8, m1 ; t10 |
| | 527 | paddd m1, m8 ; -out1 |
| | 528 | psubd m8, m15, m9 ; t3a |
| | 529 | paddd m15, m9 ; -out15 |
| | 530 | psubd m9, m14, m16 ; t11 |
| | 531 | paddd m14, m16 ; out14 |
| | 532 | psubd m16, m0, m2 ; t2a |
| | 533 | paddd m0, m2 ; out0 |
| | 534 | REPX {paddd x, m20}, m11, m13, m12, m3 |
| | 535 | paddd m2, m11, m10 ; out2 |
| | 536 | psubd m11, m10 ; t14a |
| | 537 | psubd m10, m13, m7 ; t15a |
| | 538 | paddd m13, m7 ; -out13 |
| | 539 | psubd m7, m12, m4 ; t7 |
| | 540 | paddd m12, m4 ; out12 |
| | 541 | psubd m4, m3, m6 ; t6 |
| | 542 | paddd m3, m6 ; -out3 |
| | 543 | REPX {psrad x, 14}, m10, m7, m11, m4 |
| | 544 | REPX {pmulld x, m21}, m9, m10, m7, m8, m5, m11, m4, m16 |
| | 545 | REPX {psrad x, 14}, m2, m13, m12, m3 |
| | 546 | %endmacro |
| | 547 | |
| | 548 | %macro IADST16_PART2 0 |
| | 549 | paddd m9, m20 |
| | 550 | psubd m10, m20, m10 |
| | 551 | paddd m7, m20 |
| | 552 | psubd m8, m20, m8 |
| | 553 | paddd m6, m9, m5 ; out6 |
| | 554 | psubd m9, m5 ; out9 |
| | 555 | psubd m5, m10, m11 ; out5 |
| | 556 | paddd m10, m11 ; out10 |
| | 557 | psubd m11, m7, m4 ; out11 |
| | 558 | paddd m4, m7 ; out4 |
| | 559 | psubd m7, m8, m16 ; out7 |
| | 560 | paddd m8, m16 ; out8 |
| | 561 | %endmacro |
| | 562 | |
| | 563 | %macro IADST16_PASS1_END 0 |
| | 564 | pxor m16, m16 |
| | 565 | psubd m1, m16, m1 |
| | 566 | psubd m3, m16, m3 |
| | 567 | psubd m13, m16, m13 |
| | 568 | psubd m15, m16, m15 |
| | 569 | REPX {psrad x, 14}, m4, m5, m6, m7, m8, m9, m10, m11 |
| | 570 | %endmacro |
| | 571 | |
| | 572 | INV_TXFM_16X16_FN adst, dct, 39-18 |
| | 573 | INV_TXFM_16X16_FN adst, adst |
| | 574 | |
| | 575 | cglobal vp9_iadst_16x16_internal_10, 0, 7, 22, dst, stride, c, eob, tx2 |
| | 576 | mova m0, [cq+64* 0] |
| | 577 | mova m1, [cq+64* 1] |
| | 578 | mova m2, [cq+64* 2] |
| | 579 | mova m3, [cq+64* 3] |
| | 580 | mova m4, [cq+64* 4] |
| | 581 | mova m5, [cq+64* 5] |
| | 582 | mova m6, [cq+64* 6] |
| | 583 | mova m7, [cq+64* 7] |
| | 584 | vpbroadcastd m20, [o(pd_8192)] |
| | 585 | vpbroadcastd m21, [o(pd_11585)] |
| | 586 | sub eobd, 39 |
| | 587 | jl .pass1_fast |
| | 588 | mova m8, [cq+64* 8] |
| | 589 | mova m9, [cq+64* 9] |
| | 590 | mova m10, [cq+64*10] |
| | 591 | mova m11, [cq+64*11] |
| | 592 | mova m12, [cq+64*12] |
| | 593 | mova m13, [cq+64*13] |
| | 594 | mova m14, [cq+64*14] |
| | 595 | mova m15, [cq+64*15] |
| | 596 | call .main_part1 |
| | 597 | call .main_part2 |
| | 598 | IADST16_PASS1_END |
| | 599 | jmp m(vp9_idct_16x16_internal_10).pass1_end |
| | 600 | .pass1_fast: |
| | 601 | WRAP_YMM IADST16_PART1 |
| | 602 | WRAP_YMM IADST16_PART2 |
| | 603 | WRAP_YMM IADST16_PASS1_END |
| | 604 | jmp m(vp9_idct_16x16_internal_10).pass1_fast_end |
| | 605 | .pass2: |
| | 606 | test eobd, eobd |
| | 607 | jl .pass2_fast |
| | 608 | call .main_part1 |
| | 609 | jmp .pass2_end |
| | 610 | .pass2_fast: |
| | 611 | call .main_part1_fast |
| | 612 | .pass2_end: |
| | 613 | vpbroadcastd m20, [o(pd_532480)] |
| | 614 | call .main_part2 |
| | 615 | vpbroadcastd m16, [o(pixel_clip6)] |
| | 616 | REPX {paddd x, m16}, m0, m2, m12, m14 |
| | 617 | REPX {psubd x, m16, x}, m1, m3, m13, m15 |
| | 618 | REPX {psrad x, 6}, m0, m1, m2, m3 |
| | 619 | packssdw m0, m1 |
| | 620 | lea r6, [strideq*3] |
| | 621 | packssdw m1, m2, m3 |
| | 622 | mova m2, [o(deintq_perm)] |
| | 623 | vpbroadcastd m3, [o(pixel_clip)] |
| | 624 | REPX {psrad x, 20}, m4, m5, m6, m7 |
| | 625 | call m(vp9_idct_16x16_internal_10).write_16x4 |
| | 626 | packssdw m0, m4, m5 |
| | 627 | packssdw m1, m6, m7 |
| | 628 | paddsw m0, m3 |
| | 629 | paddsw m1, m3 |
| | 630 | REPX {psrad x, 20}, m8, m9, m10, m11 |
| | 631 | call m(vp9_idct_16x16_internal_10).write_16x4 |
| | 632 | packssdw m0, m8, m9 |
| | 633 | packssdw m1, m10, m11 |
| | 634 | paddsw m0, m3 |
| | 635 | paddsw m1, m3 |
| | 636 | jmp m(vp9_idct_16x16_internal_10).pass2_end2 |
| | 637 | ALIGN function_align |
| | 638 | IADST16_PART1 |
| | 639 | ret |
| | 640 | ALIGN function_align |
| | 641 | .main_part2: |
| | 642 | IADST16_PART2 |
| | 643 | ret |
| | 644 | |
| | 645 | cglobal vp9_idct_idct_32x32_add_10, 4, 7, 23, 64*64, dst, stride, c, eob |
| | 646 | %undef cmp |
| | 647 | lea r5, [o_base] |
| | 648 | dec eobd |
| | 649 | jnz .pass1 |
| | 650 | imul r6d, [cq], 11585 |
| | 651 | vpbroadcastd m3, [o(pixel_clip)] |
| | 652 | mov [cq], r3d |
| | 653 | add r6d, 8192 |
| | 654 | sar r6d, 14 |
| | 655 | imul r6d, 11585 |
| | 656 | or r3d, 16 |
| | 657 | add r6d, 532480 |
| | 658 | sar r6d, 20 |
| | 659 | vpbroadcastw m2, r6d |
| | 660 | paddsw m2, m3 |
| | 661 | .dconly_loop: |
| | 662 | paddsw m0, m2, [dstq+strideq*0] |
| | 663 | paddsw m1, m2, [dstq+strideq*1] |
| | 664 | psubusw m0, m3 |
| | 665 | psubusw m1, m3 |
| | 666 | mova [dstq+strideq*0], m0 |
| | 667 | mova [dstq+strideq*1], m1 |
| | 668 | lea dstq, [dstq+strideq*2] |
| | 669 | dec r3d |
| | 670 | jg .dconly_loop |
| | 671 | RET |
| | 672 | .pass1: |
| | 673 | vpbroadcastd m20, [o(pd_8192)] |
| | 674 | vpbroadcastd m21, [o(pd_11585)] |
| | 675 | cmp eobd, 135 |
| | 676 | jl .pass1_fast |
| | 677 | add cq, 64 |
| | 678 | lea r4, [rsp+64*8] |
| | 679 | cmp eobd, 579 |
| | 680 | jl .pass1_right_fast |
| | 681 | mov r6d, 128*28 |
| | 682 | call .pass1_main |
| | 683 | jmp .pass1_right_end |
| | 684 | .pass1_right_fast: ; bottomright quadrant is zero |
| | 685 | mova m0, [cq+128* 1] |
| | 686 | mova m1, [cq+128* 3] |
| | 687 | mova m2, [cq+128* 5] |
| | 688 | mova m3, [cq+128* 7] |
| | 689 | mova m4, [cq+128* 9] |
| | 690 | mova m5, [cq+128*11] |
| | 691 | mova m6, [cq+128*13] |
| | 692 | mova m7, [cq+128*15] |
| | 693 | call .main_fast |
| | 694 | mova m0, [cq+128* 0] |
| | 695 | mova m1, [cq+128* 2] |
| | 696 | mova m2, [cq+128* 4] |
| | 697 | mova m3, [cq+128* 6] |
| | 698 | mova m4, [cq+128* 8] |
| | 699 | mova m5, [cq+128*10] |
| | 700 | mova m6, [cq+128*12] |
| | 701 | mova m7, [cq+128*14] |
| | 702 | call m(vp9_idct_16x16_internal_10).main_part1_fast |
| | 703 | mov r6d, 128*12 |
| | 704 | call .pass1_main_end |
| | 705 | .pass1_right_end: |
| | 706 | mova [r4+64* 8], m0 |
| | 707 | mova [r4+64* 9], m1 |
| | 708 | mova [r4+64*10], m2 |
| | 709 | mova [r4+64*11], m3 |
| | 710 | mova [r4+64*12], m4 |
| | 711 | mova [r4+64*13], m5 |
| | 712 | mova [r4+64*14], m6 |
| | 713 | mova [r4+64*15], m7 |
| | 714 | mova [r4+64*16], m16 |
| | 715 | mova [r4+64*17], m17 |
| | 716 | mova [r4+64*18], m18 |
| | 717 | mova [r4+64*19], m19 |
| | 718 | mova [r4+64*20], m8 |
| | 719 | mova [r4+64*21], m9 |
| | 720 | mova [r4+64*22], m10 |
| | 721 | mova [r4+64*23], m11 |
| | 722 | sub cq, 64 |
| | 723 | sub r4, 64*8 |
| | 724 | mov r6d, 128*28 |
| | 725 | call .pass1_main |
| | 726 | mova m12, [r4+64*20] |
| | 727 | mova m13, [r4+64*21] |
| | 728 | mova m14, [r4+64*22] |
| | 729 | mova m15, [r4+64*23] |
| | 730 | mova [r4+64*20], m8 |
| | 731 | mova [r4+64*21], m9 |
| | 732 | mova [r4+64*22], m10 |
| | 733 | mova [r4+64*23], m11 |
| | 734 | mova m8, [r4+64*16] |
| | 735 | mova m9, [r4+64*17] |
| | 736 | mova m10, [r4+64*18] |
| | 737 | mova m11, [r4+64*19] |
| | 738 | mova [r4+64*16], m16 |
| | 739 | mova [r4+64*17], m17 |
| | 740 | mova [r4+64*18], m18 |
| | 741 | mova [r4+64*19], m19 |
| | 742 | call .main |
| | 743 | mova m0, [r4+64*16] |
| | 744 | mova m1, [r4+64*17] |
| | 745 | mova m2, [r4+64*18] |
| | 746 | mova m3, [r4+64*19] |
| | 747 | mova m4, [r4+64*20] |
| | 748 | mova m5, [r4+64*21] |
| | 749 | mova m6, [r4+64*22] |
| | 750 | mova m7, [r4+64*23] |
| | 751 | mova m8, [r4+64*24] |
| | 752 | mova m9, [r4+64*25] |
| | 753 | mova m10, [r4+64*26] |
| | 754 | mova m11, [r4+64*27] |
| | 755 | mova m12, [r4+64*28] |
| | 756 | mova m13, [r4+64*29] |
| | 757 | mova m14, [r4+64*30] |
| | 758 | mova m15, [r4+64*31] |
| | 759 | call m(vp9_idct_16x16_internal_10).main_part1 |
| | 760 | call .pass2_main_left |
| | 761 | mova m8, [r4+64* 8] |
| | 762 | mova m9, [r4+64* 9] |
| | 763 | mova m10, [r4+64*10] |
| | 764 | mova m11, [r4+64*11] |
| | 765 | mova m12, [r4+64*12] |
| | 766 | mova m13, [r4+64*13] |
| | 767 | mova m14, [r4+64*14] |
| | 768 | mova m15, [r4+64*15] |
| | 769 | TRANSPOSE_4DQ 8, 10, 12, 14, 16 |
| | 770 | TRANSPOSE_4DQ 9, 11, 13, 15, 16 |
| | 771 | call .main |
| | 772 | call .pass2_main_right |
| | 773 | mova m8, [r4+64*24] |
| | 774 | mova m9, [r4+64*25] |
| | 775 | mova m10, [r4+64*26] |
| | 776 | mova m11, [r4+64*27] |
| | 777 | mova m12, [r4+64*28] |
| | 778 | mova m13, [r4+64*29] |
| | 779 | mova m14, [r4+64*30] |
| | 780 | mova m15, [r4+64*31] |
| | 781 | TRANSPOSE_4DQ 8, 10, 12, 14, 16 |
| | 782 | TRANSPOSE_4DQ 9, 11, 13, 15, 16 |
| | 783 | call m(vp9_idct_16x16_internal_10).main_part1 |
| | 784 | jmp .pass2_end |
| | 785 | .pass1_fast: |
| | 786 | mova m0, [cq+128* 1] |
| | 787 | mova m1, [cq+128* 3] |
| | 788 | mova m2, [cq+128* 5] |
| | 789 | mova m3, [cq+128* 7] |
| | 790 | mova m4, [cq+128* 9] |
| | 791 | mova m5, [cq+128*11] |
| | 792 | mova m6, [cq+128*13] |
| | 793 | mova m7, [cq+128*15] |
| | 794 | mov r4, rsp |
| | 795 | call .main_fast |
| | 796 | mova m0, [cq+128* 0] |
| | 797 | mova m1, [cq+128* 2] |
| | 798 | mova m2, [cq+128* 4] |
| | 799 | mova m3, [cq+128* 6] |
| | 800 | mova m4, [cq+128* 8] |
| | 801 | mova m5, [cq+128*10] |
| | 802 | mova m6, [cq+128*12] |
| | 803 | mova m7, [cq+128*14] |
| | 804 | call m(vp9_idct_16x16_internal_10).main_part1_fast |
| | 805 | call m(vp9_idct_16x16_internal_10).main_part2 |
| | 806 | mov r6d, 128*12 |
| | 807 | call .pass1_main_end2 |
| | 808 | mova [r4+64*16], m16 |
| | 809 | mova [r4+64*17], m17 |
| | 810 | mova [r4+64*18], m18 |
| | 811 | mova [r4+64*19], m19 |
| | 812 | mova [r4+64*20], m8 |
| | 813 | mova [r4+64*21], m9 |
| | 814 | mova [r4+64*22], m10 |
| | 815 | mova [r4+64*23], m11 |
| | 816 | call .main_fast |
| | 817 | mova m0, [r4+64*16] |
| | 818 | mova m1, [r4+64*17] |
| | 819 | mova m2, [r4+64*18] |
| | 820 | mova m3, [r4+64*19] |
| | 821 | mova m4, [r4+64*20] |
| | 822 | mova m5, [r4+64*21] |
| | 823 | mova m6, [r4+64*22] |
| | 824 | mova m7, [r4+64*23] |
| | 825 | call m(vp9_idct_16x16_internal_10).main_part1_fast |
| | 826 | call .pass2_main_left |
| | 827 | call .main_fast |
| | 828 | call .pass2_main_right |
| | 829 | call m(vp9_idct_16x16_internal_10).main_part1_fast |
| | 830 | .pass2_end: |
| | 831 | paddd m0, m22 |
| | 832 | paddd m18, m22 |
| | 833 | call m(vp9_idct_16x16_internal_10).main_part2 |
| | 834 | mova m20, [o(deintq_perm)] |
| | 835 | rorx r2, strideq, 59 ; strideq*32 |
| | 836 | vpbroadcastd m21, [o(pixel_clip)] |
| | 837 | add r2, dstq |
| | 838 | %assign i 0 |
| | 839 | %rep 16 |
| | 840 | mova m16, [r4+64*(15-i)] |
| | 841 | mova m17, [r4+64*(i-16)] |
| | 842 | mova m18, [r4-64*(17+i)] |
| | 843 | paddd m19, m %+ i, m16 |
| | 844 | psubd m0, m %+ i, m16 |
| | 845 | call .write_32x2 |
| | 846 | %assign i i+1 |
| | 847 | %endrep |
| | 848 | RET |
| | 849 | ALIGN function_align |
| | 850 | .write_32x2: |
| | 851 | paddd m16, m17, m18 |
| | 852 | psubd m17, m18 |
| | 853 | REPX {psrad x, 6}, m19, m16, m0, m17 |
| | 854 | packssdw m16, m19 |
| | 855 | packssdw m17, m0 |
| | 856 | sub r2, strideq |
| | 857 | vpermq m16, m20, m16 |
| | 858 | vpermq m17, m20, m17 |
| | 859 | paddsw m16, [dstq] |
| | 860 | paddsw m17, [r2 ] |
| | 861 | psubusw m16, m21 |
| | 862 | psubusw m17, m21 |
| | 863 | mova [dstq], m16 |
| | 864 | mova [r2 ], m17 |
| | 865 | add dstq, strideq |
| | 866 | ret |
| | 867 | ALIGN function_align |
| | 868 | .pass1_main: |
| | 869 | mova m0, [cq+128* 1] |
| | 870 | mova m1, [cq+128* 3] |
| | 871 | mova m2, [cq+128* 5] |
| | 872 | mova m3, [cq+128* 7] |
| | 873 | mova m4, [cq+128* 9] |
| | 874 | mova m5, [cq+128*11] |
| | 875 | mova m6, [cq+128*13] |
| | 876 | mova m7, [cq+128*15] |
| | 877 | mova m8, [cq+128*17] |
| | 878 | mova m9, [cq+128*19] |
| | 879 | mova m10, [cq+128*21] |
| | 880 | mova m11, [cq+128*23] |
| | 881 | mova m12, [cq+128*25] |
| | 882 | mova m13, [cq+128*27] |
| | 883 | mova m14, [cq+128*29] |
| | 884 | mova m15, [cq+128*31] |
| | 885 | call .main |
| | 886 | mova m0, [cq+128* 0] |
| | 887 | mova m1, [cq+128* 2] |
| | 888 | mova m2, [cq+128* 4] |
| | 889 | mova m3, [cq+128* 6] |
| | 890 | mova m4, [cq+128* 8] |
| | 891 | mova m5, [cq+128*10] |
| | 892 | mova m6, [cq+128*12] |
| | 893 | mova m7, [cq+128*14] |
| | 894 | mova m8, [cq+128*16] |
| | 895 | mova m9, [cq+128*18] |
| | 896 | mova m10, [cq+128*20] |
| | 897 | mova m11, [cq+128*22] |
| | 898 | mova m12, [cq+128*24] |
| | 899 | mova m13, [cq+128*26] |
| | 900 | mova m14, [cq+128*28] |
| | 901 | mova m15, [cq+128*30] |
| | 902 | call m(vp9_idct_16x16_internal_10).main_part1 |
| | 903 | .pass1_main_end: |
| | 904 | call m(vp9_idct_16x16_internal_10).main_part2 |
| | 905 | .pass1_main_end2: |
| | 906 | pxor m16, m16 |
| | 907 | .pass1_zero_loop: |
| | 908 | mova [cq+r6+128*0], m16 |
| | 909 | mova [cq+r6+128*1], m16 |
| | 910 | mova [cq+r6+128*2], m16 |
| | 911 | mova [cq+r6+128*3], m16 |
| | 912 | sub r6d, 128*4 |
| | 913 | jge .pass1_zero_loop |
| | 914 | mova m16, [r4+64*15] |
| | 915 | mova m19, [r4+64*14] |
| | 916 | mova m22, [r4+64*13] |
| | 917 | mova m17, [r4+64*12] |
| | 918 | psubd m18, m0, m16 |
| | 919 | paddd m16, m0 |
| | 920 | paddd m0, m19, m1 |
| | 921 | psubd m19, m1, m19 |
| | 922 | paddd m1, m17, m3 |
| | 923 | psubd m3, m17 |
| | 924 | paddd m17, m2, m22 |
| | 925 | psubd m2, m22 |
| | 926 | TRANSPOSE_4D 3, 2, 19, 18, 22 ; 28 29 30 31 |
| | 927 | TRANSPOSE_4D 16, 0, 17, 1, 22 ; 0 1 2 3 |
| | 928 | mova [r4+64*54], m3 |
| | 929 | mova [r4+64*55], m19 |
| | 930 | mova [r4+64*38], m2 |
| | 931 | mova [r4+64*39], m18 |
| | 932 | mova m2, [r4+64*11] |
| | 933 | mova m19, [r4+64*10] |
| | 934 | mova m3, [r4+64* 9] |
| | 935 | mova m22, [r4+64* 8] |
| | 936 | paddd m18, m4, m2 |
| | 937 | psubd m4, m2 |
| | 938 | paddd m2, m5, m19 |
| | 939 | psubd m5, m19 |
| | 940 | paddd m19, m6, m3 |
| | 941 | psubd m6, m3 |
| | 942 | paddd m3, m7, m22 |
| | 943 | psubd m7, m22 |
| | 944 | TRANSPOSE_4D 7, 6, 5, 4, 22 ; 24 25 26 27 |
| | 945 | TRANSPOSE_4D 18, 2, 19, 3, 22 ; 4 5 6 7 |
| | 946 | mova [r4+64*52], m7 |
| | 947 | mova [r4+64*53], m5 |
| | 948 | mova [r4+64*36], m6 |
| | 949 | mova [r4+64*37], m4 |
| | 950 | mova m7, [r4+64* 7] |
| | 951 | mova m4, [r4+64* 6] |
| | 952 | mova m5, [r4+64* 5] |
| | 953 | mova m22, [r4+64* 4] |
| | 954 | psubd m6, m8, m7 |
| | 955 | paddd m8, m7 |
| | 956 | psubd m7, m9, m4 |
| | 957 | paddd m4, m9 |
| | 958 | paddd m9, m10, m5 |
| | 959 | psubd m10, m5 |
| | 960 | paddd m5, m11, m22 |
| | 961 | psubd m11, m22 |
| | 962 | TRANSPOSE_4D 11, 10, 7, 6, 22 ; 20 21 22 23 |
| | 963 | TRANSPOSE_4D 8, 4, 9, 5, 22 ; 8 9 10 11 |
| | 964 | mova [r4+64*50], m11 |
| | 965 | mova [r4+64*51], m7 |
| | 966 | mova [r4+64*34], m10 |
| | 967 | mova [r4+64*35], m6 |
| | 968 | mova m6, [r4+64* 3] |
| | 969 | mova m11, [r4+64* 2] |
| | 970 | mova m7, [r4+64* 1] |
| | 971 | mova m22, [r4+64* 0] |
| | 972 | paddd m10, m12, m6 |
| | 973 | psubd m12, m6 |
| | 974 | paddd m6, m13, m11 |
| | 975 | psubd m13, m11 |
| | 976 | paddd m11, m14, m7 |
| | 977 | psubd m14, m7 |
| | 978 | paddd m7, m15, m22 |
| | 979 | psubd m15, m22 |
| | 980 | TRANSPOSE_4D 15, 14, 13, 12, 22 ; 16 17 18 19 |
| | 981 | TRANSPOSE_4D 10, 6, 11, 7, 22 ; 12 13 14 15 |
| | 982 | mova [r4+64*48], m15 |
| | 983 | mova [r4+64*49], m13 |
| | 984 | mova [r4+64*32], m14 |
| | 985 | mova [r4+64*33], m12 |
| | 986 | TRANSPOSE_4DQ 0, 2, 4, 6, 22 |
| | 987 | TRANSPOSE_4DQ 1, 3, 5, 7, 22 |
| | 988 | TRANSPOSE_4DQ 16, 18, 8, 10, 22 |
| | 989 | TRANSPOSE_4DQ 17, 19, 9, 11, 22 |
| | 990 | ret |
| | 991 | ALIGN function_align |
| | 992 | .pass2_main_left: |
| | 993 | vpbroadcastd m22, [o(pixel_clip6)] |
| | 994 | paddd m0, m22 |
| | 995 | paddd m18, m22 |
| | 996 | call m(vp9_idct_16x16_internal_10).main_part2 |
| | 997 | mova [r4+64*16], m0 |
| | 998 | mova [r4+64*17], m1 |
| | 999 | mova [r4+64*18], m2 |
| | 1000 | mova [r4+64*19], m3 |
| | 1001 | mova [r4+64*20], m4 |
| | 1002 | mova [r4+64*21], m5 |
| | 1003 | mova [r4+64*22], m6 |
| | 1004 | mova [r4+64*23], m7 |
| | 1005 | mova [r4+64*24], m8 |
| | 1006 | mova [r4+64*25], m9 |
| | 1007 | mova [r4+64*26], m10 |
| | 1008 | mova [r4+64*27], m11 |
| | 1009 | mova [r4+64*28], m12 |
| | 1010 | mova [r4+64*29], m13 |
| | 1011 | mova [r4+64*30], m14 |
| | 1012 | mova [r4+64*31], m15 |
| | 1013 | add r4, 64*32 |
| | 1014 | mova m0, [r4+64* 0] |
| | 1015 | mova m1, [r4+64* 1] |
| | 1016 | mova m2, [r4+64* 2] |
| | 1017 | mova m3, [r4+64* 3] |
| | 1018 | mova m4, [r4+64* 4] |
| | 1019 | mova m5, [r4+64* 5] |
| | 1020 | mova m6, [r4+64* 6] |
| | 1021 | mova m7, [r4+64* 7] |
| | 1022 | jmp .pass2_main_transpose |
| | 1023 | ALIGN function_align |
| | 1024 | .pass2_main_right: |
| | 1025 | mova m0, [r4+64*16] |
| | 1026 | mova m1, [r4+64*17] |
| | 1027 | mova m2, [r4+64*18] |
| | 1028 | mova m3, [r4+64*19] |
| | 1029 | mova m4, [r4+64*20] |
| | 1030 | mova m5, [r4+64*21] |
| | 1031 | mova m6, [r4+64*22] |
| | 1032 | mova m7, [r4+64*23] |
| | 1033 | .pass2_main_transpose: |
| | 1034 | TRANSPOSE_4DQ 0, 2, 4, 6, 8 |
| | 1035 | TRANSPOSE_4DQ 1, 3, 5, 7, 8 |
| | 1036 | ret |
| | 1037 | ALIGN function_align |
| | 1038 | .main_fast: |
| | 1039 | pmulld m15, m0, [o(pd_16364)] {1to16} ; t31a |
| | 1040 | pmulld m0, [o(pd_804)] {1to16} ; t16a |
| | 1041 | pmulld m8, m7, [o(pd_11003)] {1to16} ; t17a |
| | 1042 | pmulld m7, [o(pd_12140)] {1to16} ; t30a |
| | 1043 | pmulld m11, m4, [o(pd_14811)] {1to16} ; t29a |
| | 1044 | pmulld m4, [o(pd_7005)] {1to16} ; t18a |
| | 1045 | pmulld m12, m3, [o(pd_5520)] {1to16} ; t19a |
| | 1046 | pmulld m3, [o(pd_15426)] {1to16} ; t28a |
| | 1047 | pmulld m13, m2, [o(pd_15893)] {1to16} ; t27a |
| | 1048 | pmulld m2, [o(pd_3981)] {1to16} ; t20a |
| | 1049 | pmulld m10, m5, [o(pd_8423)] {1to16} ; t21a |
| | 1050 | pmulld m5, [o(pd_14053)] {1to16} ; t26a |
| | 1051 | pmulld m9, m6, [o(pd_13160)] {1to16} ; t25a |
| | 1052 | pmulld m6, [o(pd_9760)] {1to16} ; t22a |
| | 1053 | pmulld m14, m1, [o(pd_2404)] {1to16} ; t23a |
| | 1054 | pmulld m1, [o(pd_16207)] {1to16} ; t24a |
| | 1055 | REPX {psubd x, m20, x}, m8, m12, m10, m14 |
| | 1056 | jmp .main2 |
| | 1057 | ALIGN function_align |
| | 1058 | .main: |
| | 1059 | ITX_MULSUB_2D 0, 15, 16, 17, 18, _, 804, 16364 ; t16a, t31a |
| | 1060 | ITX_MULSUB_2D 8, 7, 16, 17, 18, _, 12140, 11003 ; t17a, t30a |
| | 1061 | ITX_MULSUB_2D 4, 11, 16, 17, 18, _, 7005, 14811 ; t18a, t29a |
| | 1062 | ITX_MULSUB_2D 12, 3, 16, 17, 18, _, 15426, 5520 ; t19a, t28a |
| | 1063 | ITX_MULSUB_2D 2, 13, 16, 17, 18, _, 3981, 15893 ; t20a, t27a |
| | 1064 | ITX_MULSUB_2D 10, 5, 16, 17, 18, _, 14053, 8423 ; t21a, t26a |
| | 1065 | ITX_MULSUB_2D 6, 9, 16, 17, 18, _, 9760, 13160 ; t22a, t25a |
| | 1066 | ITX_MULSUB_2D 14, 1, 16, 17, 18, _, 16207, 2404 ; t23a, t24a |
| | 1067 | REPX {paddd x, m20}, m8, m12, m10, m14 |
| | 1068 | .main2: |
| | 1069 | REPX {paddd x, m20}, m0, m15, m7, m4, m3, m11 |
| | 1070 | REPX {psrad x, 14 }, m8, m0, m15, m7, m12, m4, m3, m11 |
| | 1071 | psubd m16, m0, m8 ; t17 |
| | 1072 | paddd m0, m8 ; t16 |
| | 1073 | psubd m8, m15, m7 ; t30 |
| | 1074 | paddd m15, m7 ; t31 |
| | 1075 | paddd m7, m12, m4 ; t19 |
| | 1076 | psubd m12, m4 ; t18 |
| | 1077 | paddd m4, m3, m11 ; t28 |
| | 1078 | psubd m3, m11 ; t29 |
| | 1079 | REPX {paddd x, m20}, m2, m13, m5, m6, m1, m9 |
| | 1080 | REPX {psrad x, 14 }, m10, m2, m13, m5, m14, m6, m1, m9 |
| | 1081 | psubd m11, m2, m10 ; t21 |
| | 1082 | paddd m2, m10 ; t20 |
| | 1083 | psubd m10, m13, m5 ; t26 |
| | 1084 | paddd m13, m5 ; t27 |
| | 1085 | psubd m5, m14, m6 ; t22 |
| | 1086 | paddd m6, m14 ; t23 |
| | 1087 | psubd m14, m1, m9 ; t25 |
| | 1088 | paddd m9, m1 ; t24 |
| | 1089 | vpbroadcastd m19, [o(pd_16069)] |
| | 1090 | vpbroadcastd m18, [o(pd_3196)] |
| | 1091 | ITX_MULSUB_2D 8, 16, 1, 17, _, 20, 18, 19 ; t17a, t30a |
| | 1092 | ITX_MULSUB_2D 3, 12, 1, 17, _, 20, 18, 19, 1 ; t29a, t18a |
| | 1093 | vpbroadcastd m19, [o(pd_9102)] |
| | 1094 | vpbroadcastd m18, [o(pd_13623)] |
| | 1095 | ITX_MULSUB_2D 10, 11, 1, 17, _, 20, 18, 19 ; t21a, t26a |
| | 1096 | ITX_MULSUB_2D 14, 5, 1, 17, _, 20, 18, 19, 1 ; t25a, t22a |
| | 1097 | paddd m1, m6, m2 ; t23a |
| | 1098 | psubd m6, m2 ; t20a |
| | 1099 | psubd m2, m9, m13 ; t27a |
| | 1100 | paddd m9, m13 ; t24a |
| | 1101 | psubd m13, m15, m4 ; t28a |
| | 1102 | paddd m15, m4 ; t31a |
| | 1103 | psubd m4, m8, m12 ; t18 |
| | 1104 | paddd m8, m12 ; t17 |
| | 1105 | psubd m12, m0, m7 ; t19a |
| | 1106 | paddd m0, m7 ; t16a |
| | 1107 | psubd m7, m16, m3 ; t29 |
| | 1108 | paddd m3, m16 ; t30 |
| | 1109 | paddd m16, m5, m10 ; t22 |
| | 1110 | psubd m5, m10 ; t21 |
| | 1111 | psubd m10, m14, m11 ; t26 |
| | 1112 | paddd m14, m11 ; t25 |
| | 1113 | vpbroadcastd m19, [o(pd_15137)] |
| | 1114 | vpbroadcastd m18, [o(pd_6270)] |
| | 1115 | ITX_MULSUB_2D 13, 12, 11, 17, _, 20, 18, 19 ; t19, t28 |
| | 1116 | ITX_MULSUB_2D 2, 6, 11, 17, _, 20, 18, 19, 1 ; t27, t20 |
| | 1117 | ITX_MULSUB_2D 7, 4, 11, 17, _, 20, 18, 19 ; t18a, t29a |
| | 1118 | ITX_MULSUB_2D 10, 5, 11, 17, _, 20, 18, 19, 1 ; t26a, t21a |
| | 1119 | psubd m11, m0, m1 ; t23 |
| | 1120 | paddd m0, m1 ; t16 |
| | 1121 | paddd m1, m16, m8 ; t17a |
| | 1122 | psubd m16, m8, m16 ; t22a |
| | 1123 | psubd m8, m15, m9 ; t24 |
| | 1124 | paddd m15, m9 ; t31 |
| | 1125 | psubd m9, m3, m14 ; t25a |
| | 1126 | paddd m14, m3 ; t30a |
| | 1127 | paddd m3, m6, m13 ; t19a |
| | 1128 | psubd m6, m13, m6 ; t20a |
| | 1129 | paddd m13, m10, m4 ; t29 |
| | 1130 | psubd m10, m4, m10 ; t26 |
| | 1131 | psubd m4, m12, m2 ; t27a |
| | 1132 | paddd m12, m2 ; t28a |
| | 1133 | paddd m2, m7, m5 ; t18 |
| | 1134 | psubd m7, m5 ; t21 |
| | 1135 | REPX {pmulld x, m21}, m10, m8, m4, m9, m7, m11, m6, m16 |
| | 1136 | mova [r4+64* 0], m0 |
| | 1137 | mova [r4+64* 1], m1 |
| | 1138 | mova [r4+64* 2], m2 |
| | 1139 | mova [r4+64* 3], m3 |
| | 1140 | mova [r4+64*12], m12 |
| | 1141 | mova [r4+64*13], m13 |
| | 1142 | mova [r4+64*14], m14 |
| | 1143 | mova [r4+64*15], m15 |
| | 1144 | REPX {paddd x, m20}, m10, m8, m4, m9 |
| | 1145 | psubd m5, m10, m7 ; t21a |
| | 1146 | paddd m10, m7 ; t26a |
| | 1147 | psubd m7, m8, m11 ; t23a |
| | 1148 | paddd m8, m11 ; t24a |
| | 1149 | REPX {psrad x, 14 }, m5, m10, m7, m8 |
| | 1150 | paddd m11, m4, m6 ; t27 |
| | 1151 | psubd m4, m6 ; t20 |
| | 1152 | psubd m6, m9, m16 ; t22 |
| | 1153 | paddd m9, m16 ; t25 |
| | 1154 | REPX {psrad x, 14 }, m11, m4, m6, m9 |
| | 1155 | mova [r4+64* 4], m4 |
| | 1156 | mova [r4+64* 5], m5 |
| | 1157 | mova [r4+64* 6], m6 |
| | 1158 | mova [r4+64* 7], m7 |
| | 1159 | mova [r4+64* 8], m8 |
| | 1160 | mova [r4+64* 9], m9 |
| | 1161 | mova [r4+64*10], m10 |
| | 1162 | mova [r4+64*11], m11 |
| | 1163 | ret |
| | 1164 | |
| | 1165 | %endif |