| ;****************************************************************************** |
| ;* 36 point SSE-optimized IMDCT transform |
| ;* Copyright (c) 2011 Vitor Sessak |
| ;* |
| ;* This file is part of FFmpeg. |
| ;* |
| ;* FFmpeg is free software; you can redistribute it and/or |
| ;* modify it under the terms of the GNU Lesser General Public |
| ;* License as published by the Free Software Foundation; either |
| ;* version 2.1 of the License, or (at your option) any later version. |
| ;* |
| ;* FFmpeg is distributed in the hope that it will be useful, |
| ;* but WITHOUT ANY WARRANTY; without even the implied warranty of |
| ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| ;* Lesser General Public License for more details. |
| ;* |
| ;* You should have received a copy of the GNU Lesser General Public |
| ;* License along with FFmpeg; if not, write to the Free Software |
| ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| ;****************************************************************************** |
| |
| %include "libavutil/x86/x86util.asm" |
| |
| SECTION_RODATA |
| |
| ps_mask: dd 0, ~0, ~0, ~0 |
| ps_mask2: dd 0, ~0, 0, ~0 |
| ps_mask3: dd 0, 0, 0, ~0 |
| ps_mask4: dd 0, ~0, 0, 0 |
| |
| ps_val1: dd -0.5, -0.5, -0.8660254038, -0.8660254038 |
| ps_val2: dd 1.0, 1.0, 0.8660254038, 0.8660254038 |
| ps_val3: dd 0.1736481777, 0.1736481777, 0.3420201433, 0.3420201433 |
| ps_val4: dd -0.7660444431, -0.7660444431, 0.8660254038, 0.8660254038 |
| ps_val5: dd -0.9396926208, -0.9396926208, -0.9848077530, -0.9848077530 |
| ps_val6: dd 0.5, 0.5, -0.6427876097, -0.6427876097 |
| ps_val7: dd 1.0, 1.0, -0.6427876097, -0.6427876097 |
| |
| ps_p1p1m1m1: dd 0, 0, 0x80000000, 0x80000000 |
| ps_p1m1p1m1: dd 0, 0x80000000, 0, 0x80000000 |
| |
| ps_cosh: dd 1.0, 0.50190991877167369479, 1.0, 5.73685662283492756461 |
| dd 1.0, 0.51763809020504152469, 1.0, 1.93185165257813657349 |
| dd 1.0, 0.55168895948124587824, -1.0, -1.18310079157624925896 |
| dd 1.0, 0.61038729438072803416, -1.0, -0.87172339781054900991 |
| dd 1.0, 0.70710678118654752439, 0.0, 0.0 |
| |
| ps_cosh_sse3: dd 1.0, -0.50190991877167369479, 1.0, -5.73685662283492756461 |
| dd 1.0, -0.51763809020504152469, 1.0, -1.93185165257813657349 |
| dd 1.0, -0.55168895948124587824, -1.0, 1.18310079157624925896 |
| dd 1.0, -0.61038729438072803416, -1.0, 0.87172339781054900991 |
| dd 1.0, -0.70710678118654752439, 0.0, 0.0 |
| |
| costabs: times 4 dd 0.98480773 |
| times 4 dd 0.93969262 |
| times 4 dd 0.86602539 |
| times 4 dd -0.76604444 |
| times 4 dd -0.64278764 |
| times 4 dd 0.50000000 |
| times 4 dd -0.50000000 |
| times 4 dd -0.34202015 |
| times 4 dd -0.17364818 |
| times 4 dd 0.50190992 |
| times 4 dd 0.51763808 |
| times 4 dd 0.55168896 |
| times 4 dd 0.61038726 |
| times 4 dd 0.70710677 |
| times 4 dd 0.87172341 |
| times 4 dd 1.18310082 |
| times 4 dd 1.93185163 |
| times 4 dd 5.73685646 |
| |
| %define SBLIMIT 32 |
| SECTION .text |
| |
| %macro PSHUFD 3 |
| %if cpuflag(sse2) && notcpuflag(avx) |
| pshufd %1, %2, %3 |
| %else |
| shufps %1, %2, %2, %3 |
| %endif |
| %endmacro |
| |
| ; input %2={x1,x2,x3,x4}, %3={y1,y2,y3,y4} |
| ; output %1={x3,x4,y1,y2} |
| %macro BUILDINVHIGHLOW 3 |
| %if cpuflag(avx) |
| shufps %1, %2, %3, 0x4e |
| %else |
| movlhps %1, %3 |
| movhlps %1, %2 |
| %endif |
| %endmacro |
| |
| ; input %2={x1,x2,x3,x4}, %3={y1,y2,y3,y4} |
| ; output %1={x4,y1,y2,y3} |
| %macro ROTLEFT 3 |
| %if cpuflag(ssse3) |
| palignr %1, %3, %2, 12 |
| %else |
| BUILDINVHIGHLOW %1, %2, %3 |
| shufps %1, %1, %3, 0x99 |
| %endif |
| %endmacro |
| |
| %macro INVERTHL 2 |
| %if cpuflag(sse2) |
| PSHUFD %1, %2, 0x4e |
| %else |
| movhlps %1, %2 |
| movlhps %1, %2 |
| %endif |
| %endmacro |
| |
| %macro BUTTERF 3 |
| INVERTHL %2, %1 |
| xorps %1, [ps_p1p1m1m1] |
| addps %1, %2 |
| %if cpuflag(sse3) |
| mulps %1, %1, [ps_cosh_sse3 + %3] |
| PSHUFD %2, %1, 0xb1 |
| addsubps %1, %1, %2 |
| %else |
| mulps %1, [ps_cosh + %3] |
| PSHUFD %2, %1, 0xb1 |
| xorps %1, [ps_p1m1p1m1] |
| addps %1, %2 |
| %endif |
| %endmacro |
| |
| %macro BUTTERF2 3 |
| %if cpuflag(sse3) |
| mulps %1, %1, [ps_cosh_sse3 + %3] |
| PSHUFD %2, %1, 0xe1 |
| addsubps %1, %1, %2 |
| %else |
| mulps %1, [ps_cosh + %3] |
| PSHUFD %2, %1, 0xe1 |
| xorps %1, [ps_p1m1p1m1] |
| addps %1, %2 |
| %endif |
| %endmacro |
| |
| %macro STORE 4 |
| %if cpuflag(sse4) |
| movss [%3 ], %1 |
| extractps dword [%3 + %4], %1, 1 |
| extractps dword [%3 + 2*%4], %1, 2 |
| extractps dword [%3 + 3*%4], %1, 3 |
| %else |
| movhlps %2, %1 |
| movss [%3 ], %1 |
| movss [%3 + 2*%4], %2 |
| shufps %1, %1, 0xb1 |
| movss [%3 + %4], %1 |
| movhlps %2, %1 |
| movss [%3 + 3*%4], %2 |
| %endif |
| %endmacro |
| |
| %macro LOAD 4 |
| movlps %1, [%3 ] |
| movhps %1, [%3 + %4] |
| movlps %2, [%3 + 2*%4] |
| movhps %2, [%3 + 3*%4] |
| shufps %1, %2, 0x88 |
| %endmacro |
| |
| %macro LOADA64 2 |
| %if cpuflag(avx) |
| movu %1, [%2] |
| %else |
| movlps %1, [%2] |
| movhps %1, [%2 + 8] |
| %endif |
| %endmacro |
| |
| %macro DEFINE_IMDCT 0 |
| cglobal imdct36_float, 4,4,9, out, buf, in, win |
| |
| ; for(i=17;i>=1;i--) in[i] += in[i-1]; |
| LOADA64 m0, inq |
| LOADA64 m1, inq + 16 |
| |
| ROTLEFT m5, m0, m1 |
| |
| PSHUFD m6, m0, 0x93 |
| andps m6, m6, [ps_mask] |
| addps m0, m0, m6 |
| |
| LOADA64 m2, inq + 32 |
| |
| ROTLEFT m7, m1, m2 |
| |
| addps m1, m1, m5 |
| LOADA64 m3, inq + 48 |
| |
| ROTLEFT m5, m2, m3 |
| |
| xorps m4, m4, m4 |
| movlps m4, [inq+64] |
| BUILDINVHIGHLOW m6, m3, m4 |
| shufps m6, m6, m4, 0xa9 |
| |
| addps m4, m4, m6 |
| addps m2, m2, m7 |
| addps m3, m3, m5 |
| |
| ; for(i=17;i>=3;i-=2) in[i] += in[i-2]; |
| movlhps m5, m5, m0 |
| andps m5, m5, [ps_mask3] |
| |
| BUILDINVHIGHLOW m7, m0, m1 |
| andps m7, m7, [ps_mask2] |
| |
| addps m0, m0, m5 |
| |
| BUILDINVHIGHLOW m6, m1, m2 |
| andps m6, m6, [ps_mask2] |
| |
| addps m1, m1, m7 |
| |
| BUILDINVHIGHLOW m7, m2, m3 |
| andps m7, m7, [ps_mask2] |
| |
| addps m2, m2, m6 |
| |
| movhlps m6, m6, m3 |
| andps m6, m6, [ps_mask4] |
| |
| addps m3, m3, m7 |
| addps m4, m4, m6 |
| |
| ; Populate tmp[] |
| movlhps m6, m1, m5 ; zero out high values |
| subps m6, m6, m4 |
| |
| subps m5, m0, m3 |
| |
| %if ARCH_X86_64 |
| SWAP m5, m8 |
| %endif |
| |
| mulps m7, m2, [ps_val1] |
| |
| %if ARCH_X86_64 |
| mulps m5, m8, [ps_val2] |
| %else |
| mulps m5, m5, [ps_val2] |
| %endif |
| addps m7, m7, m5 |
| |
| mulps m5, m6, [ps_val1] |
| subps m7, m7, m5 |
| |
| %if ARCH_X86_64 |
| SWAP m5, m8 |
| %else |
| subps m5, m0, m3 |
| %endif |
| |
| subps m5, m5, m6 |
| addps m5, m5, m2 |
| |
| shufps m6, m4, m3, 0xe4 |
| subps m6, m6, m2 |
| mulps m6, m6, [ps_val3] |
| |
| addps m4, m4, m1 |
| mulps m4, m4, [ps_val4] |
| |
| shufps m1, m1, m0, 0xe4 |
| addps m1, m1, m2 |
| mulps m1, m1, [ps_val5] |
| |
| mulps m3, m3, [ps_val6] |
| mulps m0, m0, [ps_val7] |
| addps m0, m0, m3 |
| |
| xorps m2, m1, [ps_p1p1m1m1] |
| subps m2, m2, m4 |
| addps m2, m2, m0 |
| |
| addps m3, m4, m0 |
| subps m3, m3, m6 |
| xorps m3, m3, [ps_p1p1m1m1] |
| |
| shufps m0, m0, m4, 0xe4 |
| subps m0, m0, m1 |
| addps m0, m0, m6 |
| |
| BUILDINVHIGHLOW m4, m2, m3 |
| shufps m3, m3, m2, 0x4e |
| |
| ; we have tmp = {SwAPLH(m0), SwAPLH(m7), m3, m4, m5} |
| |
| BUTTERF m0, m1, 0 |
| BUTTERF m7, m2, 16 |
| BUTTERF m3, m6, 32 |
| BUTTERF m4, m1, 48 |
| BUTTERF2 m5, m1, 64 |
| |
| ; permutates: |
| ; m0 0 1 2 3 => 2 6 10 14 m1 |
| ; m7 4 5 6 7 => 3 7 11 15 m2 |
| ; m3 8 9 10 11 => 17 13 9 5 m3 |
| ; m4 12 13 14 15 => 16 12 8 4 m5 |
| ; m5 16 17 xx xx => 0 1 xx xx m0 |
| |
| unpckhps m1, m0, m7 |
| unpckhps m6, m3, m4 |
| movhlps m2, m6, m1 |
| movlhps m1, m1, m6 |
| |
| unpcklps m5, m5, m4 |
| unpcklps m3, m3, m7 |
| movhlps m4, m3, m5 |
| movlhps m5, m5, m3 |
| SWAP m4, m3 |
| ; permutation done |
| |
| PSHUFD m6, m2, 0xb1 |
| movss m4, [bufq + 4*68] |
| movss m7, [bufq + 4*64] |
| unpcklps m7, m7, m4 |
| mulps m6, m6, [winq + 16*4] |
| addps m6, m6, m7 |
| movss [outq + 64*SBLIMIT], m6 |
| shufps m6, m6, m6, 0xb1 |
| movss [outq + 68*SBLIMIT], m6 |
| |
| mulps m6, m3, [winq + 4*4] |
| LOAD m4, m7, bufq + 4*16, 16 |
| addps m6, m6, m4 |
| STORE m6, m7, outq + 16*SBLIMIT, 4*SBLIMIT |
| |
| shufps m4, m0, m3, 0xb5 |
| mulps m4, m4, [winq + 8*4] |
| LOAD m7, m6, bufq + 4*32, 16 |
| addps m4, m4, m7 |
| STORE m4, m6, outq + 32*SBLIMIT, 4*SBLIMIT |
| |
| shufps m3, m3, m2, 0xb1 |
| mulps m3, m3, [winq + 12*4] |
| LOAD m7, m6, bufq + 4*48, 16 |
| addps m3, m3, m7 |
| STORE m3, m7, outq + 48*SBLIMIT, 4*SBLIMIT |
| |
| mulps m2, m2, [winq] |
| LOAD m6, m7, bufq, 16 |
| addps m2, m2, m6 |
| STORE m2, m7, outq, 4*SBLIMIT |
| |
| mulps m4, m1, [winq + 20*4] |
| STORE m4, m7, bufq, 16 |
| |
| mulps m3, m5, [winq + 24*4] |
| STORE m3, m7, bufq + 4*16, 16 |
| |
| shufps m0, m0, m5, 0xb0 |
| mulps m0, m0, [winq + 28*4] |
| STORE m0, m7, bufq + 4*32, 16 |
| |
| shufps m5, m5, m1, 0xb1 |
| mulps m5, m5, [winq + 32*4] |
| STORE m5, m7, bufq + 4*48, 16 |
| |
| shufps m1, m1, m1, 0xb1 |
| mulps m1, m1, [winq + 36*4] |
| movss [bufq + 4*64], m1 |
| shufps m1, m1, 0xb1 |
| movss [bufq + 4*68], m1 |
| RET |
| %endmacro |
| |
| INIT_XMM sse2 |
| DEFINE_IMDCT |
| |
| INIT_XMM sse3 |
| DEFINE_IMDCT |
| |
| INIT_XMM ssse3 |
| DEFINE_IMDCT |
| |
| %if HAVE_AVX_EXTERNAL |
| INIT_XMM avx |
| DEFINE_IMDCT |
| %endif |
| |
| INIT_XMM sse |
| |
| %if ARCH_X86_64 |
| %define SPILL SWAP |
| %define UNSPILL SWAP |
| %define SPILLED(x) m %+ x |
| %else |
| %define SPILLED(x) [tmpq+(x-8)*16 + 32*4] |
| %macro SPILL 2 ; xmm#, mempos |
| movaps SPILLED(%2), m%1 |
| %endmacro |
| %macro UNSPILL 2 |
| movaps m%1, SPILLED(%2) |
| %endmacro |
| %endif |
| |
| %macro DEFINE_FOUR_IMDCT 0 |
| cglobal four_imdct36_float, 5,5,16, out, buf, in, win, tmp |
| movlps m0, [inq+64] |
| movhps m0, [inq+64 + 72] |
| movlps m3, [inq+64 + 2*72] |
| movhps m3, [inq+64 + 3*72] |
| |
| shufps m5, m0, m3, 0xdd |
| shufps m0, m0, m3, 0x88 |
| |
| mova m1, [inq+48] |
| movu m6, [inq+48 + 72] |
| mova m7, [inq+48 + 2*72] |
| movu m3, [inq+48 + 3*72] |
| |
| TRANSPOSE4x4PS 1, 6, 7, 3, 4 |
| |
| addps m4, m6, m7 |
| mova [tmpq+4*28], m4 |
| |
| addps m7, m3 |
| addps m6, m1 |
| addps m3, m0 |
| addps m0, m5 |
| addps m0, m7 |
| addps m7, m6 |
| mova [tmpq+4*12], m7 |
| SPILL 3, 12 |
| |
| mova m4, [inq+32] |
| movu m5, [inq+32 + 72] |
| mova m2, [inq+32 + 2*72] |
| movu m7, [inq+32 + 3*72] |
| |
| TRANSPOSE4x4PS 4, 5, 2, 7, 3 |
| |
| addps m1, m7 |
| SPILL 1, 11 |
| |
| addps m3, m5, m2 |
| SPILL 3, 13 |
| |
| addps m7, m2 |
| addps m5, m4 |
| addps m6, m7 |
| mova [tmpq], m6 |
| addps m7, m5 |
| mova [tmpq+4*16], m7 |
| |
| mova m2, [inq+16] |
| movu m7, [inq+16 + 72] |
| mova m1, [inq+16 + 2*72] |
| movu m6, [inq+16 + 3*72] |
| |
| TRANSPOSE4x4PS 2, 7, 1, 6, 3 |
| |
| addps m4, m6 |
| addps m6, m1 |
| addps m1, m7 |
| addps m7, m2 |
| addps m5, m6 |
| SPILL 5, 15 |
| addps m6, m7 |
| mulps m6, [costabs + 16*2] |
| mova [tmpq+4*8], m6 |
| SPILL 1, 10 |
| SPILL 0, 14 |
| |
| mova m1, [inq] |
| movu m6, [inq + 72] |
| mova m3, [inq + 2*72] |
| movu m5, [inq + 3*72] |
| |
| TRANSPOSE4x4PS 1, 6, 3, 5, 0 |
| |
| addps m2, m5 |
| addps m5, m3 |
| addps m7, m5 |
| addps m3, m6 |
| addps m6, m1 |
| SPILL 7, 8 |
| addps m5, m6 |
| SPILL 6, 9 |
| addps m6, m4, SPILLED(12) |
| subps m6, m2 |
| UNSPILL 7, 11 |
| SPILL 5, 11 |
| subps m5, m1, m7 |
| mulps m7, [costabs + 16*5] |
| addps m7, m1 |
| mulps m0, m6, [costabs + 16*6] |
| addps m0, m5 |
| mova [tmpq+4*24], m0 |
| addps m6, m5 |
| mova [tmpq+4*4], m6 |
| addps m6, m4, m2 |
| mulps m6, [costabs + 16*1] |
| subps m4, SPILLED(12) |
| mulps m4, [costabs + 16*8] |
| addps m2, SPILLED(12) |
| mulps m2, [costabs + 16*3] |
| subps m5, m7, m6 |
| subps m5, m2 |
| addps m6, m7 |
| addps m6, m4 |
| addps m7, m2 |
| subps m7, m4 |
| mova [tmpq+4*20], m7 |
| mova m2, [tmpq+4*28] |
| mova [tmpq+4*28], m5 |
| UNSPILL 7, 13 |
| subps m5, m7, m2 |
| mulps m5, [costabs + 16*7] |
| UNSPILL 1, 10 |
| mulps m1, [costabs + 16*2] |
| addps m4, m3, m2 |
| mulps m4, [costabs + 16*4] |
| addps m2, m7 |
| addps m7, m3 |
| mulps m7, [costabs] |
| subps m3, m2 |
| mulps m3, [costabs + 16*2] |
| addps m2, m7, m5 |
| addps m2, m1 |
| SPILL 2, 10 |
| addps m7, m4 |
| subps m7, m1 |
| SPILL 7, 12 |
| subps m5, m4 |
| subps m5, m1 |
| UNSPILL 0, 14 |
| SPILL 5, 13 |
| addps m1, m0, SPILLED(15) |
| subps m1, SPILLED(8) |
| mova m4, [costabs + 16*5] |
| mulps m4, [tmpq] |
| UNSPILL 2, 9 |
| addps m4, m2 |
| subps m2, [tmpq] |
| mulps m5, m1, [costabs + 16*6] |
| addps m5, m2 |
| SPILL 5, 9 |
| addps m2, m1 |
| SPILL 2, 14 |
| UNSPILL 5, 15 |
| subps m7, m5, m0 |
| addps m5, SPILLED(8) |
| mulps m5, [costabs + 16*1] |
| mulps m7, [costabs + 16*8] |
| addps m0, SPILLED(8) |
| mulps m0, [costabs + 16*3] |
| subps m2, m4, m5 |
| subps m2, m0 |
| SPILL 2, 15 |
| addps m5, m4 |
| addps m5, m7 |
| addps m4, m0 |
| subps m4, m7 |
| SPILL 4, 8 |
| mova m7, [tmpq+4*16] |
| mova m2, [tmpq+4*12] |
| addps m0, m7, m2 |
| subps m0, SPILLED(11) |
| mulps m0, [costabs + 16*2] |
| addps m4, m7, SPILLED(11) |
| mulps m4, [costabs] |
| subps m7, m2 |
| mulps m7, [costabs + 16*7] |
| addps m2, SPILLED(11) |
| mulps m2, [costabs + 16*4] |
| addps m1, m7, [tmpq+4*8] |
| addps m1, m4 |
| addps m4, m2 |
| subps m4, [tmpq+4*8] |
| SPILL 4, 11 |
| subps m7, m2 |
| subps m7, [tmpq+4*8] |
| addps m4, m6, SPILLED(10) |
| subps m6, SPILLED(10) |
| addps m2, m5, m1 |
| mulps m2, [costabs + 16*9] |
| subps m5, m1 |
| mulps m5, [costabs + 16*17] |
| subps m1, m4, m2 |
| addps m4, m2 |
| mulps m2, m1, [winq+4*36] |
| addps m2, [bufq+4*36] |
| mova [outq+1152], m2 |
| mulps m1, [winq+4*32] |
| addps m1, [bufq+4*32] |
| mova [outq+1024], m1 |
| mulps m1, m4, [winq+4*116] |
| mova [bufq+4*36], m1 |
| mulps m4, [winq+4*112] |
| mova [bufq+4*32], m4 |
| addps m2, m6, m5 |
| subps m6, m5 |
| mulps m1, m6, [winq+4*68] |
| addps m1, [bufq+4*68] |
| mova [outq+2176], m1 |
| mulps m6, [winq] |
| addps m6, [bufq] |
| mova [outq], m6 |
| mulps m1, m2, [winq+4*148] |
| mova [bufq+4*68], m1 |
| mulps m2, [winq+4*80] |
| mova [bufq], m2 |
| addps m5, m3, [tmpq+4*24] |
| mova m2, [tmpq+4*24] |
| subps m2, m3 |
| mova m1, SPILLED(9) |
| subps m1, m0 |
| mulps m1, [costabs + 16*10] |
| addps m0, SPILLED(9) |
| mulps m0, [costabs + 16*16] |
| addps m6, m5, m1 |
| subps m5, m1 |
| mulps m3, m5, [winq+4*40] |
| addps m3, [bufq+4*40] |
| mova [outq+1280], m3 |
| mulps m5, [winq+4*28] |
| addps m5, [bufq+4*28] |
| mova [outq+896], m5 |
| mulps m1, m6, [winq+4*120] |
| mova [bufq+4*40], m1 |
| mulps m6, [winq+4*108] |
| mova [bufq+4*28], m6 |
| addps m1, m2, m0 |
| subps m2, m0 |
| mulps m5, m2, [winq+4*64] |
| addps m5, [bufq+4*64] |
| mova [outq+2048], m5 |
| mulps m2, [winq+4*4] |
| addps m2, [bufq+4*4] |
| mova [outq+128], m2 |
| mulps m0, m1, [winq+4*144] |
| mova [bufq+4*64], m0 |
| mulps m1, [winq+4*84] |
| mova [bufq+4*4], m1 |
| mova m1, [tmpq+4*28] |
| mova m5, m1 |
| addps m1, SPILLED(13) |
| subps m5, SPILLED(13) |
| UNSPILL 3, 15 |
| addps m2, m7, m3 |
| mulps m2, [costabs + 16*11] |
| subps m3, m7 |
| mulps m3, [costabs + 16*15] |
| addps m0, m2, m1 |
| subps m1, m2 |
| SWAP m0, m2 |
| mulps m6, m1, [winq+4*44] |
| addps m6, [bufq+4*44] |
| mova [outq+1408], m6 |
| mulps m1, [winq+4*24] |
| addps m1, [bufq+4*24] |
| mova [outq+768], m1 |
| mulps m0, m2, [winq+4*124] |
| mova [bufq+4*44], m0 |
| mulps m2, [winq+4*104] |
| mova [bufq+4*24], m2 |
| addps m0, m5, m3 |
| subps m5, m3 |
| mulps m1, m5, [winq+4*60] |
| addps m1, [bufq+4*60] |
| mova [outq+1920], m1 |
| mulps m5, [winq+4*8] |
| addps m5, [bufq+4*8] |
| mova [outq+256], m5 |
| mulps m1, m0, [winq+4*140] |
| mova [bufq+4*60], m1 |
| mulps m0, [winq+4*88] |
| mova [bufq+4*8], m0 |
| mova m1, [tmpq+4*20] |
| addps m1, SPILLED(12) |
| mova m2, [tmpq+4*20] |
| subps m2, SPILLED(12) |
| UNSPILL 7, 8 |
| subps m0, m7, SPILLED(11) |
| addps m7, SPILLED(11) |
| mulps m4, m7, [costabs + 16*12] |
| mulps m0, [costabs + 16*14] |
| addps m5, m1, m4 |
| subps m1, m4 |
| mulps m7, m1, [winq+4*48] |
| addps m7, [bufq+4*48] |
| mova [outq+1536], m7 |
| mulps m1, [winq+4*20] |
| addps m1, [bufq+4*20] |
| mova [outq+640], m1 |
| mulps m1, m5, [winq+4*128] |
| mova [bufq+4*48], m1 |
| mulps m5, [winq+4*100] |
| mova [bufq+4*20], m5 |
| addps m6, m2, m0 |
| subps m2, m0 |
| mulps m1, m2, [winq+4*56] |
| addps m1, [bufq+4*56] |
| mova [outq+1792], m1 |
| mulps m2, [winq+4*12] |
| addps m2, [bufq+4*12] |
| mova [outq+384], m2 |
| mulps m0, m6, [winq+4*136] |
| mova [bufq+4*56], m0 |
| mulps m6, [winq+4*92] |
| mova [bufq+4*12], m6 |
| UNSPILL 0, 14 |
| mulps m0, [costabs + 16*13] |
| mova m3, [tmpq+4*4] |
| addps m2, m0, m3 |
| subps m3, m0 |
| mulps m0, m3, [winq+4*52] |
| addps m0, [bufq+4*52] |
| mova [outq+1664], m0 |
| mulps m3, [winq+4*16] |
| addps m3, [bufq+4*16] |
| mova [outq+512], m3 |
| mulps m0, m2, [winq+4*132] |
| mova [bufq+4*52], m0 |
| mulps m2, [winq+4*96] |
| mova [bufq+4*16], m2 |
| RET |
| %endmacro |
| |
| INIT_XMM sse |
| DEFINE_FOUR_IMDCT |
| |
| %if HAVE_AVX_EXTERNAL |
| INIT_XMM avx |
| DEFINE_FOUR_IMDCT |
| %endif |