]> granicus.if.org Git - libvpx/blob - vpx_dsp/x86/avg_ssse3_x86_64.asm
Merge "Remove neon assembly for idct 16x16 and 8x8"
[libvpx] / vpx_dsp / x86 / avg_ssse3_x86_64.asm
1 ;
2 ;  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
3 ;
4 ;  Use of this source code is governed by a BSD-style license
5 ;  that can be found in the LICENSE file in the root of the source
6 ;  tree. An additional intellectual property rights grant can be found
7 ;  in the file PATENTS.  All contributing project authors may
8 ;  be found in the AUTHORS file in the root of the source tree.
9 ;
10
11 %include "third_party/x86inc/x86inc.asm"
12
13 SECTION .text
14
15 %if ARCH_X86_64
16 ; matrix transpose
17 %macro TRANSPOSE8X8 10
18   ; stage 1
19   punpcklwd  m%9, m%1, m%2
20   punpcklwd  m%10, m%3, m%4
21   punpckhwd  m%1, m%2
22   punpckhwd  m%3, m%4
23
24   punpcklwd  m%2, m%5, m%6
25   punpcklwd  m%4, m%7, m%8
26   punpckhwd  m%5, m%6
27   punpckhwd  m%7, m%8
28
29   ; stage 2
30   punpckldq  m%6, m%9, m%10
31   punpckldq  m%8, m%1, m%3
32   punpckhdq  m%9, m%10
33   punpckhdq  m%1, m%3
34
35   punpckldq  m%10, m%2, m%4
36   punpckldq  m%3, m%5, m%7
37   punpckhdq  m%2, m%4
38   punpckhdq  m%5, m%7
39
40   ; stage 3
41   punpckhqdq  m%4, m%9, m%2  ; out3
42   punpcklqdq  m%9, m%2       ; out2
43   punpcklqdq  m%7, m%1, m%5  ; out6
44   punpckhqdq  m%1, m%5       ; out7
45
46   punpckhqdq  m%2, m%6, m%10 ; out1
47   punpcklqdq  m%6, m%10      ; out0
48   punpcklqdq  m%5, m%8, m%3  ; out4
49   punpckhqdq  m%8, m%3       ; out5
50
51   SWAP %6, %1
52   SWAP %3, %9
53   SWAP %8, %6
54 %endmacro
55
56 %macro HMD8_1D 0
57   psubw              m8, m0, m1
58   psubw              m9, m2, m3
59   paddw              m0, m1
60   paddw              m2, m3
61   SWAP               1, 8
62   SWAP               3, 9
63   psubw              m8, m4, m5
64   psubw              m9, m6, m7
65   paddw              m4, m5
66   paddw              m6, m7
67   SWAP               5, 8
68   SWAP               7, 9
69
70   psubw              m8, m0, m2
71   psubw              m9, m1, m3
72   paddw              m0, m2
73   paddw              m1, m3
74   SWAP               2, 8
75   SWAP               3, 9
76   psubw              m8, m4, m6
77   psubw              m9, m5, m7
78   paddw              m4, m6
79   paddw              m5, m7
80   SWAP               6, 8
81   SWAP               7, 9
82
83   psubw              m8, m0, m4
84   psubw              m9, m1, m5
85   paddw              m0, m4
86   paddw              m1, m5
87   SWAP               4, 8
88   SWAP               5, 9
89   psubw              m8, m2, m6
90   psubw              m9, m3, m7
91   paddw              m2, m6
92   paddw              m3, m7
93   SWAP               6, 8
94   SWAP               7, 9
95 %endmacro
96
97 %if CONFIG_VP9_HIGHBITDEPTH
98 ; store %1 to outputq + %2
99 ; uses m8-m10 as scratch registers
100 %macro STORE_TRAN_LOW 2
101   pxor                           m8, m8
102   mova                           m9, m%1
103   mova                          m10, m%1
104   pcmpgtw                        m8, m%1
105   punpcklwd                      m9, m8
106   punpckhwd                     m10, m8
107   mova               [outputq + %2], m9
108   mova          [outputq + %2 + 16], m10
109 %endmacro
110 %endif
111
112 INIT_XMM ssse3
113 cglobal hadamard_8x8, 3, 5, 11, input, stride, output
114   lea                r3, [2 * strideq]
115   lea                r4, [4 * strideq]
116
117   mova               m0, [inputq]
118   mova               m1, [inputq + r3]
119   lea                inputq, [inputq + r4]
120   mova               m2, [inputq]
121   mova               m3, [inputq + r3]
122   lea                inputq, [inputq + r4]
123   mova               m4, [inputq]
124   mova               m5, [inputq + r3]
125   lea                inputq, [inputq + r4]
126   mova               m6, [inputq]
127   mova               m7, [inputq + r3]
128
129   HMD8_1D
130   TRANSPOSE8X8 0, 1, 2, 3, 4, 5, 6, 7, 9, 10
131   HMD8_1D
132
133 %if CONFIG_VP9_HIGHBITDEPTH
134   STORE_TRAN_LOW                  0, 0
135   STORE_TRAN_LOW                  1, 32
136   STORE_TRAN_LOW                  2, 64
137   STORE_TRAN_LOW                  3, 96
138   STORE_TRAN_LOW                  4, 128
139   STORE_TRAN_LOW                  5, 160
140   STORE_TRAN_LOW                  6, 192
141   STORE_TRAN_LOW                  7, 224
142 %else
143   mova              [outputq +   0], m0
144   mova              [outputq +  16], m1
145   mova              [outputq +  32], m2
146   mova              [outputq +  48], m3
147   mova              [outputq +  64], m4
148   mova              [outputq +  80], m5
149   mova              [outputq +  96], m6
150   mova              [outputq + 112], m7
151 %endif
152
153   RET
154 %endif