1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker * Copyright (c) 2017, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker *
4*77c1e3ccSAndroid Build Coastguard Worker * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker */
11*77c1e3ccSAndroid Build Coastguard Worker
12*77c1e3ccSAndroid Build Coastguard Worker #include <tmmintrin.h>
13*77c1e3ccSAndroid Build Coastguard Worker
14*77c1e3ccSAndroid Build Coastguard Worker #include "config/aom_dsp_rtcd.h"
15*77c1e3ccSAndroid Build Coastguard Worker
16*77c1e3ccSAndroid Build Coastguard Worker #include "aom_dsp/intrapred_common.h"
17*77c1e3ccSAndroid Build Coastguard Worker
18*77c1e3ccSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
19*77c1e3ccSAndroid Build Coastguard Worker // PAETH_PRED
20*77c1e3ccSAndroid Build Coastguard Worker
21*77c1e3ccSAndroid Build Coastguard Worker // Return 8 16-bit pixels in one row
paeth_8x1_pred(const __m128i * left,const __m128i * top,const __m128i * topleft)22*77c1e3ccSAndroid Build Coastguard Worker static inline __m128i paeth_8x1_pred(const __m128i *left, const __m128i *top,
23*77c1e3ccSAndroid Build Coastguard Worker const __m128i *topleft) {
24*77c1e3ccSAndroid Build Coastguard Worker const __m128i base = _mm_sub_epi16(_mm_add_epi16(*top, *left), *topleft);
25*77c1e3ccSAndroid Build Coastguard Worker
26*77c1e3ccSAndroid Build Coastguard Worker __m128i pl = _mm_abs_epi16(_mm_sub_epi16(base, *left));
27*77c1e3ccSAndroid Build Coastguard Worker __m128i pt = _mm_abs_epi16(_mm_sub_epi16(base, *top));
28*77c1e3ccSAndroid Build Coastguard Worker __m128i ptl = _mm_abs_epi16(_mm_sub_epi16(base, *topleft));
29*77c1e3ccSAndroid Build Coastguard Worker
30*77c1e3ccSAndroid Build Coastguard Worker __m128i mask1 = _mm_cmpgt_epi16(pl, pt);
31*77c1e3ccSAndroid Build Coastguard Worker mask1 = _mm_or_si128(mask1, _mm_cmpgt_epi16(pl, ptl));
32*77c1e3ccSAndroid Build Coastguard Worker __m128i mask2 = _mm_cmpgt_epi16(pt, ptl);
33*77c1e3ccSAndroid Build Coastguard Worker
34*77c1e3ccSAndroid Build Coastguard Worker pl = _mm_andnot_si128(mask1, *left);
35*77c1e3ccSAndroid Build Coastguard Worker
36*77c1e3ccSAndroid Build Coastguard Worker ptl = _mm_and_si128(mask2, *topleft);
37*77c1e3ccSAndroid Build Coastguard Worker pt = _mm_andnot_si128(mask2, *top);
38*77c1e3ccSAndroid Build Coastguard Worker pt = _mm_or_si128(pt, ptl);
39*77c1e3ccSAndroid Build Coastguard Worker pt = _mm_and_si128(mask1, pt);
40*77c1e3ccSAndroid Build Coastguard Worker
41*77c1e3ccSAndroid Build Coastguard Worker return _mm_or_si128(pl, pt);
42*77c1e3ccSAndroid Build Coastguard Worker }
43*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_4x4_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)44*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_4x4_ssse3(uint8_t *dst, ptrdiff_t stride,
45*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
46*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_loadl_epi64((const __m128i *)left);
47*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_loadl_epi64((const __m128i *)above);
48*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
49*77c1e3ccSAndroid Build Coastguard Worker const __m128i t16 = _mm_unpacklo_epi8(t, zero);
50*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
51*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
52*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
53*77c1e3ccSAndroid Build Coastguard Worker
54*77c1e3ccSAndroid Build Coastguard Worker int i;
55*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 4; ++i) {
56*77c1e3ccSAndroid Build Coastguard Worker const __m128i l16 = _mm_shuffle_epi8(l, rep);
57*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_8x1_pred(&l16, &t16, &tl16);
58*77c1e3ccSAndroid Build Coastguard Worker
59*77c1e3ccSAndroid Build Coastguard Worker *(int *)dst = _mm_cvtsi128_si32(_mm_packus_epi16(row, row));
60*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
61*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
62*77c1e3ccSAndroid Build Coastguard Worker }
63*77c1e3ccSAndroid Build Coastguard Worker }
64*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_4x8_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)65*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_4x8_ssse3(uint8_t *dst, ptrdiff_t stride,
66*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
67*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_loadl_epi64((const __m128i *)left);
68*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_loadl_epi64((const __m128i *)above);
69*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
70*77c1e3ccSAndroid Build Coastguard Worker const __m128i t16 = _mm_unpacklo_epi8(t, zero);
71*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
72*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
73*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
74*77c1e3ccSAndroid Build Coastguard Worker
75*77c1e3ccSAndroid Build Coastguard Worker int i;
76*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 8; ++i) {
77*77c1e3ccSAndroid Build Coastguard Worker const __m128i l16 = _mm_shuffle_epi8(l, rep);
78*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_8x1_pred(&l16, &t16, &tl16);
79*77c1e3ccSAndroid Build Coastguard Worker
80*77c1e3ccSAndroid Build Coastguard Worker *(int *)dst = _mm_cvtsi128_si32(_mm_packus_epi16(row, row));
81*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
82*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
83*77c1e3ccSAndroid Build Coastguard Worker }
84*77c1e3ccSAndroid Build Coastguard Worker }
85*77c1e3ccSAndroid Build Coastguard Worker
86*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_paeth_predictor_4x16_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)87*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_4x16_ssse3(uint8_t *dst, ptrdiff_t stride,
88*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
89*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_load_si128((const __m128i *)left);
90*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_cvtsi32_si128(((const int *)above)[0]);
91*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
92*77c1e3ccSAndroid Build Coastguard Worker const __m128i t16 = _mm_unpacklo_epi8(t, zero);
93*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
94*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
95*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
96*77c1e3ccSAndroid Build Coastguard Worker
97*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < 16; ++i) {
98*77c1e3ccSAndroid Build Coastguard Worker const __m128i l16 = _mm_shuffle_epi8(l, rep);
99*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_8x1_pred(&l16, &t16, &tl16);
100*77c1e3ccSAndroid Build Coastguard Worker
101*77c1e3ccSAndroid Build Coastguard Worker *(int *)dst = _mm_cvtsi128_si32(_mm_packus_epi16(row, row));
102*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
103*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
104*77c1e3ccSAndroid Build Coastguard Worker }
105*77c1e3ccSAndroid Build Coastguard Worker }
106*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
107*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_8x4_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)108*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_8x4_ssse3(uint8_t *dst, ptrdiff_t stride,
109*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
110*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_loadl_epi64((const __m128i *)left);
111*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_loadl_epi64((const __m128i *)above);
112*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
113*77c1e3ccSAndroid Build Coastguard Worker const __m128i t16 = _mm_unpacklo_epi8(t, zero);
114*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
115*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
116*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
117*77c1e3ccSAndroid Build Coastguard Worker
118*77c1e3ccSAndroid Build Coastguard Worker int i;
119*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 4; ++i) {
120*77c1e3ccSAndroid Build Coastguard Worker const __m128i l16 = _mm_shuffle_epi8(l, rep);
121*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_8x1_pred(&l16, &t16, &tl16);
122*77c1e3ccSAndroid Build Coastguard Worker
123*77c1e3ccSAndroid Build Coastguard Worker _mm_storel_epi64((__m128i *)dst, _mm_packus_epi16(row, row));
124*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
125*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
126*77c1e3ccSAndroid Build Coastguard Worker }
127*77c1e3ccSAndroid Build Coastguard Worker }
128*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_8x8_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)129*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_8x8_ssse3(uint8_t *dst, ptrdiff_t stride,
130*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
131*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_loadl_epi64((const __m128i *)left);
132*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_loadl_epi64((const __m128i *)above);
133*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
134*77c1e3ccSAndroid Build Coastguard Worker const __m128i t16 = _mm_unpacklo_epi8(t, zero);
135*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
136*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
137*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
138*77c1e3ccSAndroid Build Coastguard Worker
139*77c1e3ccSAndroid Build Coastguard Worker int i;
140*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 8; ++i) {
141*77c1e3ccSAndroid Build Coastguard Worker const __m128i l16 = _mm_shuffle_epi8(l, rep);
142*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_8x1_pred(&l16, &t16, &tl16);
143*77c1e3ccSAndroid Build Coastguard Worker
144*77c1e3ccSAndroid Build Coastguard Worker _mm_storel_epi64((__m128i *)dst, _mm_packus_epi16(row, row));
145*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
146*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
147*77c1e3ccSAndroid Build Coastguard Worker }
148*77c1e3ccSAndroid Build Coastguard Worker }
149*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_8x16_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)150*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_8x16_ssse3(uint8_t *dst, ptrdiff_t stride,
151*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
152*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_load_si128((const __m128i *)left);
153*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_loadl_epi64((const __m128i *)above);
154*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
155*77c1e3ccSAndroid Build Coastguard Worker const __m128i t16 = _mm_unpacklo_epi8(t, zero);
156*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
157*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
158*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
159*77c1e3ccSAndroid Build Coastguard Worker
160*77c1e3ccSAndroid Build Coastguard Worker int i;
161*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
162*77c1e3ccSAndroid Build Coastguard Worker const __m128i l16 = _mm_shuffle_epi8(l, rep);
163*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_8x1_pred(&l16, &t16, &tl16);
164*77c1e3ccSAndroid Build Coastguard Worker
165*77c1e3ccSAndroid Build Coastguard Worker _mm_storel_epi64((__m128i *)dst, _mm_packus_epi16(row, row));
166*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
167*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
168*77c1e3ccSAndroid Build Coastguard Worker }
169*77c1e3ccSAndroid Build Coastguard Worker }
170*77c1e3ccSAndroid Build Coastguard Worker
171*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_paeth_predictor_8x32_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)172*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_8x32_ssse3(uint8_t *dst, ptrdiff_t stride,
173*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
174*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_loadl_epi64((const __m128i *)above);
175*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
176*77c1e3ccSAndroid Build Coastguard Worker const __m128i t16 = _mm_unpacklo_epi8(t, zero);
177*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
178*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
179*77c1e3ccSAndroid Build Coastguard Worker
180*77c1e3ccSAndroid Build Coastguard Worker for (int j = 0; j < 2; ++j) {
181*77c1e3ccSAndroid Build Coastguard Worker const __m128i l = _mm_load_si128((const __m128i *)(left + j * 16));
182*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
183*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < 16; ++i) {
184*77c1e3ccSAndroid Build Coastguard Worker const __m128i l16 = _mm_shuffle_epi8(l, rep);
185*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_8x1_pred(&l16, &t16, &tl16);
186*77c1e3ccSAndroid Build Coastguard Worker
187*77c1e3ccSAndroid Build Coastguard Worker _mm_storel_epi64((__m128i *)dst, _mm_packus_epi16(row, row));
188*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
189*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
190*77c1e3ccSAndroid Build Coastguard Worker }
191*77c1e3ccSAndroid Build Coastguard Worker }
192*77c1e3ccSAndroid Build Coastguard Worker }
193*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
194*77c1e3ccSAndroid Build Coastguard Worker
195*77c1e3ccSAndroid Build Coastguard Worker // Return 16 8-bit pixels in one row
paeth_16x1_pred(const __m128i * left,const __m128i * top0,const __m128i * top1,const __m128i * topleft)196*77c1e3ccSAndroid Build Coastguard Worker static inline __m128i paeth_16x1_pred(const __m128i *left, const __m128i *top0,
197*77c1e3ccSAndroid Build Coastguard Worker const __m128i *top1,
198*77c1e3ccSAndroid Build Coastguard Worker const __m128i *topleft) {
199*77c1e3ccSAndroid Build Coastguard Worker const __m128i p0 = paeth_8x1_pred(left, top0, topleft);
200*77c1e3ccSAndroid Build Coastguard Worker const __m128i p1 = paeth_8x1_pred(left, top1, topleft);
201*77c1e3ccSAndroid Build Coastguard Worker return _mm_packus_epi16(p0, p1);
202*77c1e3ccSAndroid Build Coastguard Worker }
203*77c1e3ccSAndroid Build Coastguard Worker
204*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_paeth_predictor_16x4_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)205*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_16x4_ssse3(uint8_t *dst, ptrdiff_t stride,
206*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
207*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_cvtsi32_si128(((const int *)left)[0]);
208*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_load_si128((const __m128i *)above);
209*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
210*77c1e3ccSAndroid Build Coastguard Worker const __m128i top0 = _mm_unpacklo_epi8(t, zero);
211*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = _mm_unpackhi_epi8(t, zero);
212*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
213*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
214*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
215*77c1e3ccSAndroid Build Coastguard Worker
216*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < 4; ++i) {
217*77c1e3ccSAndroid Build Coastguard Worker const __m128i l16 = _mm_shuffle_epi8(l, rep);
218*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_16x1_pred(&l16, &top0, &top1, &tl16);
219*77c1e3ccSAndroid Build Coastguard Worker
220*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, row);
221*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
222*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
223*77c1e3ccSAndroid Build Coastguard Worker }
224*77c1e3ccSAndroid Build Coastguard Worker }
225*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
226*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_16x8_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)227*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_16x8_ssse3(uint8_t *dst, ptrdiff_t stride,
228*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
229*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_loadl_epi64((const __m128i *)left);
230*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_load_si128((const __m128i *)above);
231*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
232*77c1e3ccSAndroid Build Coastguard Worker const __m128i top0 = _mm_unpacklo_epi8(t, zero);
233*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = _mm_unpackhi_epi8(t, zero);
234*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
235*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
236*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
237*77c1e3ccSAndroid Build Coastguard Worker
238*77c1e3ccSAndroid Build Coastguard Worker int i;
239*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 8; ++i) {
240*77c1e3ccSAndroid Build Coastguard Worker const __m128i l16 = _mm_shuffle_epi8(l, rep);
241*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_16x1_pred(&l16, &top0, &top1, &tl16);
242*77c1e3ccSAndroid Build Coastguard Worker
243*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, row);
244*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
245*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
246*77c1e3ccSAndroid Build Coastguard Worker }
247*77c1e3ccSAndroid Build Coastguard Worker }
248*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_16x16_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)249*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_16x16_ssse3(uint8_t *dst, ptrdiff_t stride,
250*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
251*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
252*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_load_si128((const __m128i *)left);
253*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_load_si128((const __m128i *)above);
254*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
255*77c1e3ccSAndroid Build Coastguard Worker const __m128i top0 = _mm_unpacklo_epi8(t, zero);
256*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = _mm_unpackhi_epi8(t, zero);
257*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
258*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
259*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
260*77c1e3ccSAndroid Build Coastguard Worker
261*77c1e3ccSAndroid Build Coastguard Worker int i;
262*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
263*77c1e3ccSAndroid Build Coastguard Worker const __m128i l16 = _mm_shuffle_epi8(l, rep);
264*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_16x1_pred(&l16, &top0, &top1, &tl16);
265*77c1e3ccSAndroid Build Coastguard Worker
266*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, row);
267*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
268*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
269*77c1e3ccSAndroid Build Coastguard Worker }
270*77c1e3ccSAndroid Build Coastguard Worker }
271*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_16x32_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)272*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_16x32_ssse3(uint8_t *dst, ptrdiff_t stride,
273*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
274*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
275*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_load_si128((const __m128i *)left);
276*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_load_si128((const __m128i *)above);
277*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
278*77c1e3ccSAndroid Build Coastguard Worker const __m128i top0 = _mm_unpacklo_epi8(t, zero);
279*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = _mm_unpackhi_epi8(t, zero);
280*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
281*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
282*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
283*77c1e3ccSAndroid Build Coastguard Worker __m128i l16;
284*77c1e3ccSAndroid Build Coastguard Worker
285*77c1e3ccSAndroid Build Coastguard Worker int i;
286*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
287*77c1e3ccSAndroid Build Coastguard Worker l16 = _mm_shuffle_epi8(l, rep);
288*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_16x1_pred(&l16, &top0, &top1, &tl16);
289*77c1e3ccSAndroid Build Coastguard Worker
290*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, row);
291*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
292*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
293*77c1e3ccSAndroid Build Coastguard Worker }
294*77c1e3ccSAndroid Build Coastguard Worker
295*77c1e3ccSAndroid Build Coastguard Worker l = _mm_load_si128((const __m128i *)(left + 16));
296*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_set1_epi16((short)0x8000);
297*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
298*77c1e3ccSAndroid Build Coastguard Worker l16 = _mm_shuffle_epi8(l, rep);
299*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_16x1_pred(&l16, &top0, &top1, &tl16);
300*77c1e3ccSAndroid Build Coastguard Worker
301*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, row);
302*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
303*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
304*77c1e3ccSAndroid Build Coastguard Worker }
305*77c1e3ccSAndroid Build Coastguard Worker }
306*77c1e3ccSAndroid Build Coastguard Worker
307*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_paeth_predictor_16x64_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)308*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_16x64_ssse3(uint8_t *dst, ptrdiff_t stride,
309*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
310*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
311*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_load_si128((const __m128i *)above);
312*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
313*77c1e3ccSAndroid Build Coastguard Worker const __m128i top0 = _mm_unpacklo_epi8(t, zero);
314*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = _mm_unpackhi_epi8(t, zero);
315*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
316*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
317*77c1e3ccSAndroid Build Coastguard Worker
318*77c1e3ccSAndroid Build Coastguard Worker for (int j = 0; j < 4; ++j) {
319*77c1e3ccSAndroid Build Coastguard Worker const __m128i l = _mm_load_si128((const __m128i *)(left + j * 16));
320*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
321*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < 16; ++i) {
322*77c1e3ccSAndroid Build Coastguard Worker const __m128i l16 = _mm_shuffle_epi8(l, rep);
323*77c1e3ccSAndroid Build Coastguard Worker const __m128i row = paeth_16x1_pred(&l16, &top0, &top1, &tl16);
324*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, row);
325*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
326*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
327*77c1e3ccSAndroid Build Coastguard Worker }
328*77c1e3ccSAndroid Build Coastguard Worker }
329*77c1e3ccSAndroid Build Coastguard Worker }
330*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_32x8_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)331*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_32x8_ssse3(uint8_t *dst, ptrdiff_t stride,
332*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
333*77c1e3ccSAndroid Build Coastguard Worker const __m128i a = _mm_load_si128((const __m128i *)above);
334*77c1e3ccSAndroid Build Coastguard Worker const __m128i b = _mm_load_si128((const __m128i *)(above + 16));
335*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
336*77c1e3ccSAndroid Build Coastguard Worker const __m128i al = _mm_unpacklo_epi8(a, zero);
337*77c1e3ccSAndroid Build Coastguard Worker const __m128i ah = _mm_unpackhi_epi8(a, zero);
338*77c1e3ccSAndroid Build Coastguard Worker const __m128i bl = _mm_unpacklo_epi8(b, zero);
339*77c1e3ccSAndroid Build Coastguard Worker const __m128i bh = _mm_unpackhi_epi8(b, zero);
340*77c1e3ccSAndroid Build Coastguard Worker
341*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
342*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
343*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
344*77c1e3ccSAndroid Build Coastguard Worker const __m128i l = _mm_loadl_epi64((const __m128i *)left);
345*77c1e3ccSAndroid Build Coastguard Worker __m128i l16;
346*77c1e3ccSAndroid Build Coastguard Worker
347*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < 8; ++i) {
348*77c1e3ccSAndroid Build Coastguard Worker l16 = _mm_shuffle_epi8(l, rep);
349*77c1e3ccSAndroid Build Coastguard Worker const __m128i r32l = paeth_16x1_pred(&l16, &al, &ah, &tl16);
350*77c1e3ccSAndroid Build Coastguard Worker const __m128i r32h = paeth_16x1_pred(&l16, &bl, &bh, &tl16);
351*77c1e3ccSAndroid Build Coastguard Worker
352*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, r32l);
353*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 16), r32h);
354*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
355*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
356*77c1e3ccSAndroid Build Coastguard Worker }
357*77c1e3ccSAndroid Build Coastguard Worker }
358*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
359*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_32x16_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)360*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_32x16_ssse3(uint8_t *dst, ptrdiff_t stride,
361*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
362*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
363*77c1e3ccSAndroid Build Coastguard Worker const __m128i a = _mm_load_si128((const __m128i *)above);
364*77c1e3ccSAndroid Build Coastguard Worker const __m128i b = _mm_load_si128((const __m128i *)(above + 16));
365*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
366*77c1e3ccSAndroid Build Coastguard Worker const __m128i al = _mm_unpacklo_epi8(a, zero);
367*77c1e3ccSAndroid Build Coastguard Worker const __m128i ah = _mm_unpackhi_epi8(a, zero);
368*77c1e3ccSAndroid Build Coastguard Worker const __m128i bl = _mm_unpacklo_epi8(b, zero);
369*77c1e3ccSAndroid Build Coastguard Worker const __m128i bh = _mm_unpackhi_epi8(b, zero);
370*77c1e3ccSAndroid Build Coastguard Worker
371*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
372*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
373*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
374*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_load_si128((const __m128i *)left);
375*77c1e3ccSAndroid Build Coastguard Worker __m128i l16;
376*77c1e3ccSAndroid Build Coastguard Worker
377*77c1e3ccSAndroid Build Coastguard Worker int i;
378*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
379*77c1e3ccSAndroid Build Coastguard Worker l16 = _mm_shuffle_epi8(l, rep);
380*77c1e3ccSAndroid Build Coastguard Worker const __m128i r32l = paeth_16x1_pred(&l16, &al, &ah, &tl16);
381*77c1e3ccSAndroid Build Coastguard Worker const __m128i r32h = paeth_16x1_pred(&l16, &bl, &bh, &tl16);
382*77c1e3ccSAndroid Build Coastguard Worker
383*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, r32l);
384*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 16), r32h);
385*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
386*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
387*77c1e3ccSAndroid Build Coastguard Worker }
388*77c1e3ccSAndroid Build Coastguard Worker }
389*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_32x32_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)390*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_32x32_ssse3(uint8_t *dst, ptrdiff_t stride,
391*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
392*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
393*77c1e3ccSAndroid Build Coastguard Worker const __m128i a = _mm_load_si128((const __m128i *)above);
394*77c1e3ccSAndroid Build Coastguard Worker const __m128i b = _mm_load_si128((const __m128i *)(above + 16));
395*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
396*77c1e3ccSAndroid Build Coastguard Worker const __m128i al = _mm_unpacklo_epi8(a, zero);
397*77c1e3ccSAndroid Build Coastguard Worker const __m128i ah = _mm_unpackhi_epi8(a, zero);
398*77c1e3ccSAndroid Build Coastguard Worker const __m128i bl = _mm_unpacklo_epi8(b, zero);
399*77c1e3ccSAndroid Build Coastguard Worker const __m128i bh = _mm_unpackhi_epi8(b, zero);
400*77c1e3ccSAndroid Build Coastguard Worker
401*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
402*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
403*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
404*77c1e3ccSAndroid Build Coastguard Worker __m128i l = _mm_load_si128((const __m128i *)left);
405*77c1e3ccSAndroid Build Coastguard Worker __m128i l16;
406*77c1e3ccSAndroid Build Coastguard Worker
407*77c1e3ccSAndroid Build Coastguard Worker int i;
408*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
409*77c1e3ccSAndroid Build Coastguard Worker l16 = _mm_shuffle_epi8(l, rep);
410*77c1e3ccSAndroid Build Coastguard Worker const __m128i r32l = paeth_16x1_pred(&l16, &al, &ah, &tl16);
411*77c1e3ccSAndroid Build Coastguard Worker const __m128i r32h = paeth_16x1_pred(&l16, &bl, &bh, &tl16);
412*77c1e3ccSAndroid Build Coastguard Worker
413*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, r32l);
414*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 16), r32h);
415*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
416*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
417*77c1e3ccSAndroid Build Coastguard Worker }
418*77c1e3ccSAndroid Build Coastguard Worker
419*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_set1_epi16((short)0x8000);
420*77c1e3ccSAndroid Build Coastguard Worker l = _mm_load_si128((const __m128i *)(left + 16));
421*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
422*77c1e3ccSAndroid Build Coastguard Worker l16 = _mm_shuffle_epi8(l, rep);
423*77c1e3ccSAndroid Build Coastguard Worker const __m128i r32l = paeth_16x1_pred(&l16, &al, &ah, &tl16);
424*77c1e3ccSAndroid Build Coastguard Worker const __m128i r32h = paeth_16x1_pred(&l16, &bl, &bh, &tl16);
425*77c1e3ccSAndroid Build Coastguard Worker
426*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, r32l);
427*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 16), r32h);
428*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
429*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
430*77c1e3ccSAndroid Build Coastguard Worker }
431*77c1e3ccSAndroid Build Coastguard Worker }
432*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_32x64_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)433*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_32x64_ssse3(uint8_t *dst, ptrdiff_t stride,
434*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
435*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
436*77c1e3ccSAndroid Build Coastguard Worker const __m128i a = _mm_load_si128((const __m128i *)above);
437*77c1e3ccSAndroid Build Coastguard Worker const __m128i b = _mm_load_si128((const __m128i *)(above + 16));
438*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
439*77c1e3ccSAndroid Build Coastguard Worker const __m128i al = _mm_unpacklo_epi8(a, zero);
440*77c1e3ccSAndroid Build Coastguard Worker const __m128i ah = _mm_unpackhi_epi8(a, zero);
441*77c1e3ccSAndroid Build Coastguard Worker const __m128i bl = _mm_unpacklo_epi8(b, zero);
442*77c1e3ccSAndroid Build Coastguard Worker const __m128i bh = _mm_unpackhi_epi8(b, zero);
443*77c1e3ccSAndroid Build Coastguard Worker
444*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
445*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
446*77c1e3ccSAndroid Build Coastguard Worker __m128i l16;
447*77c1e3ccSAndroid Build Coastguard Worker
448*77c1e3ccSAndroid Build Coastguard Worker int i, j;
449*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < 4; ++j) {
450*77c1e3ccSAndroid Build Coastguard Worker const __m128i l = _mm_load_si128((const __m128i *)(left + j * 16));
451*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
452*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
453*77c1e3ccSAndroid Build Coastguard Worker l16 = _mm_shuffle_epi8(l, rep);
454*77c1e3ccSAndroid Build Coastguard Worker const __m128i r32l = paeth_16x1_pred(&l16, &al, &ah, &tl16);
455*77c1e3ccSAndroid Build Coastguard Worker const __m128i r32h = paeth_16x1_pred(&l16, &bl, &bh, &tl16);
456*77c1e3ccSAndroid Build Coastguard Worker
457*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, r32l);
458*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 16), r32h);
459*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
460*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
461*77c1e3ccSAndroid Build Coastguard Worker }
462*77c1e3ccSAndroid Build Coastguard Worker }
463*77c1e3ccSAndroid Build Coastguard Worker }
464*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_64x32_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)465*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_64x32_ssse3(uint8_t *dst, ptrdiff_t stride,
466*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
467*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
468*77c1e3ccSAndroid Build Coastguard Worker const __m128i a = _mm_load_si128((const __m128i *)above);
469*77c1e3ccSAndroid Build Coastguard Worker const __m128i b = _mm_load_si128((const __m128i *)(above + 16));
470*77c1e3ccSAndroid Build Coastguard Worker const __m128i c = _mm_load_si128((const __m128i *)(above + 32));
471*77c1e3ccSAndroid Build Coastguard Worker const __m128i d = _mm_load_si128((const __m128i *)(above + 48));
472*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
473*77c1e3ccSAndroid Build Coastguard Worker const __m128i al = _mm_unpacklo_epi8(a, zero);
474*77c1e3ccSAndroid Build Coastguard Worker const __m128i ah = _mm_unpackhi_epi8(a, zero);
475*77c1e3ccSAndroid Build Coastguard Worker const __m128i bl = _mm_unpacklo_epi8(b, zero);
476*77c1e3ccSAndroid Build Coastguard Worker const __m128i bh = _mm_unpackhi_epi8(b, zero);
477*77c1e3ccSAndroid Build Coastguard Worker const __m128i cl = _mm_unpacklo_epi8(c, zero);
478*77c1e3ccSAndroid Build Coastguard Worker const __m128i ch = _mm_unpackhi_epi8(c, zero);
479*77c1e3ccSAndroid Build Coastguard Worker const __m128i dl = _mm_unpacklo_epi8(d, zero);
480*77c1e3ccSAndroid Build Coastguard Worker const __m128i dh = _mm_unpackhi_epi8(d, zero);
481*77c1e3ccSAndroid Build Coastguard Worker
482*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
483*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
484*77c1e3ccSAndroid Build Coastguard Worker __m128i l16;
485*77c1e3ccSAndroid Build Coastguard Worker
486*77c1e3ccSAndroid Build Coastguard Worker int i, j;
487*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < 2; ++j) {
488*77c1e3ccSAndroid Build Coastguard Worker const __m128i l = _mm_load_si128((const __m128i *)(left + j * 16));
489*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
490*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
491*77c1e3ccSAndroid Build Coastguard Worker l16 = _mm_shuffle_epi8(l, rep);
492*77c1e3ccSAndroid Build Coastguard Worker const __m128i r0 = paeth_16x1_pred(&l16, &al, &ah, &tl16);
493*77c1e3ccSAndroid Build Coastguard Worker const __m128i r1 = paeth_16x1_pred(&l16, &bl, &bh, &tl16);
494*77c1e3ccSAndroid Build Coastguard Worker const __m128i r2 = paeth_16x1_pred(&l16, &cl, &ch, &tl16);
495*77c1e3ccSAndroid Build Coastguard Worker const __m128i r3 = paeth_16x1_pred(&l16, &dl, &dh, &tl16);
496*77c1e3ccSAndroid Build Coastguard Worker
497*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, r0);
498*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 16), r1);
499*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 32), r2);
500*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 48), r3);
501*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
502*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
503*77c1e3ccSAndroid Build Coastguard Worker }
504*77c1e3ccSAndroid Build Coastguard Worker }
505*77c1e3ccSAndroid Build Coastguard Worker }
506*77c1e3ccSAndroid Build Coastguard Worker
aom_paeth_predictor_64x64_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)507*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_64x64_ssse3(uint8_t *dst, ptrdiff_t stride,
508*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
509*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
510*77c1e3ccSAndroid Build Coastguard Worker const __m128i a = _mm_load_si128((const __m128i *)above);
511*77c1e3ccSAndroid Build Coastguard Worker const __m128i b = _mm_load_si128((const __m128i *)(above + 16));
512*77c1e3ccSAndroid Build Coastguard Worker const __m128i c = _mm_load_si128((const __m128i *)(above + 32));
513*77c1e3ccSAndroid Build Coastguard Worker const __m128i d = _mm_load_si128((const __m128i *)(above + 48));
514*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
515*77c1e3ccSAndroid Build Coastguard Worker const __m128i al = _mm_unpacklo_epi8(a, zero);
516*77c1e3ccSAndroid Build Coastguard Worker const __m128i ah = _mm_unpackhi_epi8(a, zero);
517*77c1e3ccSAndroid Build Coastguard Worker const __m128i bl = _mm_unpacklo_epi8(b, zero);
518*77c1e3ccSAndroid Build Coastguard Worker const __m128i bh = _mm_unpackhi_epi8(b, zero);
519*77c1e3ccSAndroid Build Coastguard Worker const __m128i cl = _mm_unpacklo_epi8(c, zero);
520*77c1e3ccSAndroid Build Coastguard Worker const __m128i ch = _mm_unpackhi_epi8(c, zero);
521*77c1e3ccSAndroid Build Coastguard Worker const __m128i dl = _mm_unpacklo_epi8(d, zero);
522*77c1e3ccSAndroid Build Coastguard Worker const __m128i dh = _mm_unpackhi_epi8(d, zero);
523*77c1e3ccSAndroid Build Coastguard Worker
524*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
525*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
526*77c1e3ccSAndroid Build Coastguard Worker __m128i l16;
527*77c1e3ccSAndroid Build Coastguard Worker
528*77c1e3ccSAndroid Build Coastguard Worker int i, j;
529*77c1e3ccSAndroid Build Coastguard Worker for (j = 0; j < 4; ++j) {
530*77c1e3ccSAndroid Build Coastguard Worker const __m128i l = _mm_load_si128((const __m128i *)(left + j * 16));
531*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
532*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
533*77c1e3ccSAndroid Build Coastguard Worker l16 = _mm_shuffle_epi8(l, rep);
534*77c1e3ccSAndroid Build Coastguard Worker const __m128i r0 = paeth_16x1_pred(&l16, &al, &ah, &tl16);
535*77c1e3ccSAndroid Build Coastguard Worker const __m128i r1 = paeth_16x1_pred(&l16, &bl, &bh, &tl16);
536*77c1e3ccSAndroid Build Coastguard Worker const __m128i r2 = paeth_16x1_pred(&l16, &cl, &ch, &tl16);
537*77c1e3ccSAndroid Build Coastguard Worker const __m128i r3 = paeth_16x1_pred(&l16, &dl, &dh, &tl16);
538*77c1e3ccSAndroid Build Coastguard Worker
539*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, r0);
540*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 16), r1);
541*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 32), r2);
542*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 48), r3);
543*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
544*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
545*77c1e3ccSAndroid Build Coastguard Worker }
546*77c1e3ccSAndroid Build Coastguard Worker }
547*77c1e3ccSAndroid Build Coastguard Worker }
548*77c1e3ccSAndroid Build Coastguard Worker
549*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_paeth_predictor_64x16_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)550*77c1e3ccSAndroid Build Coastguard Worker void aom_paeth_predictor_64x16_ssse3(uint8_t *dst, ptrdiff_t stride,
551*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
552*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
553*77c1e3ccSAndroid Build Coastguard Worker const __m128i a = _mm_load_si128((const __m128i *)above);
554*77c1e3ccSAndroid Build Coastguard Worker const __m128i b = _mm_load_si128((const __m128i *)(above + 16));
555*77c1e3ccSAndroid Build Coastguard Worker const __m128i c = _mm_load_si128((const __m128i *)(above + 32));
556*77c1e3ccSAndroid Build Coastguard Worker const __m128i d = _mm_load_si128((const __m128i *)(above + 48));
557*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
558*77c1e3ccSAndroid Build Coastguard Worker const __m128i al = _mm_unpacklo_epi8(a, zero);
559*77c1e3ccSAndroid Build Coastguard Worker const __m128i ah = _mm_unpackhi_epi8(a, zero);
560*77c1e3ccSAndroid Build Coastguard Worker const __m128i bl = _mm_unpacklo_epi8(b, zero);
561*77c1e3ccSAndroid Build Coastguard Worker const __m128i bh = _mm_unpackhi_epi8(b, zero);
562*77c1e3ccSAndroid Build Coastguard Worker const __m128i cl = _mm_unpacklo_epi8(c, zero);
563*77c1e3ccSAndroid Build Coastguard Worker const __m128i ch = _mm_unpackhi_epi8(c, zero);
564*77c1e3ccSAndroid Build Coastguard Worker const __m128i dl = _mm_unpacklo_epi8(d, zero);
565*77c1e3ccSAndroid Build Coastguard Worker const __m128i dh = _mm_unpackhi_epi8(d, zero);
566*77c1e3ccSAndroid Build Coastguard Worker
567*77c1e3ccSAndroid Build Coastguard Worker const __m128i tl16 = _mm_set1_epi16((int16_t)above[-1]);
568*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
569*77c1e3ccSAndroid Build Coastguard Worker __m128i l16;
570*77c1e3ccSAndroid Build Coastguard Worker
571*77c1e3ccSAndroid Build Coastguard Worker int i;
572*77c1e3ccSAndroid Build Coastguard Worker const __m128i l = _mm_load_si128((const __m128i *)left);
573*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = _mm_set1_epi16((short)0x8000);
574*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
575*77c1e3ccSAndroid Build Coastguard Worker l16 = _mm_shuffle_epi8(l, rep);
576*77c1e3ccSAndroid Build Coastguard Worker const __m128i r0 = paeth_16x1_pred(&l16, &al, &ah, &tl16);
577*77c1e3ccSAndroid Build Coastguard Worker const __m128i r1 = paeth_16x1_pred(&l16, &bl, &bh, &tl16);
578*77c1e3ccSAndroid Build Coastguard Worker const __m128i r2 = paeth_16x1_pred(&l16, &cl, &ch, &tl16);
579*77c1e3ccSAndroid Build Coastguard Worker const __m128i r3 = paeth_16x1_pred(&l16, &dl, &dh, &tl16);
580*77c1e3ccSAndroid Build Coastguard Worker
581*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)dst, r0);
582*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 16), r1);
583*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 32), r2);
584*77c1e3ccSAndroid Build Coastguard Worker _mm_store_si128((__m128i *)(dst + 48), r3);
585*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
586*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
587*77c1e3ccSAndroid Build Coastguard Worker }
588*77c1e3ccSAndroid Build Coastguard Worker }
589*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
590*77c1e3ccSAndroid Build Coastguard Worker
591*77c1e3ccSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
592*77c1e3ccSAndroid Build Coastguard Worker // SMOOTH_PRED
593*77c1e3ccSAndroid Build Coastguard Worker
594*77c1e3ccSAndroid Build Coastguard Worker // pixels[0]: above and below_pred interleave vector
595*77c1e3ccSAndroid Build Coastguard Worker // pixels[1]: left vector
596*77c1e3ccSAndroid Build Coastguard Worker // pixels[2]: right_pred vector
load_pixel_w4(const uint8_t * above,const uint8_t * left,int height,__m128i * pixels)597*77c1e3ccSAndroid Build Coastguard Worker static inline void load_pixel_w4(const uint8_t *above, const uint8_t *left,
598*77c1e3ccSAndroid Build Coastguard Worker int height, __m128i *pixels) {
599*77c1e3ccSAndroid Build Coastguard Worker __m128i d = _mm_cvtsi32_si128(((const int *)above)[0]);
600*77c1e3ccSAndroid Build Coastguard Worker if (height == 4)
601*77c1e3ccSAndroid Build Coastguard Worker pixels[1] = _mm_cvtsi32_si128(((const int *)left)[0]);
602*77c1e3ccSAndroid Build Coastguard Worker else if (height == 8)
603*77c1e3ccSAndroid Build Coastguard Worker pixels[1] = _mm_loadl_epi64(((const __m128i *)left));
604*77c1e3ccSAndroid Build Coastguard Worker else
605*77c1e3ccSAndroid Build Coastguard Worker pixels[1] = _mm_loadu_si128(((const __m128i *)left));
606*77c1e3ccSAndroid Build Coastguard Worker
607*77c1e3ccSAndroid Build Coastguard Worker pixels[2] = _mm_set1_epi16((int16_t)above[3]);
608*77c1e3ccSAndroid Build Coastguard Worker
609*77c1e3ccSAndroid Build Coastguard Worker const __m128i bp = _mm_set1_epi16((int16_t)left[height - 1]);
610*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
611*77c1e3ccSAndroid Build Coastguard Worker d = _mm_unpacklo_epi8(d, zero);
612*77c1e3ccSAndroid Build Coastguard Worker pixels[0] = _mm_unpacklo_epi16(d, bp);
613*77c1e3ccSAndroid Build Coastguard Worker }
614*77c1e3ccSAndroid Build Coastguard Worker
615*77c1e3ccSAndroid Build Coastguard Worker // weight_h[0]: weight_h vector
616*77c1e3ccSAndroid Build Coastguard Worker // weight_h[1]: scale - weight_h vector
617*77c1e3ccSAndroid Build Coastguard Worker // weight_h[2]: same as [0], second half for height = 16 only
618*77c1e3ccSAndroid Build Coastguard Worker // weight_h[3]: same as [1], second half for height = 16 only
619*77c1e3ccSAndroid Build Coastguard Worker // weight_w[0]: weights_w and scale - weights_w interleave vector
load_weight_w4(int height,__m128i * weight_h,__m128i * weight_w)620*77c1e3ccSAndroid Build Coastguard Worker static inline void load_weight_w4(int height, __m128i *weight_h,
621*77c1e3ccSAndroid Build Coastguard Worker __m128i *weight_w) {
622*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
623*77c1e3ccSAndroid Build Coastguard Worker const __m128i d = _mm_set1_epi16((int16_t)(1 << SMOOTH_WEIGHT_LOG2_SCALE));
624*77c1e3ccSAndroid Build Coastguard Worker const __m128i t = _mm_cvtsi32_si128(((const int *)smooth_weights)[0]);
625*77c1e3ccSAndroid Build Coastguard Worker weight_h[0] = _mm_unpacklo_epi8(t, zero);
626*77c1e3ccSAndroid Build Coastguard Worker weight_h[1] = _mm_sub_epi16(d, weight_h[0]);
627*77c1e3ccSAndroid Build Coastguard Worker weight_w[0] = _mm_unpacklo_epi16(weight_h[0], weight_h[1]);
628*77c1e3ccSAndroid Build Coastguard Worker
629*77c1e3ccSAndroid Build Coastguard Worker if (height == 8) {
630*77c1e3ccSAndroid Build Coastguard Worker const __m128i weight = _mm_loadl_epi64((const __m128i *)&smooth_weights[4]);
631*77c1e3ccSAndroid Build Coastguard Worker weight_h[0] = _mm_unpacklo_epi8(weight, zero);
632*77c1e3ccSAndroid Build Coastguard Worker weight_h[1] = _mm_sub_epi16(d, weight_h[0]);
633*77c1e3ccSAndroid Build Coastguard Worker } else if (height == 16) {
634*77c1e3ccSAndroid Build Coastguard Worker const __m128i weight =
635*77c1e3ccSAndroid Build Coastguard Worker _mm_loadu_si128((const __m128i *)&smooth_weights[12]);
636*77c1e3ccSAndroid Build Coastguard Worker weight_h[0] = _mm_unpacklo_epi8(weight, zero);
637*77c1e3ccSAndroid Build Coastguard Worker weight_h[1] = _mm_sub_epi16(d, weight_h[0]);
638*77c1e3ccSAndroid Build Coastguard Worker weight_h[2] = _mm_unpackhi_epi8(weight, zero);
639*77c1e3ccSAndroid Build Coastguard Worker weight_h[3] = _mm_sub_epi16(d, weight_h[2]);
640*77c1e3ccSAndroid Build Coastguard Worker }
641*77c1e3ccSAndroid Build Coastguard Worker }
642*77c1e3ccSAndroid Build Coastguard Worker
smooth_pred_4xh(const __m128i * pixel,const __m128i * wh,const __m128i * ww,int h,uint8_t * dst,ptrdiff_t stride,int second_half)643*77c1e3ccSAndroid Build Coastguard Worker static inline void smooth_pred_4xh(const __m128i *pixel, const __m128i *wh,
644*77c1e3ccSAndroid Build Coastguard Worker const __m128i *ww, int h, uint8_t *dst,
645*77c1e3ccSAndroid Build Coastguard Worker ptrdiff_t stride, int second_half) {
646*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi32((1 << SMOOTH_WEIGHT_LOG2_SCALE));
647*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
648*77c1e3ccSAndroid Build Coastguard Worker const __m128i inc = _mm_set1_epi16(0x202);
649*77c1e3ccSAndroid Build Coastguard Worker const __m128i gat = _mm_set1_epi32(0xc080400);
650*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = second_half ? _mm_set1_epi16((short)0x8008)
651*77c1e3ccSAndroid Build Coastguard Worker : _mm_set1_epi16((short)0x8000);
652*77c1e3ccSAndroid Build Coastguard Worker __m128i d = _mm_set1_epi16(0x100);
653*77c1e3ccSAndroid Build Coastguard Worker
654*77c1e3ccSAndroid Build Coastguard Worker for (int i = 0; i < h; ++i) {
655*77c1e3ccSAndroid Build Coastguard Worker const __m128i wg_wg = _mm_shuffle_epi8(wh[0], d);
656*77c1e3ccSAndroid Build Coastguard Worker const __m128i sc_sc = _mm_shuffle_epi8(wh[1], d);
657*77c1e3ccSAndroid Build Coastguard Worker const __m128i wh_sc = _mm_unpacklo_epi16(wg_wg, sc_sc);
658*77c1e3ccSAndroid Build Coastguard Worker __m128i s = _mm_madd_epi16(pixel[0], wh_sc);
659*77c1e3ccSAndroid Build Coastguard Worker
660*77c1e3ccSAndroid Build Coastguard Worker __m128i b = _mm_shuffle_epi8(pixel[1], rep);
661*77c1e3ccSAndroid Build Coastguard Worker b = _mm_unpacklo_epi16(b, pixel[2]);
662*77c1e3ccSAndroid Build Coastguard Worker __m128i sum = _mm_madd_epi16(b, ww[0]);
663*77c1e3ccSAndroid Build Coastguard Worker
664*77c1e3ccSAndroid Build Coastguard Worker sum = _mm_add_epi32(s, sum);
665*77c1e3ccSAndroid Build Coastguard Worker sum = _mm_add_epi32(sum, round);
666*77c1e3ccSAndroid Build Coastguard Worker sum = _mm_srai_epi32(sum, 1 + SMOOTH_WEIGHT_LOG2_SCALE);
667*77c1e3ccSAndroid Build Coastguard Worker
668*77c1e3ccSAndroid Build Coastguard Worker sum = _mm_shuffle_epi8(sum, gat);
669*77c1e3ccSAndroid Build Coastguard Worker *(int *)dst = _mm_cvtsi128_si32(sum);
670*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
671*77c1e3ccSAndroid Build Coastguard Worker
672*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
673*77c1e3ccSAndroid Build Coastguard Worker d = _mm_add_epi16(d, inc);
674*77c1e3ccSAndroid Build Coastguard Worker }
675*77c1e3ccSAndroid Build Coastguard Worker }
676*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_4x4_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)677*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_4x4_ssse3(uint8_t *dst, ptrdiff_t stride,
678*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
679*77c1e3ccSAndroid Build Coastguard Worker __m128i pixels[3];
680*77c1e3ccSAndroid Build Coastguard Worker load_pixel_w4(above, left, 4, pixels);
681*77c1e3ccSAndroid Build Coastguard Worker
682*77c1e3ccSAndroid Build Coastguard Worker __m128i wh[4], ww[2];
683*77c1e3ccSAndroid Build Coastguard Worker load_weight_w4(4, wh, ww);
684*77c1e3ccSAndroid Build Coastguard Worker
685*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_4xh(pixels, wh, ww, 4, dst, stride, 0);
686*77c1e3ccSAndroid Build Coastguard Worker }
687*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_4x8_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)688*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_4x8_ssse3(uint8_t *dst, ptrdiff_t stride,
689*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
690*77c1e3ccSAndroid Build Coastguard Worker __m128i pixels[3];
691*77c1e3ccSAndroid Build Coastguard Worker load_pixel_w4(above, left, 8, pixels);
692*77c1e3ccSAndroid Build Coastguard Worker
693*77c1e3ccSAndroid Build Coastguard Worker __m128i wh[4], ww[2];
694*77c1e3ccSAndroid Build Coastguard Worker load_weight_w4(8, wh, ww);
695*77c1e3ccSAndroid Build Coastguard Worker
696*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_4xh(pixels, wh, ww, 8, dst, stride, 0);
697*77c1e3ccSAndroid Build Coastguard Worker }
698*77c1e3ccSAndroid Build Coastguard Worker
699*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_predictor_4x16_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)700*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_4x16_ssse3(uint8_t *dst, ptrdiff_t stride,
701*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
702*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
703*77c1e3ccSAndroid Build Coastguard Worker __m128i pixels[3];
704*77c1e3ccSAndroid Build Coastguard Worker load_pixel_w4(above, left, 16, pixels);
705*77c1e3ccSAndroid Build Coastguard Worker
706*77c1e3ccSAndroid Build Coastguard Worker __m128i wh[4], ww[2];
707*77c1e3ccSAndroid Build Coastguard Worker load_weight_w4(16, wh, ww);
708*77c1e3ccSAndroid Build Coastguard Worker
709*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_4xh(pixels, wh, ww, 8, dst, stride, 0);
710*77c1e3ccSAndroid Build Coastguard Worker dst += stride << 3;
711*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_4xh(pixels, &wh[2], ww, 8, dst, stride, 1);
712*77c1e3ccSAndroid Build Coastguard Worker }
713*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
714*77c1e3ccSAndroid Build Coastguard Worker
715*77c1e3ccSAndroid Build Coastguard Worker // pixels[0]: above and below_pred interleave vector, first half
716*77c1e3ccSAndroid Build Coastguard Worker // pixels[1]: above and below_pred interleave vector, second half
717*77c1e3ccSAndroid Build Coastguard Worker // pixels[2]: left vector
718*77c1e3ccSAndroid Build Coastguard Worker // pixels[3]: right_pred vector
719*77c1e3ccSAndroid Build Coastguard Worker // pixels[4]: above and below_pred interleave vector, first half
720*77c1e3ccSAndroid Build Coastguard Worker // pixels[5]: above and below_pred interleave vector, second half
721*77c1e3ccSAndroid Build Coastguard Worker // pixels[6]: left vector + 16
722*77c1e3ccSAndroid Build Coastguard Worker // pixels[7]: right_pred vector
load_pixel_w8(const uint8_t * above,const uint8_t * left,int height,__m128i * pixels)723*77c1e3ccSAndroid Build Coastguard Worker static inline void load_pixel_w8(const uint8_t *above, const uint8_t *left,
724*77c1e3ccSAndroid Build Coastguard Worker int height, __m128i *pixels) {
725*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
726*77c1e3ccSAndroid Build Coastguard Worker const __m128i bp = _mm_set1_epi16((int16_t)left[height - 1]);
727*77c1e3ccSAndroid Build Coastguard Worker __m128i d = _mm_loadl_epi64((const __m128i *)above);
728*77c1e3ccSAndroid Build Coastguard Worker d = _mm_unpacklo_epi8(d, zero);
729*77c1e3ccSAndroid Build Coastguard Worker pixels[0] = _mm_unpacklo_epi16(d, bp);
730*77c1e3ccSAndroid Build Coastguard Worker pixels[1] = _mm_unpackhi_epi16(d, bp);
731*77c1e3ccSAndroid Build Coastguard Worker
732*77c1e3ccSAndroid Build Coastguard Worker pixels[3] = _mm_set1_epi16((int16_t)above[7]);
733*77c1e3ccSAndroid Build Coastguard Worker
734*77c1e3ccSAndroid Build Coastguard Worker if (height == 4) {
735*77c1e3ccSAndroid Build Coastguard Worker pixels[2] = _mm_cvtsi32_si128(((const int *)left)[0]);
736*77c1e3ccSAndroid Build Coastguard Worker } else if (height == 8) {
737*77c1e3ccSAndroid Build Coastguard Worker pixels[2] = _mm_loadl_epi64((const __m128i *)left);
738*77c1e3ccSAndroid Build Coastguard Worker } else if (height == 16) {
739*77c1e3ccSAndroid Build Coastguard Worker pixels[2] = _mm_load_si128((const __m128i *)left);
740*77c1e3ccSAndroid Build Coastguard Worker } else {
741*77c1e3ccSAndroid Build Coastguard Worker pixels[2] = _mm_load_si128((const __m128i *)left);
742*77c1e3ccSAndroid Build Coastguard Worker pixels[4] = pixels[0];
743*77c1e3ccSAndroid Build Coastguard Worker pixels[5] = pixels[1];
744*77c1e3ccSAndroid Build Coastguard Worker pixels[6] = _mm_load_si128((const __m128i *)(left + 16));
745*77c1e3ccSAndroid Build Coastguard Worker pixels[7] = pixels[3];
746*77c1e3ccSAndroid Build Coastguard Worker }
747*77c1e3ccSAndroid Build Coastguard Worker }
748*77c1e3ccSAndroid Build Coastguard Worker
749*77c1e3ccSAndroid Build Coastguard Worker // weight_h[0]: weight_h vector
750*77c1e3ccSAndroid Build Coastguard Worker // weight_h[1]: scale - weight_h vector
751*77c1e3ccSAndroid Build Coastguard Worker // weight_h[2]: same as [0], offset 8
752*77c1e3ccSAndroid Build Coastguard Worker // weight_h[3]: same as [1], offset 8
753*77c1e3ccSAndroid Build Coastguard Worker // weight_h[4]: same as [0], offset 16
754*77c1e3ccSAndroid Build Coastguard Worker // weight_h[5]: same as [1], offset 16
755*77c1e3ccSAndroid Build Coastguard Worker // weight_h[6]: same as [0], offset 24
756*77c1e3ccSAndroid Build Coastguard Worker // weight_h[7]: same as [1], offset 24
757*77c1e3ccSAndroid Build Coastguard Worker // weight_w[0]: weights_w and scale - weights_w interleave vector, first half
758*77c1e3ccSAndroid Build Coastguard Worker // weight_w[1]: weights_w and scale - weights_w interleave vector, second half
load_weight_w8(int height,__m128i * weight_h,__m128i * weight_w)759*77c1e3ccSAndroid Build Coastguard Worker static inline void load_weight_w8(int height, __m128i *weight_h,
760*77c1e3ccSAndroid Build Coastguard Worker __m128i *weight_w) {
761*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
762*77c1e3ccSAndroid Build Coastguard Worker const int we_offset = height < 8 ? 0 : 4;
763*77c1e3ccSAndroid Build Coastguard Worker __m128i we = _mm_loadu_si128((const __m128i *)&smooth_weights[we_offset]);
764*77c1e3ccSAndroid Build Coastguard Worker weight_h[0] = _mm_unpacklo_epi8(we, zero);
765*77c1e3ccSAndroid Build Coastguard Worker const __m128i d = _mm_set1_epi16((int16_t)(1 << SMOOTH_WEIGHT_LOG2_SCALE));
766*77c1e3ccSAndroid Build Coastguard Worker weight_h[1] = _mm_sub_epi16(d, weight_h[0]);
767*77c1e3ccSAndroid Build Coastguard Worker
768*77c1e3ccSAndroid Build Coastguard Worker if (height == 4) {
769*77c1e3ccSAndroid Build Coastguard Worker we = _mm_srli_si128(we, 4);
770*77c1e3ccSAndroid Build Coastguard Worker __m128i tmp1 = _mm_unpacklo_epi8(we, zero);
771*77c1e3ccSAndroid Build Coastguard Worker __m128i tmp2 = _mm_sub_epi16(d, tmp1);
772*77c1e3ccSAndroid Build Coastguard Worker weight_w[0] = _mm_unpacklo_epi16(tmp1, tmp2);
773*77c1e3ccSAndroid Build Coastguard Worker weight_w[1] = _mm_unpackhi_epi16(tmp1, tmp2);
774*77c1e3ccSAndroid Build Coastguard Worker } else {
775*77c1e3ccSAndroid Build Coastguard Worker weight_w[0] = _mm_unpacklo_epi16(weight_h[0], weight_h[1]);
776*77c1e3ccSAndroid Build Coastguard Worker weight_w[1] = _mm_unpackhi_epi16(weight_h[0], weight_h[1]);
777*77c1e3ccSAndroid Build Coastguard Worker }
778*77c1e3ccSAndroid Build Coastguard Worker
779*77c1e3ccSAndroid Build Coastguard Worker if (height == 16) {
780*77c1e3ccSAndroid Build Coastguard Worker we = _mm_loadu_si128((const __m128i *)&smooth_weights[12]);
781*77c1e3ccSAndroid Build Coastguard Worker weight_h[0] = _mm_unpacklo_epi8(we, zero);
782*77c1e3ccSAndroid Build Coastguard Worker weight_h[1] = _mm_sub_epi16(d, weight_h[0]);
783*77c1e3ccSAndroid Build Coastguard Worker weight_h[2] = _mm_unpackhi_epi8(we, zero);
784*77c1e3ccSAndroid Build Coastguard Worker weight_h[3] = _mm_sub_epi16(d, weight_h[2]);
785*77c1e3ccSAndroid Build Coastguard Worker } else if (height == 32) {
786*77c1e3ccSAndroid Build Coastguard Worker const __m128i weight_lo =
787*77c1e3ccSAndroid Build Coastguard Worker _mm_loadu_si128((const __m128i *)&smooth_weights[28]);
788*77c1e3ccSAndroid Build Coastguard Worker weight_h[0] = _mm_unpacklo_epi8(weight_lo, zero);
789*77c1e3ccSAndroid Build Coastguard Worker weight_h[1] = _mm_sub_epi16(d, weight_h[0]);
790*77c1e3ccSAndroid Build Coastguard Worker weight_h[2] = _mm_unpackhi_epi8(weight_lo, zero);
791*77c1e3ccSAndroid Build Coastguard Worker weight_h[3] = _mm_sub_epi16(d, weight_h[2]);
792*77c1e3ccSAndroid Build Coastguard Worker const __m128i weight_hi =
793*77c1e3ccSAndroid Build Coastguard Worker _mm_loadu_si128((const __m128i *)&smooth_weights[28 + 16]);
794*77c1e3ccSAndroid Build Coastguard Worker weight_h[4] = _mm_unpacklo_epi8(weight_hi, zero);
795*77c1e3ccSAndroid Build Coastguard Worker weight_h[5] = _mm_sub_epi16(d, weight_h[4]);
796*77c1e3ccSAndroid Build Coastguard Worker weight_h[6] = _mm_unpackhi_epi8(weight_hi, zero);
797*77c1e3ccSAndroid Build Coastguard Worker weight_h[7] = _mm_sub_epi16(d, weight_h[6]);
798*77c1e3ccSAndroid Build Coastguard Worker }
799*77c1e3ccSAndroid Build Coastguard Worker }
800*77c1e3ccSAndroid Build Coastguard Worker
smooth_pred_8xh(const __m128i * pixels,const __m128i * wh,const __m128i * ww,int h,uint8_t * dst,ptrdiff_t stride,int second_half)801*77c1e3ccSAndroid Build Coastguard Worker static inline void smooth_pred_8xh(const __m128i *pixels, const __m128i *wh,
802*77c1e3ccSAndroid Build Coastguard Worker const __m128i *ww, int h, uint8_t *dst,
803*77c1e3ccSAndroid Build Coastguard Worker ptrdiff_t stride, int second_half) {
804*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi32((1 << SMOOTH_WEIGHT_LOG2_SCALE));
805*77c1e3ccSAndroid Build Coastguard Worker const __m128i one = _mm_set1_epi16(1);
806*77c1e3ccSAndroid Build Coastguard Worker const __m128i inc = _mm_set1_epi16(0x202);
807*77c1e3ccSAndroid Build Coastguard Worker const __m128i gat = _mm_set_epi32(0, 0, 0xe0c0a08, 0x6040200);
808*77c1e3ccSAndroid Build Coastguard Worker
809*77c1e3ccSAndroid Build Coastguard Worker __m128i rep = second_half ? _mm_set1_epi16((short)0x8008)
810*77c1e3ccSAndroid Build Coastguard Worker : _mm_set1_epi16((short)0x8000);
811*77c1e3ccSAndroid Build Coastguard Worker __m128i d = _mm_set1_epi16(0x100);
812*77c1e3ccSAndroid Build Coastguard Worker
813*77c1e3ccSAndroid Build Coastguard Worker int i;
814*77c1e3ccSAndroid Build Coastguard Worker for (i = 0; i < h; ++i) {
815*77c1e3ccSAndroid Build Coastguard Worker const __m128i wg_wg = _mm_shuffle_epi8(wh[0], d);
816*77c1e3ccSAndroid Build Coastguard Worker const __m128i sc_sc = _mm_shuffle_epi8(wh[1], d);
817*77c1e3ccSAndroid Build Coastguard Worker const __m128i wh_sc = _mm_unpacklo_epi16(wg_wg, sc_sc);
818*77c1e3ccSAndroid Build Coastguard Worker __m128i s0 = _mm_madd_epi16(pixels[0], wh_sc);
819*77c1e3ccSAndroid Build Coastguard Worker __m128i s1 = _mm_madd_epi16(pixels[1], wh_sc);
820*77c1e3ccSAndroid Build Coastguard Worker
821*77c1e3ccSAndroid Build Coastguard Worker __m128i b = _mm_shuffle_epi8(pixels[2], rep);
822*77c1e3ccSAndroid Build Coastguard Worker b = _mm_unpacklo_epi16(b, pixels[3]);
823*77c1e3ccSAndroid Build Coastguard Worker __m128i sum0 = _mm_madd_epi16(b, ww[0]);
824*77c1e3ccSAndroid Build Coastguard Worker __m128i sum1 = _mm_madd_epi16(b, ww[1]);
825*77c1e3ccSAndroid Build Coastguard Worker
826*77c1e3ccSAndroid Build Coastguard Worker s0 = _mm_add_epi32(s0, sum0);
827*77c1e3ccSAndroid Build Coastguard Worker s0 = _mm_add_epi32(s0, round);
828*77c1e3ccSAndroid Build Coastguard Worker s0 = _mm_srai_epi32(s0, 1 + SMOOTH_WEIGHT_LOG2_SCALE);
829*77c1e3ccSAndroid Build Coastguard Worker
830*77c1e3ccSAndroid Build Coastguard Worker s1 = _mm_add_epi32(s1, sum1);
831*77c1e3ccSAndroid Build Coastguard Worker s1 = _mm_add_epi32(s1, round);
832*77c1e3ccSAndroid Build Coastguard Worker s1 = _mm_srai_epi32(s1, 1 + SMOOTH_WEIGHT_LOG2_SCALE);
833*77c1e3ccSAndroid Build Coastguard Worker
834*77c1e3ccSAndroid Build Coastguard Worker sum0 = _mm_packus_epi16(s0, s1);
835*77c1e3ccSAndroid Build Coastguard Worker sum0 = _mm_shuffle_epi8(sum0, gat);
836*77c1e3ccSAndroid Build Coastguard Worker _mm_storel_epi64((__m128i *)dst, sum0);
837*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
838*77c1e3ccSAndroid Build Coastguard Worker
839*77c1e3ccSAndroid Build Coastguard Worker rep = _mm_add_epi16(rep, one);
840*77c1e3ccSAndroid Build Coastguard Worker d = _mm_add_epi16(d, inc);
841*77c1e3ccSAndroid Build Coastguard Worker }
842*77c1e3ccSAndroid Build Coastguard Worker }
843*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_8x4_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)844*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_8x4_ssse3(uint8_t *dst, ptrdiff_t stride,
845*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
846*77c1e3ccSAndroid Build Coastguard Worker __m128i pixels[4];
847*77c1e3ccSAndroid Build Coastguard Worker load_pixel_w8(above, left, 4, pixels);
848*77c1e3ccSAndroid Build Coastguard Worker
849*77c1e3ccSAndroid Build Coastguard Worker __m128i wh[4], ww[2];
850*77c1e3ccSAndroid Build Coastguard Worker load_weight_w8(4, wh, ww);
851*77c1e3ccSAndroid Build Coastguard Worker
852*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_8xh(pixels, wh, ww, 4, dst, stride, 0);
853*77c1e3ccSAndroid Build Coastguard Worker }
854*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_8x8_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)855*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_8x8_ssse3(uint8_t *dst, ptrdiff_t stride,
856*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above, const uint8_t *left) {
857*77c1e3ccSAndroid Build Coastguard Worker __m128i pixels[4];
858*77c1e3ccSAndroid Build Coastguard Worker load_pixel_w8(above, left, 8, pixels);
859*77c1e3ccSAndroid Build Coastguard Worker
860*77c1e3ccSAndroid Build Coastguard Worker __m128i wh[4], ww[2];
861*77c1e3ccSAndroid Build Coastguard Worker load_weight_w8(8, wh, ww);
862*77c1e3ccSAndroid Build Coastguard Worker
863*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_8xh(pixels, wh, ww, 8, dst, stride, 0);
864*77c1e3ccSAndroid Build Coastguard Worker }
865*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_8x16_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)866*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_8x16_ssse3(uint8_t *dst, ptrdiff_t stride,
867*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
868*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
869*77c1e3ccSAndroid Build Coastguard Worker __m128i pixels[4];
870*77c1e3ccSAndroid Build Coastguard Worker load_pixel_w8(above, left, 16, pixels);
871*77c1e3ccSAndroid Build Coastguard Worker
872*77c1e3ccSAndroid Build Coastguard Worker __m128i wh[4], ww[2];
873*77c1e3ccSAndroid Build Coastguard Worker load_weight_w8(16, wh, ww);
874*77c1e3ccSAndroid Build Coastguard Worker
875*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_8xh(pixels, wh, ww, 8, dst, stride, 0);
876*77c1e3ccSAndroid Build Coastguard Worker dst += stride << 3;
877*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_8xh(pixels, &wh[2], ww, 8, dst, stride, 1);
878*77c1e3ccSAndroid Build Coastguard Worker }
879*77c1e3ccSAndroid Build Coastguard Worker
880*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_predictor_8x32_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)881*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_8x32_ssse3(uint8_t *dst, ptrdiff_t stride,
882*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
883*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
884*77c1e3ccSAndroid Build Coastguard Worker __m128i pixels[8];
885*77c1e3ccSAndroid Build Coastguard Worker load_pixel_w8(above, left, 32, pixels);
886*77c1e3ccSAndroid Build Coastguard Worker
887*77c1e3ccSAndroid Build Coastguard Worker __m128i wh[8], ww[2];
888*77c1e3ccSAndroid Build Coastguard Worker load_weight_w8(32, wh, ww);
889*77c1e3ccSAndroid Build Coastguard Worker
890*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_8xh(&pixels[0], wh, ww, 8, dst, stride, 0);
891*77c1e3ccSAndroid Build Coastguard Worker dst += stride << 3;
892*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_8xh(&pixels[0], &wh[2], ww, 8, dst, stride, 1);
893*77c1e3ccSAndroid Build Coastguard Worker dst += stride << 3;
894*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_8xh(&pixels[4], &wh[4], ww, 8, dst, stride, 0);
895*77c1e3ccSAndroid Build Coastguard Worker dst += stride << 3;
896*77c1e3ccSAndroid Build Coastguard Worker smooth_pred_8xh(&pixels[4], &wh[6], ww, 8, dst, stride, 1);
897*77c1e3ccSAndroid Build Coastguard Worker }
898*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
899*77c1e3ccSAndroid Build Coastguard Worker
900*77c1e3ccSAndroid Build Coastguard Worker // TODO(slavarnway): Visual Studio only supports restrict when /std:c11
901*77c1e3ccSAndroid Build Coastguard Worker // (available in 2019+) or greater is specified; __restrict can be used in that
902*77c1e3ccSAndroid Build Coastguard Worker // case. This should be moved to rtcd and used consistently between the
903*77c1e3ccSAndroid Build Coastguard Worker // function declarations and definitions to avoid warnings in Visual Studio
904*77c1e3ccSAndroid Build Coastguard Worker // when defining LIBAOM_RESTRICT to restrict or __restrict.
905*77c1e3ccSAndroid Build Coastguard Worker #if defined(_MSC_VER)
906*77c1e3ccSAndroid Build Coastguard Worker #define LIBAOM_RESTRICT
907*77c1e3ccSAndroid Build Coastguard Worker #else
908*77c1e3ccSAndroid Build Coastguard Worker #define LIBAOM_RESTRICT restrict
909*77c1e3ccSAndroid Build Coastguard Worker #endif
910*77c1e3ccSAndroid Build Coastguard Worker
Load4(const void * src)911*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE __m128i Load4(const void *src) {
912*77c1e3ccSAndroid Build Coastguard Worker // With new compilers such as clang 8.0.0 we can use the new _mm_loadu_si32
913*77c1e3ccSAndroid Build Coastguard Worker // intrinsic. Both _mm_loadu_si32(src) and the code here are compiled into a
914*77c1e3ccSAndroid Build Coastguard Worker // movss instruction.
915*77c1e3ccSAndroid Build Coastguard Worker //
916*77c1e3ccSAndroid Build Coastguard Worker // Until compiler support of _mm_loadu_si32 is widespread, use of
917*77c1e3ccSAndroid Build Coastguard Worker // _mm_loadu_si32 is banned.
918*77c1e3ccSAndroid Build Coastguard Worker int val;
919*77c1e3ccSAndroid Build Coastguard Worker memcpy(&val, src, sizeof(val));
920*77c1e3ccSAndroid Build Coastguard Worker return _mm_cvtsi32_si128(val);
921*77c1e3ccSAndroid Build Coastguard Worker }
922*77c1e3ccSAndroid Build Coastguard Worker
LoadLo8(const void * a)923*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE __m128i LoadLo8(const void *a) {
924*77c1e3ccSAndroid Build Coastguard Worker return _mm_loadl_epi64((const __m128i *)(a));
925*77c1e3ccSAndroid Build Coastguard Worker }
926*77c1e3ccSAndroid Build Coastguard Worker
LoadUnaligned16(const void * a)927*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE __m128i LoadUnaligned16(const void *a) {
928*77c1e3ccSAndroid Build Coastguard Worker return _mm_loadu_si128((const __m128i *)(a));
929*77c1e3ccSAndroid Build Coastguard Worker }
930*77c1e3ccSAndroid Build Coastguard Worker
Store4(void * dst,const __m128i x)931*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE void Store4(void *dst, const __m128i x) {
932*77c1e3ccSAndroid Build Coastguard Worker const int val = _mm_cvtsi128_si32(x);
933*77c1e3ccSAndroid Build Coastguard Worker memcpy(dst, &val, sizeof(val));
934*77c1e3ccSAndroid Build Coastguard Worker }
935*77c1e3ccSAndroid Build Coastguard Worker
StoreLo8(void * a,const __m128i v)936*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE void StoreLo8(void *a, const __m128i v) {
937*77c1e3ccSAndroid Build Coastguard Worker _mm_storel_epi64((__m128i *)(a), v);
938*77c1e3ccSAndroid Build Coastguard Worker }
939*77c1e3ccSAndroid Build Coastguard Worker
StoreUnaligned16(void * a,const __m128i v)940*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE void StoreUnaligned16(void *a, const __m128i v) {
941*77c1e3ccSAndroid Build Coastguard Worker _mm_storeu_si128((__m128i *)(a), v);
942*77c1e3ccSAndroid Build Coastguard Worker }
943*77c1e3ccSAndroid Build Coastguard Worker
cvtepu8_epi16(__m128i x)944*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE __m128i cvtepu8_epi16(__m128i x) {
945*77c1e3ccSAndroid Build Coastguard Worker return _mm_unpacklo_epi8((x), _mm_setzero_si128());
946*77c1e3ccSAndroid Build Coastguard Worker }
947*77c1e3ccSAndroid Build Coastguard Worker
cvtepu8_epi32(__m128i x)948*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE __m128i cvtepu8_epi32(__m128i x) {
949*77c1e3ccSAndroid Build Coastguard Worker const __m128i tmp = _mm_unpacklo_epi8((x), _mm_setzero_si128());
950*77c1e3ccSAndroid Build Coastguard Worker return _mm_unpacklo_epi16(tmp, _mm_setzero_si128());
951*77c1e3ccSAndroid Build Coastguard Worker }
952*77c1e3ccSAndroid Build Coastguard Worker
cvtepu16_epi32(__m128i x)953*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE __m128i cvtepu16_epi32(__m128i x) {
954*77c1e3ccSAndroid Build Coastguard Worker return _mm_unpacklo_epi16((x), _mm_setzero_si128());
955*77c1e3ccSAndroid Build Coastguard Worker }
956*77c1e3ccSAndroid Build Coastguard Worker
smooth_predictor_wxh(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column,int width,int height)957*77c1e3ccSAndroid Build Coastguard Worker static void smooth_predictor_wxh(uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
958*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
959*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column,
960*77c1e3ccSAndroid Build Coastguard Worker int width, int height) {
961*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *const sm_weights_h = smooth_weights + height - 4;
962*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *const sm_weights_w = smooth_weights + width - 4;
963*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
964*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale_value = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
965*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_cvtsi32_si128(left_column[height - 1]);
966*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[width - 1]);
967*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi32(1 << SMOOTH_WEIGHT_LOG2_SCALE);
968*77c1e3ccSAndroid Build Coastguard Worker for (int y = 0; y < height; ++y) {
969*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_cvtsi32_si128(sm_weights_h[y]);
970*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_cvtsi32_si128(left_column[y]);
971*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale_m_weights_y = _mm_sub_epi16(scale_value, weights_y);
972*77c1e3ccSAndroid Build Coastguard Worker __m128i scaled_bottom_left =
973*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(scale_m_weights_y, bottom_left);
974*77c1e3ccSAndroid Build Coastguard Worker const __m128i weight_left_y =
975*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi32(_mm_unpacklo_epi16(weights_y, left_y), 0);
976*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left = _mm_add_epi32(scaled_bottom_left, round);
977*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left = _mm_shuffle_epi32(scaled_bottom_left, 0);
978*77c1e3ccSAndroid Build Coastguard Worker for (int x = 0; x < width; x += 8) {
979*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_x = LoadLo8(top_row + x);
980*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_x = LoadLo8(sm_weights_w + x);
981*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_weights_x = _mm_unpacklo_epi8(top_x, weights_x);
982*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_weights_x_lo = cvtepu8_epi16(top_weights_x);
983*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_weights_x_hi = _mm_unpackhi_epi8(top_weights_x, zero);
984*77c1e3ccSAndroid Build Coastguard Worker
985*77c1e3ccSAndroid Build Coastguard Worker // Here opposite weights and pixels are multiplied, where the order of
986*77c1e3ccSAndroid Build Coastguard Worker // interleaving is indicated in the names.
987*77c1e3ccSAndroid Build Coastguard Worker __m128i pred_lo = _mm_madd_epi16(top_weights_x_lo, weight_left_y);
988*77c1e3ccSAndroid Build Coastguard Worker __m128i pred_hi = _mm_madd_epi16(top_weights_x_hi, weight_left_y);
989*77c1e3ccSAndroid Build Coastguard Worker
990*77c1e3ccSAndroid Build Coastguard Worker // |scaled_bottom_left| is always scaled by the same weight each row, so
991*77c1e3ccSAndroid Build Coastguard Worker // we only derive |scaled_top_right| values here.
992*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights_x =
993*77c1e3ccSAndroid Build Coastguard Worker _mm_sub_epi16(scale_value, cvtepu8_epi16(weights_x));
994*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right =
995*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights_x, top_right);
996*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right_lo = cvtepu16_epi32(scaled_top_right);
997*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right_hi =
998*77c1e3ccSAndroid Build Coastguard Worker _mm_unpackhi_epi16(scaled_top_right, zero);
999*77c1e3ccSAndroid Build Coastguard Worker pred_lo = _mm_add_epi32(pred_lo, scaled_bottom_left);
1000*77c1e3ccSAndroid Build Coastguard Worker pred_hi = _mm_add_epi32(pred_hi, scaled_bottom_left);
1001*77c1e3ccSAndroid Build Coastguard Worker pred_lo = _mm_add_epi32(pred_lo, scaled_top_right_lo);
1002*77c1e3ccSAndroid Build Coastguard Worker pred_hi = _mm_add_epi32(pred_hi, scaled_top_right_hi);
1003*77c1e3ccSAndroid Build Coastguard Worker
1004*77c1e3ccSAndroid Build Coastguard Worker // The round value for RightShiftWithRounding was added with
1005*77c1e3ccSAndroid Build Coastguard Worker // |scaled_bottom_left|.
1006*77c1e3ccSAndroid Build Coastguard Worker pred_lo = _mm_srli_epi32(pred_lo, (1 + SMOOTH_WEIGHT_LOG2_SCALE));
1007*77c1e3ccSAndroid Build Coastguard Worker pred_hi = _mm_srli_epi32(pred_hi, (1 + SMOOTH_WEIGHT_LOG2_SCALE));
1008*77c1e3ccSAndroid Build Coastguard Worker const __m128i pred = _mm_packus_epi16(pred_lo, pred_hi);
1009*77c1e3ccSAndroid Build Coastguard Worker StoreLo8(dst + x, _mm_packus_epi16(pred, pred));
1010*77c1e3ccSAndroid Build Coastguard Worker }
1011*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1012*77c1e3ccSAndroid Build Coastguard Worker }
1013*77c1e3ccSAndroid Build Coastguard Worker }
1014*77c1e3ccSAndroid Build Coastguard Worker
1015*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_predictor_16x4_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1016*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_16x4_ssse3(uint8_t *dst, ptrdiff_t stride,
1017*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1018*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1019*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 16, 4);
1020*77c1e3ccSAndroid Build Coastguard Worker }
1021*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1022*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_16x8_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1023*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_16x8_ssse3(uint8_t *dst, ptrdiff_t stride,
1024*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1025*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1026*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 16, 8);
1027*77c1e3ccSAndroid Build Coastguard Worker }
1028*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_16x16_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1029*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_16x16_ssse3(uint8_t *dst, ptrdiff_t stride,
1030*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1031*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1032*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 16, 16);
1033*77c1e3ccSAndroid Build Coastguard Worker }
1034*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_16x32_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1035*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_16x32_ssse3(uint8_t *dst, ptrdiff_t stride,
1036*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1037*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1038*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 16, 32);
1039*77c1e3ccSAndroid Build Coastguard Worker }
1040*77c1e3ccSAndroid Build Coastguard Worker
1041*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_predictor_16x64_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1042*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_16x64_ssse3(uint8_t *dst, ptrdiff_t stride,
1043*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1044*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1045*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 16, 64);
1046*77c1e3ccSAndroid Build Coastguard Worker }
1047*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_32x8_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1048*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_32x8_ssse3(uint8_t *dst, ptrdiff_t stride,
1049*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1050*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1051*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 32, 8);
1052*77c1e3ccSAndroid Build Coastguard Worker }
1053*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1054*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_32x16_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1055*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_32x16_ssse3(uint8_t *dst, ptrdiff_t stride,
1056*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1057*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1058*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 32, 16);
1059*77c1e3ccSAndroid Build Coastguard Worker }
1060*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_32x32_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1061*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_32x32_ssse3(uint8_t *dst, ptrdiff_t stride,
1062*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1063*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1064*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 32, 32);
1065*77c1e3ccSAndroid Build Coastguard Worker }
1066*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_32x64_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1067*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_32x64_ssse3(uint8_t *dst, ptrdiff_t stride,
1068*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1069*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1070*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 32, 64);
1071*77c1e3ccSAndroid Build Coastguard Worker }
1072*77c1e3ccSAndroid Build Coastguard Worker
1073*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_predictor_64x16_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1074*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_64x16_ssse3(uint8_t *dst, ptrdiff_t stride,
1075*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1076*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1077*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 64, 16);
1078*77c1e3ccSAndroid Build Coastguard Worker }
1079*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1080*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_64x32_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1081*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_64x32_ssse3(uint8_t *dst, ptrdiff_t stride,
1082*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1083*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1084*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 64, 32);
1085*77c1e3ccSAndroid Build Coastguard Worker }
1086*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_predictor_64x64_ssse3(uint8_t * dst,ptrdiff_t stride,const uint8_t * above,const uint8_t * left)1087*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_predictor_64x64_ssse3(uint8_t *dst, ptrdiff_t stride,
1088*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *above,
1089*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *left) {
1090*77c1e3ccSAndroid Build Coastguard Worker smooth_predictor_wxh(dst, stride, above, left, 64, 64);
1091*77c1e3ccSAndroid Build Coastguard Worker }
1092*77c1e3ccSAndroid Build Coastguard Worker
1093*77c1e3ccSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
1094*77c1e3ccSAndroid Build Coastguard Worker // Smooth horizontal/vertical helper functions.
1095*77c1e3ccSAndroid Build Coastguard Worker
1096*77c1e3ccSAndroid Build Coastguard Worker // For Horizontal, pixels1 and pixels2 are the same repeated value. For
1097*77c1e3ccSAndroid Build Coastguard Worker // Vertical, weights1 and weights2 are the same, and scaled_corner1 and
1098*77c1e3ccSAndroid Build Coastguard Worker // scaled_corner2 are the same.
write_smooth_directional_sum16(uint8_t * LIBAOM_RESTRICT dst,const __m128i pixels1,const __m128i pixels2,const __m128i weights1,const __m128i weights2,const __m128i scaled_corner1,const __m128i scaled_corner2,const __m128i round)1099*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE void write_smooth_directional_sum16(
1100*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, const __m128i pixels1, const __m128i pixels2,
1101*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1, const __m128i weights2,
1102*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_corner1, const __m128i scaled_corner2,
1103*77c1e3ccSAndroid Build Coastguard Worker const __m128i round) {
1104*77c1e3ccSAndroid Build Coastguard Worker const __m128i weighted_px1 = _mm_mullo_epi16(pixels1, weights1);
1105*77c1e3ccSAndroid Build Coastguard Worker const __m128i weighted_px2 = _mm_mullo_epi16(pixels2, weights2);
1106*77c1e3ccSAndroid Build Coastguard Worker const __m128i pred_sum1 = _mm_add_epi16(scaled_corner1, weighted_px1);
1107*77c1e3ccSAndroid Build Coastguard Worker const __m128i pred_sum2 = _mm_add_epi16(scaled_corner2, weighted_px2);
1108*77c1e3ccSAndroid Build Coastguard Worker // Equivalent to RightShiftWithRounding(pred[x][y], 8).
1109*77c1e3ccSAndroid Build Coastguard Worker const __m128i pred1 = _mm_srli_epi16(_mm_add_epi16(pred_sum1, round), 8);
1110*77c1e3ccSAndroid Build Coastguard Worker const __m128i pred2 = _mm_srli_epi16(_mm_add_epi16(pred_sum2, round), 8);
1111*77c1e3ccSAndroid Build Coastguard Worker StoreUnaligned16(dst, _mm_packus_epi16(pred1, pred2));
1112*77c1e3ccSAndroid Build Coastguard Worker }
1113*77c1e3ccSAndroid Build Coastguard Worker
smooth_directional_sum8(const __m128i pixels,const __m128i weights,const __m128i scaled_corner)1114*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE __m128i smooth_directional_sum8(
1115*77c1e3ccSAndroid Build Coastguard Worker const __m128i pixels, const __m128i weights, const __m128i scaled_corner) {
1116*77c1e3ccSAndroid Build Coastguard Worker const __m128i weighted_px = _mm_mullo_epi16(pixels, weights);
1117*77c1e3ccSAndroid Build Coastguard Worker return _mm_add_epi16(scaled_corner, weighted_px);
1118*77c1e3ccSAndroid Build Coastguard Worker }
1119*77c1e3ccSAndroid Build Coastguard Worker
write_smooth_directional_sum8(uint8_t * LIBAOM_RESTRICT dst,const __m128i * pixels,const __m128i * weights,const __m128i * scaled_corner,const __m128i * round)1120*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE void write_smooth_directional_sum8(
1121*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, const __m128i *pixels, const __m128i *weights,
1122*77c1e3ccSAndroid Build Coastguard Worker const __m128i *scaled_corner, const __m128i *round) {
1123*77c1e3ccSAndroid Build Coastguard Worker const __m128i pred_sum =
1124*77c1e3ccSAndroid Build Coastguard Worker smooth_directional_sum8(*pixels, *weights, *scaled_corner);
1125*77c1e3ccSAndroid Build Coastguard Worker // Equivalent to RightShiftWithRounding(pred[x][y], 8).
1126*77c1e3ccSAndroid Build Coastguard Worker const __m128i pred = _mm_srli_epi16(_mm_add_epi16(pred_sum, *round), 8);
1127*77c1e3ccSAndroid Build Coastguard Worker StoreLo8(dst, _mm_packus_epi16(pred, pred));
1128*77c1e3ccSAndroid Build Coastguard Worker }
1129*77c1e3ccSAndroid Build Coastguard Worker
1130*77c1e3ccSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
1131*77c1e3ccSAndroid Build Coastguard Worker // SMOOTH_V_PRED
1132*77c1e3ccSAndroid Build Coastguard Worker
load_smooth_vertical_pixels4(const uint8_t * LIBAOM_RESTRICT above,const uint8_t * LIBAOM_RESTRICT left,const int height,__m128i * pixels)1133*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE void load_smooth_vertical_pixels4(
1134*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT above, const uint8_t *LIBAOM_RESTRICT left,
1135*77c1e3ccSAndroid Build Coastguard Worker const int height, __m128i *pixels) {
1136*77c1e3ccSAndroid Build Coastguard Worker __m128i top = Load4(above);
1137*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left[height - 1]);
1138*77c1e3ccSAndroid Build Coastguard Worker top = cvtepu8_epi16(top);
1139*77c1e3ccSAndroid Build Coastguard Worker pixels[0] = _mm_unpacklo_epi16(top, bottom_left);
1140*77c1e3ccSAndroid Build Coastguard Worker }
1141*77c1e3ccSAndroid Build Coastguard Worker
1142*77c1e3ccSAndroid Build Coastguard Worker // |weight_array| alternates weight vectors from the table with their inverted
1143*77c1e3ccSAndroid Build Coastguard Worker // (256-w) counterparts. This is precomputed by the compiler when the weights
1144*77c1e3ccSAndroid Build Coastguard Worker // table is visible to this module. Removing this visibility can cut speed by up
1145*77c1e3ccSAndroid Build Coastguard Worker // to half in both 4xH and 8xH transforms.
load_smooth_vertical_weights4(const uint8_t * LIBAOM_RESTRICT weight_array,const int height,__m128i * weights)1146*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE void load_smooth_vertical_weights4(
1147*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT weight_array, const int height,
1148*77c1e3ccSAndroid Build Coastguard Worker __m128i *weights) {
1149*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverter = _mm_set1_epi16(256);
1150*77c1e3ccSAndroid Build Coastguard Worker
1151*77c1e3ccSAndroid Build Coastguard Worker if (height == 4) {
1152*77c1e3ccSAndroid Build Coastguard Worker const __m128i weight = Load4(weight_array);
1153*77c1e3ccSAndroid Build Coastguard Worker weights[0] = cvtepu8_epi16(weight);
1154*77c1e3ccSAndroid Build Coastguard Worker weights[1] = _mm_sub_epi16(inverter, weights[0]);
1155*77c1e3ccSAndroid Build Coastguard Worker } else if (height == 8) {
1156*77c1e3ccSAndroid Build Coastguard Worker const __m128i weight = LoadLo8(weight_array + 4);
1157*77c1e3ccSAndroid Build Coastguard Worker weights[0] = cvtepu8_epi16(weight);
1158*77c1e3ccSAndroid Build Coastguard Worker weights[1] = _mm_sub_epi16(inverter, weights[0]);
1159*77c1e3ccSAndroid Build Coastguard Worker } else {
1160*77c1e3ccSAndroid Build Coastguard Worker const __m128i weight = LoadUnaligned16(weight_array + 12);
1161*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
1162*77c1e3ccSAndroid Build Coastguard Worker weights[0] = cvtepu8_epi16(weight);
1163*77c1e3ccSAndroid Build Coastguard Worker weights[1] = _mm_sub_epi16(inverter, weights[0]);
1164*77c1e3ccSAndroid Build Coastguard Worker weights[2] = _mm_unpackhi_epi8(weight, zero);
1165*77c1e3ccSAndroid Build Coastguard Worker weights[3] = _mm_sub_epi16(inverter, weights[2]);
1166*77c1e3ccSAndroid Build Coastguard Worker }
1167*77c1e3ccSAndroid Build Coastguard Worker }
1168*77c1e3ccSAndroid Build Coastguard Worker
write_smooth_vertical4xh(const __m128i * pixel,const __m128i * weight,const int height,uint8_t * LIBAOM_RESTRICT dst,const ptrdiff_t stride)1169*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE void write_smooth_vertical4xh(
1170*77c1e3ccSAndroid Build Coastguard Worker const __m128i *pixel, const __m128i *weight, const int height,
1171*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, const ptrdiff_t stride) {
1172*77c1e3ccSAndroid Build Coastguard Worker const __m128i pred_round = _mm_set1_epi32(128);
1173*77c1e3ccSAndroid Build Coastguard Worker const __m128i mask_increment = _mm_set1_epi16(0x0202);
1174*77c1e3ccSAndroid Build Coastguard Worker const __m128i cvtepu8_epi32 = _mm_set1_epi32(0xC080400);
1175*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi16(0x0100);
1176*77c1e3ccSAndroid Build Coastguard Worker
1177*77c1e3ccSAndroid Build Coastguard Worker for (int y = 0; y < height; ++y) {
1178*77c1e3ccSAndroid Build Coastguard Worker const __m128i weight_y = _mm_shuffle_epi8(weight[0], y_select);
1179*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weight_y = _mm_shuffle_epi8(weight[1], y_select);
1180*77c1e3ccSAndroid Build Coastguard Worker const __m128i alternate_weights =
1181*77c1e3ccSAndroid Build Coastguard Worker _mm_unpacklo_epi16(weight_y, inverted_weight_y);
1182*77c1e3ccSAndroid Build Coastguard Worker // Here the pixel vector is top_row[0], corner, top_row[1], corner, ...
1183*77c1e3ccSAndroid Build Coastguard Worker // The madd instruction yields four results of the form:
1184*77c1e3ccSAndroid Build Coastguard Worker // (top_row[x] * weight[y] + corner * inverted_weight[y])
1185*77c1e3ccSAndroid Build Coastguard Worker __m128i sum = _mm_madd_epi16(pixel[0], alternate_weights);
1186*77c1e3ccSAndroid Build Coastguard Worker sum = _mm_add_epi32(sum, pred_round);
1187*77c1e3ccSAndroid Build Coastguard Worker sum = _mm_srai_epi32(sum, 8);
1188*77c1e3ccSAndroid Build Coastguard Worker sum = _mm_shuffle_epi8(sum, cvtepu8_epi32);
1189*77c1e3ccSAndroid Build Coastguard Worker Store4(dst, sum);
1190*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1191*77c1e3ccSAndroid Build Coastguard Worker y_select = _mm_add_epi16(y_select, mask_increment);
1192*77c1e3ccSAndroid Build Coastguard Worker }
1193*77c1e3ccSAndroid Build Coastguard Worker }
1194*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_4x4_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1195*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_4x4_ssse3(
1196*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1197*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1198*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1199*77c1e3ccSAndroid Build Coastguard Worker __m128i pixels;
1200*77c1e3ccSAndroid Build Coastguard Worker load_smooth_vertical_pixels4(top_row, left_column, 4, &pixels);
1201*77c1e3ccSAndroid Build Coastguard Worker
1202*77c1e3ccSAndroid Build Coastguard Worker __m128i weights[2];
1203*77c1e3ccSAndroid Build Coastguard Worker load_smooth_vertical_weights4(smooth_weights, 4, weights);
1204*77c1e3ccSAndroid Build Coastguard Worker
1205*77c1e3ccSAndroid Build Coastguard Worker write_smooth_vertical4xh(&pixels, weights, 4, dst, stride);
1206*77c1e3ccSAndroid Build Coastguard Worker }
1207*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_4x8_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1208*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_4x8_ssse3(
1209*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1210*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1211*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1212*77c1e3ccSAndroid Build Coastguard Worker __m128i pixels;
1213*77c1e3ccSAndroid Build Coastguard Worker load_smooth_vertical_pixels4(top_row, left_column, 8, &pixels);
1214*77c1e3ccSAndroid Build Coastguard Worker
1215*77c1e3ccSAndroid Build Coastguard Worker __m128i weights[2];
1216*77c1e3ccSAndroid Build Coastguard Worker load_smooth_vertical_weights4(smooth_weights, 8, weights);
1217*77c1e3ccSAndroid Build Coastguard Worker
1218*77c1e3ccSAndroid Build Coastguard Worker write_smooth_vertical4xh(&pixels, weights, 8, dst, stride);
1219*77c1e3ccSAndroid Build Coastguard Worker }
1220*77c1e3ccSAndroid Build Coastguard Worker
1221*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_v_predictor_4x16_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1222*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_4x16_ssse3(
1223*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1224*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1225*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1226*77c1e3ccSAndroid Build Coastguard Worker __m128i pixels;
1227*77c1e3ccSAndroid Build Coastguard Worker load_smooth_vertical_pixels4(top_row, left_column, 16, &pixels);
1228*77c1e3ccSAndroid Build Coastguard Worker
1229*77c1e3ccSAndroid Build Coastguard Worker __m128i weights[4];
1230*77c1e3ccSAndroid Build Coastguard Worker load_smooth_vertical_weights4(smooth_weights, 16, weights);
1231*77c1e3ccSAndroid Build Coastguard Worker
1232*77c1e3ccSAndroid Build Coastguard Worker write_smooth_vertical4xh(&pixels, weights, 8, dst, stride);
1233*77c1e3ccSAndroid Build Coastguard Worker dst += stride << 3;
1234*77c1e3ccSAndroid Build Coastguard Worker write_smooth_vertical4xh(&pixels, &weights[2], 8, dst, stride);
1235*77c1e3ccSAndroid Build Coastguard Worker }
1236*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1237*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_8x4_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1238*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_8x4_ssse3(
1239*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1240*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1241*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1242*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[3]);
1243*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi16(Load4(smooth_weights));
1244*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1245*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi16(scale, weights);
1246*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left =
1247*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights, bottom_left);
1248*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
1249*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(0x01000100);
1250*77c1e3ccSAndroid Build Coastguard Worker const __m128i top = cvtepu8_epi16(LoadLo8(top_row));
1251*77c1e3ccSAndroid Build Coastguard Worker __m128i weights_y = _mm_shuffle_epi8(weights, y_select);
1252*77c1e3ccSAndroid Build Coastguard Worker __m128i scaled_bottom_left_y = _mm_shuffle_epi8(scaled_bottom_left, y_select);
1253*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &top, &weights_y, &scaled_bottom_left_y,
1254*77c1e3ccSAndroid Build Coastguard Worker &round);
1255*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1256*77c1e3ccSAndroid Build Coastguard Worker y_select = _mm_set1_epi32(0x03020302);
1257*77c1e3ccSAndroid Build Coastguard Worker weights_y = _mm_shuffle_epi8(weights, y_select);
1258*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y = _mm_shuffle_epi8(scaled_bottom_left, y_select);
1259*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &top, &weights_y, &scaled_bottom_left_y,
1260*77c1e3ccSAndroid Build Coastguard Worker &round);
1261*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1262*77c1e3ccSAndroid Build Coastguard Worker y_select = _mm_set1_epi32(0x05040504);
1263*77c1e3ccSAndroid Build Coastguard Worker weights_y = _mm_shuffle_epi8(weights, y_select);
1264*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y = _mm_shuffle_epi8(scaled_bottom_left, y_select);
1265*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &top, &weights_y, &scaled_bottom_left_y,
1266*77c1e3ccSAndroid Build Coastguard Worker &round);
1267*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1268*77c1e3ccSAndroid Build Coastguard Worker y_select = _mm_set1_epi32(0x07060706);
1269*77c1e3ccSAndroid Build Coastguard Worker weights_y = _mm_shuffle_epi8(weights, y_select);
1270*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y = _mm_shuffle_epi8(scaled_bottom_left, y_select);
1271*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &top, &weights_y, &scaled_bottom_left_y,
1272*77c1e3ccSAndroid Build Coastguard Worker &round);
1273*77c1e3ccSAndroid Build Coastguard Worker }
1274*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_8x8_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1275*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_8x8_ssse3(
1276*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1277*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1278*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1279*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[7]);
1280*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi16(LoadLo8(smooth_weights + 4));
1281*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1282*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi16(scale, weights);
1283*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left =
1284*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights, bottom_left);
1285*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
1286*77c1e3ccSAndroid Build Coastguard Worker const __m128i top = cvtepu8_epi16(LoadLo8(top_row));
1287*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1288*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1289*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights, y_select);
1290*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1291*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left, y_select);
1292*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &top, &weights_y, &scaled_bottom_left_y,
1293*77c1e3ccSAndroid Build Coastguard Worker &round);
1294*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1295*77c1e3ccSAndroid Build Coastguard Worker }
1296*77c1e3ccSAndroid Build Coastguard Worker }
1297*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_8x16_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1298*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_8x16_ssse3(
1299*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1300*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1301*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1302*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[15]);
1303*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(smooth_weights + 12);
1304*77c1e3ccSAndroid Build Coastguard Worker
1305*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights);
1306*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights, 8));
1307*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1308*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
1309*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
1310*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left1 =
1311*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, bottom_left);
1312*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left2 =
1313*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, bottom_left);
1314*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
1315*77c1e3ccSAndroid Build Coastguard Worker const __m128i top = cvtepu8_epi16(LoadLo8(top_row));
1316*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1317*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1318*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights1, y_select);
1319*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1320*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left1, y_select);
1321*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &top, &weights_y, &scaled_bottom_left_y,
1322*77c1e3ccSAndroid Build Coastguard Worker &round);
1323*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1324*77c1e3ccSAndroid Build Coastguard Worker }
1325*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1326*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1327*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights2, y_select);
1328*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1329*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left2, y_select);
1330*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &top, &weights_y, &scaled_bottom_left_y,
1331*77c1e3ccSAndroid Build Coastguard Worker &round);
1332*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1333*77c1e3ccSAndroid Build Coastguard Worker }
1334*77c1e3ccSAndroid Build Coastguard Worker }
1335*77c1e3ccSAndroid Build Coastguard Worker
1336*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_v_predictor_8x32_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1337*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_8x32_ssse3(
1338*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1339*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1340*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1341*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
1342*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[31]);
1343*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = LoadUnaligned16(smooth_weights + 28);
1344*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = LoadUnaligned16(smooth_weights + 44);
1345*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights_lo);
1346*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = _mm_unpackhi_epi8(weights_lo, zero);
1347*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights3 = cvtepu8_epi16(weights_hi);
1348*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights4 = _mm_unpackhi_epi8(weights_hi, zero);
1349*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1350*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
1351*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
1352*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights3 = _mm_sub_epi16(scale, weights3);
1353*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights4 = _mm_sub_epi16(scale, weights4);
1354*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left1 =
1355*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, bottom_left);
1356*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left2 =
1357*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, bottom_left);
1358*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left3 =
1359*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights3, bottom_left);
1360*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left4 =
1361*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights4, bottom_left);
1362*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
1363*77c1e3ccSAndroid Build Coastguard Worker const __m128i top = cvtepu8_epi16(LoadLo8(top_row));
1364*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1365*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1366*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights1, y_select);
1367*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1368*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left1, y_select);
1369*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &top, &weights_y, &scaled_bottom_left_y,
1370*77c1e3ccSAndroid Build Coastguard Worker &round);
1371*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1372*77c1e3ccSAndroid Build Coastguard Worker }
1373*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1374*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1375*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights2, y_select);
1376*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1377*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left2, y_select);
1378*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &top, &weights_y, &scaled_bottom_left_y,
1379*77c1e3ccSAndroid Build Coastguard Worker &round);
1380*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1381*77c1e3ccSAndroid Build Coastguard Worker }
1382*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1383*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1384*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights3, y_select);
1385*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1386*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left3, y_select);
1387*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &top, &weights_y, &scaled_bottom_left_y,
1388*77c1e3ccSAndroid Build Coastguard Worker &round);
1389*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1390*77c1e3ccSAndroid Build Coastguard Worker }
1391*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1392*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1393*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights4, y_select);
1394*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1395*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left4, y_select);
1396*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &top, &weights_y, &scaled_bottom_left_y,
1397*77c1e3ccSAndroid Build Coastguard Worker &round);
1398*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1399*77c1e3ccSAndroid Build Coastguard Worker }
1400*77c1e3ccSAndroid Build Coastguard Worker }
1401*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_16x4_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1402*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_16x4_ssse3(
1403*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1404*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1405*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1406*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[3]);
1407*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi16(Load4(smooth_weights));
1408*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1409*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi16(scale, weights);
1410*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left =
1411*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights, bottom_left);
1412*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(128);
1413*77c1e3ccSAndroid Build Coastguard Worker const __m128i top = LoadUnaligned16(top_row);
1414*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lo = cvtepu8_epi16(top);
1415*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hi = cvtepu8_epi16(_mm_srli_si128(top, 8));
1416*77c1e3ccSAndroid Build Coastguard Worker
1417*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(0x01000100);
1418*77c1e3ccSAndroid Build Coastguard Worker __m128i weights_y = _mm_shuffle_epi8(weights, y_select);
1419*77c1e3ccSAndroid Build Coastguard Worker __m128i scaled_bottom_left_y = _mm_shuffle_epi8(scaled_bottom_left, y_select);
1420*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1421*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1422*77c1e3ccSAndroid Build Coastguard Worker round);
1423*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1424*77c1e3ccSAndroid Build Coastguard Worker y_select = _mm_set1_epi32(0x03020302);
1425*77c1e3ccSAndroid Build Coastguard Worker weights_y = _mm_shuffle_epi8(weights, y_select);
1426*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y = _mm_shuffle_epi8(scaled_bottom_left, y_select);
1427*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1428*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1429*77c1e3ccSAndroid Build Coastguard Worker round);
1430*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1431*77c1e3ccSAndroid Build Coastguard Worker y_select = _mm_set1_epi32(0x05040504);
1432*77c1e3ccSAndroid Build Coastguard Worker weights_y = _mm_shuffle_epi8(weights, y_select);
1433*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y = _mm_shuffle_epi8(scaled_bottom_left, y_select);
1434*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1435*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1436*77c1e3ccSAndroid Build Coastguard Worker round);
1437*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1438*77c1e3ccSAndroid Build Coastguard Worker y_select = _mm_set1_epi32(0x07060706);
1439*77c1e3ccSAndroid Build Coastguard Worker weights_y = _mm_shuffle_epi8(weights, y_select);
1440*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y = _mm_shuffle_epi8(scaled_bottom_left, y_select);
1441*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1442*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1443*77c1e3ccSAndroid Build Coastguard Worker round);
1444*77c1e3ccSAndroid Build Coastguard Worker }
1445*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1446*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_16x8_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1447*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_16x8_ssse3(
1448*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1449*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1450*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1451*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[7]);
1452*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi16(LoadLo8(smooth_weights + 4));
1453*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1454*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi16(scale, weights);
1455*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left =
1456*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights, bottom_left);
1457*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(128);
1458*77c1e3ccSAndroid Build Coastguard Worker const __m128i top = LoadUnaligned16(top_row);
1459*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lo = cvtepu8_epi16(top);
1460*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hi = cvtepu8_epi16(_mm_srli_si128(top, 8));
1461*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1462*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1463*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights, y_select);
1464*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1465*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left, y_select);
1466*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1467*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1468*77c1e3ccSAndroid Build Coastguard Worker round);
1469*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1470*77c1e3ccSAndroid Build Coastguard Worker }
1471*77c1e3ccSAndroid Build Coastguard Worker }
1472*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_16x16_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1473*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_16x16_ssse3(
1474*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1475*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1476*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1477*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[15]);
1478*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
1479*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1480*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(smooth_weights + 12);
1481*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = cvtepu8_epi16(weights);
1482*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = _mm_unpackhi_epi8(weights, zero);
1483*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights_lo = _mm_sub_epi16(scale, weights_lo);
1484*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights_hi = _mm_sub_epi16(scale, weights_hi);
1485*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_lo =
1486*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights_lo, bottom_left);
1487*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_hi =
1488*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights_hi, bottom_left);
1489*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(128);
1490*77c1e3ccSAndroid Build Coastguard Worker
1491*77c1e3ccSAndroid Build Coastguard Worker const __m128i top = LoadUnaligned16(top_row);
1492*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lo = cvtepu8_epi16(top);
1493*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hi = _mm_unpackhi_epi8(top, zero);
1494*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1495*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1496*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights_lo, y_select);
1497*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1498*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left_lo, y_select);
1499*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1500*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1501*77c1e3ccSAndroid Build Coastguard Worker round);
1502*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1503*77c1e3ccSAndroid Build Coastguard Worker }
1504*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1505*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1506*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights_hi, y_select);
1507*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1508*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left_hi, y_select);
1509*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1510*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1511*77c1e3ccSAndroid Build Coastguard Worker round);
1512*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1513*77c1e3ccSAndroid Build Coastguard Worker }
1514*77c1e3ccSAndroid Build Coastguard Worker }
1515*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_16x32_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1516*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_16x32_ssse3(
1517*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1518*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1519*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1520*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[31]);
1521*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = LoadUnaligned16(smooth_weights + 28);
1522*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = LoadUnaligned16(smooth_weights + 44);
1523*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1524*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
1525*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights_lo);
1526*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = _mm_unpackhi_epi8(weights_lo, zero);
1527*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights3 = cvtepu8_epi16(weights_hi);
1528*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights4 = _mm_unpackhi_epi8(weights_hi, zero);
1529*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
1530*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
1531*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights3 = _mm_sub_epi16(scale, weights3);
1532*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights4 = _mm_sub_epi16(scale, weights4);
1533*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left1 =
1534*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, bottom_left);
1535*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left2 =
1536*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, bottom_left);
1537*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left3 =
1538*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights3, bottom_left);
1539*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left4 =
1540*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights4, bottom_left);
1541*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(128);
1542*77c1e3ccSAndroid Build Coastguard Worker
1543*77c1e3ccSAndroid Build Coastguard Worker const __m128i top = LoadUnaligned16(top_row);
1544*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lo = cvtepu8_epi16(top);
1545*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hi = _mm_unpackhi_epi8(top, zero);
1546*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1547*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1548*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights1, y_select);
1549*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1550*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left1, y_select);
1551*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1552*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1553*77c1e3ccSAndroid Build Coastguard Worker round);
1554*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1555*77c1e3ccSAndroid Build Coastguard Worker }
1556*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1557*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1558*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights2, y_select);
1559*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1560*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left2, y_select);
1561*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1562*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1563*77c1e3ccSAndroid Build Coastguard Worker round);
1564*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1565*77c1e3ccSAndroid Build Coastguard Worker }
1566*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1567*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1568*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights3, y_select);
1569*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1570*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left3, y_select);
1571*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1572*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1573*77c1e3ccSAndroid Build Coastguard Worker round);
1574*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1575*77c1e3ccSAndroid Build Coastguard Worker }
1576*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1577*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1578*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights4, y_select);
1579*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1580*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left4, y_select);
1581*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1582*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1583*77c1e3ccSAndroid Build Coastguard Worker round);
1584*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1585*77c1e3ccSAndroid Build Coastguard Worker }
1586*77c1e3ccSAndroid Build Coastguard Worker }
1587*77c1e3ccSAndroid Build Coastguard Worker
1588*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_v_predictor_16x64_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1589*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_16x64_ssse3(
1590*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1591*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1592*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1593*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[63]);
1594*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1595*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(128);
1596*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
1597*77c1e3ccSAndroid Build Coastguard Worker const __m128i top = LoadUnaligned16(top_row);
1598*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lo = cvtepu8_epi16(top);
1599*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hi = _mm_unpackhi_epi8(top, zero);
1600*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *weights_base_ptr = smooth_weights + 60;
1601*77c1e3ccSAndroid Build Coastguard Worker for (int left_offset = 0; left_offset < 64; left_offset += 16) {
1602*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(weights_base_ptr + left_offset);
1603*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = cvtepu8_epi16(weights);
1604*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = _mm_unpackhi_epi8(weights, zero);
1605*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights_lo = _mm_sub_epi16(scale, weights_lo);
1606*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights_hi = _mm_sub_epi16(scale, weights_hi);
1607*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_lo =
1608*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights_lo, bottom_left);
1609*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_hi =
1610*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights_hi, bottom_left);
1611*77c1e3ccSAndroid Build Coastguard Worker
1612*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1613*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1614*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights_lo, y_select);
1615*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1616*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left_lo, y_select);
1617*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1618*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1619*77c1e3ccSAndroid Build Coastguard Worker round);
1620*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1621*77c1e3ccSAndroid Build Coastguard Worker }
1622*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1623*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1624*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights_hi, y_select);
1625*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1626*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left_hi, y_select);
1627*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top_lo, top_hi, weights_y, weights_y,
1628*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1629*77c1e3ccSAndroid Build Coastguard Worker round);
1630*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1631*77c1e3ccSAndroid Build Coastguard Worker }
1632*77c1e3ccSAndroid Build Coastguard Worker }
1633*77c1e3ccSAndroid Build Coastguard Worker }
1634*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_32x8_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1635*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_32x8_ssse3(
1636*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1637*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1638*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1639*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
1640*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[7]);
1641*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lo = LoadUnaligned16(top_row);
1642*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hi = LoadUnaligned16(top_row + 16);
1643*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = cvtepu8_epi16(top_lo);
1644*77c1e3ccSAndroid Build Coastguard Worker const __m128i top2 = _mm_unpackhi_epi8(top_lo, zero);
1645*77c1e3ccSAndroid Build Coastguard Worker const __m128i top3 = cvtepu8_epi16(top_hi);
1646*77c1e3ccSAndroid Build Coastguard Worker const __m128i top4 = _mm_unpackhi_epi8(top_hi, zero);
1647*77c1e3ccSAndroid Build Coastguard Worker __m128i scale = _mm_set1_epi16(256);
1648*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi16(LoadLo8(smooth_weights + 4));
1649*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi16(scale, weights);
1650*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left =
1651*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights, bottom_left);
1652*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
1653*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1654*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
1655*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights, y_select);
1656*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1657*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left, y_select);
1658*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1659*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1660*77c1e3ccSAndroid Build Coastguard Worker round);
1661*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1662*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1663*77c1e3ccSAndroid Build Coastguard Worker round);
1664*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1665*77c1e3ccSAndroid Build Coastguard Worker }
1666*77c1e3ccSAndroid Build Coastguard Worker }
1667*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1668*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_32x16_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1669*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_32x16_ssse3(
1670*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1671*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1672*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1673*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
1674*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[15]);
1675*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lo = LoadUnaligned16(top_row);
1676*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hi = LoadUnaligned16(top_row + 16);
1677*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = cvtepu8_epi16(top_lo);
1678*77c1e3ccSAndroid Build Coastguard Worker const __m128i top2 = _mm_unpackhi_epi8(top_lo, zero);
1679*77c1e3ccSAndroid Build Coastguard Worker const __m128i top3 = cvtepu8_epi16(top_hi);
1680*77c1e3ccSAndroid Build Coastguard Worker const __m128i top4 = _mm_unpackhi_epi8(top_hi, zero);
1681*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(smooth_weights + 12);
1682*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights);
1683*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = _mm_unpackhi_epi8(weights, zero);
1684*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1685*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
1686*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
1687*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left1 =
1688*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, bottom_left);
1689*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left2 =
1690*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, bottom_left);
1691*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
1692*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1693*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
1694*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights1, y_select);
1695*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1696*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left1, y_select);
1697*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1698*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1699*77c1e3ccSAndroid Build Coastguard Worker round);
1700*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1701*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1702*77c1e3ccSAndroid Build Coastguard Worker round);
1703*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1704*77c1e3ccSAndroid Build Coastguard Worker }
1705*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1706*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
1707*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights2, y_select);
1708*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1709*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left2, y_select);
1710*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1711*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1712*77c1e3ccSAndroid Build Coastguard Worker round);
1713*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1714*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1715*77c1e3ccSAndroid Build Coastguard Worker round);
1716*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1717*77c1e3ccSAndroid Build Coastguard Worker }
1718*77c1e3ccSAndroid Build Coastguard Worker }
1719*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_32x32_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1720*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_32x32_ssse3(
1721*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1722*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1723*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1724*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[31]);
1725*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = LoadUnaligned16(smooth_weights + 28);
1726*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = LoadUnaligned16(smooth_weights + 44);
1727*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
1728*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1729*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lo = LoadUnaligned16(top_row);
1730*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hi = LoadUnaligned16(top_row + 16);
1731*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = cvtepu8_epi16(top_lo);
1732*77c1e3ccSAndroid Build Coastguard Worker const __m128i top2 = _mm_unpackhi_epi8(top_lo, zero);
1733*77c1e3ccSAndroid Build Coastguard Worker const __m128i top3 = cvtepu8_epi16(top_hi);
1734*77c1e3ccSAndroid Build Coastguard Worker const __m128i top4 = _mm_unpackhi_epi8(top_hi, zero);
1735*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights_lo);
1736*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = _mm_unpackhi_epi8(weights_lo, zero);
1737*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights3 = cvtepu8_epi16(weights_hi);
1738*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights4 = _mm_unpackhi_epi8(weights_hi, zero);
1739*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
1740*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
1741*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights3 = _mm_sub_epi16(scale, weights3);
1742*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights4 = _mm_sub_epi16(scale, weights4);
1743*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left1 =
1744*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, bottom_left);
1745*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left2 =
1746*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, bottom_left);
1747*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left3 =
1748*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights3, bottom_left);
1749*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left4 =
1750*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights4, bottom_left);
1751*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
1752*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1753*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1754*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights1, y_select);
1755*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1756*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left1, y_select);
1757*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1758*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1759*77c1e3ccSAndroid Build Coastguard Worker round);
1760*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1761*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1762*77c1e3ccSAndroid Build Coastguard Worker round);
1763*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1764*77c1e3ccSAndroid Build Coastguard Worker }
1765*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1766*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1767*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights2, y_select);
1768*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1769*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left2, y_select);
1770*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1771*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1772*77c1e3ccSAndroid Build Coastguard Worker round);
1773*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1774*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1775*77c1e3ccSAndroid Build Coastguard Worker round);
1776*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1777*77c1e3ccSAndroid Build Coastguard Worker }
1778*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1779*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1780*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights3, y_select);
1781*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1782*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left3, y_select);
1783*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1784*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1785*77c1e3ccSAndroid Build Coastguard Worker round);
1786*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1787*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1788*77c1e3ccSAndroid Build Coastguard Worker round);
1789*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1790*77c1e3ccSAndroid Build Coastguard Worker }
1791*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1792*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1793*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights4, y_select);
1794*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1795*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left4, y_select);
1796*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1797*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1798*77c1e3ccSAndroid Build Coastguard Worker round);
1799*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1800*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1801*77c1e3ccSAndroid Build Coastguard Worker round);
1802*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1803*77c1e3ccSAndroid Build Coastguard Worker }
1804*77c1e3ccSAndroid Build Coastguard Worker }
1805*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_32x64_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1806*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_32x64_ssse3(
1807*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1808*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1809*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1810*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
1811*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[63]);
1812*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lo = LoadUnaligned16(top_row);
1813*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hi = LoadUnaligned16(top_row + 16);
1814*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = cvtepu8_epi16(top_lo);
1815*77c1e3ccSAndroid Build Coastguard Worker const __m128i top2 = _mm_unpackhi_epi8(top_lo, zero);
1816*77c1e3ccSAndroid Build Coastguard Worker const __m128i top3 = cvtepu8_epi16(top_hi);
1817*77c1e3ccSAndroid Build Coastguard Worker const __m128i top4 = _mm_unpackhi_epi8(top_hi, zero);
1818*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1819*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
1820*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *weights_base_ptr = smooth_weights + 60;
1821*77c1e3ccSAndroid Build Coastguard Worker for (int left_offset = 0; left_offset < 64; left_offset += 16) {
1822*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(weights_base_ptr + left_offset);
1823*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = cvtepu8_epi16(weights);
1824*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = _mm_unpackhi_epi8(weights, zero);
1825*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights_lo = _mm_sub_epi16(scale, weights_lo);
1826*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights_hi = _mm_sub_epi16(scale, weights_hi);
1827*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_lo =
1828*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights_lo, bottom_left);
1829*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_hi =
1830*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights_hi, bottom_left);
1831*77c1e3ccSAndroid Build Coastguard Worker
1832*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1833*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1834*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights_lo, y_select);
1835*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1836*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left_lo, y_select);
1837*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1838*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1839*77c1e3ccSAndroid Build Coastguard Worker round);
1840*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1841*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1842*77c1e3ccSAndroid Build Coastguard Worker round);
1843*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1844*77c1e3ccSAndroid Build Coastguard Worker }
1845*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1846*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1847*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights_hi, y_select);
1848*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1849*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left_hi, y_select);
1850*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1851*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1852*77c1e3ccSAndroid Build Coastguard Worker round);
1853*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1854*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1855*77c1e3ccSAndroid Build Coastguard Worker round);
1856*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1857*77c1e3ccSAndroid Build Coastguard Worker }
1858*77c1e3ccSAndroid Build Coastguard Worker }
1859*77c1e3ccSAndroid Build Coastguard Worker }
1860*77c1e3ccSAndroid Build Coastguard Worker
1861*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_v_predictor_64x16_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1862*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_64x16_ssse3(
1863*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1864*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1865*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1866*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[15]);
1867*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1868*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
1869*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lolo = LoadUnaligned16(top_row);
1870*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lohi = LoadUnaligned16(top_row + 16);
1871*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = cvtepu8_epi16(top_lolo);
1872*77c1e3ccSAndroid Build Coastguard Worker const __m128i top2 = _mm_unpackhi_epi8(top_lolo, zero);
1873*77c1e3ccSAndroid Build Coastguard Worker const __m128i top3 = cvtepu8_epi16(top_lohi);
1874*77c1e3ccSAndroid Build Coastguard Worker const __m128i top4 = _mm_unpackhi_epi8(top_lohi, zero);
1875*77c1e3ccSAndroid Build Coastguard Worker
1876*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(smooth_weights + 12);
1877*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights);
1878*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = _mm_unpackhi_epi8(weights, zero);
1879*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
1880*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
1881*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hilo = LoadUnaligned16(top_row + 32);
1882*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hihi = LoadUnaligned16(top_row + 48);
1883*77c1e3ccSAndroid Build Coastguard Worker const __m128i top5 = cvtepu8_epi16(top_hilo);
1884*77c1e3ccSAndroid Build Coastguard Worker const __m128i top6 = _mm_unpackhi_epi8(top_hilo, zero);
1885*77c1e3ccSAndroid Build Coastguard Worker const __m128i top7 = cvtepu8_epi16(top_hihi);
1886*77c1e3ccSAndroid Build Coastguard Worker const __m128i top8 = _mm_unpackhi_epi8(top_hihi, zero);
1887*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left1 =
1888*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, bottom_left);
1889*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left2 =
1890*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, bottom_left);
1891*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
1892*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1893*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1894*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights1, y_select);
1895*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1896*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left1, y_select);
1897*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1898*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1899*77c1e3ccSAndroid Build Coastguard Worker round);
1900*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1901*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1902*77c1e3ccSAndroid Build Coastguard Worker round);
1903*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, top5, top6, weights_y, weights_y,
1904*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1905*77c1e3ccSAndroid Build Coastguard Worker round);
1906*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, top7, top8, weights_y, weights_y,
1907*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1908*77c1e3ccSAndroid Build Coastguard Worker round);
1909*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1910*77c1e3ccSAndroid Build Coastguard Worker }
1911*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1912*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1913*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights2, y_select);
1914*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1915*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left2, y_select);
1916*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1917*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1918*77c1e3ccSAndroid Build Coastguard Worker round);
1919*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1920*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1921*77c1e3ccSAndroid Build Coastguard Worker round);
1922*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, top5, top6, weights_y, weights_y,
1923*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1924*77c1e3ccSAndroid Build Coastguard Worker round);
1925*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, top7, top8, weights_y, weights_y,
1926*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1927*77c1e3ccSAndroid Build Coastguard Worker round);
1928*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1929*77c1e3ccSAndroid Build Coastguard Worker }
1930*77c1e3ccSAndroid Build Coastguard Worker }
1931*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
1932*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_64x32_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)1933*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_64x32_ssse3(
1934*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
1935*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
1936*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
1937*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
1938*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[31]);
1939*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lolo = LoadUnaligned16(top_row);
1940*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lohi = LoadUnaligned16(top_row + 16);
1941*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = cvtepu8_epi16(top_lolo);
1942*77c1e3ccSAndroid Build Coastguard Worker const __m128i top2 = _mm_unpackhi_epi8(top_lolo, zero);
1943*77c1e3ccSAndroid Build Coastguard Worker const __m128i top3 = cvtepu8_epi16(top_lohi);
1944*77c1e3ccSAndroid Build Coastguard Worker const __m128i top4 = _mm_unpackhi_epi8(top_lohi, zero);
1945*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hilo = LoadUnaligned16(top_row + 32);
1946*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hihi = LoadUnaligned16(top_row + 48);
1947*77c1e3ccSAndroid Build Coastguard Worker const __m128i top5 = cvtepu8_epi16(top_hilo);
1948*77c1e3ccSAndroid Build Coastguard Worker const __m128i top6 = _mm_unpackhi_epi8(top_hilo, zero);
1949*77c1e3ccSAndroid Build Coastguard Worker const __m128i top7 = cvtepu8_epi16(top_hihi);
1950*77c1e3ccSAndroid Build Coastguard Worker const __m128i top8 = _mm_unpackhi_epi8(top_hihi, zero);
1951*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = LoadUnaligned16(smooth_weights + 28);
1952*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = LoadUnaligned16(smooth_weights + 44);
1953*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights_lo);
1954*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = _mm_unpackhi_epi8(weights_lo, zero);
1955*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights3 = cvtepu8_epi16(weights_hi);
1956*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights4 = _mm_unpackhi_epi8(weights_hi, zero);
1957*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
1958*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
1959*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
1960*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights3 = _mm_sub_epi16(scale, weights3);
1961*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights4 = _mm_sub_epi16(scale, weights4);
1962*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left1 =
1963*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, bottom_left);
1964*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left2 =
1965*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, bottom_left);
1966*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left3 =
1967*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights3, bottom_left);
1968*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left4 =
1969*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights4, bottom_left);
1970*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
1971*77c1e3ccSAndroid Build Coastguard Worker
1972*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1973*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1974*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights1, y_select);
1975*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1976*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left1, y_select);
1977*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1978*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1979*77c1e3ccSAndroid Build Coastguard Worker round);
1980*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
1981*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1982*77c1e3ccSAndroid Build Coastguard Worker round);
1983*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, top5, top6, weights_y, weights_y,
1984*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1985*77c1e3ccSAndroid Build Coastguard Worker round);
1986*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, top7, top8, weights_y, weights_y,
1987*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1988*77c1e3ccSAndroid Build Coastguard Worker round);
1989*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
1990*77c1e3ccSAndroid Build Coastguard Worker }
1991*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
1992*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
1993*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights2, y_select);
1994*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
1995*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left2, y_select);
1996*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
1997*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
1998*77c1e3ccSAndroid Build Coastguard Worker round);
1999*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
2000*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2001*77c1e3ccSAndroid Build Coastguard Worker round);
2002*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, top5, top6, weights_y, weights_y,
2003*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2004*77c1e3ccSAndroid Build Coastguard Worker round);
2005*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, top7, top8, weights_y, weights_y,
2006*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2007*77c1e3ccSAndroid Build Coastguard Worker round);
2008*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2009*77c1e3ccSAndroid Build Coastguard Worker }
2010*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2011*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2012*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights3, y_select);
2013*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
2014*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left3, y_select);
2015*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
2016*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2017*77c1e3ccSAndroid Build Coastguard Worker round);
2018*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
2019*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2020*77c1e3ccSAndroid Build Coastguard Worker round);
2021*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, top5, top6, weights_y, weights_y,
2022*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2023*77c1e3ccSAndroid Build Coastguard Worker round);
2024*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, top7, top8, weights_y, weights_y,
2025*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2026*77c1e3ccSAndroid Build Coastguard Worker round);
2027*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2028*77c1e3ccSAndroid Build Coastguard Worker }
2029*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2030*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2031*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights4, y_select);
2032*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
2033*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left4, y_select);
2034*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
2035*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2036*77c1e3ccSAndroid Build Coastguard Worker round);
2037*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
2038*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2039*77c1e3ccSAndroid Build Coastguard Worker round);
2040*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, top5, top6, weights_y, weights_y,
2041*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2042*77c1e3ccSAndroid Build Coastguard Worker round);
2043*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, top7, top8, weights_y, weights_y,
2044*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2045*77c1e3ccSAndroid Build Coastguard Worker round);
2046*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2047*77c1e3ccSAndroid Build Coastguard Worker }
2048*77c1e3ccSAndroid Build Coastguard Worker }
2049*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_v_predictor_64x64_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2050*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_v_predictor_64x64_ssse3(
2051*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2052*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2053*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2054*77c1e3ccSAndroid Build Coastguard Worker const __m128i zero = _mm_setzero_si128();
2055*77c1e3ccSAndroid Build Coastguard Worker const __m128i bottom_left = _mm_set1_epi16(left_column[63]);
2056*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lolo = LoadUnaligned16(top_row);
2057*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_lohi = LoadUnaligned16(top_row + 16);
2058*77c1e3ccSAndroid Build Coastguard Worker const __m128i top1 = cvtepu8_epi16(top_lolo);
2059*77c1e3ccSAndroid Build Coastguard Worker const __m128i top2 = _mm_unpackhi_epi8(top_lolo, zero);
2060*77c1e3ccSAndroid Build Coastguard Worker const __m128i top3 = cvtepu8_epi16(top_lohi);
2061*77c1e3ccSAndroid Build Coastguard Worker const __m128i top4 = _mm_unpackhi_epi8(top_lohi, zero);
2062*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hilo = LoadUnaligned16(top_row + 32);
2063*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_hihi = LoadUnaligned16(top_row + 48);
2064*77c1e3ccSAndroid Build Coastguard Worker const __m128i top5 = cvtepu8_epi16(top_hilo);
2065*77c1e3ccSAndroid Build Coastguard Worker const __m128i top6 = _mm_unpackhi_epi8(top_hilo, zero);
2066*77c1e3ccSAndroid Build Coastguard Worker const __m128i top7 = cvtepu8_epi16(top_hihi);
2067*77c1e3ccSAndroid Build Coastguard Worker const __m128i top8 = _mm_unpackhi_epi8(top_hihi, zero);
2068*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2069*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(128);
2070*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *weights_base_ptr = smooth_weights + 60;
2071*77c1e3ccSAndroid Build Coastguard Worker for (int left_offset = 0; left_offset < 64; left_offset += 16) {
2072*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(weights_base_ptr + left_offset);
2073*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = cvtepu8_epi16(weights);
2074*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = _mm_unpackhi_epi8(weights, zero);
2075*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights_lo = _mm_sub_epi16(scale, weights_lo);
2076*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights_hi = _mm_sub_epi16(scale, weights_hi);
2077*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_lo =
2078*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights_lo, bottom_left);
2079*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_hi =
2080*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights_hi, bottom_left);
2081*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2082*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2083*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights_lo, y_select);
2084*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
2085*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left_lo, y_select);
2086*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
2087*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2088*77c1e3ccSAndroid Build Coastguard Worker round);
2089*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
2090*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2091*77c1e3ccSAndroid Build Coastguard Worker round);
2092*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, top5, top6, weights_y, weights_y,
2093*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2094*77c1e3ccSAndroid Build Coastguard Worker round);
2095*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, top7, top8, weights_y, weights_y,
2096*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2097*77c1e3ccSAndroid Build Coastguard Worker round);
2098*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2099*77c1e3ccSAndroid Build Coastguard Worker }
2100*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2101*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2102*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_y = _mm_shuffle_epi8(weights_hi, y_select);
2103*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_bottom_left_y =
2104*77c1e3ccSAndroid Build Coastguard Worker _mm_shuffle_epi8(scaled_bottom_left_hi, y_select);
2105*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, top1, top2, weights_y, weights_y,
2106*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2107*77c1e3ccSAndroid Build Coastguard Worker round);
2108*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, top3, top4, weights_y, weights_y,
2109*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2110*77c1e3ccSAndroid Build Coastguard Worker round);
2111*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, top5, top6, weights_y, weights_y,
2112*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2113*77c1e3ccSAndroid Build Coastguard Worker round);
2114*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, top7, top8, weights_y, weights_y,
2115*77c1e3ccSAndroid Build Coastguard Worker scaled_bottom_left_y, scaled_bottom_left_y,
2116*77c1e3ccSAndroid Build Coastguard Worker round);
2117*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2118*77c1e3ccSAndroid Build Coastguard Worker }
2119*77c1e3ccSAndroid Build Coastguard Worker }
2120*77c1e3ccSAndroid Build Coastguard Worker }
2121*77c1e3ccSAndroid Build Coastguard Worker
2122*77c1e3ccSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
2123*77c1e3ccSAndroid Build Coastguard Worker // SMOOTH_H_PRED
write_smooth_horizontal_sum4(uint8_t * LIBAOM_RESTRICT dst,const __m128i * left_y,const __m128i * weights,const __m128i * scaled_top_right,const __m128i * round)2124*77c1e3ccSAndroid Build Coastguard Worker static AOM_FORCE_INLINE void write_smooth_horizontal_sum4(
2125*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, const __m128i *left_y, const __m128i *weights,
2126*77c1e3ccSAndroid Build Coastguard Worker const __m128i *scaled_top_right, const __m128i *round) {
2127*77c1e3ccSAndroid Build Coastguard Worker const __m128i weighted_left_y = _mm_mullo_epi16(*left_y, *weights);
2128*77c1e3ccSAndroid Build Coastguard Worker const __m128i pred_sum = _mm_add_epi32(*scaled_top_right, weighted_left_y);
2129*77c1e3ccSAndroid Build Coastguard Worker // Equivalent to RightShiftWithRounding(pred[x][y], 8).
2130*77c1e3ccSAndroid Build Coastguard Worker const __m128i pred = _mm_srli_epi32(_mm_add_epi32(pred_sum, *round), 8);
2131*77c1e3ccSAndroid Build Coastguard Worker const __m128i cvtepi32_epi8 = _mm_set1_epi32(0x0C080400);
2132*77c1e3ccSAndroid Build Coastguard Worker Store4(dst, _mm_shuffle_epi8(pred, cvtepi32_epi8));
2133*77c1e3ccSAndroid Build Coastguard Worker }
2134*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_4x4_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2135*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_4x4_ssse3(
2136*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2137*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2138*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2139*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi32(top_row[3]);
2140*77c1e3ccSAndroid Build Coastguard Worker const __m128i left = cvtepu8_epi32(Load4(left_column));
2141*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi32(Load4(smooth_weights));
2142*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2143*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi32(scale, weights);
2144*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right = _mm_mullo_epi16(inverted_weights, top_right);
2145*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2146*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi32(left, 0);
2147*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2148*77c1e3ccSAndroid Build Coastguard Worker &round);
2149*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2150*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0x55);
2151*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2152*77c1e3ccSAndroid Build Coastguard Worker &round);
2153*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2154*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xaa);
2155*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2156*77c1e3ccSAndroid Build Coastguard Worker &round);
2157*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2158*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xff);
2159*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2160*77c1e3ccSAndroid Build Coastguard Worker &round);
2161*77c1e3ccSAndroid Build Coastguard Worker }
2162*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_4x8_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2163*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_4x8_ssse3(
2164*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2165*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2166*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2167*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi32(top_row[3]);
2168*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi32(Load4(smooth_weights));
2169*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2170*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi32(scale, weights);
2171*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right = _mm_mullo_epi16(inverted_weights, top_right);
2172*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2173*77c1e3ccSAndroid Build Coastguard Worker __m128i left = cvtepu8_epi32(Load4(left_column));
2174*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi32(left, 0);
2175*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2176*77c1e3ccSAndroid Build Coastguard Worker &round);
2177*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2178*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0x55);
2179*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2180*77c1e3ccSAndroid Build Coastguard Worker &round);
2181*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2182*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xaa);
2183*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2184*77c1e3ccSAndroid Build Coastguard Worker &round);
2185*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2186*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xff);
2187*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2188*77c1e3ccSAndroid Build Coastguard Worker &round);
2189*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2190*77c1e3ccSAndroid Build Coastguard Worker
2191*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi32(Load4(left_column + 4));
2192*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0);
2193*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2194*77c1e3ccSAndroid Build Coastguard Worker &round);
2195*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2196*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0x55);
2197*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2198*77c1e3ccSAndroid Build Coastguard Worker &round);
2199*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2200*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xaa);
2201*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2202*77c1e3ccSAndroid Build Coastguard Worker &round);
2203*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2204*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xff);
2205*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2206*77c1e3ccSAndroid Build Coastguard Worker &round);
2207*77c1e3ccSAndroid Build Coastguard Worker }
2208*77c1e3ccSAndroid Build Coastguard Worker
2209*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_h_predictor_4x16_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2210*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_4x16_ssse3(
2211*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2212*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2213*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2214*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi32(top_row[3]);
2215*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi32(Load4(smooth_weights));
2216*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2217*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi32(scale, weights);
2218*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right = _mm_mullo_epi16(inverted_weights, top_right);
2219*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2220*77c1e3ccSAndroid Build Coastguard Worker __m128i left = cvtepu8_epi32(Load4(left_column));
2221*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi32(left, 0);
2222*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2223*77c1e3ccSAndroid Build Coastguard Worker &round);
2224*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2225*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0x55);
2226*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2227*77c1e3ccSAndroid Build Coastguard Worker &round);
2228*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2229*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xaa);
2230*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2231*77c1e3ccSAndroid Build Coastguard Worker &round);
2232*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2233*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xff);
2234*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2235*77c1e3ccSAndroid Build Coastguard Worker &round);
2236*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2237*77c1e3ccSAndroid Build Coastguard Worker
2238*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi32(Load4(left_column + 4));
2239*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0);
2240*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2241*77c1e3ccSAndroid Build Coastguard Worker &round);
2242*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2243*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0x55);
2244*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2245*77c1e3ccSAndroid Build Coastguard Worker &round);
2246*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2247*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xaa);
2248*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2249*77c1e3ccSAndroid Build Coastguard Worker &round);
2250*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2251*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xff);
2252*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2253*77c1e3ccSAndroid Build Coastguard Worker &round);
2254*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2255*77c1e3ccSAndroid Build Coastguard Worker
2256*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi32(Load4(left_column + 8));
2257*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0);
2258*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2259*77c1e3ccSAndroid Build Coastguard Worker &round);
2260*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2261*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0x55);
2262*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2263*77c1e3ccSAndroid Build Coastguard Worker &round);
2264*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2265*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xaa);
2266*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2267*77c1e3ccSAndroid Build Coastguard Worker &round);
2268*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2269*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xff);
2270*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2271*77c1e3ccSAndroid Build Coastguard Worker &round);
2272*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2273*77c1e3ccSAndroid Build Coastguard Worker
2274*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi32(Load4(left_column + 12));
2275*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0);
2276*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2277*77c1e3ccSAndroid Build Coastguard Worker &round);
2278*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2279*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0x55);
2280*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2281*77c1e3ccSAndroid Build Coastguard Worker &round);
2282*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2283*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xaa);
2284*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2285*77c1e3ccSAndroid Build Coastguard Worker &round);
2286*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2287*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi32(left, 0xff);
2288*77c1e3ccSAndroid Build Coastguard Worker write_smooth_horizontal_sum4(dst, &left_y, &weights, &scaled_top_right,
2289*77c1e3ccSAndroid Build Coastguard Worker &round);
2290*77c1e3ccSAndroid Build Coastguard Worker }
2291*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
2292*77c1e3ccSAndroid Build Coastguard Worker
2293*77c1e3ccSAndroid Build Coastguard Worker // For SMOOTH_H, |pixels| is the repeated left value for the row. For SMOOTH_V,
2294*77c1e3ccSAndroid Build Coastguard Worker // |pixels| is a segment of the top row or the whole top row, and |weights| is
2295*77c1e3ccSAndroid Build Coastguard Worker // repeated.
aom_smooth_h_predictor_8x4_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2296*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_8x4_ssse3(
2297*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2298*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2299*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2300*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[7]);
2301*77c1e3ccSAndroid Build Coastguard Worker const __m128i left = cvtepu8_epi16(Load4(left_column));
2302*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi16(LoadLo8(smooth_weights + 4));
2303*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2304*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi16(scale, weights);
2305*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right = _mm_mullo_epi16(inverted_weights, top_right);
2306*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2307*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(0x01000100);
2308*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi8(left, y_select);
2309*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &left_y, &weights, &scaled_top_right,
2310*77c1e3ccSAndroid Build Coastguard Worker &round);
2311*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2312*77c1e3ccSAndroid Build Coastguard Worker y_select = _mm_set1_epi32(0x03020302);
2313*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi8(left, y_select);
2314*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &left_y, &weights, &scaled_top_right,
2315*77c1e3ccSAndroid Build Coastguard Worker &round);
2316*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2317*77c1e3ccSAndroid Build Coastguard Worker y_select = _mm_set1_epi32(0x05040504);
2318*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi8(left, y_select);
2319*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &left_y, &weights, &scaled_top_right,
2320*77c1e3ccSAndroid Build Coastguard Worker &round);
2321*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2322*77c1e3ccSAndroid Build Coastguard Worker y_select = _mm_set1_epi32(0x07060706);
2323*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi8(left, y_select);
2324*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &left_y, &weights, &scaled_top_right,
2325*77c1e3ccSAndroid Build Coastguard Worker &round);
2326*77c1e3ccSAndroid Build Coastguard Worker }
2327*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_8x8_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2328*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_8x8_ssse3(
2329*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2330*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2331*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2332*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[7]);
2333*77c1e3ccSAndroid Build Coastguard Worker const __m128i left = cvtepu8_epi16(LoadLo8(left_column));
2334*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi16(LoadLo8(smooth_weights + 4));
2335*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2336*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi16(scale, weights);
2337*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right = _mm_mullo_epi16(inverted_weights, top_right);
2338*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2339*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2340*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2341*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2342*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &left_y, &weights, &scaled_top_right,
2343*77c1e3ccSAndroid Build Coastguard Worker &round);
2344*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2345*77c1e3ccSAndroid Build Coastguard Worker }
2346*77c1e3ccSAndroid Build Coastguard Worker }
2347*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_8x16_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2348*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_8x16_ssse3(
2349*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2350*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2351*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2352*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[7]);
2353*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi16(LoadLo8(smooth_weights + 4));
2354*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2355*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi16(scale, weights);
2356*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right = _mm_mullo_epi16(inverted_weights, top_right);
2357*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2358*77c1e3ccSAndroid Build Coastguard Worker __m128i left = cvtepu8_epi16(LoadLo8(left_column));
2359*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2360*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2361*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2362*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &left_y, &weights, &scaled_top_right,
2363*77c1e3ccSAndroid Build Coastguard Worker &round);
2364*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2365*77c1e3ccSAndroid Build Coastguard Worker }
2366*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi16(LoadLo8(left_column + 8));
2367*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2368*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2369*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2370*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &left_y, &weights, &scaled_top_right,
2371*77c1e3ccSAndroid Build Coastguard Worker &round);
2372*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2373*77c1e3ccSAndroid Build Coastguard Worker }
2374*77c1e3ccSAndroid Build Coastguard Worker }
2375*77c1e3ccSAndroid Build Coastguard Worker
2376*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_h_predictor_8x32_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2377*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_8x32_ssse3(
2378*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2379*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2380*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2381*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[7]);
2382*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = cvtepu8_epi16(LoadLo8(smooth_weights + 4));
2383*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2384*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights = _mm_sub_epi16(scale, weights);
2385*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right = _mm_mullo_epi16(inverted_weights, top_right);
2386*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2387*77c1e3ccSAndroid Build Coastguard Worker __m128i left = cvtepu8_epi16(LoadLo8(left_column));
2388*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2389*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2390*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2391*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &left_y, &weights, &scaled_top_right,
2392*77c1e3ccSAndroid Build Coastguard Worker &round);
2393*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2394*77c1e3ccSAndroid Build Coastguard Worker }
2395*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi16(LoadLo8(left_column + 8));
2396*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2397*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2398*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2399*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &left_y, &weights, &scaled_top_right,
2400*77c1e3ccSAndroid Build Coastguard Worker &round);
2401*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2402*77c1e3ccSAndroid Build Coastguard Worker }
2403*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi16(LoadLo8(left_column + 16));
2404*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2405*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2406*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2407*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &left_y, &weights, &scaled_top_right,
2408*77c1e3ccSAndroid Build Coastguard Worker &round);
2409*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2410*77c1e3ccSAndroid Build Coastguard Worker }
2411*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi16(LoadLo8(left_column + 24));
2412*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2413*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2414*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2415*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum8(dst, &left_y, &weights, &scaled_top_right,
2416*77c1e3ccSAndroid Build Coastguard Worker &round);
2417*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2418*77c1e3ccSAndroid Build Coastguard Worker }
2419*77c1e3ccSAndroid Build Coastguard Worker }
2420*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_16x4_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2421*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_16x4_ssse3(
2422*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2423*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2424*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2425*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[15]);
2426*77c1e3ccSAndroid Build Coastguard Worker const __m128i left = cvtepu8_epi16(Load4(left_column));
2427*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(smooth_weights + 12);
2428*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2429*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights);
2430*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights, 8));
2431*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2432*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2433*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2434*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2435*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2436*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2437*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2438*77c1e3ccSAndroid Build Coastguard Worker __m128i y_mask = _mm_set1_epi32(0x01000100);
2439*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi8(left, y_mask);
2440*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2441*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2442*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2443*77c1e3ccSAndroid Build Coastguard Worker y_mask = _mm_set1_epi32(0x03020302);
2444*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi8(left, y_mask);
2445*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2446*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2447*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2448*77c1e3ccSAndroid Build Coastguard Worker y_mask = _mm_set1_epi32(0x05040504);
2449*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi8(left, y_mask);
2450*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2451*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2452*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2453*77c1e3ccSAndroid Build Coastguard Worker y_mask = _mm_set1_epi32(0x07060706);
2454*77c1e3ccSAndroid Build Coastguard Worker left_y = _mm_shuffle_epi8(left, y_mask);
2455*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2456*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2457*77c1e3ccSAndroid Build Coastguard Worker }
2458*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
2459*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_16x8_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2460*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_16x8_ssse3(
2461*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2462*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2463*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2464*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[15]);
2465*77c1e3ccSAndroid Build Coastguard Worker const __m128i left = cvtepu8_epi16(LoadLo8(left_column));
2466*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(smooth_weights + 12);
2467*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2468*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights);
2469*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights, 8));
2470*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2471*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2472*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2473*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2474*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2475*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2476*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2477*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2478*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2479*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2480*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2481*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2482*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2483*77c1e3ccSAndroid Build Coastguard Worker }
2484*77c1e3ccSAndroid Build Coastguard Worker }
2485*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_16x16_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2486*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_16x16_ssse3(
2487*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2488*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2489*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2490*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[15]);
2491*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(smooth_weights + 12);
2492*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2493*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights);
2494*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights, 8));
2495*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2496*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2497*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2498*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2499*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2500*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2501*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2502*77c1e3ccSAndroid Build Coastguard Worker __m128i left = cvtepu8_epi16(LoadLo8(left_column));
2503*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2504*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2505*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2506*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2507*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2508*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2509*77c1e3ccSAndroid Build Coastguard Worker }
2510*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi16(LoadLo8(left_column + 8));
2511*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2512*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2513*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2514*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2515*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2516*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2517*77c1e3ccSAndroid Build Coastguard Worker }
2518*77c1e3ccSAndroid Build Coastguard Worker }
2519*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_16x32_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2520*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_16x32_ssse3(
2521*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2522*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2523*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2524*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[15]);
2525*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(smooth_weights + 12);
2526*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2527*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights);
2528*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights, 8));
2529*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2530*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2531*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2532*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2533*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2534*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2535*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2536*77c1e3ccSAndroid Build Coastguard Worker __m128i left = cvtepu8_epi16(LoadLo8(left_column));
2537*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2538*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2539*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2540*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2541*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2542*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2543*77c1e3ccSAndroid Build Coastguard Worker }
2544*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi16(LoadLo8(left_column + 8));
2545*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2546*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2547*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2548*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2549*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2550*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2551*77c1e3ccSAndroid Build Coastguard Worker }
2552*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi16(LoadLo8(left_column + 16));
2553*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2554*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2555*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2556*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2557*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2558*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2559*77c1e3ccSAndroid Build Coastguard Worker }
2560*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi16(LoadLo8(left_column + 24));
2561*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2562*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2563*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2564*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2565*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2566*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2567*77c1e3ccSAndroid Build Coastguard Worker }
2568*77c1e3ccSAndroid Build Coastguard Worker }
2569*77c1e3ccSAndroid Build Coastguard Worker
2570*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_h_predictor_16x64_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2571*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_16x64_ssse3(
2572*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2573*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2574*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2575*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[15]);
2576*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights = LoadUnaligned16(smooth_weights + 12);
2577*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2578*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights);
2579*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights, 8));
2580*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2581*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2582*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2583*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2584*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2585*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2586*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2587*77c1e3ccSAndroid Build Coastguard Worker for (int left_offset = 0; left_offset < 64; left_offset += 8) {
2588*77c1e3ccSAndroid Build Coastguard Worker const __m128i left = cvtepu8_epi16(LoadLo8(left_column + left_offset));
2589*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2590*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2591*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2592*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2593*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2,
2594*77c1e3ccSAndroid Build Coastguard Worker round);
2595*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2596*77c1e3ccSAndroid Build Coastguard Worker }
2597*77c1e3ccSAndroid Build Coastguard Worker }
2598*77c1e3ccSAndroid Build Coastguard Worker }
2599*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_32x8_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2600*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_32x8_ssse3(
2601*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2602*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2603*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2604*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[31]);
2605*77c1e3ccSAndroid Build Coastguard Worker const __m128i left = cvtepu8_epi16(LoadLo8(left_column));
2606*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = LoadUnaligned16(smooth_weights + 28);
2607*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = LoadUnaligned16(smooth_weights + 44);
2608*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2609*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights_lo);
2610*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights_lo, 8));
2611*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights3 = cvtepu8_epi16(weights_hi);
2612*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights4 = cvtepu8_epi16(_mm_srli_si128(weights_hi, 8));
2613*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2614*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2615*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights3 = _mm_sub_epi16(scale, weights3);
2616*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights4 = _mm_sub_epi16(scale, weights4);
2617*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2618*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2619*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2620*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2621*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right3 =
2622*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights3, top_right);
2623*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right4 =
2624*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights4, top_right);
2625*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2626*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2627*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
2628*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi8(left, y_select);
2629*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2630*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2631*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2632*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2633*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2634*77c1e3ccSAndroid Build Coastguard Worker }
2635*77c1e3ccSAndroid Build Coastguard Worker }
2636*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
2637*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_32x16_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2638*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_32x16_ssse3(
2639*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2640*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2641*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2642*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[31]);
2643*77c1e3ccSAndroid Build Coastguard Worker const __m128i left1 = cvtepu8_epi16(LoadLo8(left_column));
2644*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = LoadUnaligned16(smooth_weights + 28);
2645*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = LoadUnaligned16(smooth_weights + 44);
2646*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2647*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights_lo);
2648*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights_lo, 8));
2649*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights3 = cvtepu8_epi16(weights_hi);
2650*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights4 = cvtepu8_epi16(_mm_srli_si128(weights_hi, 8));
2651*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2652*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2653*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights3 = _mm_sub_epi16(scale, weights3);
2654*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights4 = _mm_sub_epi16(scale, weights4);
2655*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2656*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2657*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2658*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2659*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right3 =
2660*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights3, top_right);
2661*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right4 =
2662*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights4, top_right);
2663*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2664*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2665*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
2666*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi8(left1, y_select);
2667*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2668*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2669*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2670*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2671*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2672*77c1e3ccSAndroid Build Coastguard Worker }
2673*77c1e3ccSAndroid Build Coastguard Worker const __m128i left2 =
2674*77c1e3ccSAndroid Build Coastguard Worker cvtepu8_epi16(LoadLo8((const uint8_t *)left_column + 8));
2675*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2676*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
2677*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi8(left2, y_select);
2678*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2679*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2680*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2681*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2682*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2683*77c1e3ccSAndroid Build Coastguard Worker }
2684*77c1e3ccSAndroid Build Coastguard Worker }
2685*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_32x32_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2686*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_32x32_ssse3(
2687*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2688*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2689*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2690*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[31]);
2691*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = LoadUnaligned16(smooth_weights + 28);
2692*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = LoadUnaligned16(smooth_weights + 44);
2693*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2694*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights_lo);
2695*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights_lo, 8));
2696*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights3 = cvtepu8_epi16(weights_hi);
2697*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights4 = cvtepu8_epi16(_mm_srli_si128(weights_hi, 8));
2698*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2699*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2700*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights3 = _mm_sub_epi16(scale, weights3);
2701*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights4 = _mm_sub_epi16(scale, weights4);
2702*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2703*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2704*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2705*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2706*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right3 =
2707*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights3, top_right);
2708*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right4 =
2709*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights4, top_right);
2710*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2711*77c1e3ccSAndroid Build Coastguard Worker __m128i left = cvtepu8_epi16(LoadLo8(left_column));
2712*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2713*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
2714*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi8(left, y_select);
2715*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2716*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2717*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2718*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2719*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2720*77c1e3ccSAndroid Build Coastguard Worker }
2721*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi16(LoadLo8(left_column + 8));
2722*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2723*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
2724*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi8(left, y_select);
2725*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2726*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2727*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2728*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2729*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2730*77c1e3ccSAndroid Build Coastguard Worker }
2731*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi16(LoadLo8(left_column + 16));
2732*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2733*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
2734*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi8(left, y_select);
2735*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2736*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2737*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2738*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2739*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2740*77c1e3ccSAndroid Build Coastguard Worker }
2741*77c1e3ccSAndroid Build Coastguard Worker left = cvtepu8_epi16(LoadLo8(left_column + 24));
2742*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2743*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
2744*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi8(left, y_select);
2745*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2746*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2747*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2748*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2749*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2750*77c1e3ccSAndroid Build Coastguard Worker }
2751*77c1e3ccSAndroid Build Coastguard Worker }
2752*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_32x64_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2753*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_32x64_ssse3(
2754*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2755*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2756*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2757*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[31]);
2758*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lo = LoadUnaligned16(smooth_weights + 28);
2759*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hi = LoadUnaligned16(smooth_weights + 44);
2760*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2761*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights_lo);
2762*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights_lo, 8));
2763*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights3 = cvtepu8_epi16(weights_hi);
2764*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights4 = cvtepu8_epi16(_mm_srli_si128(weights_hi, 8));
2765*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2766*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2767*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights3 = _mm_sub_epi16(scale, weights3);
2768*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights4 = _mm_sub_epi16(scale, weights4);
2769*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2770*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2771*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2772*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2773*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right3 =
2774*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights3, top_right);
2775*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right4 =
2776*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights4, top_right);
2777*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2778*77c1e3ccSAndroid Build Coastguard Worker for (int left_offset = 0; left_offset < 64; left_offset += 8) {
2779*77c1e3ccSAndroid Build Coastguard Worker const __m128i left = cvtepu8_epi16(LoadLo8(left_column + left_offset));
2780*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2781*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2782*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
2783*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2784*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2,
2785*77c1e3ccSAndroid Build Coastguard Worker round);
2786*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3,
2787*77c1e3ccSAndroid Build Coastguard Worker weights4, scaled_top_right3,
2788*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right4, round);
2789*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2790*77c1e3ccSAndroid Build Coastguard Worker }
2791*77c1e3ccSAndroid Build Coastguard Worker }
2792*77c1e3ccSAndroid Build Coastguard Worker }
2793*77c1e3ccSAndroid Build Coastguard Worker
2794*77c1e3ccSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
aom_smooth_h_predictor_64x16_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2795*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_64x16_ssse3(
2796*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2797*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2798*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2799*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[63]);
2800*77c1e3ccSAndroid Build Coastguard Worker const __m128i left1 = cvtepu8_epi16(LoadLo8(left_column));
2801*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lolo = LoadUnaligned16(smooth_weights + 60);
2802*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lohi = LoadUnaligned16(smooth_weights + 76);
2803*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2804*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights_lolo);
2805*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights_lolo, 8));
2806*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights3 = cvtepu8_epi16(weights_lohi);
2807*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights4 = cvtepu8_epi16(_mm_srli_si128(weights_lohi, 8));
2808*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2809*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2810*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights3 = _mm_sub_epi16(scale, weights3);
2811*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights4 = _mm_sub_epi16(scale, weights4);
2812*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2813*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2814*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2815*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2816*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right3 =
2817*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights3, top_right);
2818*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right4 =
2819*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights4, top_right);
2820*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hilo = LoadUnaligned16(smooth_weights + 92);
2821*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hihi = LoadUnaligned16(smooth_weights + 108);
2822*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights5 = cvtepu8_epi16(weights_hilo);
2823*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights6 = cvtepu8_epi16(_mm_srli_si128(weights_hilo, 8));
2824*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights7 = cvtepu8_epi16(weights_hihi);
2825*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights8 = cvtepu8_epi16(_mm_srli_si128(weights_hihi, 8));
2826*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights5 = _mm_sub_epi16(scale, weights5);
2827*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights6 = _mm_sub_epi16(scale, weights6);
2828*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights7 = _mm_sub_epi16(scale, weights7);
2829*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights8 = _mm_sub_epi16(scale, weights8);
2830*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right5 =
2831*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights5, top_right);
2832*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right6 =
2833*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights6, top_right);
2834*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right7 =
2835*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights7, top_right);
2836*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right8 =
2837*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights8, top_right);
2838*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2839*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2840*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
2841*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi8(left1, y_select);
2842*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2843*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2844*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2845*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2846*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, left_y, left_y, weights5, weights6,
2847*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right5, scaled_top_right6, round);
2848*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, left_y, left_y, weights7, weights8,
2849*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right7, scaled_top_right8, round);
2850*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2851*77c1e3ccSAndroid Build Coastguard Worker }
2852*77c1e3ccSAndroid Build Coastguard Worker const __m128i left2 = cvtepu8_epi16(LoadLo8(left_column + 8));
2853*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2854*77c1e3ccSAndroid Build Coastguard Worker __m128i y_select = _mm_set1_epi32(y_mask);
2855*77c1e3ccSAndroid Build Coastguard Worker __m128i left_y = _mm_shuffle_epi8(left2, y_select);
2856*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2857*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2858*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2859*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2860*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, left_y, left_y, weights5, weights6,
2861*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right5, scaled_top_right6, round);
2862*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, left_y, left_y, weights7, weights8,
2863*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right7, scaled_top_right8, round);
2864*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2865*77c1e3ccSAndroid Build Coastguard Worker }
2866*77c1e3ccSAndroid Build Coastguard Worker }
2867*77c1e3ccSAndroid Build Coastguard Worker #endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
2868*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_64x32_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2869*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_64x32_ssse3(
2870*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2871*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2872*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2873*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[63]);
2874*77c1e3ccSAndroid Build Coastguard Worker const __m128i left1 = cvtepu8_epi16(LoadLo8(left_column));
2875*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lolo = LoadUnaligned16(smooth_weights + 60);
2876*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lohi = LoadUnaligned16(smooth_weights + 76);
2877*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2878*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights_lolo);
2879*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights_lolo, 8));
2880*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights3 = cvtepu8_epi16(weights_lohi);
2881*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights4 = cvtepu8_epi16(_mm_srli_si128(weights_lohi, 8));
2882*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2883*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2884*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights3 = _mm_sub_epi16(scale, weights3);
2885*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights4 = _mm_sub_epi16(scale, weights4);
2886*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2887*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2888*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2889*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2890*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right3 =
2891*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights3, top_right);
2892*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right4 =
2893*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights4, top_right);
2894*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hilo = LoadUnaligned16(smooth_weights + 92);
2895*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hihi = LoadUnaligned16(smooth_weights + 108);
2896*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights5 = cvtepu8_epi16(weights_hilo);
2897*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights6 = cvtepu8_epi16(_mm_srli_si128(weights_hilo, 8));
2898*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights7 = cvtepu8_epi16(weights_hihi);
2899*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights8 = cvtepu8_epi16(_mm_srli_si128(weights_hihi, 8));
2900*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights5 = _mm_sub_epi16(scale, weights5);
2901*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights6 = _mm_sub_epi16(scale, weights6);
2902*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights7 = _mm_sub_epi16(scale, weights7);
2903*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights8 = _mm_sub_epi16(scale, weights8);
2904*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right5 =
2905*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights5, top_right);
2906*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right6 =
2907*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights6, top_right);
2908*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right7 =
2909*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights7, top_right);
2910*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right8 =
2911*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights8, top_right);
2912*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
2913*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2914*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2915*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left1, y_select);
2916*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2917*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2918*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2919*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2920*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, left_y, left_y, weights5, weights6,
2921*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right5, scaled_top_right6, round);
2922*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, left_y, left_y, weights7, weights8,
2923*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right7, scaled_top_right8, round);
2924*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2925*77c1e3ccSAndroid Build Coastguard Worker }
2926*77c1e3ccSAndroid Build Coastguard Worker const __m128i left2 = cvtepu8_epi16(LoadLo8(left_column + 8));
2927*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2928*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2929*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left2, y_select);
2930*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2931*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2932*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2933*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2934*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, left_y, left_y, weights5, weights6,
2935*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right5, scaled_top_right6, round);
2936*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, left_y, left_y, weights7, weights8,
2937*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right7, scaled_top_right8, round);
2938*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2939*77c1e3ccSAndroid Build Coastguard Worker }
2940*77c1e3ccSAndroid Build Coastguard Worker const __m128i left3 = cvtepu8_epi16(LoadLo8(left_column + 16));
2941*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2942*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2943*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left3, y_select);
2944*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2945*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2946*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2947*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2948*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, left_y, left_y, weights5, weights6,
2949*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right5, scaled_top_right6, round);
2950*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, left_y, left_y, weights7, weights8,
2951*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right7, scaled_top_right8, round);
2952*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2953*77c1e3ccSAndroid Build Coastguard Worker }
2954*77c1e3ccSAndroid Build Coastguard Worker const __m128i left4 = cvtepu8_epi16(LoadLo8(left_column + 24));
2955*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
2956*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
2957*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left4, y_select);
2958*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
2959*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2, round);
2960*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3, weights4,
2961*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right3, scaled_top_right4, round);
2962*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, left_y, left_y, weights5, weights6,
2963*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right5, scaled_top_right6, round);
2964*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, left_y, left_y, weights7, weights8,
2965*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right7, scaled_top_right8, round);
2966*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
2967*77c1e3ccSAndroid Build Coastguard Worker }
2968*77c1e3ccSAndroid Build Coastguard Worker }
2969*77c1e3ccSAndroid Build Coastguard Worker
aom_smooth_h_predictor_64x64_ssse3(uint8_t * LIBAOM_RESTRICT dst,ptrdiff_t stride,const uint8_t * LIBAOM_RESTRICT top_row,const uint8_t * LIBAOM_RESTRICT left_column)2970*77c1e3ccSAndroid Build Coastguard Worker void aom_smooth_h_predictor_64x64_ssse3(
2971*77c1e3ccSAndroid Build Coastguard Worker uint8_t *LIBAOM_RESTRICT dst, ptrdiff_t stride,
2972*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT top_row,
2973*77c1e3ccSAndroid Build Coastguard Worker const uint8_t *LIBAOM_RESTRICT left_column) {
2974*77c1e3ccSAndroid Build Coastguard Worker const __m128i top_right = _mm_set1_epi16(top_row[63]);
2975*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lolo = LoadUnaligned16(smooth_weights + 60);
2976*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_lohi = LoadUnaligned16(smooth_weights + 76);
2977*77c1e3ccSAndroid Build Coastguard Worker const __m128i scale = _mm_set1_epi16(1 << SMOOTH_WEIGHT_LOG2_SCALE);
2978*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights1 = cvtepu8_epi16(weights_lolo);
2979*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights2 = cvtepu8_epi16(_mm_srli_si128(weights_lolo, 8));
2980*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights3 = cvtepu8_epi16(weights_lohi);
2981*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights4 = cvtepu8_epi16(_mm_srli_si128(weights_lohi, 8));
2982*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights1 = _mm_sub_epi16(scale, weights1);
2983*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights2 = _mm_sub_epi16(scale, weights2);
2984*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights3 = _mm_sub_epi16(scale, weights3);
2985*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights4 = _mm_sub_epi16(scale, weights4);
2986*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right1 =
2987*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights1, top_right);
2988*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right2 =
2989*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights2, top_right);
2990*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right3 =
2991*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights3, top_right);
2992*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right4 =
2993*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights4, top_right);
2994*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hilo = LoadUnaligned16(smooth_weights + 92);
2995*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights_hihi = LoadUnaligned16(smooth_weights + 108);
2996*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights5 = cvtepu8_epi16(weights_hilo);
2997*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights6 = cvtepu8_epi16(_mm_srli_si128(weights_hilo, 8));
2998*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights7 = cvtepu8_epi16(weights_hihi);
2999*77c1e3ccSAndroid Build Coastguard Worker const __m128i weights8 = cvtepu8_epi16(_mm_srli_si128(weights_hihi, 8));
3000*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights5 = _mm_sub_epi16(scale, weights5);
3001*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights6 = _mm_sub_epi16(scale, weights6);
3002*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights7 = _mm_sub_epi16(scale, weights7);
3003*77c1e3ccSAndroid Build Coastguard Worker const __m128i inverted_weights8 = _mm_sub_epi16(scale, weights8);
3004*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right5 =
3005*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights5, top_right);
3006*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right6 =
3007*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights6, top_right);
3008*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right7 =
3009*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights7, top_right);
3010*77c1e3ccSAndroid Build Coastguard Worker const __m128i scaled_top_right8 =
3011*77c1e3ccSAndroid Build Coastguard Worker _mm_mullo_epi16(inverted_weights8, top_right);
3012*77c1e3ccSAndroid Build Coastguard Worker const __m128i round = _mm_set1_epi16(1 << (SMOOTH_WEIGHT_LOG2_SCALE - 1));
3013*77c1e3ccSAndroid Build Coastguard Worker for (int left_offset = 0; left_offset < 64; left_offset += 8) {
3014*77c1e3ccSAndroid Build Coastguard Worker const __m128i left = cvtepu8_epi16(LoadLo8(left_column + left_offset));
3015*77c1e3ccSAndroid Build Coastguard Worker for (int y_mask = 0x01000100; y_mask < 0x0F0E0F0F; y_mask += 0x02020202) {
3016*77c1e3ccSAndroid Build Coastguard Worker const __m128i y_select = _mm_set1_epi32(y_mask);
3017*77c1e3ccSAndroid Build Coastguard Worker const __m128i left_y = _mm_shuffle_epi8(left, y_select);
3018*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst, left_y, left_y, weights1, weights2,
3019*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right1, scaled_top_right2,
3020*77c1e3ccSAndroid Build Coastguard Worker round);
3021*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 16, left_y, left_y, weights3,
3022*77c1e3ccSAndroid Build Coastguard Worker weights4, scaled_top_right3,
3023*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right4, round);
3024*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 32, left_y, left_y, weights5,
3025*77c1e3ccSAndroid Build Coastguard Worker weights6, scaled_top_right5,
3026*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right6, round);
3027*77c1e3ccSAndroid Build Coastguard Worker write_smooth_directional_sum16(dst + 48, left_y, left_y, weights7,
3028*77c1e3ccSAndroid Build Coastguard Worker weights8, scaled_top_right7,
3029*77c1e3ccSAndroid Build Coastguard Worker scaled_top_right8, round);
3030*77c1e3ccSAndroid Build Coastguard Worker dst += stride;
3031*77c1e3ccSAndroid Build Coastguard Worker }
3032*77c1e3ccSAndroid Build Coastguard Worker }
3033*77c1e3ccSAndroid Build Coastguard Worker }
3034