Coverage Report

Created: 2026-08-14 06:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aom/aom_dsp/x86/intrapred_sse2.c
Line
Count
Source
1
/*
2
 * Copyright (c) 2017, 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
12
#include <emmintrin.h>
13
#include "aom_dsp/x86/intrapred_x86.h"
14
#include "config/aom_dsp_rtcd.h"
15
16
static inline void dc_store_4xh(uint32_t dc, int height, uint8_t *dst,
17
913k
                                ptrdiff_t stride) {
18
7.24M
  for (int i = 0; i < height; i += 2) {
19
6.33M
    *(uint32_t *)dst = dc;
20
6.33M
    dst += stride;
21
6.33M
    *(uint32_t *)dst = dc;
22
6.33M
    dst += stride;
23
6.33M
  }
24
913k
}
25
26
static inline void dc_store_8xh(const __m128i *row, int height, uint8_t *dst,
27
699k
                                ptrdiff_t stride) {
28
699k
  int i;
29
9.14M
  for (i = 0; i < height; ++i) {
30
8.44M
    _mm_storel_epi64((__m128i *)dst, *row);
31
8.44M
    dst += stride;
32
8.44M
  }
33
699k
}
34
35
static inline void dc_store_16xh(const __m128i *row, int height, uint8_t *dst,
36
1.17M
                                 ptrdiff_t stride) {
37
1.17M
  int i;
38
14.9M
  for (i = 0; i < height; ++i) {
39
13.7M
    _mm_store_si128((__m128i *)dst, *row);
40
13.7M
    dst += stride;
41
13.7M
  }
42
1.17M
}
43
44
static inline void dc_store_32xh(const __m128i *row, int height, uint8_t *dst,
45
289k
                                 ptrdiff_t stride) {
46
289k
  int i;
47
2.60M
  for (i = 0; i < height; ++i) {
48
2.31M
    _mm_store_si128((__m128i *)dst, *row);
49
2.31M
    _mm_store_si128((__m128i *)(dst + 16), *row);
50
2.31M
    dst += stride;
51
2.31M
  }
52
289k
}
53
54
static inline void dc_store_64xh(const __m128i *row, int height, uint8_t *dst,
55
0
                                 ptrdiff_t stride) {
56
0
  for (int i = 0; i < height; ++i) {
57
0
    _mm_store_si128((__m128i *)dst, *row);
58
0
    _mm_store_si128((__m128i *)(dst + 16), *row);
59
0
    _mm_store_si128((__m128i *)(dst + 32), *row);
60
0
    _mm_store_si128((__m128i *)(dst + 48), *row);
61
0
    dst += stride;
62
0
  }
63
0
}
64
65
1.75M
static inline __m128i dc_sum_4(const uint8_t *ref) {
66
1.75M
  __m128i x = _mm_loadl_epi64((__m128i const *)ref);
67
1.75M
  const __m128i zero = _mm_setzero_si128();
68
1.75M
  x = _mm_unpacklo_epi8(x, zero);
69
1.75M
  return _mm_sad_epu8(x, zero);
70
1.75M
}
71
72
1.42M
static inline __m128i dc_sum_8(const uint8_t *ref) {
73
1.42M
  __m128i x = _mm_loadl_epi64((__m128i const *)ref);
74
1.42M
  const __m128i zero = _mm_setzero_si128();
75
1.42M
  return _mm_sad_epu8(x, zero);
76
1.42M
}
77
78
21.7k
static inline __m128i dc_sum_64(const uint8_t *ref) {
79
21.7k
  __m128i x0 = _mm_load_si128((__m128i const *)ref);
80
21.7k
  __m128i x1 = _mm_load_si128((__m128i const *)(ref + 16));
81
21.7k
  __m128i x2 = _mm_load_si128((__m128i const *)(ref + 32));
82
21.7k
  __m128i x3 = _mm_load_si128((__m128i const *)(ref + 48));
83
21.7k
  const __m128i zero = _mm_setzero_si128();
84
21.7k
  x0 = _mm_sad_epu8(x0, zero);
85
21.7k
  x1 = _mm_sad_epu8(x1, zero);
86
21.7k
  x2 = _mm_sad_epu8(x2, zero);
87
21.7k
  x3 = _mm_sad_epu8(x3, zero);
88
21.7k
  x0 = _mm_add_epi16(x0, x1);
89
21.7k
  x2 = _mm_add_epi16(x2, x3);
90
21.7k
  x0 = _mm_add_epi16(x0, x2);
91
21.7k
  const __m128i high = _mm_unpackhi_epi64(x0, x0);
92
21.7k
  return _mm_add_epi16(x0, high);
93
21.7k
}
94
95
1.21M
#define DC_MULTIPLIER_1X2 0x5556
96
1.58M
#define DC_MULTIPLIER_1X4 0x3334
97
98
2.80M
#define DC_SHIFT2 16
99
100
static inline int divide_using_multiply_shift(int num, int shift1,
101
2.80M
                                              int multiplier) {
102
2.80M
  const int interm = num >> shift1;
103
2.80M
  return interm * multiplier >> DC_SHIFT2;
104
2.80M
}
105
106
// -----------------------------------------------------------------------------
107
// DC_PRED
108
109
void aom_dc_predictor_4x8_sse2(uint8_t *dst, ptrdiff_t stride,
110
208k
                               const uint8_t *above, const uint8_t *left) {
111
208k
  const __m128i sum_left = dc_sum_8(left);
112
208k
  __m128i sum_above = dc_sum_4(above);
113
208k
  sum_above = _mm_add_epi16(sum_left, sum_above);
114
115
208k
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
116
208k
  sum += 6;
117
208k
  sum = divide_using_multiply_shift(sum, 2, DC_MULTIPLIER_1X2);
118
119
208k
  const __m128i row = _mm_set1_epi8((int8_t)sum);
120
208k
  const uint32_t pred = (uint32_t)_mm_cvtsi128_si32(row);
121
208k
  dc_store_4xh(pred, 8, dst, stride);
122
208k
}
123
124
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
125
void aom_dc_predictor_4x16_sse2(uint8_t *dst, ptrdiff_t stride,
126
652k
                                const uint8_t *above, const uint8_t *left) {
127
652k
  const __m128i sum_left = dc_sum_16_sse2(left);
128
652k
  __m128i sum_above = dc_sum_4(above);
129
652k
  sum_above = _mm_add_epi16(sum_left, sum_above);
130
131
652k
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
132
652k
  sum += 10;
133
652k
  sum = divide_using_multiply_shift(sum, 2, DC_MULTIPLIER_1X4);
134
135
652k
  const __m128i row = _mm_set1_epi8((int8_t)sum);
136
652k
  const uint32_t pred = (uint32_t)_mm_cvtsi128_si32(row);
137
652k
  dc_store_4xh(pred, 16, dst, stride);
138
652k
}
139
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
140
141
void aom_dc_predictor_8x4_sse2(uint8_t *dst, ptrdiff_t stride,
142
337k
                               const uint8_t *above, const uint8_t *left) {
143
337k
  const __m128i sum_left = dc_sum_4(left);
144
337k
  __m128i sum_above = dc_sum_8(above);
145
337k
  sum_above = _mm_add_epi16(sum_above, sum_left);
146
147
337k
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
148
337k
  sum += 6;
149
337k
  sum = divide_using_multiply_shift(sum, 2, DC_MULTIPLIER_1X2);
150
151
337k
  const __m128i row = _mm_set1_epi8((int8_t)sum);
152
337k
  dc_store_8xh(&row, 4, dst, stride);
153
337k
}
154
155
void aom_dc_predictor_8x16_sse2(uint8_t *dst, ptrdiff_t stride,
156
183k
                                const uint8_t *above, const uint8_t *left) {
157
183k
  const __m128i sum_left = dc_sum_16_sse2(left);
158
183k
  __m128i sum_above = dc_sum_8(above);
159
183k
  sum_above = _mm_add_epi16(sum_above, sum_left);
160
161
183k
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
162
183k
  sum += 12;
163
183k
  sum = divide_using_multiply_shift(sum, 3, DC_MULTIPLIER_1X2);
164
183k
  const __m128i row = _mm_set1_epi8((int8_t)sum);
165
183k
  dc_store_8xh(&row, 16, dst, stride);
166
183k
}
167
168
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
169
void aom_dc_predictor_8x32_sse2(uint8_t *dst, ptrdiff_t stride,
170
93.3k
                                const uint8_t *above, const uint8_t *left) {
171
93.3k
  const __m128i sum_left = dc_sum_32_sse2(left);
172
93.3k
  __m128i sum_above = dc_sum_8(above);
173
93.3k
  sum_above = _mm_add_epi16(sum_above, sum_left);
174
175
93.3k
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
176
93.3k
  sum += 20;
177
93.3k
  sum = divide_using_multiply_shift(sum, 3, DC_MULTIPLIER_1X4);
178
93.3k
  const __m128i row = _mm_set1_epi8((int8_t)sum);
179
93.3k
  dc_store_8xh(&row, 32, dst, stride);
180
93.3k
}
181
182
void aom_dc_predictor_16x4_sse2(uint8_t *dst, ptrdiff_t stride,
183
538k
                                const uint8_t *above, const uint8_t *left) {
184
538k
  const __m128i sum_left = dc_sum_4(left);
185
538k
  __m128i sum_above = dc_sum_16_sse2(above);
186
538k
  sum_above = _mm_add_epi16(sum_above, sum_left);
187
188
538k
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
189
538k
  sum += 10;
190
538k
  sum = divide_using_multiply_shift(sum, 2, DC_MULTIPLIER_1X4);
191
538k
  const __m128i row = _mm_set1_epi8((int8_t)sum);
192
538k
  dc_store_16xh(&row, 4, dst, stride);
193
538k
}
194
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
195
196
void aom_dc_predictor_16x8_sse2(uint8_t *dst, ptrdiff_t stride,
197
299k
                                const uint8_t *above, const uint8_t *left) {
198
299k
  const __m128i sum_left = dc_sum_8(left);
199
299k
  __m128i sum_above = dc_sum_16_sse2(above);
200
299k
  sum_above = _mm_add_epi16(sum_above, sum_left);
201
202
299k
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
203
299k
  sum += 12;
204
299k
  sum = divide_using_multiply_shift(sum, 3, DC_MULTIPLIER_1X2);
205
299k
  const __m128i row = _mm_set1_epi8((int8_t)sum);
206
299k
  dc_store_16xh(&row, 8, dst, stride);
207
299k
}
208
209
void aom_dc_predictor_16x32_sse2(uint8_t *dst, ptrdiff_t stride,
210
190k
                                 const uint8_t *above, const uint8_t *left) {
211
190k
  const __m128i sum_left = dc_sum_32_sse2(left);
212
190k
  __m128i sum_above = dc_sum_16_sse2(above);
213
190k
  sum_above = _mm_add_epi16(sum_left, sum_above);
214
215
190k
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
216
190k
  sum += 24;
217
190k
  sum = divide_using_multiply_shift(sum, 4, DC_MULTIPLIER_1X2);
218
190k
  const __m128i row = _mm_set1_epi8((int8_t)sum);
219
190k
  dc_store_16xh(&row, 32, dst, stride);
220
190k
}
221
222
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
223
void aom_dc_predictor_16x64_sse2(uint8_t *dst, ptrdiff_t stride,
224
21.3k
                                 const uint8_t *above, const uint8_t *left) {
225
21.3k
  const __m128i sum_left = dc_sum_64(left);
226
21.3k
  __m128i sum_above = dc_sum_16_sse2(above);
227
21.3k
  sum_above = _mm_add_epi16(sum_left, sum_above);
228
229
21.3k
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
230
21.3k
  sum += 40;
231
21.3k
  sum = divide_using_multiply_shift(sum, 4, DC_MULTIPLIER_1X4);
232
21.3k
  const __m128i row = _mm_set1_epi8((int8_t)sum);
233
21.3k
  dc_store_16xh(&row, 64, dst, stride);
234
21.3k
}
235
236
void aom_dc_predictor_32x8_sse2(uint8_t *dst, ptrdiff_t stride,
237
277k
                                const uint8_t *above, const uint8_t *left) {
238
277k
  __m128i sum_above = dc_sum_32_sse2(above);
239
277k
  const __m128i sum_left = dc_sum_8(left);
240
277k
  sum_above = _mm_add_epi16(sum_above, sum_left);
241
242
277k
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
243
277k
  sum += 20;
244
277k
  sum = divide_using_multiply_shift(sum, 3, DC_MULTIPLIER_1X4);
245
277k
  const __m128i row = _mm_set1_epi8((int8_t)sum);
246
277k
  dc_store_32xh(&row, 8, dst, stride);
247
277k
}
248
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
249
250
void aom_dc_predictor_32x16_sse2(uint8_t *dst, ptrdiff_t stride,
251
0
                                 const uint8_t *above, const uint8_t *left) {
252
0
  __m128i sum_above = dc_sum_32_sse2(above);
253
0
  const __m128i sum_left = dc_sum_16_sse2(left);
254
0
  sum_above = _mm_add_epi16(sum_above, sum_left);
255
256
0
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
257
0
  sum += 24;
258
0
  sum = divide_using_multiply_shift(sum, 4, DC_MULTIPLIER_1X2);
259
0
  const __m128i row = _mm_set1_epi8((int8_t)sum);
260
0
  dc_store_32xh(&row, 16, dst, stride);
261
0
}
262
263
void aom_dc_predictor_32x64_sse2(uint8_t *dst, ptrdiff_t stride,
264
0
                                 const uint8_t *above, const uint8_t *left) {
265
0
  __m128i sum_above = dc_sum_32_sse2(above);
266
0
  const __m128i sum_left = dc_sum_64(left);
267
0
  sum_above = _mm_add_epi16(sum_above, sum_left);
268
269
0
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
270
0
  sum += 48;
271
0
  sum = divide_using_multiply_shift(sum, 5, DC_MULTIPLIER_1X2);
272
0
  const __m128i row = _mm_set1_epi8((int8_t)sum);
273
0
  dc_store_32xh(&row, 64, dst, stride);
274
0
}
275
276
void aom_dc_predictor_64x64_sse2(uint8_t *dst, ptrdiff_t stride,
277
0
                                 const uint8_t *above, const uint8_t *left) {
278
0
  __m128i sum_above = dc_sum_64(above);
279
0
  const __m128i sum_left = dc_sum_64(left);
280
0
  sum_above = _mm_add_epi16(sum_above, sum_left);
281
282
0
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
283
0
  sum += 64;
284
0
  sum /= 128;
285
0
  const __m128i row = _mm_set1_epi8((int8_t)sum);
286
0
  dc_store_64xh(&row, 64, dst, stride);
287
0
}
288
289
void aom_dc_predictor_64x32_sse2(uint8_t *dst, ptrdiff_t stride,
290
0
                                 const uint8_t *above, const uint8_t *left) {
291
0
  __m128i sum_above = dc_sum_64(above);
292
0
  const __m128i sum_left = dc_sum_32_sse2(left);
293
0
  sum_above = _mm_add_epi16(sum_above, sum_left);
294
295
0
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
296
0
  sum += 48;
297
0
  sum = divide_using_multiply_shift(sum, 5, DC_MULTIPLIER_1X2);
298
0
  const __m128i row = _mm_set1_epi8((int8_t)sum);
299
0
  dc_store_64xh(&row, 32, dst, stride);
300
0
}
301
302
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
303
void aom_dc_predictor_64x16_sse2(uint8_t *dst, ptrdiff_t stride,
304
0
                                 const uint8_t *above, const uint8_t *left) {
305
0
  __m128i sum_above = dc_sum_64(above);
306
0
  const __m128i sum_left = dc_sum_16_sse2(left);
307
0
  sum_above = _mm_add_epi16(sum_above, sum_left);
308
309
0
  uint32_t sum = (uint32_t)_mm_cvtsi128_si32(sum_above);
310
0
  sum += 40;
311
0
  sum = divide_using_multiply_shift(sum, 4, DC_MULTIPLIER_1X4);
312
0
  const __m128i row = _mm_set1_epi8((int8_t)sum);
313
0
  dc_store_64xh(&row, 16, dst, stride);
314
0
}
315
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
316
317
// -----------------------------------------------------------------------------
318
// DC_TOP
319
320
void aom_dc_top_predictor_4x8_sse2(uint8_t *dst, ptrdiff_t stride,
321
4.20k
                                   const uint8_t *above, const uint8_t *left) {
322
4.20k
  (void)left;
323
4.20k
  __m128i sum_above = dc_sum_4(above);
324
4.20k
  const __m128i two = _mm_set1_epi16(2);
325
4.20k
  sum_above = _mm_add_epi16(sum_above, two);
326
4.20k
  sum_above = _mm_srai_epi16(sum_above, 2);
327
4.20k
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
328
4.20k
  sum_above = _mm_packus_epi16(sum_above, sum_above);
329
330
4.20k
  const uint32_t pred = (uint32_t)_mm_cvtsi128_si32(sum_above);
331
4.20k
  dc_store_4xh(pred, 8, dst, stride);
332
4.20k
}
333
334
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
335
void aom_dc_top_predictor_4x16_sse2(uint8_t *dst, ptrdiff_t stride,
336
5.33k
                                    const uint8_t *above, const uint8_t *left) {
337
5.33k
  (void)left;
338
5.33k
  __m128i sum_above = dc_sum_4(above);
339
5.33k
  const __m128i two = _mm_set1_epi16(2);
340
5.33k
  sum_above = _mm_add_epi16(sum_above, two);
341
5.33k
  sum_above = _mm_srai_epi16(sum_above, 2);
342
5.33k
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
343
5.33k
  sum_above = _mm_packus_epi16(sum_above, sum_above);
344
345
5.33k
  const uint32_t pred = (uint32_t)_mm_cvtsi128_si32(sum_above);
346
5.33k
  dc_store_4xh(pred, 16, dst, stride);
347
5.33k
}
348
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
349
350
void aom_dc_top_predictor_8x4_sse2(uint8_t *dst, ptrdiff_t stride,
351
2.70k
                                   const uint8_t *above, const uint8_t *left) {
352
2.70k
  (void)left;
353
2.70k
  __m128i sum_above = dc_sum_8(above);
354
2.70k
  const __m128i four = _mm_set1_epi16(4);
355
2.70k
  sum_above = _mm_add_epi16(sum_above, four);
356
2.70k
  sum_above = _mm_srai_epi16(sum_above, 3);
357
2.70k
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
358
2.70k
  const __m128i row = _mm_shufflelo_epi16(sum_above, 0);
359
2.70k
  dc_store_8xh(&row, 4, dst, stride);
360
2.70k
}
361
362
void aom_dc_top_predictor_8x16_sse2(uint8_t *dst, ptrdiff_t stride,
363
2.53k
                                    const uint8_t *above, const uint8_t *left) {
364
2.53k
  (void)left;
365
2.53k
  __m128i sum_above = dc_sum_8(above);
366
2.53k
  const __m128i four = _mm_set1_epi16(4);
367
2.53k
  sum_above = _mm_add_epi16(sum_above, four);
368
2.53k
  sum_above = _mm_srai_epi16(sum_above, 3);
369
2.53k
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
370
2.53k
  const __m128i row = _mm_shufflelo_epi16(sum_above, 0);
371
2.53k
  dc_store_8xh(&row, 16, dst, stride);
372
2.53k
}
373
374
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
375
void aom_dc_top_predictor_8x32_sse2(uint8_t *dst, ptrdiff_t stride,
376
4.12k
                                    const uint8_t *above, const uint8_t *left) {
377
4.12k
  (void)left;
378
4.12k
  __m128i sum_above = dc_sum_8(above);
379
4.12k
  const __m128i four = _mm_set1_epi16(4);
380
4.12k
  sum_above = _mm_add_epi16(sum_above, four);
381
4.12k
  sum_above = _mm_srai_epi16(sum_above, 3);
382
4.12k
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
383
4.12k
  const __m128i row = _mm_shufflelo_epi16(sum_above, 0);
384
4.12k
  dc_store_8xh(&row, 32, dst, stride);
385
4.12k
}
386
387
void aom_dc_top_predictor_16x4_sse2(uint8_t *dst, ptrdiff_t stride,
388
11.4k
                                    const uint8_t *above, const uint8_t *left) {
389
11.4k
  (void)left;
390
11.4k
  __m128i sum_above = dc_sum_16_sse2(above);
391
11.4k
  const __m128i eight = _mm_set1_epi16(8);
392
11.4k
  sum_above = _mm_add_epi16(sum_above, eight);
393
11.4k
  sum_above = _mm_srai_epi16(sum_above, 4);
394
11.4k
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
395
11.4k
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
396
11.4k
  const __m128i row = _mm_unpacklo_epi64(sum_above, sum_above);
397
11.4k
  dc_store_16xh(&row, 4, dst, stride);
398
11.4k
}
399
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
400
401
void aom_dc_top_predictor_16x8_sse2(uint8_t *dst, ptrdiff_t stride,
402
2.42k
                                    const uint8_t *above, const uint8_t *left) {
403
2.42k
  (void)left;
404
2.42k
  __m128i sum_above = dc_sum_16_sse2(above);
405
2.42k
  const __m128i eight = _mm_set1_epi16(8);
406
2.42k
  sum_above = _mm_add_epi16(sum_above, eight);
407
2.42k
  sum_above = _mm_srai_epi16(sum_above, 4);
408
2.42k
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
409
2.42k
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
410
2.42k
  const __m128i row = _mm_unpacklo_epi64(sum_above, sum_above);
411
2.42k
  dc_store_16xh(&row, 8, dst, stride);
412
2.42k
}
413
414
void aom_dc_top_predictor_16x32_sse2(uint8_t *dst, ptrdiff_t stride,
415
                                     const uint8_t *above,
416
16.4k
                                     const uint8_t *left) {
417
16.4k
  (void)left;
418
16.4k
  __m128i sum_above = dc_sum_16_sse2(above);
419
16.4k
  const __m128i eight = _mm_set1_epi16(8);
420
16.4k
  sum_above = _mm_add_epi16(sum_above, eight);
421
16.4k
  sum_above = _mm_srai_epi16(sum_above, 4);
422
16.4k
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
423
16.4k
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
424
16.4k
  const __m128i row = _mm_unpacklo_epi64(sum_above, sum_above);
425
16.4k
  dc_store_16xh(&row, 32, dst, stride);
426
16.4k
}
427
428
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
429
void aom_dc_top_predictor_16x64_sse2(uint8_t *dst, ptrdiff_t stride,
430
                                     const uint8_t *above,
431
1.24k
                                     const uint8_t *left) {
432
1.24k
  (void)left;
433
1.24k
  __m128i sum_above = dc_sum_16_sse2(above);
434
1.24k
  const __m128i eight = _mm_set1_epi16(8);
435
1.24k
  sum_above = _mm_add_epi16(sum_above, eight);
436
1.24k
  sum_above = _mm_srai_epi16(sum_above, 4);
437
1.24k
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
438
1.24k
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
439
1.24k
  const __m128i row = _mm_unpacklo_epi64(sum_above, sum_above);
440
1.24k
  dc_store_16xh(&row, 64, dst, stride);
441
1.24k
}
442
443
void aom_dc_top_predictor_32x8_sse2(uint8_t *dst, ptrdiff_t stride,
444
9.32k
                                    const uint8_t *above, const uint8_t *left) {
445
9.32k
  (void)left;
446
9.32k
  __m128i sum_above = dc_sum_32_sse2(above);
447
9.32k
  const __m128i sixteen = _mm_set1_epi16(16);
448
9.32k
  sum_above = _mm_add_epi16(sum_above, sixteen);
449
9.32k
  sum_above = _mm_srai_epi16(sum_above, 5);
450
9.32k
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
451
9.32k
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
452
9.32k
  const __m128i row = _mm_unpacklo_epi64(sum_above, sum_above);
453
9.32k
  dc_store_32xh(&row, 8, dst, stride);
454
9.32k
}
455
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
456
457
void aom_dc_top_predictor_32x16_sse2(uint8_t *dst, ptrdiff_t stride,
458
                                     const uint8_t *above,
459
0
                                     const uint8_t *left) {
460
0
  (void)left;
461
0
  __m128i sum_above = dc_sum_32_sse2(above);
462
0
  const __m128i sixteen = _mm_set1_epi16(16);
463
0
  sum_above = _mm_add_epi16(sum_above, sixteen);
464
0
  sum_above = _mm_srai_epi16(sum_above, 5);
465
0
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
466
0
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
467
0
  const __m128i row = _mm_unpacklo_epi64(sum_above, sum_above);
468
0
  dc_store_32xh(&row, 16, dst, stride);
469
0
}
470
471
void aom_dc_top_predictor_32x64_sse2(uint8_t *dst, ptrdiff_t stride,
472
                                     const uint8_t *above,
473
0
                                     const uint8_t *left) {
474
0
  (void)left;
475
0
  __m128i sum_above = dc_sum_32_sse2(above);
476
0
  const __m128i sixteen = _mm_set1_epi16(16);
477
0
  sum_above = _mm_add_epi16(sum_above, sixteen);
478
0
  sum_above = _mm_srai_epi16(sum_above, 5);
479
0
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
480
0
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
481
0
  const __m128i row = _mm_unpacklo_epi64(sum_above, sum_above);
482
0
  dc_store_32xh(&row, 64, dst, stride);
483
0
}
484
485
void aom_dc_top_predictor_64x64_sse2(uint8_t *dst, ptrdiff_t stride,
486
                                     const uint8_t *above,
487
0
                                     const uint8_t *left) {
488
0
  (void)left;
489
0
  __m128i sum_above = dc_sum_64(above);
490
0
  const __m128i thirtytwo = _mm_set1_epi16(32);
491
0
  sum_above = _mm_add_epi16(sum_above, thirtytwo);
492
0
  sum_above = _mm_srai_epi16(sum_above, 6);
493
0
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
494
0
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
495
0
  const __m128i row = _mm_unpacklo_epi64(sum_above, sum_above);
496
0
  dc_store_64xh(&row, 64, dst, stride);
497
0
}
498
499
void aom_dc_top_predictor_64x32_sse2(uint8_t *dst, ptrdiff_t stride,
500
                                     const uint8_t *above,
501
0
                                     const uint8_t *left) {
502
0
  (void)left;
503
0
  __m128i sum_above = dc_sum_64(above);
504
0
  const __m128i thirtytwo = _mm_set1_epi16(32);
505
0
  sum_above = _mm_add_epi16(sum_above, thirtytwo);
506
0
  sum_above = _mm_srai_epi16(sum_above, 6);
507
0
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
508
0
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
509
0
  const __m128i row = _mm_unpacklo_epi64(sum_above, sum_above);
510
0
  dc_store_64xh(&row, 32, dst, stride);
511
0
}
512
513
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
514
void aom_dc_top_predictor_64x16_sse2(uint8_t *dst, ptrdiff_t stride,
515
                                     const uint8_t *above,
516
0
                                     const uint8_t *left) {
517
0
  (void)left;
518
0
  __m128i sum_above = dc_sum_64(above);
519
0
  const __m128i thirtytwo = _mm_set1_epi16(32);
520
0
  sum_above = _mm_add_epi16(sum_above, thirtytwo);
521
0
  sum_above = _mm_srai_epi16(sum_above, 6);
522
0
  sum_above = _mm_unpacklo_epi8(sum_above, sum_above);
523
0
  sum_above = _mm_shufflelo_epi16(sum_above, 0);
524
0
  const __m128i row = _mm_unpacklo_epi64(sum_above, sum_above);
525
0
  dc_store_64xh(&row, 16, dst, stride);
526
0
}
527
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
528
529
// -----------------------------------------------------------------------------
530
// DC_LEFT
531
532
void aom_dc_left_predictor_4x8_sse2(uint8_t *dst, ptrdiff_t stride,
533
7.31k
                                    const uint8_t *above, const uint8_t *left) {
534
7.31k
  (void)above;
535
7.31k
  __m128i sum_left = dc_sum_8(left);
536
7.31k
  const __m128i four = _mm_set1_epi16(4);
537
7.31k
  sum_left = _mm_add_epi16(sum_left, four);
538
7.31k
  sum_left = _mm_srai_epi16(sum_left, 3);
539
7.31k
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
540
7.31k
  sum_left = _mm_packus_epi16(sum_left, sum_left);
541
542
7.31k
  const uint32_t pred = (uint32_t)_mm_cvtsi128_si32(sum_left);
543
7.31k
  dc_store_4xh(pred, 8, dst, stride);
544
7.31k
}
545
546
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
547
void aom_dc_left_predictor_4x16_sse2(uint8_t *dst, ptrdiff_t stride,
548
                                     const uint8_t *above,
549
5.83k
                                     const uint8_t *left) {
550
5.83k
  (void)above;
551
5.83k
  __m128i sum_left = dc_sum_16_sse2(left);
552
5.83k
  const __m128i eight = _mm_set1_epi16(8);
553
5.83k
  sum_left = _mm_add_epi16(sum_left, eight);
554
5.83k
  sum_left = _mm_srai_epi16(sum_left, 4);
555
5.83k
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
556
5.83k
  sum_left = _mm_packus_epi16(sum_left, sum_left);
557
558
5.83k
  const uint32_t pred = (uint32_t)_mm_cvtsi128_si32(sum_left);
559
5.83k
  dc_store_4xh(pred, 16, dst, stride);
560
5.83k
}
561
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
562
563
void aom_dc_left_predictor_8x4_sse2(uint8_t *dst, ptrdiff_t stride,
564
4.74k
                                    const uint8_t *above, const uint8_t *left) {
565
4.74k
  (void)above;
566
4.74k
  __m128i sum_left = dc_sum_4(left);
567
4.74k
  const __m128i two = _mm_set1_epi16(2);
568
4.74k
  sum_left = _mm_add_epi16(sum_left, two);
569
4.74k
  sum_left = _mm_srai_epi16(sum_left, 2);
570
4.74k
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
571
4.74k
  const __m128i row = _mm_shufflelo_epi16(sum_left, 0);
572
4.74k
  dc_store_8xh(&row, 4, dst, stride);
573
4.74k
}
574
575
void aom_dc_left_predictor_8x16_sse2(uint8_t *dst, ptrdiff_t stride,
576
                                     const uint8_t *above,
577
5.10k
                                     const uint8_t *left) {
578
5.10k
  (void)above;
579
5.10k
  __m128i sum_left = dc_sum_16_sse2(left);
580
5.10k
  const __m128i eight = _mm_set1_epi16(8);
581
5.10k
  sum_left = _mm_add_epi16(sum_left, eight);
582
5.10k
  sum_left = _mm_srai_epi16(sum_left, 4);
583
5.10k
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
584
5.10k
  const __m128i row = _mm_shufflelo_epi16(sum_left, 0);
585
5.10k
  dc_store_8xh(&row, 16, dst, stride);
586
5.10k
}
587
588
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
589
void aom_dc_left_predictor_8x32_sse2(uint8_t *dst, ptrdiff_t stride,
590
                                     const uint8_t *above,
591
11.7k
                                     const uint8_t *left) {
592
11.7k
  (void)above;
593
11.7k
  __m128i sum_left = dc_sum_32_sse2(left);
594
11.7k
  const __m128i sixteen = _mm_set1_epi16(16);
595
11.7k
  sum_left = _mm_add_epi16(sum_left, sixteen);
596
11.7k
  sum_left = _mm_srai_epi16(sum_left, 5);
597
11.7k
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
598
11.7k
  const __m128i row = _mm_shufflelo_epi16(sum_left, 0);
599
11.7k
  dc_store_8xh(&row, 32, dst, stride);
600
11.7k
}
601
602
void aom_dc_left_predictor_16x4_sse2(uint8_t *dst, ptrdiff_t stride,
603
                                     const uint8_t *above,
604
4.71k
                                     const uint8_t *left) {
605
4.71k
  (void)above;
606
4.71k
  __m128i sum_left = dc_sum_4(left);
607
4.71k
  const __m128i two = _mm_set1_epi16(2);
608
4.71k
  sum_left = _mm_add_epi16(sum_left, two);
609
4.71k
  sum_left = _mm_srai_epi16(sum_left, 2);
610
4.71k
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
611
4.71k
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
612
4.71k
  const __m128i row = _mm_unpacklo_epi64(sum_left, sum_left);
613
4.71k
  dc_store_16xh(&row, 4, dst, stride);
614
4.71k
}
615
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
616
617
void aom_dc_left_predictor_16x8_sse2(uint8_t *dst, ptrdiff_t stride,
618
                                     const uint8_t *above,
619
10.5k
                                     const uint8_t *left) {
620
10.5k
  (void)above;
621
10.5k
  __m128i sum_left = dc_sum_8(left);
622
10.5k
  const __m128i four = _mm_set1_epi16(4);
623
10.5k
  sum_left = _mm_add_epi16(sum_left, four);
624
10.5k
  sum_left = _mm_srai_epi16(sum_left, 3);
625
10.5k
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
626
10.5k
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
627
10.5k
  const __m128i row = _mm_unpacklo_epi64(sum_left, sum_left);
628
10.5k
  dc_store_16xh(&row, 8, dst, stride);
629
10.5k
}
630
631
void aom_dc_left_predictor_16x32_sse2(uint8_t *dst, ptrdiff_t stride,
632
                                      const uint8_t *above,
633
5.32k
                                      const uint8_t *left) {
634
5.32k
  (void)above;
635
5.32k
  __m128i sum_left = dc_sum_32_sse2(left);
636
5.32k
  const __m128i sixteen = _mm_set1_epi16(16);
637
5.32k
  sum_left = _mm_add_epi16(sum_left, sixteen);
638
5.32k
  sum_left = _mm_srai_epi16(sum_left, 5);
639
5.32k
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
640
5.32k
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
641
5.32k
  const __m128i row = _mm_unpacklo_epi64(sum_left, sum_left);
642
5.32k
  dc_store_16xh(&row, 32, dst, stride);
643
5.32k
}
644
645
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
646
void aom_dc_left_predictor_16x64_sse2(uint8_t *dst, ptrdiff_t stride,
647
                                      const uint8_t *above,
648
355
                                      const uint8_t *left) {
649
355
  (void)above;
650
355
  __m128i sum_left = dc_sum_64(left);
651
355
  const __m128i thirtytwo = _mm_set1_epi16(32);
652
355
  sum_left = _mm_add_epi16(sum_left, thirtytwo);
653
355
  sum_left = _mm_srai_epi16(sum_left, 6);
654
355
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
655
355
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
656
355
  const __m128i row = _mm_unpacklo_epi64(sum_left, sum_left);
657
355
  dc_store_16xh(&row, 64, dst, stride);
658
355
}
659
660
void aom_dc_left_predictor_32x8_sse2(uint8_t *dst, ptrdiff_t stride,
661
                                     const uint8_t *above,
662
2.56k
                                     const uint8_t *left) {
663
2.56k
  (void)above;
664
2.56k
  __m128i sum_left = dc_sum_8(left);
665
2.56k
  const __m128i four = _mm_set1_epi16(4);
666
2.56k
  sum_left = _mm_add_epi16(sum_left, four);
667
2.56k
  sum_left = _mm_srai_epi16(sum_left, 3);
668
2.56k
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
669
2.56k
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
670
2.56k
  const __m128i row = _mm_unpacklo_epi64(sum_left, sum_left);
671
2.56k
  dc_store_32xh(&row, 8, dst, stride);
672
2.56k
}
673
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
674
675
void aom_dc_left_predictor_32x16_sse2(uint8_t *dst, ptrdiff_t stride,
676
                                      const uint8_t *above,
677
0
                                      const uint8_t *left) {
678
0
  (void)above;
679
0
  __m128i sum_left = dc_sum_16_sse2(left);
680
0
  const __m128i eight = _mm_set1_epi16(8);
681
0
  sum_left = _mm_add_epi16(sum_left, eight);
682
0
  sum_left = _mm_srai_epi16(sum_left, 4);
683
0
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
684
0
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
685
0
  const __m128i row = _mm_unpacklo_epi64(sum_left, sum_left);
686
0
  dc_store_32xh(&row, 16, dst, stride);
687
0
}
688
689
void aom_dc_left_predictor_32x64_sse2(uint8_t *dst, ptrdiff_t stride,
690
                                      const uint8_t *above,
691
0
                                      const uint8_t *left) {
692
0
  (void)above;
693
0
  __m128i sum_left = dc_sum_64(left);
694
0
  const __m128i thirtytwo = _mm_set1_epi16(32);
695
0
  sum_left = _mm_add_epi16(sum_left, thirtytwo);
696
0
  sum_left = _mm_srai_epi16(sum_left, 6);
697
0
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
698
0
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
699
0
  const __m128i row = _mm_unpacklo_epi64(sum_left, sum_left);
700
0
  dc_store_32xh(&row, 64, dst, stride);
701
0
}
702
703
void aom_dc_left_predictor_64x64_sse2(uint8_t *dst, ptrdiff_t stride,
704
                                      const uint8_t *above,
705
0
                                      const uint8_t *left) {
706
0
  (void)above;
707
0
  __m128i sum_left = dc_sum_64(left);
708
0
  const __m128i thirtytwo = _mm_set1_epi16(32);
709
0
  sum_left = _mm_add_epi16(sum_left, thirtytwo);
710
0
  sum_left = _mm_srai_epi16(sum_left, 6);
711
0
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
712
0
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
713
0
  const __m128i row = _mm_unpacklo_epi64(sum_left, sum_left);
714
0
  dc_store_64xh(&row, 64, dst, stride);
715
0
}
716
717
void aom_dc_left_predictor_64x32_sse2(uint8_t *dst, ptrdiff_t stride,
718
                                      const uint8_t *above,
719
0
                                      const uint8_t *left) {
720
0
  (void)above;
721
0
  __m128i sum_left = dc_sum_32_sse2(left);
722
0
  const __m128i sixteen = _mm_set1_epi16(16);
723
0
  sum_left = _mm_add_epi16(sum_left, sixteen);
724
0
  sum_left = _mm_srai_epi16(sum_left, 5);
725
0
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
726
0
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
727
0
  const __m128i row = _mm_unpacklo_epi64(sum_left, sum_left);
728
0
  dc_store_64xh(&row, 32, dst, stride);
729
0
}
730
731
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
732
void aom_dc_left_predictor_64x16_sse2(uint8_t *dst, ptrdiff_t stride,
733
                                      const uint8_t *above,
734
0
                                      const uint8_t *left) {
735
0
  (void)above;
736
0
  __m128i sum_left = dc_sum_16_sse2(left);
737
0
  const __m128i eight = _mm_set1_epi16(8);
738
0
  sum_left = _mm_add_epi16(sum_left, eight);
739
0
  sum_left = _mm_srai_epi16(sum_left, 4);
740
0
  sum_left = _mm_unpacklo_epi8(sum_left, sum_left);
741
0
  sum_left = _mm_shufflelo_epi16(sum_left, 0);
742
0
  const __m128i row = _mm_unpacklo_epi64(sum_left, sum_left);
743
0
  dc_store_64xh(&row, 16, dst, stride);
744
0
}
745
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
746
747
// -----------------------------------------------------------------------------
748
// DC_128
749
750
void aom_dc_128_predictor_4x8_sse2(uint8_t *dst, ptrdiff_t stride,
751
2.39k
                                   const uint8_t *above, const uint8_t *left) {
752
2.39k
  (void)above;
753
2.39k
  (void)left;
754
2.39k
  const uint32_t pred = 0x80808080;
755
2.39k
  dc_store_4xh(pred, 8, dst, stride);
756
2.39k
}
757
758
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
759
void aom_dc_128_predictor_4x16_sse2(uint8_t *dst, ptrdiff_t stride,
760
311
                                    const uint8_t *above, const uint8_t *left) {
761
311
  (void)above;
762
311
  (void)left;
763
311
  const uint32_t pred = 0x80808080;
764
311
  dc_store_4xh(pred, 16, dst, stride);
765
311
}
766
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
767
768
void aom_dc_128_predictor_8x4_sse2(uint8_t *dst, ptrdiff_t stride,
769
621
                                   const uint8_t *above, const uint8_t *left) {
770
621
  (void)above;
771
621
  (void)left;
772
621
  const __m128i row = _mm_set1_epi8((int8_t)128);
773
621
  dc_store_8xh(&row, 4, dst, stride);
774
621
}
775
776
void aom_dc_128_predictor_8x16_sse2(uint8_t *dst, ptrdiff_t stride,
777
1.44k
                                    const uint8_t *above, const uint8_t *left) {
778
1.44k
  (void)above;
779
1.44k
  (void)left;
780
1.44k
  const __m128i row = _mm_set1_epi8((int8_t)128);
781
1.44k
  dc_store_8xh(&row, 16, dst, stride);
782
1.44k
}
783
784
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
785
void aom_dc_128_predictor_8x32_sse2(uint8_t *dst, ptrdiff_t stride,
786
265
                                    const uint8_t *above, const uint8_t *left) {
787
265
  (void)above;
788
265
  (void)left;
789
265
  const __m128i row = _mm_set1_epi8((int8_t)128);
790
265
  dc_store_8xh(&row, 32, dst, stride);
791
265
}
792
793
void aom_dc_128_predictor_16x4_sse2(uint8_t *dst, ptrdiff_t stride,
794
364
                                    const uint8_t *above, const uint8_t *left) {
795
364
  (void)above;
796
364
  (void)left;
797
364
  const __m128i row = _mm_set1_epi8((int8_t)128);
798
364
  dc_store_16xh(&row, 4, dst, stride);
799
364
}
800
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
801
802
void aom_dc_128_predictor_16x8_sse2(uint8_t *dst, ptrdiff_t stride,
803
305
                                    const uint8_t *above, const uint8_t *left) {
804
305
  (void)above;
805
305
  (void)left;
806
305
  const __m128i row = _mm_set1_epi8((int8_t)128);
807
305
  dc_store_16xh(&row, 8, dst, stride);
808
305
}
809
810
void aom_dc_128_predictor_16x32_sse2(uint8_t *dst, ptrdiff_t stride,
811
                                     const uint8_t *above,
812
1.91k
                                     const uint8_t *left) {
813
1.91k
  (void)above;
814
1.91k
  (void)left;
815
1.91k
  const __m128i row = _mm_set1_epi8((int8_t)128);
816
1.91k
  dc_store_16xh(&row, 32, dst, stride);
817
1.91k
}
818
819
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
820
void aom_dc_128_predictor_16x64_sse2(uint8_t *dst, ptrdiff_t stride,
821
                                     const uint8_t *above,
822
123
                                     const uint8_t *left) {
823
123
  (void)above;
824
123
  (void)left;
825
123
  const __m128i row = _mm_set1_epi8((int8_t)128);
826
123
  dc_store_16xh(&row, 64, dst, stride);
827
123
}
828
829
void aom_dc_128_predictor_32x8_sse2(uint8_t *dst, ptrdiff_t stride,
830
212
                                    const uint8_t *above, const uint8_t *left) {
831
212
  (void)above;
832
212
  (void)left;
833
212
  const __m128i row = _mm_set1_epi8((int8_t)128);
834
212
  dc_store_32xh(&row, 8, dst, stride);
835
212
}
836
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
837
838
void aom_dc_128_predictor_32x16_sse2(uint8_t *dst, ptrdiff_t stride,
839
                                     const uint8_t *above,
840
0
                                     const uint8_t *left) {
841
0
  (void)above;
842
0
  (void)left;
843
0
  const __m128i row = _mm_set1_epi8((int8_t)128);
844
0
  dc_store_32xh(&row, 16, dst, stride);
845
0
}
846
847
void aom_dc_128_predictor_32x64_sse2(uint8_t *dst, ptrdiff_t stride,
848
                                     const uint8_t *above,
849
0
                                     const uint8_t *left) {
850
0
  (void)above;
851
0
  (void)left;
852
0
  const __m128i row = _mm_set1_epi8((int8_t)128);
853
0
  dc_store_32xh(&row, 64, dst, stride);
854
0
}
855
856
void aom_dc_128_predictor_64x64_sse2(uint8_t *dst, ptrdiff_t stride,
857
                                     const uint8_t *above,
858
0
                                     const uint8_t *left) {
859
0
  (void)above;
860
0
  (void)left;
861
0
  const __m128i row = _mm_set1_epi8((int8_t)128);
862
0
  dc_store_64xh(&row, 64, dst, stride);
863
0
}
864
865
void aom_dc_128_predictor_64x32_sse2(uint8_t *dst, ptrdiff_t stride,
866
                                     const uint8_t *above,
867
0
                                     const uint8_t *left) {
868
0
  (void)above;
869
0
  (void)left;
870
0
  const __m128i row = _mm_set1_epi8((int8_t)128);
871
0
  dc_store_64xh(&row, 32, dst, stride);
872
0
}
873
874
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
875
void aom_dc_128_predictor_64x16_sse2(uint8_t *dst, ptrdiff_t stride,
876
                                     const uint8_t *above,
877
0
                                     const uint8_t *left) {
878
0
  (void)above;
879
0
  (void)left;
880
0
  const __m128i row = _mm_set1_epi8((int8_t)128);
881
0
  dc_store_64xh(&row, 16, dst, stride);
882
0
}
883
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
884
885
// -----------------------------------------------------------------------------
886
// V_PRED
887
888
void aom_v_predictor_4x8_sse2(uint8_t *dst, ptrdiff_t stride,
889
21.0k
                              const uint8_t *above, const uint8_t *left) {
890
21.0k
  const uint32_t pred = *(uint32_t *)above;
891
21.0k
  (void)left;
892
21.0k
  dc_store_4xh(pred, 8, dst, stride);
893
21.0k
}
894
895
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
896
void aom_v_predictor_4x16_sse2(uint8_t *dst, ptrdiff_t stride,
897
6.58k
                               const uint8_t *above, const uint8_t *left) {
898
6.58k
  const uint32_t pred = *(uint32_t *)above;
899
6.58k
  (void)left;
900
6.58k
  dc_store_4xh(pred, 16, dst, stride);
901
6.58k
}
902
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
903
904
void aom_v_predictor_8x4_sse2(uint8_t *dst, ptrdiff_t stride,
905
34.5k
                              const uint8_t *above, const uint8_t *left) {
906
34.5k
  const __m128i row = _mm_loadl_epi64((__m128i const *)above);
907
34.5k
  (void)left;
908
34.5k
  dc_store_8xh(&row, 4, dst, stride);
909
34.5k
}
910
911
void aom_v_predictor_8x16_sse2(uint8_t *dst, ptrdiff_t stride,
912
14.0k
                               const uint8_t *above, const uint8_t *left) {
913
14.0k
  const __m128i row = _mm_loadl_epi64((__m128i const *)above);
914
14.0k
  (void)left;
915
14.0k
  dc_store_8xh(&row, 16, dst, stride);
916
14.0k
}
917
918
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
919
void aom_v_predictor_8x32_sse2(uint8_t *dst, ptrdiff_t stride,
920
3.69k
                               const uint8_t *above, const uint8_t *left) {
921
3.69k
  const __m128i row = _mm_loadl_epi64((__m128i const *)above);
922
3.69k
  (void)left;
923
3.69k
  dc_store_8xh(&row, 32, dst, stride);
924
3.69k
}
925
926
void aom_v_predictor_16x4_sse2(uint8_t *dst, ptrdiff_t stride,
927
29.0k
                               const uint8_t *above, const uint8_t *left) {
928
29.0k
  const __m128i row = _mm_load_si128((__m128i const *)above);
929
29.0k
  (void)left;
930
29.0k
  dc_store_16xh(&row, 4, dst, stride);
931
29.0k
}
932
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
933
934
void aom_v_predictor_16x8_sse2(uint8_t *dst, ptrdiff_t stride,
935
28.3k
                               const uint8_t *above, const uint8_t *left) {
936
28.3k
  const __m128i row = _mm_load_si128((__m128i const *)above);
937
28.3k
  (void)left;
938
28.3k
  dc_store_16xh(&row, 8, dst, stride);
939
28.3k
}
940
941
void aom_v_predictor_16x32_sse2(uint8_t *dst, ptrdiff_t stride,
942
8.77k
                                const uint8_t *above, const uint8_t *left) {
943
8.77k
  const __m128i row = _mm_load_si128((__m128i const *)above);
944
8.77k
  (void)left;
945
8.77k
  dc_store_16xh(&row, 32, dst, stride);
946
8.77k
}
947
948
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
949
void aom_v_predictor_16x64_sse2(uint8_t *dst, ptrdiff_t stride,
950
1.37k
                                const uint8_t *above, const uint8_t *left) {
951
1.37k
  const __m128i row = _mm_load_si128((__m128i const *)above);
952
1.37k
  (void)left;
953
1.37k
  dc_store_16xh(&row, 64, dst, stride);
954
1.37k
}
955
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
956
957
static inline void v_predictor_32xh(uint8_t *dst, ptrdiff_t stride,
958
10.3k
                                    const uint8_t *above, int height) {
959
10.3k
  const __m128i row0 = _mm_load_si128((__m128i const *)above);
960
10.3k
  const __m128i row1 = _mm_load_si128((__m128i const *)(above + 16));
961
93.3k
  for (int i = 0; i < height; ++i) {
962
82.9k
    _mm_store_si128((__m128i *)dst, row0);
963
82.9k
    _mm_store_si128((__m128i *)(dst + 16), row1);
964
82.9k
    dst += stride;
965
82.9k
  }
966
10.3k
}
967
968
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
969
void aom_v_predictor_32x8_sse2(uint8_t *dst, ptrdiff_t stride,
970
10.3k
                               const uint8_t *above, const uint8_t *left) {
971
10.3k
  (void)left;
972
10.3k
  v_predictor_32xh(dst, stride, above, 8);
973
10.3k
}
974
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
975
976
void aom_v_predictor_32x16_sse2(uint8_t *dst, ptrdiff_t stride,
977
0
                                const uint8_t *above, const uint8_t *left) {
978
0
  (void)left;
979
0
  v_predictor_32xh(dst, stride, above, 16);
980
0
}
981
982
void aom_v_predictor_32x64_sse2(uint8_t *dst, ptrdiff_t stride,
983
0
                                const uint8_t *above, const uint8_t *left) {
984
0
  (void)left;
985
0
  v_predictor_32xh(dst, stride, above, 64);
986
0
}
987
988
static inline void v_predictor_64xh(uint8_t *dst, ptrdiff_t stride,
989
0
                                    const uint8_t *above, int height) {
990
0
  const __m128i row0 = _mm_load_si128((__m128i const *)above);
991
0
  const __m128i row1 = _mm_load_si128((__m128i const *)(above + 16));
992
0
  const __m128i row2 = _mm_load_si128((__m128i const *)(above + 32));
993
0
  const __m128i row3 = _mm_load_si128((__m128i const *)(above + 48));
994
0
  for (int i = 0; i < height; ++i) {
995
0
    _mm_store_si128((__m128i *)dst, row0);
996
0
    _mm_store_si128((__m128i *)(dst + 16), row1);
997
0
    _mm_store_si128((__m128i *)(dst + 32), row2);
998
0
    _mm_store_si128((__m128i *)(dst + 48), row3);
999
0
    dst += stride;
1000
0
  }
1001
0
}
1002
1003
void aom_v_predictor_64x64_sse2(uint8_t *dst, ptrdiff_t stride,
1004
0
                                const uint8_t *above, const uint8_t *left) {
1005
0
  (void)left;
1006
0
  v_predictor_64xh(dst, stride, above, 64);
1007
0
}
1008
1009
void aom_v_predictor_64x32_sse2(uint8_t *dst, ptrdiff_t stride,
1010
0
                                const uint8_t *above, const uint8_t *left) {
1011
0
  (void)left;
1012
0
  v_predictor_64xh(dst, stride, above, 32);
1013
0
}
1014
1015
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1016
void aom_v_predictor_64x16_sse2(uint8_t *dst, ptrdiff_t stride,
1017
0
                                const uint8_t *above, const uint8_t *left) {
1018
0
  (void)left;
1019
0
  v_predictor_64xh(dst, stride, above, 16);
1020
0
}
1021
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1022
1023
// -----------------------------------------------------------------------------
1024
// H_PRED
1025
1026
void aom_h_predictor_4x8_sse2(uint8_t *dst, ptrdiff_t stride,
1027
35.2k
                              const uint8_t *above, const uint8_t *left) {
1028
35.2k
  (void)above;
1029
35.2k
  __m128i left_col = _mm_loadl_epi64((__m128i const *)left);
1030
35.2k
  left_col = _mm_unpacklo_epi8(left_col, left_col);
1031
35.2k
  __m128i row0 = _mm_shufflelo_epi16(left_col, 0);
1032
35.2k
  __m128i row1 = _mm_shufflelo_epi16(left_col, 0x55);
1033
35.2k
  __m128i row2 = _mm_shufflelo_epi16(left_col, 0xaa);
1034
35.2k
  __m128i row3 = _mm_shufflelo_epi16(left_col, 0xff);
1035
35.2k
  *(int *)dst = _mm_cvtsi128_si32(row0);
1036
35.2k
  dst += stride;
1037
35.2k
  *(int *)dst = _mm_cvtsi128_si32(row1);
1038
35.2k
  dst += stride;
1039
35.2k
  *(int *)dst = _mm_cvtsi128_si32(row2);
1040
35.2k
  dst += stride;
1041
35.2k
  *(int *)dst = _mm_cvtsi128_si32(row3);
1042
35.2k
  dst += stride;
1043
35.2k
  left_col = _mm_unpackhi_epi64(left_col, left_col);
1044
35.2k
  row0 = _mm_shufflelo_epi16(left_col, 0);
1045
35.2k
  row1 = _mm_shufflelo_epi16(left_col, 0x55);
1046
35.2k
  row2 = _mm_shufflelo_epi16(left_col, 0xaa);
1047
35.2k
  row3 = _mm_shufflelo_epi16(left_col, 0xff);
1048
35.2k
  *(int *)dst = _mm_cvtsi128_si32(row0);
1049
35.2k
  dst += stride;
1050
35.2k
  *(int *)dst = _mm_cvtsi128_si32(row1);
1051
35.2k
  dst += stride;
1052
35.2k
  *(int *)dst = _mm_cvtsi128_si32(row2);
1053
35.2k
  dst += stride;
1054
35.2k
  *(int *)dst = _mm_cvtsi128_si32(row3);
1055
35.2k
}
1056
1057
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1058
void aom_h_predictor_4x16_sse2(uint8_t *dst, ptrdiff_t stride,
1059
23.1k
                               const uint8_t *above, const uint8_t *left) {
1060
23.1k
  (void)above;
1061
23.1k
  const __m128i left_col = _mm_load_si128((__m128i const *)left);
1062
23.1k
  __m128i left_col_low = _mm_unpacklo_epi8(left_col, left_col);
1063
23.1k
  __m128i left_col_high = _mm_unpackhi_epi8(left_col, left_col);
1064
1065
23.1k
  __m128i row0 = _mm_shufflelo_epi16(left_col_low, 0);
1066
23.1k
  __m128i row1 = _mm_shufflelo_epi16(left_col_low, 0x55);
1067
23.1k
  __m128i row2 = _mm_shufflelo_epi16(left_col_low, 0xaa);
1068
23.1k
  __m128i row3 = _mm_shufflelo_epi16(left_col_low, 0xff);
1069
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row0);
1070
23.1k
  dst += stride;
1071
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row1);
1072
23.1k
  dst += stride;
1073
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row2);
1074
23.1k
  dst += stride;
1075
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row3);
1076
23.1k
  dst += stride;
1077
1078
23.1k
  left_col_low = _mm_unpackhi_epi64(left_col_low, left_col_low);
1079
23.1k
  row0 = _mm_shufflelo_epi16(left_col_low, 0);
1080
23.1k
  row1 = _mm_shufflelo_epi16(left_col_low, 0x55);
1081
23.1k
  row2 = _mm_shufflelo_epi16(left_col_low, 0xaa);
1082
23.1k
  row3 = _mm_shufflelo_epi16(left_col_low, 0xff);
1083
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row0);
1084
23.1k
  dst += stride;
1085
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row1);
1086
23.1k
  dst += stride;
1087
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row2);
1088
23.1k
  dst += stride;
1089
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row3);
1090
23.1k
  dst += stride;
1091
1092
23.1k
  row0 = _mm_shufflelo_epi16(left_col_high, 0);
1093
23.1k
  row1 = _mm_shufflelo_epi16(left_col_high, 0x55);
1094
23.1k
  row2 = _mm_shufflelo_epi16(left_col_high, 0xaa);
1095
23.1k
  row3 = _mm_shufflelo_epi16(left_col_high, 0xff);
1096
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row0);
1097
23.1k
  dst += stride;
1098
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row1);
1099
23.1k
  dst += stride;
1100
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row2);
1101
23.1k
  dst += stride;
1102
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row3);
1103
23.1k
  dst += stride;
1104
1105
23.1k
  left_col_high = _mm_unpackhi_epi64(left_col_high, left_col_high);
1106
23.1k
  row0 = _mm_shufflelo_epi16(left_col_high, 0);
1107
23.1k
  row1 = _mm_shufflelo_epi16(left_col_high, 0x55);
1108
23.1k
  row2 = _mm_shufflelo_epi16(left_col_high, 0xaa);
1109
23.1k
  row3 = _mm_shufflelo_epi16(left_col_high, 0xff);
1110
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row0);
1111
23.1k
  dst += stride;
1112
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row1);
1113
23.1k
  dst += stride;
1114
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row2);
1115
23.1k
  dst += stride;
1116
23.1k
  *(int *)dst = _mm_cvtsi128_si32(row3);
1117
23.1k
}
1118
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1119
1120
void aom_h_predictor_8x4_sse2(uint8_t *dst, ptrdiff_t stride,
1121
64.9k
                              const uint8_t *above, const uint8_t *left) {
1122
64.9k
  (void)above;
1123
64.9k
  __m128i left_col = _mm_loadl_epi64((__m128i const *)left);
1124
64.9k
  left_col = _mm_unpacklo_epi8(left_col, left_col);
1125
64.9k
  __m128i row0 = _mm_shufflelo_epi16(left_col, 0);
1126
64.9k
  __m128i row1 = _mm_shufflelo_epi16(left_col, 0x55);
1127
64.9k
  __m128i row2 = _mm_shufflelo_epi16(left_col, 0xaa);
1128
64.9k
  __m128i row3 = _mm_shufflelo_epi16(left_col, 0xff);
1129
64.9k
  _mm_storel_epi64((__m128i *)dst, row0);
1130
64.9k
  dst += stride;
1131
64.9k
  _mm_storel_epi64((__m128i *)dst, row1);
1132
64.9k
  dst += stride;
1133
64.9k
  _mm_storel_epi64((__m128i *)dst, row2);
1134
64.9k
  dst += stride;
1135
64.9k
  _mm_storel_epi64((__m128i *)dst, row3);
1136
64.9k
}
1137
1138
static inline void h_predictor_8x16xc(uint8_t *dst, ptrdiff_t stride,
1139
                                      const uint8_t *above, const uint8_t *left,
1140
43.6k
                                      int count) {
1141
43.6k
  (void)above;
1142
98.6k
  for (int i = 0; i < count; ++i) {
1143
54.9k
    const __m128i left_col = _mm_load_si128((__m128i const *)left);
1144
54.9k
    __m128i left_col_low = _mm_unpacklo_epi8(left_col, left_col);
1145
54.9k
    __m128i left_col_high = _mm_unpackhi_epi8(left_col, left_col);
1146
1147
54.9k
    __m128i row0 = _mm_shufflelo_epi16(left_col_low, 0);
1148
54.9k
    __m128i row1 = _mm_shufflelo_epi16(left_col_low, 0x55);
1149
54.9k
    __m128i row2 = _mm_shufflelo_epi16(left_col_low, 0xaa);
1150
54.9k
    __m128i row3 = _mm_shufflelo_epi16(left_col_low, 0xff);
1151
54.9k
    _mm_storel_epi64((__m128i *)dst, row0);
1152
54.9k
    dst += stride;
1153
54.9k
    _mm_storel_epi64((__m128i *)dst, row1);
1154
54.9k
    dst += stride;
1155
54.9k
    _mm_storel_epi64((__m128i *)dst, row2);
1156
54.9k
    dst += stride;
1157
54.9k
    _mm_storel_epi64((__m128i *)dst, row3);
1158
54.9k
    dst += stride;
1159
1160
54.9k
    left_col_low = _mm_unpackhi_epi64(left_col_low, left_col_low);
1161
54.9k
    row0 = _mm_shufflelo_epi16(left_col_low, 0);
1162
54.9k
    row1 = _mm_shufflelo_epi16(left_col_low, 0x55);
1163
54.9k
    row2 = _mm_shufflelo_epi16(left_col_low, 0xaa);
1164
54.9k
    row3 = _mm_shufflelo_epi16(left_col_low, 0xff);
1165
54.9k
    _mm_storel_epi64((__m128i *)dst, row0);
1166
54.9k
    dst += stride;
1167
54.9k
    _mm_storel_epi64((__m128i *)dst, row1);
1168
54.9k
    dst += stride;
1169
54.9k
    _mm_storel_epi64((__m128i *)dst, row2);
1170
54.9k
    dst += stride;
1171
54.9k
    _mm_storel_epi64((__m128i *)dst, row3);
1172
54.9k
    dst += stride;
1173
1174
54.9k
    row0 = _mm_shufflelo_epi16(left_col_high, 0);
1175
54.9k
    row1 = _mm_shufflelo_epi16(left_col_high, 0x55);
1176
54.9k
    row2 = _mm_shufflelo_epi16(left_col_high, 0xaa);
1177
54.9k
    row3 = _mm_shufflelo_epi16(left_col_high, 0xff);
1178
54.9k
    _mm_storel_epi64((__m128i *)dst, row0);
1179
54.9k
    dst += stride;
1180
54.9k
    _mm_storel_epi64((__m128i *)dst, row1);
1181
54.9k
    dst += stride;
1182
54.9k
    _mm_storel_epi64((__m128i *)dst, row2);
1183
54.9k
    dst += stride;
1184
54.9k
    _mm_storel_epi64((__m128i *)dst, row3);
1185
54.9k
    dst += stride;
1186
1187
54.9k
    left_col_high = _mm_unpackhi_epi64(left_col_high, left_col_high);
1188
54.9k
    row0 = _mm_shufflelo_epi16(left_col_high, 0);
1189
54.9k
    row1 = _mm_shufflelo_epi16(left_col_high, 0x55);
1190
54.9k
    row2 = _mm_shufflelo_epi16(left_col_high, 0xaa);
1191
54.9k
    row3 = _mm_shufflelo_epi16(left_col_high, 0xff);
1192
54.9k
    _mm_storel_epi64((__m128i *)dst, row0);
1193
54.9k
    dst += stride;
1194
54.9k
    _mm_storel_epi64((__m128i *)dst, row1);
1195
54.9k
    dst += stride;
1196
54.9k
    _mm_storel_epi64((__m128i *)dst, row2);
1197
54.9k
    dst += stride;
1198
54.9k
    _mm_storel_epi64((__m128i *)dst, row3);
1199
54.9k
    dst += stride;
1200
54.9k
    left += 16;
1201
54.9k
  }
1202
43.6k
}
1203
1204
void aom_h_predictor_8x16_sse2(uint8_t *dst, ptrdiff_t stride,
1205
32.3k
                               const uint8_t *above, const uint8_t *left) {
1206
32.3k
  h_predictor_8x16xc(dst, stride, above, left, 1);
1207
32.3k
}
1208
1209
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1210
void aom_h_predictor_8x32_sse2(uint8_t *dst, ptrdiff_t stride,
1211
11.2k
                               const uint8_t *above, const uint8_t *left) {
1212
11.2k
  h_predictor_8x16xc(dst, stride, above, left, 2);
1213
11.2k
}
1214
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1215
1216
static inline void h_pred_store_16xh(const __m128i *row, int h, uint8_t *dst,
1217
517k
                                     ptrdiff_t stride) {
1218
517k
  int i;
1219
2.58M
  for (i = 0; i < h; ++i) {
1220
2.07M
    _mm_store_si128((__m128i *)dst, row[i]);
1221
2.07M
    dst += stride;
1222
2.07M
  }
1223
517k
}
1224
1225
534k
static inline void repeat_low_4pixels(const __m128i *x, __m128i *row) {
1226
534k
  const __m128i u0 = _mm_shufflelo_epi16(*x, 0);
1227
534k
  const __m128i u1 = _mm_shufflelo_epi16(*x, 0x55);
1228
534k
  const __m128i u2 = _mm_shufflelo_epi16(*x, 0xaa);
1229
534k
  const __m128i u3 = _mm_shufflelo_epi16(*x, 0xff);
1230
1231
534k
  row[0] = _mm_unpacklo_epi64(u0, u0);
1232
534k
  row[1] = _mm_unpacklo_epi64(u1, u1);
1233
534k
  row[2] = _mm_unpacklo_epi64(u2, u2);
1234
534k
  row[3] = _mm_unpacklo_epi64(u3, u3);
1235
534k
}
1236
1237
419k
static inline void repeat_high_4pixels(const __m128i *x, __m128i *row) {
1238
419k
  const __m128i u0 = _mm_shufflehi_epi16(*x, 0);
1239
419k
  const __m128i u1 = _mm_shufflehi_epi16(*x, 0x55);
1240
419k
  const __m128i u2 = _mm_shufflehi_epi16(*x, 0xaa);
1241
419k
  const __m128i u3 = _mm_shufflehi_epi16(*x, 0xff);
1242
1243
419k
  row[0] = _mm_unpackhi_epi64(u0, u0);
1244
419k
  row[1] = _mm_unpackhi_epi64(u1, u1);
1245
419k
  row[2] = _mm_unpackhi_epi64(u2, u2);
1246
419k
  row[3] = _mm_unpackhi_epi64(u3, u3);
1247
419k
}
1248
1249
// Process 16x8, first 4 rows
1250
// Use first 8 bytes of left register: xxxxxxxx33221100
1251
static inline void h_prediction_16x8_1(const __m128i *left, uint8_t *dst,
1252
316k
                                       ptrdiff_t stride) {
1253
316k
  __m128i row[4];
1254
316k
  repeat_low_4pixels(left, row);
1255
316k
  h_pred_store_16xh(row, 4, dst, stride);
1256
316k
}
1257
1258
// Process 16x8, second 4 rows
1259
// Use second 8 bytes of left register: 77665544xxxxxxxx
1260
static inline void h_prediction_16x8_2(const __m128i *left, uint8_t *dst,
1261
201k
                                       ptrdiff_t stride) {
1262
201k
  __m128i row[4];
1263
201k
  repeat_high_4pixels(left, row);
1264
201k
  h_pred_store_16xh(row, 4, dst, stride);
1265
201k
}
1266
1267
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1268
void aom_h_predictor_16x4_sse2(uint8_t *dst, ptrdiff_t stride,
1269
115k
                               const uint8_t *above, const uint8_t *left) {
1270
115k
  (void)above;
1271
115k
  const __m128i left_col = _mm_loadl_epi64((const __m128i *)left);
1272
115k
  const __m128i left_col_8p = _mm_unpacklo_epi8(left_col, left_col);
1273
115k
  h_prediction_16x8_1(&left_col_8p, dst, stride);
1274
115k
}
1275
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1276
1277
void aom_h_predictor_16x8_sse2(uint8_t *dst, ptrdiff_t stride,
1278
72.2k
                               const uint8_t *above, const uint8_t *left) {
1279
72.2k
  (void)above;
1280
72.2k
  const __m128i left_col = _mm_loadl_epi64((const __m128i *)left);
1281
72.2k
  const __m128i left_col_8p = _mm_unpacklo_epi8(left_col, left_col);
1282
72.2k
  h_prediction_16x8_1(&left_col_8p, dst, stride);
1283
72.2k
  dst += stride << 2;
1284
72.2k
  h_prediction_16x8_2(&left_col_8p, dst, stride);
1285
72.2k
}
1286
1287
static inline void h_predictor_16xh(uint8_t *dst, ptrdiff_t stride,
1288
28.4k
                                    const uint8_t *left, int count) {
1289
28.4k
  int i = 0;
1290
64.5k
  do {
1291
64.5k
    const __m128i left_col = _mm_load_si128((const __m128i *)left);
1292
64.5k
    const __m128i left_col_8p_lo = _mm_unpacklo_epi8(left_col, left_col);
1293
64.5k
    h_prediction_16x8_1(&left_col_8p_lo, dst, stride);
1294
64.5k
    dst += stride << 2;
1295
64.5k
    h_prediction_16x8_2(&left_col_8p_lo, dst, stride);
1296
64.5k
    dst += stride << 2;
1297
1298
64.5k
    const __m128i left_col_8p_hi = _mm_unpackhi_epi8(left_col, left_col);
1299
64.5k
    h_prediction_16x8_1(&left_col_8p_hi, dst, stride);
1300
64.5k
    dst += stride << 2;
1301
64.5k
    h_prediction_16x8_2(&left_col_8p_hi, dst, stride);
1302
64.5k
    dst += stride << 2;
1303
1304
64.5k
    left += 16;
1305
64.5k
    i++;
1306
64.5k
  } while (i < count);
1307
28.4k
}
1308
1309
void aom_h_predictor_16x32_sse2(uint8_t *dst, ptrdiff_t stride,
1310
24.7k
                                const uint8_t *above, const uint8_t *left) {
1311
24.7k
  (void)above;
1312
24.7k
  h_predictor_16xh(dst, stride, left, 2);
1313
24.7k
}
1314
1315
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1316
void aom_h_predictor_16x64_sse2(uint8_t *dst, ptrdiff_t stride,
1317
3.77k
                                const uint8_t *above, const uint8_t *left) {
1318
3.77k
  (void)above;
1319
3.77k
  h_predictor_16xh(dst, stride, left, 4);
1320
3.77k
}
1321
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1322
1323
static inline void h_pred_store_32xh(const __m128i *row, int h, uint8_t *dst,
1324
436k
                                     ptrdiff_t stride) {
1325
436k
  int i;
1326
2.18M
  for (i = 0; i < h; ++i) {
1327
1.74M
    _mm_store_si128((__m128i *)dst, row[i]);
1328
1.74M
    _mm_store_si128((__m128i *)(dst + 16), row[i]);
1329
1.74M
    dst += stride;
1330
1.74M
  }
1331
436k
}
1332
1333
// Process 32x8, first 4 rows
1334
// Use first 8 bytes of left register: xxxxxxxx33221100
1335
static inline void h_prediction_32x8_1(const __m128i *left, uint8_t *dst,
1336
218k
                                       ptrdiff_t stride) {
1337
218k
  __m128i row[4];
1338
218k
  repeat_low_4pixels(left, row);
1339
218k
  h_pred_store_32xh(row, 4, dst, stride);
1340
218k
}
1341
1342
// Process 32x8, second 4 rows
1343
// Use second 8 bytes of left register: 77665544xxxxxxxx
1344
static inline void h_prediction_32x8_2(const __m128i *left, uint8_t *dst,
1345
218k
                                       ptrdiff_t stride) {
1346
218k
  __m128i row[4];
1347
218k
  repeat_high_4pixels(left, row);
1348
218k
  h_pred_store_32xh(row, 4, dst, stride);
1349
218k
}
1350
1351
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1352
void aom_h_predictor_32x8_sse2(uint8_t *dst, ptrdiff_t stride,
1353
133k
                               const uint8_t *above, const uint8_t *left) {
1354
133k
  __m128i left_col, left_col_8p;
1355
133k
  (void)above;
1356
1357
133k
  left_col = _mm_load_si128((const __m128i *)left);
1358
1359
133k
  left_col_8p = _mm_unpacklo_epi8(left_col, left_col);
1360
133k
  h_prediction_32x8_1(&left_col_8p, dst, stride);
1361
133k
  dst += stride << 2;
1362
133k
  h_prediction_32x8_2(&left_col_8p, dst, stride);
1363
133k
}
1364
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1365
1366
void aom_h_predictor_32x16_sse2(uint8_t *dst, ptrdiff_t stride,
1367
42.5k
                                const uint8_t *above, const uint8_t *left) {
1368
42.5k
  __m128i left_col, left_col_8p;
1369
42.5k
  (void)above;
1370
1371
42.5k
  left_col = _mm_load_si128((const __m128i *)left);
1372
1373
42.5k
  left_col_8p = _mm_unpacklo_epi8(left_col, left_col);
1374
42.5k
  h_prediction_32x8_1(&left_col_8p, dst, stride);
1375
42.5k
  dst += stride << 2;
1376
42.5k
  h_prediction_32x8_2(&left_col_8p, dst, stride);
1377
42.5k
  dst += stride << 2;
1378
1379
42.5k
  left_col_8p = _mm_unpackhi_epi8(left_col, left_col);
1380
42.5k
  h_prediction_32x8_1(&left_col_8p, dst, stride);
1381
42.5k
  dst += stride << 2;
1382
42.5k
  h_prediction_32x8_2(&left_col_8p, dst, stride);
1383
42.5k
}
1384
1385
static inline void h_predictor_32xh(uint8_t *dst, ptrdiff_t stride,
1386
2.84k
                                    const uint8_t *left, int height) {
1387
2.84k
  int i = height >> 2;
1388
45.5k
  do {
1389
45.5k
    __m128i left4 = _mm_cvtsi32_si128(((int *)left)[0]);
1390
45.5k
    left4 = _mm_unpacklo_epi8(left4, left4);
1391
45.5k
    left4 = _mm_unpacklo_epi8(left4, left4);
1392
45.5k
    const __m128i r0 = _mm_shuffle_epi32(left4, 0x0);
1393
45.5k
    const __m128i r1 = _mm_shuffle_epi32(left4, 0x55);
1394
45.5k
    _mm_store_si128((__m128i *)dst, r0);
1395
45.5k
    _mm_store_si128((__m128i *)(dst + 16), r0);
1396
45.5k
    _mm_store_si128((__m128i *)(dst + stride), r1);
1397
45.5k
    _mm_store_si128((__m128i *)(dst + stride + 16), r1);
1398
45.5k
    const __m128i r2 = _mm_shuffle_epi32(left4, 0xaa);
1399
45.5k
    const __m128i r3 = _mm_shuffle_epi32(left4, 0xff);
1400
45.5k
    _mm_store_si128((__m128i *)(dst + stride * 2), r2);
1401
45.5k
    _mm_store_si128((__m128i *)(dst + stride * 2 + 16), r2);
1402
45.5k
    _mm_store_si128((__m128i *)(dst + stride * 3), r3);
1403
45.5k
    _mm_store_si128((__m128i *)(dst + stride * 3 + 16), r3);
1404
45.5k
    left += 4;
1405
45.5k
    dst += stride * 4;
1406
45.5k
  } while (--i);
1407
2.84k
}
1408
1409
void aom_h_predictor_32x64_sse2(uint8_t *dst, ptrdiff_t stride,
1410
2.84k
                                const uint8_t *above, const uint8_t *left) {
1411
2.84k
  (void)above;
1412
2.84k
  h_predictor_32xh(dst, stride, left, 64);
1413
2.84k
}
1414
1415
static inline void h_predictor_64xh(uint8_t *dst, ptrdiff_t stride,
1416
66.8k
                                    const uint8_t *left, int height) {
1417
66.8k
  int i = height >> 2;
1418
485k
  do {
1419
485k
    __m128i left4 = _mm_cvtsi32_si128(((int *)left)[0]);
1420
485k
    left4 = _mm_unpacklo_epi8(left4, left4);
1421
485k
    left4 = _mm_unpacklo_epi8(left4, left4);
1422
485k
    const __m128i r0 = _mm_shuffle_epi32(left4, 0x0);
1423
485k
    const __m128i r1 = _mm_shuffle_epi32(left4, 0x55);
1424
485k
    _mm_store_si128((__m128i *)dst, r0);
1425
485k
    _mm_store_si128((__m128i *)(dst + 16), r0);
1426
485k
    _mm_store_si128((__m128i *)(dst + 32), r0);
1427
485k
    _mm_store_si128((__m128i *)(dst + 48), r0);
1428
485k
    _mm_store_si128((__m128i *)(dst + stride), r1);
1429
485k
    _mm_store_si128((__m128i *)(dst + stride + 16), r1);
1430
485k
    _mm_store_si128((__m128i *)(dst + stride + 32), r1);
1431
485k
    _mm_store_si128((__m128i *)(dst + stride + 48), r1);
1432
485k
    const __m128i r2 = _mm_shuffle_epi32(left4, 0xaa);
1433
485k
    const __m128i r3 = _mm_shuffle_epi32(left4, 0xff);
1434
485k
    _mm_store_si128((__m128i *)(dst + stride * 2), r2);
1435
485k
    _mm_store_si128((__m128i *)(dst + stride * 2 + 16), r2);
1436
485k
    _mm_store_si128((__m128i *)(dst + stride * 2 + 32), r2);
1437
485k
    _mm_store_si128((__m128i *)(dst + stride * 2 + 48), r2);
1438
485k
    _mm_store_si128((__m128i *)(dst + stride * 3), r3);
1439
485k
    _mm_store_si128((__m128i *)(dst + stride * 3 + 16), r3);
1440
485k
    _mm_store_si128((__m128i *)(dst + stride * 3 + 32), r3);
1441
485k
    _mm_store_si128((__m128i *)(dst + stride * 3 + 48), r3);
1442
485k
    left += 4;
1443
485k
    dst += stride * 4;
1444
485k
  } while (--i);
1445
66.8k
}
1446
1447
void aom_h_predictor_64x64_sse2(uint8_t *dst, ptrdiff_t stride,
1448
15.1k
                                const uint8_t *above, const uint8_t *left) {
1449
15.1k
  (void)above;
1450
15.1k
  h_predictor_64xh(dst, stride, left, 64);
1451
15.1k
}
1452
1453
void aom_h_predictor_64x32_sse2(uint8_t *dst, ptrdiff_t stride,
1454
9.05k
                                const uint8_t *above, const uint8_t *left) {
1455
9.05k
  (void)above;
1456
9.05k
  h_predictor_64xh(dst, stride, left, 32);
1457
9.05k
}
1458
1459
#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1460
void aom_h_predictor_64x16_sse2(uint8_t *dst, ptrdiff_t stride,
1461
42.6k
                                const uint8_t *above, const uint8_t *left) {
1462
42.6k
  (void)above;
1463
42.6k
  h_predictor_64xh(dst, stride, left, 16);
1464
42.6k
}
1465
#endif  // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER