/src/aom/aom_dsp/x86/highbd_convolve_sse2.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2018, Alliance for Open Media. All rights reserved. |
3 | | * |
4 | | * This source code is subject to the terms of the BSD 2 Clause License and |
5 | | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
6 | | * was not distributed with this source code in the LICENSE file, you can |
7 | | * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
8 | | * Media Patent License 1.0 was not distributed with this source code in the |
9 | | * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
10 | | */ |
11 | | #include <emmintrin.h> |
12 | | |
13 | | #include "config/aom_config.h" |
14 | | #include "config/aom_dsp_rtcd.h" |
15 | | #include "aom_dsp/x86/convolve.h" |
16 | | |
17 | | // ----------------------------------------------------------------------------- |
18 | | |
19 | | #if HAVE_X86_ASM |
20 | | static void aom_highbd_filter_block1d4_v4_sse2( |
21 | | const uint16_t *src_ptr, ptrdiff_t src_pitch, uint16_t *dst_ptr, |
22 | 0 | ptrdiff_t dst_pitch, uint32_t height, const int16_t *filter, int bd) { |
23 | 0 | __m128i filtersReg; |
24 | 0 | __m128i srcReg2, srcReg3, srcReg4, srcReg5, srcReg6; |
25 | 0 | __m128i srcReg23_lo, srcReg34_lo; |
26 | 0 | __m128i srcReg45_lo, srcReg56_lo; |
27 | 0 | __m128i resReg23_lo, resReg34_lo, resReg45_lo, resReg56_lo; |
28 | 0 | __m128i resReg23_45_lo, resReg34_56_lo; |
29 | 0 | __m128i resReg23_45, resReg34_56; |
30 | 0 | __m128i addFilterReg64, secondFilters, thirdFilters; |
31 | 0 | unsigned int i; |
32 | 0 | ptrdiff_t src_stride, dst_stride; |
33 | |
|
34 | 0 | const __m128i max = _mm_set1_epi16((1 << bd) - 1); |
35 | 0 | addFilterReg64 = _mm_set1_epi32(64); |
36 | 0 | filtersReg = _mm_loadu_si128((const __m128i *)filter); |
37 | | |
38 | | // coeffs 0 1 0 1 2 3 2 3 |
39 | 0 | const __m128i tmp0 = _mm_unpacklo_epi32(filtersReg, filtersReg); |
40 | | // coeffs 4 5 4 5 6 7 6 7 |
41 | 0 | const __m128i tmp1 = _mm_unpackhi_epi32(filtersReg, filtersReg); |
42 | |
|
43 | 0 | secondFilters = _mm_unpackhi_epi64(tmp0, tmp0); // coeffs 2 3 2 3 2 3 2 3 |
44 | 0 | thirdFilters = _mm_unpacklo_epi64(tmp1, tmp1); // coeffs 4 5 4 5 4 5 4 5 |
45 | | |
46 | | // multiply the size of the source and destination stride by two |
47 | 0 | src_stride = src_pitch << 1; |
48 | 0 | dst_stride = dst_pitch << 1; |
49 | |
|
50 | 0 | srcReg2 = _mm_loadl_epi64((const __m128i *)(src_ptr + src_pitch * 2)); |
51 | 0 | srcReg3 = _mm_loadl_epi64((const __m128i *)(src_ptr + src_pitch * 3)); |
52 | 0 | srcReg23_lo = _mm_unpacklo_epi16(srcReg2, srcReg3); |
53 | |
|
54 | 0 | srcReg4 = _mm_loadl_epi64((const __m128i *)(src_ptr + src_pitch * 4)); |
55 | 0 | srcReg34_lo = _mm_unpacklo_epi16(srcReg3, srcReg4); |
56 | |
|
57 | 0 | for (i = height; i > 1; i -= 2) { |
58 | 0 | srcReg5 = _mm_loadl_epi64((const __m128i *)(src_ptr + src_pitch * 5)); |
59 | 0 | srcReg45_lo = _mm_unpacklo_epi16(srcReg4, srcReg5); |
60 | |
|
61 | 0 | srcReg6 = _mm_loadl_epi64((const __m128i *)(src_ptr + src_pitch * 6)); |
62 | 0 | srcReg56_lo = _mm_unpacklo_epi16(srcReg5, srcReg6); |
63 | | |
64 | | // multiply 2 adjacent elements with the filter and add the result |
65 | |
|
66 | 0 | resReg23_lo = _mm_madd_epi16(srcReg23_lo, secondFilters); |
67 | 0 | resReg34_lo = _mm_madd_epi16(srcReg34_lo, secondFilters); |
68 | 0 | resReg45_lo = _mm_madd_epi16(srcReg45_lo, thirdFilters); |
69 | 0 | resReg56_lo = _mm_madd_epi16(srcReg56_lo, thirdFilters); |
70 | |
|
71 | 0 | resReg23_45_lo = _mm_add_epi32(resReg23_lo, resReg45_lo); |
72 | 0 | resReg34_56_lo = _mm_add_epi32(resReg34_lo, resReg56_lo); |
73 | | |
74 | | // shift by 7 bit each 32 bit |
75 | 0 | resReg23_45_lo = _mm_add_epi32(resReg23_45_lo, addFilterReg64); |
76 | 0 | resReg34_56_lo = _mm_add_epi32(resReg34_56_lo, addFilterReg64); |
77 | 0 | resReg23_45_lo = _mm_srai_epi32(resReg23_45_lo, 7); |
78 | 0 | resReg34_56_lo = _mm_srai_epi32(resReg34_56_lo, 7); |
79 | | |
80 | | // shrink to 16 bit each 32 bits, the first lane contain the first |
81 | | // convolve result and the second lane contain the second convolve |
82 | | // result |
83 | 0 | resReg23_45 = _mm_packs_epi32(resReg23_45_lo, _mm_setzero_si128()); |
84 | 0 | resReg34_56 = _mm_packs_epi32(resReg34_56_lo, _mm_setzero_si128()); |
85 | |
|
86 | 0 | resReg23_45 = _mm_max_epi16(resReg23_45, _mm_setzero_si128()); |
87 | 0 | resReg23_45 = _mm_min_epi16(resReg23_45, max); |
88 | 0 | resReg34_56 = _mm_max_epi16(resReg34_56, _mm_setzero_si128()); |
89 | 0 | resReg34_56 = _mm_min_epi16(resReg34_56, max); |
90 | |
|
91 | 0 | src_ptr += src_stride; |
92 | |
|
93 | 0 | _mm_storel_epi64((__m128i *)dst_ptr, (resReg23_45)); |
94 | 0 | _mm_storel_epi64((__m128i *)(dst_ptr + dst_pitch), (resReg34_56)); |
95 | |
|
96 | 0 | dst_ptr += dst_stride; |
97 | | |
98 | | // save part of the registers for next strides |
99 | 0 | srcReg23_lo = srcReg45_lo; |
100 | 0 | srcReg34_lo = srcReg56_lo; |
101 | 0 | srcReg4 = srcReg6; |
102 | 0 | } |
103 | 0 | } |
104 | | |
105 | | static void aom_highbd_filter_block1d4_h4_sse2( |
106 | | const uint16_t *src_ptr, ptrdiff_t src_pitch, uint16_t *dst_ptr, |
107 | 0 | ptrdiff_t dst_pitch, uint32_t height, const int16_t *filter, int bd) { |
108 | 0 | __m128i filtersReg; |
109 | 0 | __m128i addFilterReg64; |
110 | 0 | __m128i secondFilters, thirdFilters; |
111 | 0 | __m128i srcRegFilt32b1_1; |
112 | 0 | __m128i srcReg32b1; |
113 | 0 | unsigned int i; |
114 | 0 | src_ptr -= 3; |
115 | 0 | addFilterReg64 = _mm_set1_epi32(64); |
116 | 0 | filtersReg = _mm_loadu_si128((const __m128i *)filter); |
117 | 0 | const __m128i max = _mm_set1_epi16((1 << bd) - 1); |
118 | | |
119 | | // coeffs 0 1 0 1 2 3 2 3 |
120 | 0 | const __m128i tmp_0 = _mm_unpacklo_epi32(filtersReg, filtersReg); |
121 | | // coeffs 4 5 4 5 6 7 6 7 |
122 | 0 | const __m128i tmp_1 = _mm_unpackhi_epi32(filtersReg, filtersReg); |
123 | |
|
124 | 0 | secondFilters = _mm_unpackhi_epi64(tmp_0, tmp_0); // coeffs 2 3 2 3 2 3 2 3 |
125 | 0 | thirdFilters = _mm_unpacklo_epi64(tmp_1, tmp_1); // coeffs 4 5 4 5 4 5 4 5 |
126 | |
|
127 | 0 | for (i = height; i > 0; i -= 1) { |
128 | 0 | srcReg32b1 = _mm_loadu_si128((const __m128i *)(src_ptr + 2)); |
129 | |
|
130 | 0 | __m128i ss_3_1 = _mm_srli_si128(srcReg32b1, 2); |
131 | 0 | __m128i ss_4_1 = _mm_srli_si128(srcReg32b1, 4); |
132 | 0 | __m128i ss_5_1 = _mm_srli_si128(srcReg32b1, 6); |
133 | 0 | __m128i ss_23 = _mm_unpacklo_epi32(srcReg32b1, ss_3_1); |
134 | 0 | __m128i ss_45 = _mm_unpacklo_epi32(ss_4_1, ss_5_1); |
135 | |
|
136 | 0 | ss_23 = _mm_madd_epi16(ss_23, secondFilters); |
137 | 0 | ss_45 = _mm_madd_epi16(ss_45, thirdFilters); |
138 | 0 | srcRegFilt32b1_1 = _mm_add_epi32(ss_23, ss_45); |
139 | | |
140 | | // shift by 7 bit each 32 bit |
141 | 0 | srcRegFilt32b1_1 = _mm_add_epi32(srcRegFilt32b1_1, addFilterReg64); |
142 | 0 | srcRegFilt32b1_1 = _mm_srai_epi32(srcRegFilt32b1_1, 7); |
143 | |
|
144 | 0 | srcRegFilt32b1_1 = _mm_packs_epi32(srcRegFilt32b1_1, _mm_setzero_si128()); |
145 | 0 | srcRegFilt32b1_1 = _mm_max_epi16(srcRegFilt32b1_1, _mm_setzero_si128()); |
146 | 0 | srcRegFilt32b1_1 = _mm_min_epi16(srcRegFilt32b1_1, max); |
147 | |
|
148 | 0 | src_ptr += src_pitch; |
149 | |
|
150 | 0 | _mm_storel_epi64((__m128i *)dst_ptr, srcRegFilt32b1_1); |
151 | |
|
152 | 0 | dst_ptr += dst_pitch; |
153 | 0 | } |
154 | 0 | } |
155 | | |
156 | | static void aom_highbd_filter_block1d8_v4_sse2( |
157 | | const uint16_t *src_ptr, ptrdiff_t src_pitch, uint16_t *dst_ptr, |
158 | 0 | ptrdiff_t dst_pitch, uint32_t height, const int16_t *filter, int bd) { |
159 | 0 | __m128i filtersReg; |
160 | 0 | __m128i srcReg2, srcReg3, srcReg4, srcReg5, srcReg6; |
161 | 0 | __m128i srcReg23_lo, srcReg23_hi, srcReg34_lo, srcReg34_hi; |
162 | 0 | __m128i srcReg45_lo, srcReg45_hi, srcReg56_lo, srcReg56_hi; |
163 | 0 | __m128i resReg23_lo, resReg34_lo, resReg45_lo, resReg56_lo; |
164 | 0 | __m128i resReg23_hi, resReg34_hi, resReg45_hi, resReg56_hi; |
165 | 0 | __m128i resReg23_45_lo, resReg34_56_lo, resReg23_45_hi, resReg34_56_hi; |
166 | 0 | __m128i resReg23_45, resReg34_56; |
167 | 0 | __m128i addFilterReg64, secondFilters, thirdFilters; |
168 | 0 | unsigned int i; |
169 | 0 | ptrdiff_t src_stride, dst_stride; |
170 | |
|
171 | 0 | const __m128i max = _mm_set1_epi16((1 << bd) - 1); |
172 | 0 | addFilterReg64 = _mm_set1_epi32(64); |
173 | 0 | filtersReg = _mm_loadu_si128((const __m128i *)filter); |
174 | | |
175 | | // coeffs 0 1 0 1 2 3 2 3 |
176 | 0 | const __m128i tmp0 = _mm_unpacklo_epi32(filtersReg, filtersReg); |
177 | | // coeffs 4 5 4 5 6 7 6 7 |
178 | 0 | const __m128i tmp1 = _mm_unpackhi_epi32(filtersReg, filtersReg); |
179 | |
|
180 | 0 | secondFilters = _mm_unpackhi_epi64(tmp0, tmp0); // coeffs 2 3 2 3 2 3 2 3 |
181 | 0 | thirdFilters = _mm_unpacklo_epi64(tmp1, tmp1); // coeffs 4 5 4 5 4 5 4 5 |
182 | | |
183 | | // multiple the size of the source and destination stride by two |
184 | 0 | src_stride = src_pitch << 1; |
185 | 0 | dst_stride = dst_pitch << 1; |
186 | |
|
187 | 0 | srcReg2 = _mm_loadu_si128((const __m128i *)(src_ptr + src_pitch * 2)); |
188 | 0 | srcReg3 = _mm_loadu_si128((const __m128i *)(src_ptr + src_pitch * 3)); |
189 | 0 | srcReg23_lo = _mm_unpacklo_epi16(srcReg2, srcReg3); |
190 | 0 | srcReg23_hi = _mm_unpackhi_epi16(srcReg2, srcReg3); |
191 | |
|
192 | 0 | srcReg4 = _mm_loadu_si128((const __m128i *)(src_ptr + src_pitch * 4)); |
193 | 0 | srcReg34_lo = _mm_unpacklo_epi16(srcReg3, srcReg4); |
194 | 0 | srcReg34_hi = _mm_unpackhi_epi16(srcReg3, srcReg4); |
195 | |
|
196 | 0 | for (i = height; i > 1; i -= 2) { |
197 | 0 | srcReg5 = _mm_loadu_si128((const __m128i *)(src_ptr + src_pitch * 5)); |
198 | |
|
199 | 0 | srcReg45_lo = _mm_unpacklo_epi16(srcReg4, srcReg5); |
200 | 0 | srcReg45_hi = _mm_unpackhi_epi16(srcReg4, srcReg5); |
201 | |
|
202 | 0 | srcReg6 = _mm_loadu_si128((const __m128i *)(src_ptr + src_pitch * 6)); |
203 | |
|
204 | 0 | srcReg56_lo = _mm_unpacklo_epi16(srcReg5, srcReg6); |
205 | 0 | srcReg56_hi = _mm_unpackhi_epi16(srcReg5, srcReg6); |
206 | | |
207 | | // multiply 2 adjacent elements with the filter and add the result |
208 | |
|
209 | 0 | resReg23_lo = _mm_madd_epi16(srcReg23_lo, secondFilters); |
210 | 0 | resReg34_lo = _mm_madd_epi16(srcReg34_lo, secondFilters); |
211 | 0 | resReg45_lo = _mm_madd_epi16(srcReg45_lo, thirdFilters); |
212 | 0 | resReg56_lo = _mm_madd_epi16(srcReg56_lo, thirdFilters); |
213 | |
|
214 | 0 | resReg23_45_lo = _mm_add_epi32(resReg23_lo, resReg45_lo); |
215 | 0 | resReg34_56_lo = _mm_add_epi32(resReg34_lo, resReg56_lo); |
216 | | |
217 | | // multiply 2 adjacent elements with the filter and add the result |
218 | |
|
219 | 0 | resReg23_hi = _mm_madd_epi16(srcReg23_hi, secondFilters); |
220 | 0 | resReg34_hi = _mm_madd_epi16(srcReg34_hi, secondFilters); |
221 | 0 | resReg45_hi = _mm_madd_epi16(srcReg45_hi, thirdFilters); |
222 | 0 | resReg56_hi = _mm_madd_epi16(srcReg56_hi, thirdFilters); |
223 | |
|
224 | 0 | resReg23_45_hi = _mm_add_epi32(resReg23_hi, resReg45_hi); |
225 | 0 | resReg34_56_hi = _mm_add_epi32(resReg34_hi, resReg56_hi); |
226 | | |
227 | | // shift by 7 bit each 32 bit |
228 | 0 | resReg23_45_lo = _mm_add_epi32(resReg23_45_lo, addFilterReg64); |
229 | 0 | resReg34_56_lo = _mm_add_epi32(resReg34_56_lo, addFilterReg64); |
230 | 0 | resReg23_45_hi = _mm_add_epi32(resReg23_45_hi, addFilterReg64); |
231 | 0 | resReg34_56_hi = _mm_add_epi32(resReg34_56_hi, addFilterReg64); |
232 | 0 | resReg23_45_lo = _mm_srai_epi32(resReg23_45_lo, 7); |
233 | 0 | resReg34_56_lo = _mm_srai_epi32(resReg34_56_lo, 7); |
234 | 0 | resReg23_45_hi = _mm_srai_epi32(resReg23_45_hi, 7); |
235 | 0 | resReg34_56_hi = _mm_srai_epi32(resReg34_56_hi, 7); |
236 | | |
237 | | // shrink to 16 bit each 32 bits, the first lane contain the first |
238 | | // convolve result and the second lane contain the second convolve |
239 | | // result |
240 | 0 | resReg23_45 = _mm_packs_epi32(resReg23_45_lo, resReg23_45_hi); |
241 | 0 | resReg34_56 = _mm_packs_epi32(resReg34_56_lo, resReg34_56_hi); |
242 | |
|
243 | 0 | resReg23_45 = _mm_max_epi16(resReg23_45, _mm_setzero_si128()); |
244 | 0 | resReg23_45 = _mm_min_epi16(resReg23_45, max); |
245 | 0 | resReg34_56 = _mm_max_epi16(resReg34_56, _mm_setzero_si128()); |
246 | 0 | resReg34_56 = _mm_min_epi16(resReg34_56, max); |
247 | |
|
248 | 0 | src_ptr += src_stride; |
249 | |
|
250 | 0 | _mm_store_si128((__m128i *)dst_ptr, (resReg23_45)); |
251 | 0 | _mm_store_si128((__m128i *)(dst_ptr + dst_pitch), (resReg34_56)); |
252 | |
|
253 | 0 | dst_ptr += dst_stride; |
254 | | |
255 | | // save part of the registers for next strides |
256 | 0 | srcReg23_lo = srcReg45_lo; |
257 | 0 | srcReg23_hi = srcReg45_hi; |
258 | 0 | srcReg34_lo = srcReg56_lo; |
259 | 0 | srcReg34_hi = srcReg56_hi; |
260 | 0 | srcReg4 = srcReg6; |
261 | 0 | } |
262 | 0 | } |
263 | | |
264 | | static void aom_highbd_filter_block1d8_h4_sse2( |
265 | | const uint16_t *src_ptr, ptrdiff_t src_pitch, uint16_t *dst_ptr, |
266 | 0 | ptrdiff_t dst_pitch, uint32_t height, const int16_t *filter, int bd) { |
267 | 0 | __m128i filtersReg; |
268 | 0 | __m128i addFilterReg64; |
269 | 0 | __m128i secondFilters, thirdFilters; |
270 | 0 | __m128i srcRegFilt32b1_1, srcRegFilt32b1_2; |
271 | 0 | __m128i srcReg32b1, srcReg32b2; |
272 | 0 | unsigned int i; |
273 | 0 | src_ptr -= 3; |
274 | 0 | addFilterReg64 = _mm_set1_epi32(64); |
275 | 0 | filtersReg = _mm_loadu_si128((const __m128i *)filter); |
276 | 0 | const __m128i max = _mm_set1_epi16((1 << bd) - 1); |
277 | | |
278 | | // coeffs 0 1 0 1 2 3 2 3 |
279 | 0 | const __m128i tmp_0 = _mm_unpacklo_epi32(filtersReg, filtersReg); |
280 | | // coeffs 4 5 4 5 6 7 6 7 |
281 | 0 | const __m128i tmp_1 = _mm_unpackhi_epi32(filtersReg, filtersReg); |
282 | |
|
283 | 0 | secondFilters = _mm_unpackhi_epi64(tmp_0, tmp_0); // coeffs 2 3 2 3 2 3 2 3 |
284 | 0 | thirdFilters = _mm_unpacklo_epi64(tmp_1, tmp_1); // coeffs 4 5 4 5 4 5 4 5 |
285 | |
|
286 | 0 | for (i = height; i > 0; i -= 1) { |
287 | 0 | srcReg32b1 = _mm_loadu_si128((const __m128i *)(src_ptr + 2)); |
288 | 0 | srcReg32b2 = _mm_loadu_si128((const __m128i *)(src_ptr + 6)); |
289 | |
|
290 | 0 | __m128i ss_4_1 = _mm_srli_si128(srcReg32b1, 4); |
291 | 0 | __m128i ss_4_2 = _mm_srli_si128(srcReg32b2, 4); |
292 | 0 | __m128i ss_4 = _mm_unpacklo_epi64(ss_4_1, ss_4_2); |
293 | |
|
294 | 0 | __m128i d1 = _mm_madd_epi16(srcReg32b1, secondFilters); |
295 | 0 | __m128i d2 = _mm_madd_epi16(ss_4, thirdFilters); |
296 | 0 | srcRegFilt32b1_1 = _mm_add_epi32(d1, d2); |
297 | |
|
298 | 0 | __m128i ss_3_1 = _mm_srli_si128(srcReg32b1, 2); |
299 | 0 | __m128i ss_5_1 = _mm_srli_si128(srcReg32b1, 6); |
300 | 0 | __m128i ss_3_2 = _mm_srli_si128(srcReg32b2, 2); |
301 | 0 | __m128i ss_5_2 = _mm_srli_si128(srcReg32b2, 6); |
302 | 0 | __m128i ss_3 = _mm_unpacklo_epi64(ss_3_1, ss_3_2); |
303 | 0 | __m128i ss_5 = _mm_unpacklo_epi64(ss_5_1, ss_5_2); |
304 | |
|
305 | 0 | d1 = _mm_madd_epi16(ss_3, secondFilters); |
306 | 0 | d2 = _mm_madd_epi16(ss_5, thirdFilters); |
307 | 0 | srcRegFilt32b1_2 = _mm_add_epi32(d1, d2); |
308 | |
|
309 | 0 | __m128i res_lo_1 = _mm_unpacklo_epi32(srcRegFilt32b1_1, srcRegFilt32b1_2); |
310 | 0 | __m128i res_hi_1 = _mm_unpackhi_epi32(srcRegFilt32b1_1, srcRegFilt32b1_2); |
311 | | |
312 | | // shift by 7 bit each 32 bit |
313 | 0 | res_lo_1 = _mm_add_epi32(res_lo_1, addFilterReg64); |
314 | 0 | res_hi_1 = _mm_add_epi32(res_hi_1, addFilterReg64); |
315 | 0 | res_lo_1 = _mm_srai_epi32(res_lo_1, 7); |
316 | 0 | res_hi_1 = _mm_srai_epi32(res_hi_1, 7); |
317 | |
|
318 | 0 | srcRegFilt32b1_1 = _mm_packs_epi32(res_lo_1, res_hi_1); |
319 | |
|
320 | 0 | srcRegFilt32b1_1 = _mm_max_epi16(srcRegFilt32b1_1, _mm_setzero_si128()); |
321 | 0 | srcRegFilt32b1_1 = _mm_min_epi16(srcRegFilt32b1_1, max); |
322 | |
|
323 | 0 | src_ptr += src_pitch; |
324 | |
|
325 | 0 | _mm_store_si128((__m128i *)dst_ptr, srcRegFilt32b1_1); |
326 | |
|
327 | 0 | dst_ptr += dst_pitch; |
328 | 0 | } |
329 | 0 | } |
330 | | |
331 | | static void aom_highbd_filter_block1d16_v4_sse2( |
332 | | const uint16_t *src_ptr, ptrdiff_t src_pitch, uint16_t *dst_ptr, |
333 | 0 | ptrdiff_t dst_pitch, uint32_t height, const int16_t *filter, int bd) { |
334 | 0 | aom_highbd_filter_block1d8_v4_sse2(src_ptr, src_pitch, dst_ptr, dst_pitch, |
335 | 0 | height, filter, bd); |
336 | 0 | aom_highbd_filter_block1d8_v4_sse2((src_ptr + 8), src_pitch, (dst_ptr + 8), |
337 | 0 | dst_pitch, height, filter, bd); |
338 | 0 | } |
339 | | |
340 | | static void aom_highbd_filter_block1d16_h4_sse2( |
341 | | const uint16_t *src_ptr, ptrdiff_t src_pitch, uint16_t *dst_ptr, |
342 | 0 | ptrdiff_t dst_pitch, uint32_t height, const int16_t *filter, int bd) { |
343 | 0 | aom_highbd_filter_block1d8_h4_sse2(src_ptr, src_pitch, dst_ptr, dst_pitch, |
344 | 0 | height, filter, bd); |
345 | 0 | aom_highbd_filter_block1d8_h4_sse2((src_ptr + 8), src_pitch, (dst_ptr + 8), |
346 | 0 | dst_pitch, height, filter, bd); |
347 | 0 | } |
348 | | |
349 | | // From aom_dsp/x86/aom_high_subpixel_8t_sse2.asm |
350 | | highbd_filter8_1dfunction aom_highbd_filter_block1d16_v8_sse2; |
351 | | highbd_filter8_1dfunction aom_highbd_filter_block1d16_h8_sse2; |
352 | | highbd_filter8_1dfunction aom_highbd_filter_block1d8_v8_sse2; |
353 | | highbd_filter8_1dfunction aom_highbd_filter_block1d8_h8_sse2; |
354 | | highbd_filter8_1dfunction aom_highbd_filter_block1d4_v8_sse2; |
355 | | highbd_filter8_1dfunction aom_highbd_filter_block1d4_h8_sse2; |
356 | | |
357 | | // From aom_dsp/x86/aom_high_subpixel_bilinear_sse2.asm |
358 | | highbd_filter8_1dfunction aom_highbd_filter_block1d16_v2_sse2; |
359 | | highbd_filter8_1dfunction aom_highbd_filter_block1d16_h2_sse2; |
360 | | highbd_filter8_1dfunction aom_highbd_filter_block1d8_v2_sse2; |
361 | | highbd_filter8_1dfunction aom_highbd_filter_block1d8_h2_sse2; |
362 | | highbd_filter8_1dfunction aom_highbd_filter_block1d4_v2_sse2; |
363 | | highbd_filter8_1dfunction aom_highbd_filter_block1d4_h2_sse2; |
364 | | |
365 | | // void aom_highbd_convolve8_horiz_sse2(const uint8_t *src, |
366 | | // ptrdiff_t src_stride, |
367 | | // uint8_t *dst, |
368 | | // ptrdiff_t dst_stride, |
369 | | // const int16_t *filter_x, |
370 | | // int x_step_q4, |
371 | | // const int16_t *filter_y, |
372 | | // int y_step_q4, |
373 | | // int w, int h, int bd); |
374 | | // void aom_highbd_convolve8_vert_sse2(const uint8_t *src, |
375 | | // ptrdiff_t src_stride, |
376 | | // uint8_t *dst, |
377 | | // ptrdiff_t dst_stride, |
378 | | // const int16_t *filter_x, |
379 | | // int x_step_q4, |
380 | | // const int16_t *filter_y, |
381 | | // int y_step_q4, |
382 | | // int w, int h, int bd); |
383 | | HIGH_FUN_CONV_1D(horiz, x_step_q4, filter_x, h, src, , sse2) |
384 | | HIGH_FUN_CONV_1D(vert, y_step_q4, filter_y, v, src - src_stride * 3, , sse2) |
385 | | #endif // HAVE_X86_ASM |