| ;****************************************************************************** | |
| ;* 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 |