| ; |
| ; Copyright (c) 2016, Alliance for Open Media. All rights reserved |
| ; |
| ; This source code is subject to the terms of the BSD 2 Clause License and |
| ; the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
| ; was not distributed with this source code in the LICENSE file, you can |
| ; obtain it at www.aomedia.org/license/software. If the Alliance for Open |
| ; Media Patent License 1.0 was not distributed with this source code in the |
| ; PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
| ; |
| |
| ; |
| |
| %include "third_party/x86inc/x86inc.asm" |
| |
| SECTION_RODATA |
| |
| pw_11585x2: times 8 dw 23170 |
| pd_8192: times 4 dd 8192 |
| |
| %macro TRANSFORM_COEFFS 2 |
| pw_%1_%2: dw %1, %2, %1, %2, %1, %2, %1, %2 |
| pw_%2_m%1: dw %2, -%1, %2, -%1, %2, -%1, %2, -%1 |
| %endmacro |
| |
| TRANSFORM_COEFFS 11585, 11585 |
| TRANSFORM_COEFFS 15137, 6270 |
| TRANSFORM_COEFFS 16069, 3196 |
| TRANSFORM_COEFFS 9102, 13623 |
| |
| %macro STORE_OUTPUT 2 ; index, result |
| ; const __m128i sign_bits = _mm_cmplt_epi16(*poutput, zero); |
| ; __m128i out0 = _mm_unpacklo_epi16(*poutput, sign_bits); |
| ; __m128i out1 = _mm_unpackhi_epi16(*poutput, sign_bits); |
| ; _mm_store_si128((__m128i *)(dst_ptr), out0); |
| ; _mm_store_si128((__m128i *)(dst_ptr + 4), out1); |
| pxor m11, m11 |
| pcmpgtw m11, m%2 |
| movdqa m12, m%2 |
| punpcklwd m%2, m11 |
| punpckhwd m12, m11 |
| mova [outputq + 4*%1 + 0], m%2 |
| mova [outputq + 4*%1 + 16], m12 |
| %endmacro |
| |
| SECTION .text |
| |
| %if AOM_ARCH_X86_64 |
| INIT_XMM ssse3 |
| cglobal fdct8x8, 3, 5, 13, input, output, stride |
| |
| mova m8, [GLOBAL(pd_8192)] |
| mova m12, [GLOBAL(pw_11585x2)] |
| |
| lea r3, [2 * strideq] |
| lea r4, [4 * strideq] |
| mova m0, [inputq] |
| mova m1, [inputq + r3] |
| lea inputq, [inputq + r4] |
| mova m2, [inputq] |
| mova m3, [inputq + r3] |
| lea inputq, [inputq + r4] |
| mova m4, [inputq] |
| mova m5, [inputq + r3] |
| lea inputq, [inputq + r4] |
| mova m6, [inputq] |
| mova m7, [inputq + r3] |
| |
| ; left shift by 2 to increase forward transformation precision |
| psllw m0, 2 |
| psllw m1, 2 |
| psllw m2, 2 |
| psllw m3, 2 |
| psllw m4, 2 |
| psllw m5, 2 |
| psllw m6, 2 |
| psllw m7, 2 |
| |
| ; column transform |
| ; stage 1 |
| paddw m10, m0, m7 |
| psubw m0, m7 |
| |
| paddw m9, m1, m6 |
| psubw m1, m6 |
| |
| paddw m7, m2, m5 |
| psubw m2, m5 |
| |
| paddw m6, m3, m4 |
| psubw m3, m4 |
| |
| ; stage 2 |
| paddw m5, m9, m7 |
| psubw m9, m7 |
| |
| paddw m4, m10, m6 |
| psubw m10, m6 |
| |
| paddw m7, m1, m2 |
| psubw m1, m2 |
| |
| ; stage 3 |
| paddw m6, m4, m5 |
| psubw m4, m5 |
| |
| pmulhrsw m1, m12 |
| pmulhrsw m7, m12 |
| |
| ; sin(pi / 8), cos(pi / 8) |
| punpcklwd m2, m10, m9 |
| punpckhwd m10, m9 |
| pmaddwd m5, m2, [GLOBAL(pw_15137_6270)] |
| pmaddwd m2, [GLOBAL(pw_6270_m15137)] |
| pmaddwd m9, m10, [GLOBAL(pw_15137_6270)] |
| pmaddwd m10, [GLOBAL(pw_6270_m15137)] |
| paddd m5, m8 |
| paddd m2, m8 |
| paddd m9, m8 |
| paddd m10, m8 |
| psrad m5, 14 |
| psrad m2, 14 |
| psrad m9, 14 |
| psrad m10, 14 |
| packssdw m5, m9 |
| packssdw m2, m10 |
| |
| pmulhrsw m6, m12 |
| pmulhrsw m4, m12 |
| |
| paddw m9, m3, m1 |
| psubw m3, m1 |
| |
| paddw m10, m0, m7 |
| psubw m0, m7 |
| |
| ; stage 4 |
| ; sin(pi / 16), cos(pi / 16) |
| punpcklwd m1, m10, m9 |
| punpckhwd m10, m9 |
| pmaddwd m7, m1, [GLOBAL(pw_16069_3196)] |
| pmaddwd m1, [GLOBAL(pw_3196_m16069)] |
| pmaddwd m9, m10, [GLOBAL(pw_16069_3196)] |
| pmaddwd m10, [GLOBAL(pw_3196_m16069)] |
| paddd m7, m8 |
| paddd m1, m8 |
| paddd m9, m8 |
| paddd m10, m8 |
| psrad m7, 14 |
| psrad m1, 14 |
| psrad m9, 14 |
| psrad m10, 14 |
| packssdw m7, m9 |
| packssdw m1, m10 |
| |
| ; sin(3 * pi / 16), cos(3 * pi / 16) |
| punpcklwd m11, m0, m3 |
| punpckhwd m0, m3 |
| pmaddwd m9, m11, [GLOBAL(pw_9102_13623)] |
| pmaddwd m11, [GLOBAL(pw_13623_m9102)] |
| pmaddwd m3, m0, [GLOBAL(pw_9102_13623)] |
| pmaddwd m0, [GLOBAL(pw_13623_m9102)] |
| paddd m9, m8 |
| paddd m11, m8 |
| paddd m3, m8 |
| paddd m0, m8 |
| psrad m9, 14 |
| psrad m11, 14 |
| psrad m3, 14 |
| psrad m0, 14 |
| packssdw m9, m3 |
| packssdw m11, m0 |
| |
| ; transpose |
| ; stage 1 |
| punpcklwd m0, m6, m7 |
| punpcklwd m3, m5, m11 |
| punpckhwd m6, m7 |
| punpckhwd m5, m11 |
| punpcklwd m7, m4, m9 |
| punpcklwd m10, m2, m1 |
| punpckhwd m4, m9 |
| punpckhwd m2, m1 |
| |
| ; stage 2 |
| punpckldq m9, m0, m3 |
| punpckldq m1, m6, m5 |
| punpckhdq m0, m3 |
| punpckhdq m6, m5 |
| punpckldq m3, m7, m10 |
| punpckldq m5, m4, m2 |
| punpckhdq m7, m10 |
| punpckhdq m4, m2 |
| |
| ; stage 3 |
| punpcklqdq m10, m9, m3 |
| punpckhqdq m9, m3 |
| punpcklqdq m2, m0, m7 |
| punpckhqdq m0, m7 |
| punpcklqdq m3, m1, m5 |
| punpckhqdq m1, m5 |
| punpcklqdq m7, m6, m4 |
| punpckhqdq m6, m4 |
| |
| ; row transform |
| ; stage 1 |
| paddw m5, m10, m6 |
| psubw m10, m6 |
| |
| paddw m4, m9, m7 |
| psubw m9, m7 |
| |
| paddw m6, m2, m1 |
| psubw m2, m1 |
| |
| paddw m7, m0, m3 |
| psubw m0, m3 |
| |
| ;stage 2 |
| paddw m1, m5, m7 |
| psubw m5, m7 |
| |
| paddw m3, m4, m6 |
| psubw m4, m6 |
| |
| paddw m7, m9, m2 |
| psubw m9, m2 |
| |
| ; stage 3 |
| punpcklwd m6, m1, m3 |
| punpckhwd m1, m3 |
| pmaddwd m2, m6, [GLOBAL(pw_11585_11585)] |
| pmaddwd m6, [GLOBAL(pw_11585_m11585)] |
| pmaddwd m3, m1, [GLOBAL(pw_11585_11585)] |
| pmaddwd m1, [GLOBAL(pw_11585_m11585)] |
| paddd m2, m8 |
| paddd m6, m8 |
| paddd m3, m8 |
| paddd m1, m8 |
| psrad m2, 14 |
| psrad m6, 14 |
| psrad m3, 14 |
| psrad m1, 14 |
| packssdw m2, m3 |
| packssdw m6, m1 |
| |
| pmulhrsw m7, m12 |
| pmulhrsw m9, m12 |
| |
| punpcklwd m3, m5, m4 |
| punpckhwd m5, m4 |
| pmaddwd m1, m3, [GLOBAL(pw_15137_6270)] |
| pmaddwd m3, [GLOBAL(pw_6270_m15137)] |
| pmaddwd m4, m5, [GLOBAL(pw_15137_6270)] |
| pmaddwd m5, [GLOBAL(pw_6270_m15137)] |
| paddd m1, m8 |
| paddd m3, m8 |
| paddd m4, m8 |
| paddd m5, m8 |
| psrad m1, 14 |
| psrad m3, 14 |
| psrad m4, 14 |
| psrad m5, 14 |
| packssdw m1, m4 |
| packssdw m3, m5 |
| |
| paddw m4, m0, m9 |
| psubw m0, m9 |
| |
| paddw m5, m10, m7 |
| psubw m10, m7 |
| |
| ; stage 4 |
| punpcklwd m9, m5, m4 |
| punpckhwd m5, m4 |
| pmaddwd m7, m9, [GLOBAL(pw_16069_3196)] |
| pmaddwd m9, [GLOBAL(pw_3196_m16069)] |
| pmaddwd m4, m5, [GLOBAL(pw_16069_3196)] |
| pmaddwd m5, [GLOBAL(pw_3196_m16069)] |
| paddd m7, m8 |
| paddd m9, m8 |
| paddd m4, m8 |
| paddd m5, m8 |
| psrad m7, 14 |
| psrad m9, 14 |
| psrad m4, 14 |
| psrad m5, 14 |
| packssdw m7, m4 |
| packssdw m9, m5 |
| |
| punpcklwd m4, m10, m0 |
| punpckhwd m10, m0 |
| pmaddwd m5, m4, [GLOBAL(pw_9102_13623)] |
| pmaddwd m4, [GLOBAL(pw_13623_m9102)] |
| pmaddwd m0, m10, [GLOBAL(pw_9102_13623)] |
| pmaddwd m10, [GLOBAL(pw_13623_m9102)] |
| paddd m5, m8 |
| paddd m4, m8 |
| paddd m0, m8 |
| paddd m10, m8 |
| psrad m5, 14 |
| psrad m4, 14 |
| psrad m0, 14 |
| psrad m10, 14 |
| packssdw m5, m0 |
| packssdw m4, m10 |
| |
| ; transpose |
| ; stage 1 |
| punpcklwd m0, m2, m7 |
| punpcklwd m10, m1, m4 |
| punpckhwd m2, m7 |
| punpckhwd m1, m4 |
| punpcklwd m7, m6, m5 |
| punpcklwd m4, m3, m9 |
| punpckhwd m6, m5 |
| punpckhwd m3, m9 |
| |
| ; stage 2 |
| punpckldq m5, m0, m10 |
| punpckldq m9, m2, m1 |
| punpckhdq m0, m10 |
| punpckhdq m2, m1 |
| punpckldq m10, m7, m4 |
| punpckldq m1, m6, m3 |
| punpckhdq m7, m4 |
| punpckhdq m6, m3 |
| |
| ; stage 3 |
| punpcklqdq m4, m5, m10 |
| punpckhqdq m5, m10 |
| punpcklqdq m3, m0, m7 |
| punpckhqdq m0, m7 |
| punpcklqdq m10, m9, m1 |
| punpckhqdq m9, m1 |
| punpcklqdq m7, m2, m6 |
| punpckhqdq m2, m6 |
| |
| psraw m1, m4, 15 |
| psraw m6, m5, 15 |
| psraw m8, m3, 15 |
| psraw m11, m0, 15 |
| |
| psubw m4, m1 |
| psubw m5, m6 |
| psubw m3, m8 |
| psubw m0, m11 |
| |
| psraw m4, 1 |
| psraw m5, 1 |
| psraw m3, 1 |
| psraw m0, 1 |
| |
| psraw m1, m10, 15 |
| psraw m6, m9, 15 |
| psraw m8, m7, 15 |
| psraw m11, m2, 15 |
| |
| psubw m10, m1 |
| psubw m9, m6 |
| psubw m7, m8 |
| psubw m2, m11 |
| |
| psraw m10, 1 |
| psraw m9, 1 |
| psraw m7, 1 |
| psraw m2, 1 |
| |
| STORE_OUTPUT 0, 4 |
| STORE_OUTPUT 8, 5 |
| STORE_OUTPUT 16, 3 |
| STORE_OUTPUT 24, 0 |
| STORE_OUTPUT 32, 10 |
| STORE_OUTPUT 40, 9 |
| STORE_OUTPUT 48, 7 |
| STORE_OUTPUT 56, 2 |
| |
| RET |
| %endif |