mirror of https://github.com/FFmpeg/FFmpeg.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
741 lines
18 KiB
741 lines
18 KiB
;****************************************************************************** |
|
;* 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 |
|
|
|
%if ARCH_X86_32 |
|
INIT_XMM sse |
|
DEFINE_IMDCT |
|
%endif |
|
|
|
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
|
|
|