tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

vp9itxfm_template.asm (4878B)


      1 ;******************************************************************************
      2 ;* VP9 IDCT SIMD optimizations
      3 ;*
      4 ;* Copyright (C) 2013 Clément Bœsch <u pkh me>
      5 ;* Copyright (C) 2013 Ronald S. Bultje <rsbultje gmail com>
      6 ;*
      7 ;* This file is part of FFmpeg.
      8 ;*
      9 ;* FFmpeg is free software; you can redistribute it and/or
     10 ;* modify it under the terms of the GNU Lesser General Public
     11 ;* License as published by the Free Software Foundation; either
     12 ;* version 2.1 of the License, or (at your option) any later version.
     13 ;*
     14 ;* FFmpeg is distributed in the hope that it will be useful,
     15 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
     16 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     17 ;* Lesser General Public License for more details.
     18 ;*
     19 ;* You should have received a copy of the GNU Lesser General Public
     20 ;* License along with FFmpeg; if not, write to the Free Software
     21 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     22 ;******************************************************************************
     23 
     24 %macro VP9_IWHT4_1D 0
     25    SWAP                 1, 2, 3
     26    paddw               m0, m2
     27    psubw               m3, m1
     28    psubw               m4, m0, m3
     29    psraw               m4, 1
     30    psubw               m5, m4, m1
     31    SWAP                 5, 1
     32    psubw               m4, m2
     33    SWAP                 4, 2
     34    psubw               m0, m1
     35    paddw               m3, m2
     36    SWAP                 3, 2, 1
     37 %endmacro
     38 
     39 ; (a*x + b*y + round) >> shift
     40 %macro VP9_MULSUB_2W_2X 5 ; dst1, dst2/src, round, coefs1, coefs2
     41    pmaddwd            m%1, m%2, %4
     42    pmaddwd            m%2,  %5
     43    paddd              m%1,  %3
     44    paddd              m%2,  %3
     45    psrad              m%1,  14
     46    psrad              m%2,  14
     47 %endmacro
     48 
     49 %macro VP9_MULSUB_2W_4X 7 ; dst1, dst2, coef1, coef2, rnd, tmp1/src, tmp2
     50    VP9_MULSUB_2W_2X    %7,  %6,  %5, [pw_m%3_%4], [pw_%4_%3]
     51    VP9_MULSUB_2W_2X    %1,  %2,  %5, [pw_m%3_%4], [pw_%4_%3]
     52    packssdw           m%1, m%7
     53    packssdw           m%2, m%6
     54 %endmacro
     55 
     56 %macro VP9_UNPACK_MULSUB_2W_4X 7-9 ; dst1, dst2, (src1, src2,) coef1, coef2, rnd, tmp1, tmp2
     57 %if %0 == 7
     58    punpckhwd          m%6, m%2, m%1
     59    punpcklwd          m%2, m%1
     60    VP9_MULSUB_2W_4X   %1, %2, %3, %4, %5, %6, %7
     61 %else
     62    punpckhwd          m%8, m%4, m%3
     63    punpcklwd          m%2, m%4, m%3
     64    VP9_MULSUB_2W_4X   %1, %2, %5, %6, %7, %8, %9
     65 %endif
     66 %endmacro
     67 
     68 %macro VP9_IDCT4_1D_FINALIZE 0
     69    SUMSUB_BA            w, 3, 2, 4                         ; m3=t3+t0, m2=-t3+t0
     70    SUMSUB_BA            w, 1, 0, 4                         ; m1=t2+t1, m0=-t2+t1
     71    SWAP                 0, 3, 2                            ; 3102 -> 0123
     72 %endmacro
     73 
     74 %macro VP9_IDCT4_1D 0
     75 %if cpuflag(ssse3)
     76    SUMSUB_BA            w, 2, 0, 4                         ; m2=IN(0)+IN(2) m0=IN(0)-IN(2)
     77    pmulhrsw            m2, m6                              ; m2=t0
     78    pmulhrsw            m0, m6                              ; m0=t1
     79 %else ; <= sse2
     80    VP9_UNPACK_MULSUB_2W_4X 0, 2, 11585, 11585, m7, 4, 5    ; m0=t1, m1=t0
     81 %endif
     82    VP9_UNPACK_MULSUB_2W_4X 1, 3, 15137, 6270, m7, 4, 5     ; m1=t2, m3=t3
     83    VP9_IDCT4_1D_FINALIZE
     84 %endmacro
     85 
     86 %macro VP9_IADST4_1D 0
     87    movq2dq           xmm0, m0
     88    movq2dq           xmm1, m1
     89    movq2dq           xmm2, m2
     90    movq2dq           xmm3, m3
     91 %if cpuflag(ssse3)
     92    paddw               m3, m0
     93 %endif
     94    punpcklwd         xmm0, xmm1
     95    punpcklwd         xmm2, xmm3
     96    pmaddwd           xmm1, xmm0, [pw_5283_13377]
     97    pmaddwd           xmm4, xmm0, [pw_9929_13377]
     98 %if notcpuflag(ssse3)
     99    pmaddwd           xmm6, xmm0, [pw_13377_0]
    100 %endif
    101    pmaddwd           xmm0, [pw_15212_m13377]
    102    pmaddwd           xmm3, xmm2, [pw_15212_9929]
    103 %if notcpuflag(ssse3)
    104    pmaddwd           xmm7, xmm2, [pw_m13377_13377]
    105 %endif
    106    pmaddwd           xmm2, [pw_m5283_m15212]
    107 %if cpuflag(ssse3)
    108    psubw               m3, m2
    109 %else
    110    paddd             xmm6, xmm7
    111 %endif
    112    paddd             xmm0, xmm2
    113    paddd             xmm3, xmm5
    114    paddd             xmm2, xmm5
    115 %if notcpuflag(ssse3)
    116    paddd             xmm6, xmm5
    117 %endif
    118    paddd             xmm1, xmm3
    119    paddd             xmm0, xmm3
    120    paddd             xmm4, xmm2
    121    psrad             xmm1, 14
    122    psrad             xmm0, 14
    123    psrad             xmm4, 14
    124 %if cpuflag(ssse3)
    125    pmulhrsw            m3, [pw_13377x2]        ; out2
    126 %else
    127    psrad             xmm6, 14
    128 %endif
    129    packssdw          xmm0, xmm0
    130    packssdw          xmm1, xmm1
    131    packssdw          xmm4, xmm4
    132 %if notcpuflag(ssse3)
    133    packssdw          xmm6, xmm6
    134 %endif
    135    movdq2q             m0, xmm0                ; out3
    136    movdq2q             m1, xmm1                ; out0
    137    movdq2q             m2, xmm4                ; out1
    138 %if notcpuflag(ssse3)
    139    movdq2q             m3, xmm6                ; out2
    140 %endif
    141    SWAP                 0, 1, 2, 3
    142 %endmacro