Coverage Report

Created: 2026-09-01 06:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/common/x86/ih264_deblk_luma_ssse3.c
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Copyright (C) 2015 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
/*****************************************************************************/
21
/*                                                                           */
22
/*  File Name         : ih264_deblk_luma_ssse3.c                             */
23
/*                                                                           */
24
/*  Description       : Contains function definitions for deblocking         */
25
/*                                                                           */
26
/*  List of Functions : ih264_deblk_luma_vert_bs4_ssse3()                    */
27
/*                      ih264_deblk_luma_horz_bs4_ssse3()                    */
28
/*                      ih264_deblk_luma_vert_bslt4_ssse3()                  */
29
/*                      ih264_deblk_luma_horz_bslt4_ssse3()                  */
30
/*                      ih264_deblk_luma_vert_bs4_mbaff_ssse3()              */
31
/*                      ih264_deblk_luma_vert_bslt4_mbaff_ssse3()            */
32
/*                                                                           */
33
/*  Issues / Problems : None                                                 */
34
/*                                                                           */
35
/*  Revision History  :                                                      */
36
/*                                                                           */
37
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
38
/*         12 02 2015   Naveen Kumar P  Added luma deblocking ssse3          */
39
/*                                      intrinsics                           */
40
/*                                                                           */
41
/*****************************************************************************/
42
43
/*****************************************************************************/
44
/* File Includes                                                             */
45
/*****************************************************************************/
46
47
/* System include files */
48
#include <stdio.h>
49
50
/* User include files */
51
#include "ih264_typedefs.h"
52
#include "ih264_platform_macros.h"
53
#include "ih264_deblk_edge_filters.h"
54
#include "ih264_macros.h"
55
56
/*****************************************************************************/
57
/* Function Definitions                                                      */
58
/*****************************************************************************/
59
60
/*****************************************************************************/
61
/*                                                                           */
62
/*  Function Name : ih264_deblk_luma_vert_bs4_ssse3()                        */
63
/*                                                                           */
64
/*  Description   : This function performs filtering of a luma block         */
65
/*                  vertical edge when the boundary strength is set to 4.    */
66
/*                                                                           */
67
/*  Inputs        : pu1_src    - pointer to the src sample q0                */
68
/*                  src_strd   - source stride                               */
69
/*                  alpha      - alpha value for the boundary                */
70
/*                  beta       - beta value for the boundary                 */
71
/*                                                                           */
72
/*  Globals       : None                                                     */
73
/*                                                                           */
74
/*  Processing    : This operation is described in Sec. 8.7.2.4 under the    */
75
/*                  title "Filtering process for edges for bS equal to 4" in */
76
/*                  ITU T Rec H.264.                                         */
77
/*                                                                           */
78
/*  Outputs       : None                                                     */
79
/*                                                                           */
80
/*  Returns       : None                                                     */
81
/*                                                                           */
82
/*  Issues        : None                                                     */
83
/*                                                                           */
84
/*  Revision History:                                                        */
85
/*                                                                           */
86
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
87
/*         12 02 2015   Naveen Kumar P  Initial version                      */
88
/*                                                                           */
89
/*****************************************************************************/
90
void ih264_deblk_luma_vert_bs4_ssse3(UWORD8 *pu1_src,
91
                                     WORD32 src_strd,
92
                                     WORD32 alpha,
93
                                     WORD32 beta)
94
3.70M
{
95
3.70M
    __m128i zero = _mm_setzero_si128();
96
3.70M
    __m128i q0_16x8, q1_16x8, q2_16x8, q3_16x8;
97
3.70M
    __m128i p0_16x8, p1_16x8, p2_16x8, p3_16x8;
98
3.70M
    __m128i q0_8x16, q1_8x16, q2_8x16, q3_8x16;
99
3.70M
    __m128i p0_8x16, p1_8x16, p2_8x16, p3_8x16;
100
3.70M
    __m128i q0_16x8_1;
101
3.70M
    __m128i p0_16x8_1;
102
3.70M
    __m128i q0_16x8_2, q1_16x8_2, q2_16x8_2;
103
3.70M
    __m128i p0_16x8_2, p1_16x8_2, p2_16x8_2;
104
3.70M
    __m128i temp1, temp2, temp3, temp4, temp5, temp6;
105
3.70M
    __m128i Alpha_8x16, Beta_8x16;
106
3.70M
    __m128i flag1_16x8, flag2_16x8, flag3_16x8, flag4_16x8;
107
3.70M
    __m128i const_val2_16x8 = _mm_set1_epi16(2);
108
3.70M
    __m128i line1, line2, line3, line4, line5, line6, line7, line8;
109
110
3.70M
    Alpha_8x16 = _mm_set1_epi16(alpha);
111
3.70M
    Beta_8x16 = _mm_set1_epi16(beta);
112
113
3.70M
    line1 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 0 * src_strd));
114
3.70M
    line2 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 1 * src_strd));
115
3.70M
    line3 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 2 * src_strd));
116
3.70M
    line4 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 3 * src_strd));
117
3.70M
    line5 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 4 * src_strd));
118
3.70M
    line6 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 5 * src_strd));
119
3.70M
    line7 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 6 * src_strd));
120
3.70M
    line8 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 7 * src_strd));
121
122
3.70M
    temp1 = _mm_unpacklo_epi8(line1, line2);
123
3.70M
    temp2 = _mm_unpacklo_epi8(line3, line4);
124
3.70M
    temp3 = _mm_unpacklo_epi8(line5, line6);
125
3.70M
    temp4 = _mm_unpacklo_epi8(line7, line8);
126
127
3.70M
    line1 = _mm_unpacklo_epi16(temp1, temp2);
128
3.70M
    line2 = _mm_unpackhi_epi16(temp1, temp2);
129
3.70M
    line3 = _mm_unpacklo_epi16(temp3, temp4);
130
3.70M
    line4 = _mm_unpackhi_epi16(temp3, temp4);
131
132
3.70M
    p1_8x16 = _mm_unpacklo_epi32(line1, line3);
133
3.70M
    p0_8x16 = _mm_unpackhi_epi32(line1, line3);
134
3.70M
    q0_8x16 = _mm_unpacklo_epi32(line2, line4);
135
3.70M
    q1_8x16 = _mm_unpackhi_epi32(line2, line4);
136
137
3.70M
    line1 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 8 * src_strd));
138
3.70M
    line2 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 9 * src_strd));
139
3.70M
    line3 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 10 * src_strd));
140
3.70M
    line4 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 11 * src_strd));
141
3.70M
    line5 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 12 * src_strd));
142
3.70M
    line6 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 13 * src_strd));
143
3.70M
    line7 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 14 * src_strd));
144
3.70M
    line8 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 15 * src_strd));
145
146
3.70M
    temp1 = _mm_unpacklo_epi8(line1, line2);
147
3.70M
    temp2 = _mm_unpacklo_epi8(line3, line4);
148
3.70M
    temp3 = _mm_unpacklo_epi8(line5, line6);
149
3.70M
    temp4 = _mm_unpacklo_epi8(line7, line8);
150
151
3.70M
    line1 = _mm_unpacklo_epi16(temp1, temp2);
152
3.70M
    line2 = _mm_unpackhi_epi16(temp1, temp2);
153
3.70M
    line3 = _mm_unpacklo_epi16(temp3, temp4);
154
3.70M
    line4 = _mm_unpackhi_epi16(temp3, temp4);
155
156
3.70M
    temp1 = _mm_unpacklo_epi32(line1, line3);
157
3.70M
    temp2 = _mm_unpackhi_epi32(line1, line3);
158
3.70M
    temp3 = _mm_unpacklo_epi32(line2, line4);
159
3.70M
    temp4 = _mm_unpackhi_epi32(line2, line4);
160
161
3.70M
    p3_16x8 = _mm_unpacklo_epi64(p1_8x16, temp1);
162
3.70M
    p2_16x8 = _mm_unpackhi_epi64(p1_8x16, temp1);
163
3.70M
    q2_16x8 = _mm_unpacklo_epi64(q1_8x16, temp4);
164
3.70M
    q3_16x8 = _mm_unpackhi_epi64(q1_8x16, temp4);
165
3.70M
    p1_16x8 = _mm_unpacklo_epi64(p0_8x16, temp2);
166
3.70M
    p0_16x8 = _mm_unpackhi_epi64(p0_8x16, temp2);
167
3.70M
    q0_16x8 = _mm_unpacklo_epi64(q0_8x16, temp3);
168
3.70M
    q1_16x8 = _mm_unpackhi_epi64(q0_8x16, temp3);
169
170
    //Cond1 (ABS(p0 - q0) < alpha)
171
3.70M
    temp1 = _mm_subs_epu8(q0_16x8, p0_16x8);
172
3.70M
    temp2 = _mm_subs_epu8(p0_16x8, q0_16x8);
173
3.70M
    temp1 = _mm_add_epi8(temp1, temp2);
174
175
3.70M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
176
3.70M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
177
178
3.70M
    temp2 = _mm_cmpgt_epi16(Alpha_8x16, temp2);
179
3.70M
    temp1 = _mm_cmpgt_epi16(Alpha_8x16, temp1);
180
181
3.70M
    flag1_16x8 = _mm_packs_epi16(temp2, temp1);
182
183
    //Cond2 (ABS(q1 - q0) < beta)
184
3.70M
    temp1 = _mm_subs_epu8(q0_16x8, q1_16x8);
185
3.70M
    temp2 = _mm_subs_epu8(q1_16x8, q0_16x8);
186
3.70M
    temp1 = _mm_add_epi8(temp1, temp2);
187
188
3.70M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
189
3.70M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
190
191
3.70M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
192
3.70M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
193
194
3.70M
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
195
196
3.70M
    flag1_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
197
198
    //Cond3 (ABS(p1 - p0) < beta)
199
3.70M
    temp1 = _mm_subs_epu8(p0_16x8, p1_16x8);
200
3.70M
    temp2 = _mm_subs_epu8(p1_16x8, p0_16x8);
201
3.70M
    temp1 = _mm_add_epi8(temp1, temp2);
202
203
3.70M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
204
3.70M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
205
206
3.70M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
207
3.70M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
208
209
3.70M
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
210
211
    // !((ABS(p0 - q0) < alpha) || (ABS(q1 - q0) < beta) || (ABS(p1 - p0) < beta))
212
3.70M
    flag1_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
213
214
    // (ABS(p0 - q0) < ((alpha >> 2) + 2))
215
3.70M
    temp1 = _mm_subs_epu8(p0_16x8, q0_16x8);
216
3.70M
    temp2 = _mm_subs_epu8(q0_16x8, p0_16x8);
217
3.70M
    temp1 = _mm_add_epi8(temp1, temp2);
218
3.70M
    Alpha_8x16 = _mm_srai_epi16(Alpha_8x16, 2);
219
3.70M
    Alpha_8x16 = _mm_add_epi16(Alpha_8x16, const_val2_16x8);
220
221
3.70M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
222
3.70M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
223
3.70M
    temp2 = _mm_cmpgt_epi16(Alpha_8x16, temp2);
224
3.70M
    temp1 = _mm_cmpgt_epi16(Alpha_8x16, temp1);
225
226
3.70M
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
227
3.70M
    flag2_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
228
229
    // (ABS(p2 - p0) < beta)
230
3.70M
    temp1 = _mm_subs_epu8(p0_16x8, p2_16x8);
231
3.70M
    temp2 = _mm_subs_epu8(p2_16x8, p0_16x8);
232
3.70M
    temp1 = _mm_add_epi8(temp1, temp2);
233
234
3.70M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
235
3.70M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
236
3.70M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
237
3.70M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
238
239
3.70M
    flag3_16x8 = _mm_packs_epi16(temp2, temp1);
240
3.70M
    flag3_16x8 = _mm_and_si128(flag3_16x8, flag2_16x8);
241
242
    // (ABS(q2 - q0) < beta)
243
3.70M
    temp1 = _mm_subs_epu8(q0_16x8, q2_16x8);
244
3.70M
    temp2 = _mm_subs_epu8(q2_16x8, q0_16x8);
245
3.70M
    temp1 = _mm_add_epi8(temp1, temp2);
246
247
3.70M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
248
3.70M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
249
3.70M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
250
3.70M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
251
252
3.70M
    flag4_16x8 = _mm_packs_epi16(temp2, temp1);
253
3.70M
    flag4_16x8 = _mm_and_si128(flag4_16x8, flag2_16x8);
254
255
    // First 8 pixels
256
3.70M
    p3_8x16 = _mm_unpacklo_epi8(p3_16x8, zero);
257
3.70M
    p2_8x16 = _mm_unpacklo_epi8(p2_16x8, zero);
258
3.70M
    p1_8x16 = _mm_unpacklo_epi8(p1_16x8, zero);
259
3.70M
    p0_8x16 = _mm_unpacklo_epi8(p0_16x8, zero);
260
3.70M
    q0_8x16 = _mm_unpacklo_epi8(q0_16x8, zero);
261
3.70M
    q1_8x16 = _mm_unpacklo_epi8(q1_16x8, zero);
262
3.70M
    q2_8x16 = _mm_unpacklo_epi8(q2_16x8, zero);
263
3.70M
    q3_8x16 = _mm_unpacklo_epi8(q3_16x8, zero);
264
265
    // p0_1 and q0_1
266
3.70M
    temp1 = _mm_add_epi16(p0_8x16, q1_8x16);
267
3.70M
    temp2 = _mm_add_epi16(p1_8x16, q0_8x16);
268
3.70M
    temp5 = _mm_add_epi16(temp1, const_val2_16x8);
269
3.70M
    temp6 = _mm_add_epi16(temp2, const_val2_16x8);
270
3.70M
    temp3 = _mm_slli_epi16(p1_8x16, 1);
271
3.70M
    temp4 = _mm_slli_epi16(q1_8x16, 1);
272
3.70M
    temp1 = _mm_add_epi16(temp5, temp3);
273
3.70M
    temp2 = _mm_add_epi16(temp6, temp4);
274
3.70M
    p0_16x8_1 = _mm_srai_epi16(temp1, 2);
275
3.70M
    q0_16x8_1 = _mm_srai_epi16(temp2, 2);
276
277
    // p1_2 and q1_2
278
3.70M
    temp6 = _mm_add_epi16(temp6, p0_8x16);
279
3.70M
    temp5 = _mm_add_epi16(temp5, q0_8x16);
280
3.70M
    temp1 = _mm_add_epi16(temp6, p2_8x16);
281
3.70M
    temp2 = _mm_add_epi16(temp5, q2_8x16);
282
3.70M
    p1_16x8_2 = _mm_srai_epi16(temp1, 2);
283
3.70M
    q1_16x8_2 = _mm_srai_epi16(temp2, 2);
284
285
    // p0_2 and q0_2
286
3.70M
    temp1 = _mm_add_epi16(temp3, p2_8x16);
287
3.70M
    temp2 = _mm_add_epi16(temp4, q2_8x16);
288
3.70M
    temp1 = _mm_add_epi16(temp1, q1_8x16);
289
3.70M
    temp2 = _mm_add_epi16(temp2, p1_8x16);
290
3.70M
    temp3 = _mm_add_epi16(p0_8x16, q0_8x16);
291
3.70M
    temp3 = _mm_slli_epi16(temp3, 1);
292
3.70M
    temp1 = _mm_add_epi16(temp1, temp3);
293
3.70M
    temp2 = _mm_add_epi16(temp2, temp3);
294
3.70M
    temp1 = _mm_add_epi16(temp1, _mm_set1_epi16(4));
295
3.70M
    temp2 = _mm_add_epi16(temp2, _mm_set1_epi16(4));
296
3.70M
    p0_16x8_2 = _mm_srai_epi16(temp1, 3);
297
3.70M
    q0_16x8_2 = _mm_srai_epi16(temp2, 3);
298
299
    // p2_2 and q2_2
300
3.70M
    temp1 = _mm_add_epi16(temp6, const_val2_16x8);
301
3.70M
    temp2 = _mm_add_epi16(temp5, const_val2_16x8);
302
3.70M
    temp3 = _mm_slli_epi16(p2_8x16, 1);
303
3.70M
    temp4 = _mm_slli_epi16(q2_8x16, 1);
304
3.70M
    temp3 = _mm_add_epi16(p2_8x16, temp3);
305
3.70M
    temp4 = _mm_add_epi16(q2_8x16, temp4);
306
3.70M
    temp5 = _mm_slli_epi16(p3_8x16, 1);
307
3.70M
    temp6 = _mm_slli_epi16(q3_8x16, 1);
308
3.70M
    temp1 = _mm_add_epi16(temp1, temp3);
309
3.70M
    temp2 = _mm_add_epi16(temp2, temp4);
310
3.70M
    temp1 = _mm_add_epi16(temp1, temp5);
311
3.70M
    temp2 = _mm_add_epi16(temp2, temp6);
312
3.70M
    p2_16x8_2 = _mm_srai_epi16(temp1, 3);
313
3.70M
    q2_16x8_2 = _mm_srai_epi16(temp2, 3);
314
315
    // Second 8 pixels and packing with first 8 pixels
316
3.70M
    p3_8x16 = _mm_unpackhi_epi8(p3_16x8, zero);
317
3.70M
    p2_8x16 = _mm_unpackhi_epi8(p2_16x8, zero);
318
3.70M
    p1_8x16 = _mm_unpackhi_epi8(p1_16x8, zero);
319
3.70M
    p0_8x16 = _mm_unpackhi_epi8(p0_16x8, zero);
320
3.70M
    q0_8x16 = _mm_unpackhi_epi8(q0_16x8, zero);
321
3.70M
    q1_8x16 = _mm_unpackhi_epi8(q1_16x8, zero);
322
3.70M
    q2_8x16 = _mm_unpackhi_epi8(q2_16x8, zero);
323
3.70M
    q3_8x16 = _mm_unpackhi_epi8(q3_16x8, zero);
324
325
    // p0_1 and q0_1
326
3.70M
    temp1 = _mm_add_epi16(p0_8x16, q1_8x16);
327
3.70M
    temp2 = _mm_add_epi16(p1_8x16, q0_8x16);
328
3.70M
    temp5 = _mm_add_epi16(temp1, const_val2_16x8);
329
3.70M
    temp6 = _mm_add_epi16(temp2, const_val2_16x8);
330
3.70M
    temp3 = _mm_slli_epi16(p1_8x16, 1);
331
3.70M
    temp4 = _mm_slli_epi16(q1_8x16, 1);
332
3.70M
    temp1 = _mm_add_epi16(temp5, temp3);
333
3.70M
    temp2 = _mm_add_epi16(temp6, temp4);
334
3.70M
    temp1 = _mm_srai_epi16(temp1, 2);
335
3.70M
    temp2 = _mm_srai_epi16(temp2, 2);
336
3.70M
    p0_16x8_1 = _mm_packus_epi16(p0_16x8_1, temp1);
337
3.70M
    q0_16x8_1 = _mm_packus_epi16(q0_16x8_1, temp2);
338
339
    // p1_2 and q1_2
340
3.70M
    temp6 = _mm_add_epi16(temp6, p0_8x16);
341
3.70M
    temp5 = _mm_add_epi16(temp5, q0_8x16);
342
3.70M
    temp1 = _mm_add_epi16(temp6, p2_8x16);
343
3.70M
    temp2 = _mm_add_epi16(temp5, q2_8x16);
344
3.70M
    temp1 = _mm_srai_epi16(temp1, 2);
345
3.70M
    temp2 = _mm_srai_epi16(temp2, 2);
346
3.70M
    p1_16x8_2 = _mm_packus_epi16(p1_16x8_2, temp1);
347
3.70M
    q1_16x8_2 = _mm_packus_epi16(q1_16x8_2, temp2);
348
349
    // p0_2 and q0_2
350
3.70M
    temp1 = _mm_add_epi16(temp3, p2_8x16);
351
3.70M
    temp2 = _mm_add_epi16(temp4, q2_8x16);
352
3.70M
    temp1 = _mm_add_epi16(temp1, q1_8x16);
353
3.70M
    temp2 = _mm_add_epi16(temp2, p1_8x16);
354
3.70M
    temp3 = _mm_add_epi16(p0_8x16, q0_8x16);
355
3.70M
    temp3 = _mm_slli_epi16(temp3, 1);
356
3.70M
    temp1 = _mm_add_epi16(temp1, temp3);
357
3.70M
    temp2 = _mm_add_epi16(temp2, temp3);
358
3.70M
    temp1 = _mm_add_epi16(temp1, _mm_set1_epi16(4));
359
3.70M
    temp2 = _mm_add_epi16(temp2, _mm_set1_epi16(4));
360
3.70M
    temp1 = _mm_srai_epi16(temp1, 3);
361
3.70M
    temp2 = _mm_srai_epi16(temp2, 3);
362
3.70M
    p0_16x8_2 = _mm_packus_epi16(p0_16x8_2, temp1);
363
3.70M
    q0_16x8_2 = _mm_packus_epi16(q0_16x8_2, temp2);
364
365
    // p2_2 and q2_2
366
3.70M
    temp1 = _mm_add_epi16(temp6, const_val2_16x8);
367
3.70M
    temp2 = _mm_add_epi16(temp5, const_val2_16x8);
368
3.70M
    temp3 = _mm_slli_epi16(p2_8x16, 1);
369
3.70M
    temp4 = _mm_slli_epi16(q2_8x16, 1);
370
3.70M
    temp3 = _mm_add_epi16(p2_8x16, temp3);
371
3.70M
    temp4 = _mm_add_epi16(q2_8x16, temp4);
372
3.70M
    temp5 = _mm_slli_epi16(p3_8x16, 1);
373
3.70M
    temp6 = _mm_slli_epi16(q3_8x16, 1);
374
3.70M
    temp1 = _mm_add_epi16(temp1, temp3);
375
3.70M
    temp2 = _mm_add_epi16(temp2, temp4);
376
3.70M
    temp1 = _mm_add_epi16(temp1, temp5);
377
3.70M
    temp2 = _mm_add_epi16(temp2, temp6);
378
3.70M
    temp1 = _mm_srai_epi16(temp1, 3);
379
3.70M
    temp2 = _mm_srai_epi16(temp2, 3);
380
3.70M
    p2_16x8_2 = _mm_packus_epi16(p2_16x8_2, temp1);
381
3.70M
    q2_16x8_2 = _mm_packus_epi16(q2_16x8_2, temp2);
382
383
    // p0 and q0
384
3.70M
    p0_16x8 = _mm_and_si128(p0_16x8,
385
3.70M
                            _mm_xor_si128(flag1_16x8, _mm_set1_epi8(0xFF)));
386
3.70M
    p0_16x8_1 = _mm_and_si128(p0_16x8_1, flag1_16x8);
387
3.70M
    p0_16x8 = _mm_add_epi8(p0_16x8, p0_16x8_1);
388
3.70M
    q0_16x8 = _mm_and_si128(q0_16x8,
389
3.70M
                            _mm_xor_si128(flag1_16x8, _mm_set1_epi8(0xFF)));
390
3.70M
    q0_16x8_1 = _mm_and_si128(q0_16x8_1, flag1_16x8);
391
3.70M
    q0_16x8 = _mm_add_epi8(q0_16x8, q0_16x8_1);
392
393
    // p0 and q0
394
3.70M
    p0_16x8 = _mm_and_si128(p0_16x8,
395
3.70M
                            _mm_xor_si128(flag3_16x8, _mm_set1_epi8(0xFF)));
396
3.70M
    p0_16x8_2 = _mm_and_si128(p0_16x8_2, flag3_16x8);
397
3.70M
    p0_16x8 = _mm_add_epi8(p0_16x8, p0_16x8_2);
398
3.70M
    q0_16x8 = _mm_and_si128(q0_16x8,
399
3.70M
                            _mm_xor_si128(flag4_16x8, _mm_set1_epi8(0xFF)));
400
3.70M
    q0_16x8_2 = _mm_and_si128(q0_16x8_2, flag4_16x8);
401
3.70M
    q0_16x8 = _mm_add_epi8(q0_16x8, q0_16x8_2);
402
403
    // p1 and q1
404
3.70M
    p1_16x8 = _mm_and_si128(p1_16x8,
405
3.70M
                            _mm_xor_si128(flag3_16x8, _mm_set1_epi8(0xFF)));
406
3.70M
    p1_16x8_2 = _mm_and_si128(p1_16x8_2, flag3_16x8);
407
3.70M
    p1_16x8 = _mm_add_epi8(p1_16x8, p1_16x8_2);
408
3.70M
    q1_16x8 = _mm_and_si128(q1_16x8,
409
3.70M
                            _mm_xor_si128(flag4_16x8, _mm_set1_epi8(0xFF)));
410
3.70M
    q1_16x8_2 = _mm_and_si128(q1_16x8_2, flag4_16x8);
411
3.70M
    q1_16x8 = _mm_add_epi8(q1_16x8, q1_16x8_2);
412
413
    // p2 and q2
414
3.70M
    p2_16x8 = _mm_and_si128(p2_16x8,
415
3.70M
                            _mm_xor_si128(flag3_16x8, _mm_set1_epi8(0xFF)));
416
3.70M
    p2_16x8_2 = _mm_and_si128(p2_16x8_2, flag3_16x8);
417
3.70M
    p2_16x8 = _mm_add_epi8(p2_16x8, p2_16x8_2);
418
3.70M
    q2_16x8 = _mm_and_si128(q2_16x8,
419
3.70M
                            _mm_xor_si128(flag4_16x8, _mm_set1_epi8(0xFF)));
420
3.70M
    q2_16x8_2 = _mm_and_si128(q2_16x8_2, flag4_16x8);
421
3.70M
    q2_16x8 = _mm_add_epi8(q2_16x8, q2_16x8_2);
422
423
3.70M
    temp1 = _mm_unpacklo_epi8(p3_16x8, p2_16x8);
424
3.70M
    temp2 = _mm_unpacklo_epi8(p1_16x8, p0_16x8);
425
3.70M
    temp3 = _mm_unpacklo_epi8(q0_16x8, q1_16x8);
426
3.70M
    temp4 = _mm_unpacklo_epi8(q2_16x8, q3_16x8);
427
428
3.70M
    p3_8x16 = _mm_unpacklo_epi16(temp1, temp2);
429
3.70M
    p2_8x16 = _mm_unpackhi_epi16(temp1, temp2);
430
3.70M
    q2_8x16 = _mm_unpacklo_epi16(temp3, temp4);
431
3.70M
    q3_8x16 = _mm_unpackhi_epi16(temp3, temp4);
432
433
3.70M
    line1 = _mm_unpacklo_epi32(p3_8x16, q2_8x16);
434
3.70M
    line2 = _mm_srli_si128(line1, 8);
435
3.70M
    line3 = _mm_unpackhi_epi32(p3_8x16, q2_8x16);
436
3.70M
    line4 = _mm_srli_si128(line3, 8);
437
3.70M
    line5 = _mm_unpacklo_epi32(p2_8x16, q3_8x16);
438
3.70M
    line6 = _mm_srli_si128(line5, 8);
439
3.70M
    line7 = _mm_unpackhi_epi32(p2_8x16, q3_8x16);
440
3.70M
    line8 = _mm_srli_si128(line7, 8);
441
442
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 0 * src_strd), line1);
443
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 1 * src_strd), line2);
444
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 2 * src_strd), line3);
445
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 3 * src_strd), line4);
446
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 4 * src_strd), line5);
447
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 5 * src_strd), line6);
448
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 6 * src_strd), line7);
449
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 7 * src_strd), line8);
450
451
3.70M
    temp1 = _mm_unpackhi_epi8(p3_16x8, p2_16x8);
452
3.70M
    temp2 = _mm_unpackhi_epi8(p1_16x8, p0_16x8);
453
3.70M
    temp3 = _mm_unpackhi_epi8(q0_16x8, q1_16x8);
454
3.70M
    temp4 = _mm_unpackhi_epi8(q2_16x8, q3_16x8);
455
456
3.70M
    p3_8x16 = _mm_unpacklo_epi16(temp1, temp2);
457
3.70M
    p2_8x16 = _mm_unpackhi_epi16(temp1, temp2);
458
3.70M
    q2_8x16 = _mm_unpacklo_epi16(temp3, temp4);
459
3.70M
    q3_8x16 = _mm_unpackhi_epi16(temp3, temp4);
460
461
3.70M
    line1 = _mm_unpacklo_epi32(p3_8x16, q2_8x16);
462
3.70M
    line2 = _mm_srli_si128(line1, 8);
463
3.70M
    line3 = _mm_unpackhi_epi32(p3_8x16, q2_8x16);
464
3.70M
    line4 = _mm_srli_si128(line3, 8);
465
3.70M
    line5 = _mm_unpacklo_epi32(p2_8x16, q3_8x16);
466
3.70M
    line6 = _mm_srli_si128(line5, 8);
467
3.70M
    line7 = _mm_unpackhi_epi32(p2_8x16, q3_8x16);
468
3.70M
    line8 = _mm_srli_si128(line7, 8);
469
470
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 8 * src_strd), line1);
471
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 9 * src_strd), line2);
472
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 10 * src_strd), line3);
473
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 11 * src_strd), line4);
474
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 12 * src_strd), line5);
475
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 13 * src_strd), line6);
476
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 14 * src_strd), line7);
477
3.70M
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 15 * src_strd), line8);
478
479
3.70M
}
480
481
/*****************************************************************************/
482
/*                                                                           */
483
/*  Function Name : ih264_deblk_luma_horz_bs4_ssse3()                        */
484
/*                                                                           */
485
/*  Description   : This function performs filtering of a luma block         */
486
/*                  horizontal edge when the boundary strength is set to 4.  */
487
/*                                                                           */
488
/*  Inputs        : pu1_src    - pointer to the src sample q0                */
489
/*                  src_strd   - source stride                               */
490
/*                  alpha      - alpha value for the boundary                */
491
/*                  beta       - beta value for the boundary                 */
492
/*                                                                           */
493
/*  Globals       : None                                                     */
494
/*                                                                           */
495
/*  Processing    : This operation is described in Sec. 8.7.2.4 under the    */
496
/*                  title "Filtering process for edges for bS equal to 4" in */
497
/*                  ITU T Rec H.264.                                         */
498
/*                                                                           */
499
/*  Outputs       : None                                                     */
500
/*                                                                           */
501
/*  Returns       : None                                                     */
502
/*                                                                           */
503
/*  Issues        : None                                                     */
504
/*                                                                           */
505
/*  Revision History:                                                        */
506
/*                                                                           */
507
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
508
/*         12 02 2015   Naveen Kumar P  Initial version                      */
509
/*                                                                           */
510
/*****************************************************************************/
511
void ih264_deblk_luma_horz_bs4_ssse3(UWORD8 *pu1_src,
512
                                     WORD32 src_strd,
513
                                     WORD32 alpha,
514
                                     WORD32 beta)
515
3.64M
{
516
3.64M
    WORD16 i16_posP3, i16_posP2, i16_posP1, i16_posP0;
517
3.64M
    WORD16 i16_posQ1, i16_posQ2, i16_posQ3;
518
3.64M
    UWORD8 *pu1_HorzPixel;
519
3.64M
    __m128i zero = _mm_setzero_si128();
520
3.64M
    __m128i q0_16x8, q1_16x8, q2_16x8, q3_16x8;
521
3.64M
    __m128i p0_16x8, p1_16x8, p2_16x8, p3_16x8;
522
3.64M
    __m128i q0_8x16, q1_8x16, q2_8x16, q3_8x16;
523
3.64M
    __m128i p0_8x16, p1_8x16, p2_8x16, p3_8x16;
524
3.64M
    __m128i q0_16x8_1;
525
3.64M
    __m128i p0_16x8_1;
526
3.64M
    __m128i q0_16x8_2, q1_16x8_2, q2_16x8_2;
527
3.64M
    __m128i p0_16x8_2, p1_16x8_2, p2_16x8_2;
528
3.64M
    __m128i temp1, temp2, temp3, temp4, temp5, temp6;
529
3.64M
    __m128i Alpha_8x16, Beta_8x16;
530
3.64M
    __m128i flag1_16x8, flag2_16x8, flag3_16x8, flag4_16x8;
531
3.64M
    __m128i const_val2_16x8 = _mm_set1_epi16(2);
532
533
3.64M
    pu1_HorzPixel = pu1_src - (src_strd << 2);
534
535
3.64M
    i16_posQ1 = src_strd;
536
3.64M
    i16_posQ2 = X2(src_strd);
537
3.64M
    i16_posQ3 = X3(src_strd);
538
3.64M
    i16_posP0 = X3(src_strd);
539
3.64M
    i16_posP1 = X2(src_strd);
540
3.64M
    i16_posP2 = src_strd;
541
3.64M
    i16_posP3 = 0;
542
543
3.64M
    Alpha_8x16 = _mm_set1_epi16(alpha);
544
3.64M
    Beta_8x16 = _mm_set1_epi16(beta);
545
546
3.64M
    p3_16x8 = _mm_loadu_si128((__m128i *)(pu1_HorzPixel + i16_posP3));
547
3.64M
    p2_16x8 = _mm_loadu_si128((__m128i *)(pu1_HorzPixel + i16_posP2));
548
3.64M
    p1_16x8 = _mm_loadu_si128((__m128i *)(pu1_HorzPixel + i16_posP1));
549
3.64M
    p0_16x8 = _mm_loadu_si128((__m128i *)(pu1_HorzPixel + i16_posP0));
550
3.64M
    q0_16x8 = _mm_loadu_si128((__m128i *)(pu1_src));
551
3.64M
    q1_16x8 = _mm_loadu_si128((__m128i *)(pu1_src + i16_posQ1));
552
3.64M
    q2_16x8 = _mm_loadu_si128((__m128i *)(pu1_src + i16_posQ2));
553
3.64M
    q3_16x8 = _mm_loadu_si128((__m128i *)(pu1_src + i16_posQ3));
554
555
    //Cond1 (ABS(p0 - q0) < alpha)
556
3.64M
    temp1 = _mm_subs_epu8(q0_16x8, p0_16x8);
557
3.64M
    temp2 = _mm_subs_epu8(p0_16x8, q0_16x8);
558
3.64M
    temp1 = _mm_add_epi8(temp1, temp2);
559
560
3.64M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
561
3.64M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
562
563
3.64M
    temp2 = _mm_cmpgt_epi16(Alpha_8x16, temp2);
564
3.64M
    temp1 = _mm_cmpgt_epi16(Alpha_8x16, temp1);
565
566
3.64M
    flag1_16x8 = _mm_packs_epi16(temp2, temp1);
567
568
    //Cond2 (ABS(q1 - q0) < beta)
569
3.64M
    temp1 = _mm_subs_epu8(q0_16x8, q1_16x8);
570
3.64M
    temp2 = _mm_subs_epu8(q1_16x8, q0_16x8);
571
3.64M
    temp1 = _mm_add_epi8(temp1, temp2);
572
573
3.64M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
574
3.64M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
575
576
3.64M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
577
3.64M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
578
579
3.64M
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
580
581
3.64M
    flag1_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
582
583
    //Cond3 (ABS(p1 - p0) < beta)
584
3.64M
    temp1 = _mm_subs_epu8(p0_16x8, p1_16x8);
585
3.64M
    temp2 = _mm_subs_epu8(p1_16x8, p0_16x8);
586
3.64M
    temp1 = _mm_add_epi8(temp1, temp2);
587
588
3.64M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
589
3.64M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
590
591
3.64M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
592
3.64M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
593
594
3.64M
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
595
596
    // !((ABS(p0 - q0) < alpha) || (ABS(q1 - q0) < beta) || (ABS(p1 - p0) < beta))
597
3.64M
    flag1_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
598
599
    // (ABS(p0 - q0) < ((alpha >> 2) + 2))
600
3.64M
    temp1 = _mm_subs_epu8(p0_16x8, q0_16x8);
601
3.64M
    temp2 = _mm_subs_epu8(q0_16x8, p0_16x8);
602
3.64M
    temp1 = _mm_add_epi8(temp1, temp2);
603
3.64M
    Alpha_8x16 = _mm_srai_epi16(Alpha_8x16, 2);
604
3.64M
    Alpha_8x16 = _mm_add_epi16(Alpha_8x16, const_val2_16x8);
605
606
3.64M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
607
3.64M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
608
3.64M
    temp2 = _mm_cmpgt_epi16(Alpha_8x16, temp2);
609
3.64M
    temp1 = _mm_cmpgt_epi16(Alpha_8x16, temp1);
610
611
3.64M
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
612
3.64M
    flag2_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
613
614
    // (ABS(p2 - p0) < beta)
615
3.64M
    temp1 = _mm_subs_epu8(p0_16x8, p2_16x8);
616
3.64M
    temp2 = _mm_subs_epu8(p2_16x8, p0_16x8);
617
3.64M
    temp1 = _mm_add_epi8(temp1, temp2);
618
619
3.64M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
620
3.64M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
621
3.64M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
622
3.64M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
623
624
3.64M
    flag3_16x8 = _mm_packs_epi16(temp2, temp1);
625
3.64M
    flag3_16x8 = _mm_and_si128(flag3_16x8, flag2_16x8);
626
627
    // (ABS(q2 - q0) < beta)
628
3.64M
    temp1 = _mm_subs_epu8(q0_16x8, q2_16x8);
629
3.64M
    temp2 = _mm_subs_epu8(q2_16x8, q0_16x8);
630
3.64M
    temp1 = _mm_add_epi8(temp1, temp2);
631
632
3.64M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
633
3.64M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
634
3.64M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
635
3.64M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
636
637
3.64M
    flag4_16x8 = _mm_packs_epi16(temp2, temp1);
638
3.64M
    flag4_16x8 = _mm_and_si128(flag4_16x8, flag2_16x8);
639
640
    // First 8 pixels
641
3.64M
    p3_8x16 = _mm_unpacklo_epi8(p3_16x8, zero);
642
3.64M
    p2_8x16 = _mm_unpacklo_epi8(p2_16x8, zero);
643
3.64M
    p1_8x16 = _mm_unpacklo_epi8(p1_16x8, zero);
644
3.64M
    p0_8x16 = _mm_unpacklo_epi8(p0_16x8, zero);
645
3.64M
    q0_8x16 = _mm_unpacklo_epi8(q0_16x8, zero);
646
3.64M
    q1_8x16 = _mm_unpacklo_epi8(q1_16x8, zero);
647
3.64M
    q2_8x16 = _mm_unpacklo_epi8(q2_16x8, zero);
648
3.64M
    q3_8x16 = _mm_unpacklo_epi8(q3_16x8, zero);
649
650
    // p0_1 and q0_1
651
3.64M
    temp1 = _mm_add_epi16(p0_8x16, q1_8x16);
652
3.64M
    temp2 = _mm_add_epi16(p1_8x16, q0_8x16);
653
3.64M
    temp5 = _mm_add_epi16(temp1, const_val2_16x8);
654
3.64M
    temp6 = _mm_add_epi16(temp2, const_val2_16x8);
655
3.64M
    temp3 = _mm_slli_epi16(p1_8x16, 1);
656
3.64M
    temp4 = _mm_slli_epi16(q1_8x16, 1);
657
3.64M
    temp1 = _mm_add_epi16(temp5, temp3);
658
3.64M
    temp2 = _mm_add_epi16(temp6, temp4);
659
3.64M
    p0_16x8_1 = _mm_srai_epi16(temp1, 2);
660
3.64M
    q0_16x8_1 = _mm_srai_epi16(temp2, 2);
661
662
    // p1_2 and q1_2
663
3.64M
    temp6 = _mm_add_epi16(temp6, p0_8x16);
664
3.64M
    temp5 = _mm_add_epi16(temp5, q0_8x16);
665
3.64M
    temp1 = _mm_add_epi16(temp6, p2_8x16);
666
3.64M
    temp2 = _mm_add_epi16(temp5, q2_8x16);
667
3.64M
    p1_16x8_2 = _mm_srai_epi16(temp1, 2);
668
3.64M
    q1_16x8_2 = _mm_srai_epi16(temp2, 2);
669
670
    // p0_2 and q0_2
671
3.64M
    temp1 = _mm_add_epi16(temp3, p2_8x16);
672
3.64M
    temp2 = _mm_add_epi16(temp4, q2_8x16);
673
3.64M
    temp1 = _mm_add_epi16(temp1, q1_8x16);
674
3.64M
    temp2 = _mm_add_epi16(temp2, p1_8x16);
675
3.64M
    temp3 = _mm_add_epi16(p0_8x16, q0_8x16);
676
3.64M
    temp3 = _mm_slli_epi16(temp3, 1);
677
3.64M
    temp1 = _mm_add_epi16(temp1, temp3);
678
3.64M
    temp2 = _mm_add_epi16(temp2, temp3);
679
3.64M
    temp1 = _mm_add_epi16(temp1, _mm_set1_epi16(4));
680
3.64M
    temp2 = _mm_add_epi16(temp2, _mm_set1_epi16(4));
681
3.64M
    p0_16x8_2 = _mm_srai_epi16(temp1, 3);
682
3.64M
    q0_16x8_2 = _mm_srai_epi16(temp2, 3);
683
684
    // p2_2 and q2_2
685
3.64M
    temp1 = _mm_add_epi16(temp6, const_val2_16x8);
686
3.64M
    temp2 = _mm_add_epi16(temp5, const_val2_16x8);
687
3.64M
    temp3 = _mm_slli_epi16(p2_8x16, 1);
688
3.64M
    temp4 = _mm_slli_epi16(q2_8x16, 1);
689
3.64M
    temp3 = _mm_add_epi16(p2_8x16, temp3);
690
3.64M
    temp4 = _mm_add_epi16(q2_8x16, temp4);
691
3.64M
    temp5 = _mm_slli_epi16(p3_8x16, 1);
692
3.64M
    temp6 = _mm_slli_epi16(q3_8x16, 1);
693
3.64M
    temp1 = _mm_add_epi16(temp1, temp3);
694
3.64M
    temp2 = _mm_add_epi16(temp2, temp4);
695
3.64M
    temp1 = _mm_add_epi16(temp1, temp5);
696
3.64M
    temp2 = _mm_add_epi16(temp2, temp6);
697
3.64M
    p2_16x8_2 = _mm_srai_epi16(temp1, 3);
698
3.64M
    q2_16x8_2 = _mm_srai_epi16(temp2, 3);
699
700
    // Second 8 pixels and packing with first 8 pixels
701
3.64M
    p3_8x16 = _mm_unpackhi_epi8(p3_16x8, zero);
702
3.64M
    p2_8x16 = _mm_unpackhi_epi8(p2_16x8, zero);
703
3.64M
    p1_8x16 = _mm_unpackhi_epi8(p1_16x8, zero);
704
3.64M
    p0_8x16 = _mm_unpackhi_epi8(p0_16x8, zero);
705
3.64M
    q0_8x16 = _mm_unpackhi_epi8(q0_16x8, zero);
706
3.64M
    q1_8x16 = _mm_unpackhi_epi8(q1_16x8, zero);
707
3.64M
    q2_8x16 = _mm_unpackhi_epi8(q2_16x8, zero);
708
3.64M
    q3_8x16 = _mm_unpackhi_epi8(q3_16x8, zero);
709
710
    // p0_1 and q0_1
711
3.64M
    temp1 = _mm_add_epi16(p0_8x16, q1_8x16);
712
3.64M
    temp2 = _mm_add_epi16(p1_8x16, q0_8x16);
713
3.64M
    temp5 = _mm_add_epi16(temp1, const_val2_16x8);
714
3.64M
    temp6 = _mm_add_epi16(temp2, const_val2_16x8);
715
3.64M
    temp3 = _mm_slli_epi16(p1_8x16, 1);
716
3.64M
    temp4 = _mm_slli_epi16(q1_8x16, 1);
717
3.64M
    temp1 = _mm_add_epi16(temp5, temp3);
718
3.64M
    temp2 = _mm_add_epi16(temp6, temp4);
719
3.64M
    temp1 = _mm_srai_epi16(temp1, 2);
720
3.64M
    temp2 = _mm_srai_epi16(temp2, 2);
721
3.64M
    p0_16x8_1 = _mm_packus_epi16(p0_16x8_1, temp1);
722
3.64M
    q0_16x8_1 = _mm_packus_epi16(q0_16x8_1, temp2);
723
724
    // p1_2 and q1_2
725
3.64M
    temp6 = _mm_add_epi16(temp6, p0_8x16);
726
3.64M
    temp5 = _mm_add_epi16(temp5, q0_8x16);
727
3.64M
    temp1 = _mm_add_epi16(temp6, p2_8x16);
728
3.64M
    temp2 = _mm_add_epi16(temp5, q2_8x16);
729
3.64M
    temp1 = _mm_srai_epi16(temp1, 2);
730
3.64M
    temp2 = _mm_srai_epi16(temp2, 2);
731
3.64M
    p1_16x8_2 = _mm_packus_epi16(p1_16x8_2, temp1);
732
3.64M
    q1_16x8_2 = _mm_packus_epi16(q1_16x8_2, temp2);
733
734
    // p0_2 and q0_2
735
3.64M
    temp1 = _mm_add_epi16(temp3, p2_8x16);
736
3.64M
    temp2 = _mm_add_epi16(temp4, q2_8x16);
737
3.64M
    temp1 = _mm_add_epi16(temp1, q1_8x16);
738
3.64M
    temp2 = _mm_add_epi16(temp2, p1_8x16);
739
3.64M
    temp3 = _mm_add_epi16(p0_8x16, q0_8x16);
740
3.64M
    temp3 = _mm_slli_epi16(temp3, 1);
741
3.64M
    temp1 = _mm_add_epi16(temp1, temp3);
742
3.64M
    temp2 = _mm_add_epi16(temp2, temp3);
743
3.64M
    temp1 = _mm_add_epi16(temp1, _mm_set1_epi16(4));
744
3.64M
    temp2 = _mm_add_epi16(temp2, _mm_set1_epi16(4));
745
3.64M
    temp1 = _mm_srai_epi16(temp1, 3);
746
3.64M
    temp2 = _mm_srai_epi16(temp2, 3);
747
3.64M
    p0_16x8_2 = _mm_packus_epi16(p0_16x8_2, temp1);
748
3.64M
    q0_16x8_2 = _mm_packus_epi16(q0_16x8_2, temp2);
749
750
    // p2_2 and q2_2
751
3.64M
    temp1 = _mm_add_epi16(temp6, const_val2_16x8);
752
3.64M
    temp2 = _mm_add_epi16(temp5, const_val2_16x8);
753
3.64M
    temp3 = _mm_slli_epi16(p2_8x16, 1);
754
3.64M
    temp4 = _mm_slli_epi16(q2_8x16, 1);
755
3.64M
    temp3 = _mm_add_epi16(p2_8x16, temp3);
756
3.64M
    temp4 = _mm_add_epi16(q2_8x16, temp4);
757
3.64M
    temp5 = _mm_slli_epi16(p3_8x16, 1);
758
3.64M
    temp6 = _mm_slli_epi16(q3_8x16, 1);
759
3.64M
    temp1 = _mm_add_epi16(temp1, temp3);
760
3.64M
    temp2 = _mm_add_epi16(temp2, temp4);
761
3.64M
    temp1 = _mm_add_epi16(temp1, temp5);
762
3.64M
    temp2 = _mm_add_epi16(temp2, temp6);
763
3.64M
    temp1 = _mm_srai_epi16(temp1, 3);
764
3.64M
    temp2 = _mm_srai_epi16(temp2, 3);
765
3.64M
    p2_16x8_2 = _mm_packus_epi16(p2_16x8_2, temp1);
766
3.64M
    q2_16x8_2 = _mm_packus_epi16(q2_16x8_2, temp2);
767
768
    // p0 and q0
769
3.64M
    p0_16x8 = _mm_and_si128(p0_16x8,
770
3.64M
                            _mm_xor_si128(flag1_16x8, _mm_set1_epi8(0xFF)));
771
3.64M
    p0_16x8_1 = _mm_and_si128(p0_16x8_1, flag1_16x8);
772
3.64M
    p0_16x8 = _mm_add_epi8(p0_16x8, p0_16x8_1);
773
3.64M
    q0_16x8 = _mm_and_si128(q0_16x8,
774
3.64M
                            _mm_xor_si128(flag1_16x8, _mm_set1_epi8(0xFF)));
775
3.64M
    q0_16x8_1 = _mm_and_si128(q0_16x8_1, flag1_16x8);
776
3.64M
    q0_16x8 = _mm_add_epi8(q0_16x8, q0_16x8_1);
777
778
    // p0 and q0
779
3.64M
    p0_16x8 = _mm_and_si128(p0_16x8,
780
3.64M
                            _mm_xor_si128(flag3_16x8, _mm_set1_epi8(0xFF)));
781
3.64M
    p0_16x8_2 = _mm_and_si128(p0_16x8_2, flag3_16x8);
782
3.64M
    p0_16x8 = _mm_add_epi8(p0_16x8, p0_16x8_2);
783
3.64M
    q0_16x8 = _mm_and_si128(q0_16x8,
784
3.64M
                            _mm_xor_si128(flag4_16x8, _mm_set1_epi8(0xFF)));
785
3.64M
    q0_16x8_2 = _mm_and_si128(q0_16x8_2, flag4_16x8);
786
3.64M
    q0_16x8 = _mm_add_epi8(q0_16x8, q0_16x8_2);
787
788
    // p1 and q1
789
3.64M
    p1_16x8 = _mm_and_si128(p1_16x8,
790
3.64M
                            _mm_xor_si128(flag3_16x8, _mm_set1_epi8(0xFF)));
791
3.64M
    p1_16x8_2 = _mm_and_si128(p1_16x8_2, flag3_16x8);
792
3.64M
    p1_16x8 = _mm_add_epi8(p1_16x8, p1_16x8_2);
793
3.64M
    q1_16x8 = _mm_and_si128(q1_16x8,
794
3.64M
                            _mm_xor_si128(flag4_16x8, _mm_set1_epi8(0xFF)));
795
3.64M
    q1_16x8_2 = _mm_and_si128(q1_16x8_2, flag4_16x8);
796
3.64M
    q1_16x8 = _mm_add_epi8(q1_16x8, q1_16x8_2);
797
798
    // p2 and q2
799
3.64M
    p2_16x8 = _mm_and_si128(p2_16x8,
800
3.64M
                            _mm_xor_si128(flag3_16x8, _mm_set1_epi8(0xFF)));
801
3.64M
    p2_16x8_2 = _mm_and_si128(p2_16x8_2, flag3_16x8);
802
3.64M
    p2_16x8 = _mm_add_epi8(p2_16x8, p2_16x8_2);
803
3.64M
    q2_16x8 = _mm_and_si128(q2_16x8,
804
3.64M
                            _mm_xor_si128(flag4_16x8, _mm_set1_epi8(0xFF)));
805
3.64M
    q2_16x8_2 = _mm_and_si128(q2_16x8_2, flag4_16x8);
806
3.64M
    q2_16x8 = _mm_add_epi8(q2_16x8, q2_16x8_2);
807
808
3.64M
    _mm_storeu_si128((__m128i *)(pu1_HorzPixel + i16_posP2), p2_16x8);
809
3.64M
    _mm_storeu_si128((__m128i *)(pu1_HorzPixel + i16_posP1), p1_16x8);
810
3.64M
    _mm_storeu_si128((__m128i *)(pu1_HorzPixel + i16_posP0), p0_16x8);
811
812
3.64M
    _mm_storeu_si128((__m128i *)(pu1_src), q0_16x8);
813
3.64M
    _mm_storeu_si128((__m128i *)(pu1_src + i16_posQ1), q1_16x8);
814
3.64M
    _mm_storeu_si128((__m128i *)(pu1_src + i16_posQ2), q2_16x8);
815
816
3.64M
}
817
818
/*****************************************************************************/
819
/*                                                                           */
820
/*  Function Name : ih264_deblk_luma_vert_bslt4_ssse3()                      */
821
/*                                                                           */
822
/*  Description   : This function performs filtering of a luma block         */
823
/*                  vertical edge when the boundary strength is less than 4. */
824
/*                                                                           */
825
/*  Inputs        : pu1_src       - pointer to the src sample q0             */
826
/*                  src_strd      - source stride                            */
827
/*                  alpha         - alpha value for the boundary             */
828
/*                  beta          - beta value for the boundary              */
829
/*                  u4_bs         - packed Boundary strength array           */
830
/*                  pu1_cliptab   - tc0_table                                */
831
/*                                                                           */
832
/*  Globals       : None                                                     */
833
/*                                                                           */
834
/*  Processing    : This operation is described in Sec. 8.7.2.3 under the    */
835
/*                  title "Filtering process for edges for bS less than 4"   */
836
/*                  in ITU T Rec H.264.                                      */
837
/*                                                                           */
838
/*  Outputs       : None                                                     */
839
/*                                                                           */
840
/*  Returns       : None                                                     */
841
/*                                                                           */
842
/*  Issues        : None                                                     */
843
/*                                                                           */
844
/*  Revision History:                                                        */
845
/*                                                                           */
846
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
847
/*         12 02 2015   Naveen Kumar P  Initial version                      */
848
/*                                                                           */
849
/*****************************************************************************/
850
void ih264_deblk_luma_vert_bslt4_ssse3(UWORD8 *pu1_src,
851
                                       WORD32 src_strd,
852
                                       WORD32 alpha,
853
                                       WORD32 beta,
854
                                       UWORD32 u4_bs,
855
                                       const UWORD8 *pu1_cliptab)
856
15.9M
{
857
15.9M
    UWORD8 u1_Bs, u1_Bs1;
858
859
15.9M
    WORD32 j = 0;
860
861
15.9M
    __m128i linea, lineb, linec, lined, linee, linef, lineg, lineh;
862
15.9M
    __m128i int1, int2, int3, int4, high1, high2;
863
15.9M
    __m128i flag, flag1, i_C, i_C0;
864
15.9M
    __m128i i_Ap, i_Aq, diff, const1, const2, in_macro, in_macrotemp, temp,
865
15.9M
                    temp1;
866
15.9M
    __m128i zero = _mm_setzero_si128();
867
868
47.8M
    for(j = 0; j <= 8 * src_strd; j += 8 * src_strd)
869
31.9M
    {
870
        //Transpose
871
31.9M
        linea = _mm_loadl_epi64((__m128i *)(pu1_src - 3 + j));
872
31.9M
        lineb = _mm_loadl_epi64((__m128i *)(pu1_src - 3 + src_strd + j));
873
31.9M
        linec = _mm_loadl_epi64((__m128i *)(pu1_src - 3 + 2 * src_strd + j));
874
31.9M
        lined = _mm_loadl_epi64((__m128i *)(pu1_src - 3 + 3 * src_strd + j));
875
876
31.9M
        linea = _mm_unpacklo_epi8(linea, zero);
877
31.9M
        lineb = _mm_unpacklo_epi8(lineb, zero);
878
31.9M
        linec = _mm_unpacklo_epi8(linec, zero);
879
31.9M
        lined = _mm_unpacklo_epi8(lined, zero);
880
881
31.9M
        int1 = _mm_unpacklo_epi16(linea, lineb);
882
31.9M
        lineb = _mm_unpackhi_epi16(linea, lineb);
883
884
31.9M
        int2 = _mm_unpacklo_epi16(linec, lined);
885
31.9M
        lined = _mm_unpackhi_epi16(linec, lined);
886
887
31.9M
        linea = _mm_unpacklo_epi16(int1, int2);
888
31.9M
        int1 = _mm_unpackhi_epi16(int1, int2);
889
890
31.9M
        linec = _mm_unpacklo_epi16(lineb, lined);
891
31.9M
        high1 = _mm_unpackhi_epi16(lineb, lined);
892
893
31.9M
        linee = _mm_loadl_epi64((__m128i *)(pu1_src - 3 + 4 * src_strd + j));
894
31.9M
        linef = _mm_loadl_epi64((__m128i *)(pu1_src - 3 + 5 * src_strd + j));
895
31.9M
        lineg = _mm_loadl_epi64((__m128i *)(pu1_src - 3 + 6 * src_strd + j));
896
31.9M
        lineh = _mm_loadl_epi64((__m128i *)(pu1_src - 3 + 7 * src_strd + j));
897
898
31.9M
        linee = _mm_unpacklo_epi8(linee, zero);
899
31.9M
        linef = _mm_unpacklo_epi8(linef, zero);
900
31.9M
        lineg = _mm_unpacklo_epi8(lineg, zero);
901
31.9M
        lineh = _mm_unpacklo_epi8(lineh, zero);
902
903
31.9M
        int2 = _mm_unpacklo_epi16(linee, linef);
904
31.9M
        linef = _mm_unpackhi_epi16(linee, linef);
905
906
31.9M
        int3 = _mm_unpacklo_epi16(lineg, lineh);
907
31.9M
        lineh = _mm_unpackhi_epi16(lineg, lineh);
908
909
31.9M
        linee = _mm_unpacklo_epi16(int2, int3);
910
31.9M
        int2 = _mm_unpackhi_epi16(int2, int3);
911
912
31.9M
        lineg = _mm_unpacklo_epi16(linef, lineh);
913
31.9M
        high2 = _mm_unpackhi_epi16(linef, lineh);
914
915
31.9M
        int4 = _mm_unpacklo_epi16(linea, linee);
916
31.9M
        lineb = _mm_unpackhi_epi16(linea, linee);
917
918
31.9M
        int3 = _mm_unpacklo_epi16(int1, int2);
919
31.9M
        lined = _mm_unpackhi_epi16(int1, int2);
920
921
31.9M
        int2 = _mm_unpacklo_epi16(linec, lineg);
922
31.9M
        linef = _mm_unpackhi_epi16(linec, lineg);
923
924
31.9M
        linea = int4;
925
31.9M
        linec = int3;
926
31.9M
        linee = int2;
927
928
31.9M
        lineg = _mm_unpacklo_epi16(high1, high2);
929
31.9M
        lineh = _mm_unpackhi_epi16(high1, high2);
930
931
        //end of transpose
932
933
31.9M
        u1_Bs = (u4_bs >> 24) & 0xff;
934
31.9M
        u1_Bs1 = (u4_bs >> 16) & 0xff;
935
31.9M
        u4_bs <<= 16;
936
937
31.9M
        flag1 = _mm_set_epi16(u1_Bs1, u1_Bs, u1_Bs1, u1_Bs, u1_Bs1, u1_Bs,
938
31.9M
                              u1_Bs1, u1_Bs);
939
31.9M
        flag1 = _mm_cmpeq_epi16(flag1, zero); //Set flag to 1s and 0s
940
31.9M
        flag1 = _mm_xor_si128(flag1, _mm_set1_epi16(0xFFFF)); //Invert for required mask
941
942
31.9M
        i_C0 = _mm_set_epi16(pu1_cliptab[u1_Bs1], pu1_cliptab[u1_Bs],
943
31.9M
                             pu1_cliptab[u1_Bs1], pu1_cliptab[u1_Bs],
944
31.9M
                             pu1_cliptab[u1_Bs1], pu1_cliptab[u1_Bs],
945
31.9M
                             pu1_cliptab[u1_Bs1], pu1_cliptab[u1_Bs]);
946
947
31.9M
        diff = _mm_subs_epi16(linec, lined); //Condn 1
948
31.9M
        diff = _mm_abs_epi16(diff);
949
31.9M
        const1 = _mm_set1_epi16(alpha);
950
31.9M
        flag = _mm_cmpgt_epi16(const1, diff);
951
952
31.9M
        diff = _mm_subs_epi16(linee, lined); //Condtn 2
953
31.9M
        diff = _mm_abs_epi16(diff);
954
31.9M
        const1 = _mm_set1_epi16(beta);
955
31.9M
        flag = _mm_and_si128(flag, _mm_cmpgt_epi16(const1, diff));
956
957
31.9M
        diff = _mm_subs_epi16(lineb, linec); //Condtn 3
958
31.9M
        diff = _mm_abs_epi16(diff);
959
31.9M
        flag = _mm_and_si128(flag, _mm_cmpgt_epi16(const1, diff)); //Const 1= Beta from now on
960
961
31.9M
        flag = _mm_and_si128(flag, flag1); //Final flag (ui_B condition + other 3 conditions)
962
963
        //Adding Ap<Beta and Aq<Beta
964
31.9M
        i_Ap = _mm_subs_epi16(linea, linec);
965
31.9M
        i_Ap = _mm_abs_epi16(i_Ap);
966
31.9M
        const2 = _mm_cmpgt_epi16(const1, i_Ap);
967
31.9M
        const2 = _mm_subs_epi16(zero, const2); //Make FFFF=1 and 0000=0
968
31.9M
        i_C = _mm_add_epi16(i_C0, const2);
969
970
31.9M
        i_Aq = _mm_subs_epi16(linef, lined);
971
31.9M
        i_Aq = _mm_abs_epi16(i_Aq);
972
31.9M
        const2 = _mm_cmpgt_epi16(const1, i_Aq);
973
31.9M
        const2 = _mm_subs_epi16(zero, const2);
974
31.9M
        i_C = _mm_add_epi16(i_C, const2);
975
976
        //Calculate in_macro
977
31.9M
        diff = _mm_subs_epi16(lined, linec);
978
31.9M
        diff = _mm_slli_epi16(diff, 2);
979
31.9M
        const2 = _mm_subs_epi16(lineb, linee);
980
31.9M
        diff = _mm_add_epi16(diff, const2);
981
31.9M
        const2 = _mm_set1_epi16(4);
982
31.9M
        diff = _mm_add_epi16(diff, const2);
983
31.9M
        in_macro = _mm_srai_epi16(diff, 3);
984
985
31.9M
        in_macro = _mm_min_epi16(i_C, in_macro); //CLIP3
986
31.9M
        i_C = _mm_subs_epi16(zero, i_C);
987
31.9M
        in_macro = _mm_max_epi16(i_C, in_macro);
988
989
        //Compute and store
990
31.9M
        in_macrotemp = _mm_add_epi16(linec, in_macro);
991
31.9M
        in_macrotemp = _mm_and_si128(in_macrotemp, flag);
992
31.9M
        temp = _mm_and_si128(linec,
993
31.9M
                             _mm_xor_si128(flag, _mm_set1_epi16(0xFFFF)));
994
31.9M
        temp = _mm_add_epi16(temp, in_macrotemp);
995
        //temp= _mm_packus_epi16 (temp, zero);
996
        //_mm_storel_epi64(uc_HorzPixel+i16_posP0+i, in_macrotemp);
997
998
31.9M
        in_macrotemp = _mm_subs_epi16(lined, in_macro);
999
31.9M
        in_macrotemp = _mm_and_si128(in_macrotemp, flag);
1000
31.9M
        temp1 = _mm_and_si128(lined,
1001
31.9M
                              _mm_xor_si128(flag, _mm_set1_epi16(0xFFFF)));
1002
31.9M
        temp1 = _mm_add_epi16(temp1, in_macrotemp);
1003
        //temp1= _mm_packus_epi16 (temp1, zero);
1004
        //_mm_storel_epi64(pu1_src+i, in_macrotemp);
1005
1006
        //If Ap<Beta
1007
31.9M
        flag1 = _mm_cmpgt_epi16(const1, i_Ap);
1008
31.9M
        flag1 = _mm_and_si128(flag, flag1);
1009
31.9M
        in_macrotemp = _mm_add_epi16(linec, lined);
1010
31.9M
        in_macrotemp = _mm_add_epi16(in_macrotemp, _mm_set1_epi16(1));
1011
31.9M
        in_macrotemp = _mm_srai_epi16(in_macrotemp, 1);
1012
31.9M
        in_macro = _mm_add_epi16(in_macrotemp, linea);
1013
31.9M
        in_macro = _mm_subs_epi16(in_macro, _mm_slli_epi16(lineb, 1));
1014
31.9M
        in_macro = _mm_srai_epi16(in_macro, 1);
1015
1016
31.9M
        in_macro = _mm_min_epi16(i_C0, in_macro); //CLIP3
1017
31.9M
        i_C0 = _mm_subs_epi16(zero, i_C0);
1018
31.9M
        in_macro = _mm_max_epi16(i_C0, in_macro);
1019
1020
31.9M
        in_macro = _mm_and_si128(in_macro, flag1);
1021
31.9M
        lineb = _mm_add_epi16(lineb, in_macro);
1022
        //in_macro= _mm_packus_epi16 (i_p1, zero);
1023
        //_mm_storel_epi64(uc_HorzPixel+i16_posP1+i, in_macro);
1024
1025
31.9M
        flag1 = _mm_cmpgt_epi16(const1, i_Aq);
1026
31.9M
        flag1 = _mm_and_si128(flag, flag1);
1027
31.9M
        in_macro = _mm_add_epi16(in_macrotemp, linef);
1028
31.9M
        in_macro = _mm_subs_epi16(in_macro, _mm_slli_epi16(linee, 1));
1029
31.9M
        in_macro = _mm_srai_epi16(in_macro, 1);
1030
1031
31.9M
        i_C0 = _mm_abs_epi16(i_C0);
1032
31.9M
        in_macro = _mm_min_epi16(i_C0, in_macro); //CLIP3
1033
31.9M
        i_C0 = _mm_subs_epi16(zero, i_C0);
1034
31.9M
        in_macro = _mm_max_epi16(i_C0, in_macro);
1035
1036
31.9M
        in_macro = _mm_and_si128(in_macro, flag1);
1037
31.9M
        linee = _mm_add_epi16(linee, in_macro);
1038
        //in_macro= _mm_packus_epi16 (i_q1, zero);
1039
        //_mm_storel_epi64(pu1_src+i16_posQ1+i, in_macro);
1040
31.9M
        linec = temp;
1041
31.9M
        lined = temp1;
1042
        //End of filtering
1043
1044
31.9M
        int1 = _mm_unpacklo_epi16(linea, linee);
1045
31.9M
        linee = _mm_unpackhi_epi16(linea, linee);
1046
1047
31.9M
        int2 = _mm_unpacklo_epi16(linec, lineg);
1048
31.9M
        lineg = _mm_unpackhi_epi16(linec, lineg);
1049
1050
31.9M
        linea = _mm_unpacklo_epi16(int1, int2);
1051
31.9M
        int3 = _mm_unpackhi_epi16(int1, int2);
1052
1053
31.9M
        linec = _mm_unpacklo_epi16(linee, lineg);
1054
31.9M
        lineg = _mm_unpackhi_epi16(linee, lineg);
1055
1056
31.9M
        int1 = _mm_unpacklo_epi16(lineb, linef);
1057
31.9M
        linef = _mm_unpackhi_epi16(lineb, linef);
1058
1059
31.9M
        int2 = _mm_unpacklo_epi16(lined, lineh);
1060
31.9M
        lineh = _mm_unpackhi_epi16(lined, lineh);
1061
1062
31.9M
        lineb = _mm_unpacklo_epi16(int1, int2);
1063
31.9M
        int4 = _mm_unpackhi_epi16(int1, int2);
1064
1065
31.9M
        lined = _mm_unpacklo_epi16(linef, lineh);
1066
31.9M
        lineh = _mm_unpackhi_epi16(linef, lineh);
1067
1068
31.9M
        int1 = _mm_unpackhi_epi16(linea, lineb);
1069
31.9M
        linea = _mm_unpacklo_epi16(linea, lineb);
1070
1071
31.9M
        int2 = _mm_unpacklo_epi16(int3, int4);
1072
31.9M
        high1 = _mm_unpackhi_epi16(int3, int4);
1073
1074
31.9M
        lineb = _mm_unpacklo_epi16(linec, lined);
1075
31.9M
        linef = _mm_unpackhi_epi16(linec, lined);
1076
1077
31.9M
        lined = _mm_unpacklo_epi16(lineg, lineh);
1078
31.9M
        lineh = _mm_unpackhi_epi16(lineg, lineh);
1079
1080
31.9M
        linee = int1;
1081
31.9M
        lineg = high1;
1082
31.9M
        linec = int2;
1083
        //End of inverse transpose
1084
1085
        //Packs and stores
1086
31.9M
        linea = _mm_packus_epi16(linea, zero);
1087
31.9M
        _mm_storel_epi64((__m128i *)(pu1_src - 3 + j), linea);
1088
1089
31.9M
        lineb = _mm_packus_epi16(lineb, zero);
1090
31.9M
        _mm_storel_epi64((__m128i *)(pu1_src - 3 + src_strd + j), lineb);
1091
1092
31.9M
        linec = _mm_packus_epi16(linec, zero);
1093
31.9M
        _mm_storel_epi64((__m128i *)(pu1_src - 3 + 2 * src_strd + j), linec);
1094
1095
31.9M
        lined = _mm_packus_epi16(lined, zero);
1096
31.9M
        _mm_storel_epi64((__m128i *)(pu1_src - 3 + 3 * src_strd + j), lined);
1097
1098
31.9M
        linee = _mm_packus_epi16(linee, zero);
1099
31.9M
        _mm_storel_epi64((__m128i *)(pu1_src - 3 + 4 * src_strd + j), linee);
1100
1101
31.9M
        linef = _mm_packus_epi16(linef, zero);
1102
31.9M
        _mm_storel_epi64((__m128i *)(pu1_src - 3 + 5 * src_strd + j), linef);
1103
1104
31.9M
        lineg = _mm_packus_epi16(lineg, zero);
1105
31.9M
        _mm_storel_epi64((__m128i *)(pu1_src - 3 + 6 * src_strd + j), lineg);
1106
1107
31.9M
        lineh = _mm_packus_epi16(lineh, zero);
1108
31.9M
        _mm_storel_epi64((__m128i *)(pu1_src - 3 + 7 * src_strd + j), lineh);
1109
1110
31.9M
    }
1111
15.9M
}
1112
1113
/*****************************************************************************/
1114
/*                                                                           */
1115
/*  Function Name : ih264_deblk_luma_horz_bslt4_ssse3()                      */
1116
/*                                                                           */
1117
/*  Description   : This function performs filtering of a luma block         */
1118
/*                  horizontal edge when boundary strength is less than 4.   */
1119
/*                                                                           */
1120
/*  Inputs        : pu1_src       - pointer to the src sample q0             */
1121
/*                  src_strd      - source stride                            */
1122
/*                  alpha         - alpha value for the boundary             */
1123
/*                  beta          - beta value for the boundary              */
1124
/*                  u4_bs         - packed Boundary strength array           */
1125
/*                  pu1_cliptab   - tc0_table                                */
1126
/*                                                                           */
1127
/*  Globals       : None                                                     */
1128
/*                                                                           */
1129
/*  Processing    : This operation is described in Sec. 8.7.2.3 under the    */
1130
/*                  title "Filtering process for edges for bS less than 4"   */
1131
/*                  in ITU T Rec H.264.                                      */
1132
/*                                                                           */
1133
/*  Outputs       : None                                                     */
1134
/*                                                                           */
1135
/*  Returns       : None                                                     */
1136
/*                                                                           */
1137
/*  Issues        : None                                                     */
1138
/*                                                                           */
1139
/*  Revision History:                                                        */
1140
/*                                                                           */
1141
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1142
/*         12 02 2015   Naveen Kumar P  Initial version                      */
1143
/*                                                                           */
1144
/*****************************************************************************/
1145
void ih264_deblk_luma_horz_bslt4_ssse3(UWORD8 *pu1_src,
1146
                                       WORD32 src_strd,
1147
                                       WORD32 alpha,
1148
                                       WORD32 beta,
1149
                                       UWORD32 u4_bs,
1150
                                       const UWORD8 *pu1_cliptab)
1151
15.9M
{
1152
15.9M
    WORD16 i16_posP2, i16_posP1, i16_posP0, i16_posQ1, i16_posQ2;
1153
15.9M
    UWORD8 *pu1_HorzPixel;
1154
15.9M
    __m128i zero = _mm_setzero_si128();
1155
15.9M
    __m128i bs_flag_16x8b, C0_16x8, C0_8x16, C0_hi_8x16, C_8x16, C_hi_8x16;
1156
15.9M
    __m128i q0_16x8, q1_16x8, q2_16x8, p0_16x8, p1_16x8, p2_16x8;
1157
15.9M
    __m128i temp1, temp2;
1158
15.9M
    __m128i Alpha_8x16, Beta_8x16, flag1_16x8, flag2_16x8, flag3_16x8;
1159
15.9M
    __m128i in_macro_16x8, in_macro_hi_16x8;
1160
15.9M
    __m128i const_val4_8x16;
1161
15.9M
    UWORD8 u1_Bs0, u1_Bs1, u1_Bs2, u1_Bs3;
1162
15.9M
    UWORD8 clip0, clip1, clip2, clip3;
1163
1164
15.9M
    pu1_HorzPixel = pu1_src - (src_strd << 2);
1165
1166
15.9M
    i16_posQ1 = src_strd;
1167
15.9M
    i16_posQ2 = X2(src_strd);
1168
15.9M
    i16_posP0 = X3(src_strd);
1169
15.9M
    i16_posP1 = X2(src_strd);
1170
15.9M
    i16_posP2 = src_strd;
1171
1172
15.9M
    q0_16x8 = _mm_loadu_si128((__m128i *)(pu1_src));
1173
15.9M
    q1_16x8 = _mm_loadu_si128((__m128i *)(pu1_src + i16_posQ1));
1174
1175
15.9M
    u1_Bs0 = (u4_bs >> 24) & 0xff;
1176
15.9M
    u1_Bs1 = (u4_bs >> 16) & 0xff;
1177
15.9M
    u1_Bs2 = (u4_bs >> 8) & 0xff;
1178
15.9M
    u1_Bs3 = (u4_bs >> 0) & 0xff;
1179
15.9M
    clip0 = pu1_cliptab[u1_Bs0];
1180
15.9M
    clip1 = pu1_cliptab[u1_Bs1];
1181
15.9M
    clip2 = pu1_cliptab[u1_Bs2];
1182
15.9M
    clip3 = pu1_cliptab[u1_Bs3];
1183
1184
15.9M
    Alpha_8x16 = _mm_set1_epi16(alpha);
1185
15.9M
    Beta_8x16 = _mm_set1_epi16(beta);
1186
1187
15.9M
    bs_flag_16x8b = _mm_set_epi8(u1_Bs3, u1_Bs3, u1_Bs3, u1_Bs3, u1_Bs2, u1_Bs2,
1188
15.9M
                                 u1_Bs2, u1_Bs2, u1_Bs1, u1_Bs1, u1_Bs1, u1_Bs1,
1189
15.9M
                                 u1_Bs0, u1_Bs0, u1_Bs0, u1_Bs0);
1190
1191
15.9M
    C0_16x8 = _mm_set_epi8(clip3, clip3, clip3, clip3, clip2, clip2, clip2,
1192
15.9M
                           clip2, clip1, clip1, clip1, clip1, clip0, clip0,
1193
15.9M
                           clip0, clip0);
1194
1195
15.9M
    bs_flag_16x8b = _mm_cmpeq_epi8(bs_flag_16x8b, zero);
1196
15.9M
    bs_flag_16x8b = _mm_xor_si128(bs_flag_16x8b, _mm_set1_epi8(0xFF)); //Invert for required mask
1197
15.9M
    C0_8x16 = _mm_unpacklo_epi8(C0_16x8, zero);
1198
15.9M
    C0_hi_8x16 = _mm_unpackhi_epi8(C0_16x8, zero);
1199
1200
15.9M
    p1_16x8 = _mm_loadu_si128((__m128i *)(pu1_HorzPixel + i16_posP1));
1201
15.9M
    p0_16x8 = _mm_loadu_si128((__m128i *)(pu1_HorzPixel + i16_posP0));
1202
15.9M
    p2_16x8 = _mm_loadu_si128((__m128i *)(pu1_HorzPixel + i16_posP2));
1203
15.9M
    q2_16x8 = _mm_loadu_si128((__m128i *)(pu1_src + i16_posQ2));
1204
1205
    //Cond1 (ABS(p0 - q0) < alpha)
1206
15.9M
    temp1 = _mm_subs_epu8(q0_16x8, p0_16x8);
1207
15.9M
    temp2 = _mm_subs_epu8(p0_16x8, q0_16x8);
1208
15.9M
    temp1 = _mm_add_epi8(temp1, temp2);
1209
1210
15.9M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1211
15.9M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
1212
1213
15.9M
    temp2 = _mm_cmpgt_epi16(Alpha_8x16, temp2);
1214
15.9M
    temp1 = _mm_cmpgt_epi16(Alpha_8x16, temp1);
1215
1216
15.9M
    flag1_16x8 = _mm_packs_epi16(temp2, temp1);
1217
15.9M
    flag1_16x8 = _mm_and_si128(flag1_16x8, bs_flag_16x8b);
1218
1219
    //Cond2 (ABS(q1 - q0) < beta)
1220
15.9M
    temp1 = _mm_subs_epu8(q0_16x8, q1_16x8);
1221
15.9M
    temp2 = _mm_subs_epu8(q1_16x8, q0_16x8);
1222
15.9M
    temp1 = _mm_add_epi8(temp1, temp2);
1223
1224
15.9M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1225
15.9M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
1226
1227
15.9M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1228
15.9M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
1229
1230
15.9M
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
1231
1232
15.9M
    flag1_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
1233
1234
    //Cond3 (ABS(p1 - p0) < beta)
1235
15.9M
    temp1 = _mm_subs_epu8(p0_16x8, p1_16x8);
1236
15.9M
    temp2 = _mm_subs_epu8(p1_16x8, p0_16x8);
1237
15.9M
    temp1 = _mm_add_epi8(temp1, temp2);
1238
1239
15.9M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1240
15.9M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
1241
1242
15.9M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1243
15.9M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
1244
1245
15.9M
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
1246
1247
    // !((ABS(p0 - q0) < alpha) || (ABS(q1 - q0) < beta) || (ABS(p1 - p0) < beta))
1248
15.9M
    flag1_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
1249
1250
    // (ABS(p2 - p0) < beta)
1251
15.9M
    temp1 = _mm_subs_epu8(p0_16x8, p2_16x8);
1252
15.9M
    temp2 = _mm_subs_epu8(p2_16x8, p0_16x8);
1253
15.9M
    temp1 = _mm_add_epi8(temp1, temp2);
1254
1255
15.9M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1256
15.9M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
1257
15.9M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1258
15.9M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
1259
1260
15.9M
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
1261
15.9M
    flag2_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
1262
1263
15.9M
    temp2 = _mm_subs_epi16(zero, temp2);
1264
15.9M
    temp1 = _mm_subs_epi16(zero, temp1);
1265
1266
15.9M
    C_8x16 = _mm_add_epi16(C0_8x16, temp2);
1267
15.9M
    C_hi_8x16 = _mm_add_epi16(C0_hi_8x16, temp1);
1268
1269
    // (ABS(q2 - q0) < beta)
1270
15.9M
    temp1 = _mm_subs_epu8(q0_16x8, q2_16x8);
1271
15.9M
    temp2 = _mm_subs_epu8(q2_16x8, q0_16x8);
1272
15.9M
    temp1 = _mm_add_epi8(temp1, temp2);
1273
1274
15.9M
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1275
15.9M
    temp1 = _mm_unpackhi_epi8(temp1, zero);
1276
15.9M
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1277
15.9M
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
1278
1279
15.9M
    flag3_16x8 = _mm_packs_epi16(temp2, temp1);
1280
15.9M
    flag3_16x8 = _mm_and_si128(flag1_16x8, flag3_16x8);
1281
1282
15.9M
    temp2 = _mm_subs_epi16(zero, temp2);
1283
15.9M
    temp1 = _mm_subs_epi16(zero, temp1);
1284
1285
15.9M
    C_8x16 = _mm_add_epi16(C_8x16, temp2);
1286
15.9M
    C_hi_8x16 = _mm_add_epi16(C_hi_8x16, temp1);
1287
1288
15.9M
    const_val4_8x16 = _mm_set1_epi16(4);
1289
15.9M
    temp1 = _mm_subs_epi16(_mm_unpacklo_epi8(q0_16x8, zero),
1290
15.9M
                           _mm_unpacklo_epi8(p0_16x8, zero));
1291
15.9M
    temp2 = _mm_subs_epi16(_mm_unpacklo_epi8(p1_16x8, zero),
1292
15.9M
                           _mm_unpacklo_epi8(q1_16x8, zero));
1293
15.9M
    temp1 = _mm_slli_epi16(temp1, 2);
1294
15.9M
    temp1 = _mm_add_epi16(temp1, temp2);
1295
15.9M
    temp1 = _mm_add_epi16(temp1, const_val4_8x16);
1296
15.9M
    in_macro_16x8 = _mm_srai_epi16(temp1, 3);
1297
1298
15.9M
    temp1 = _mm_subs_epi16(_mm_unpackhi_epi8(q0_16x8, zero),
1299
15.9M
                           _mm_unpackhi_epi8(p0_16x8, zero));
1300
15.9M
    temp2 = _mm_subs_epi16(_mm_unpackhi_epi8(p1_16x8, zero),
1301
15.9M
                           _mm_unpackhi_epi8(q1_16x8, zero));
1302
15.9M
    temp1 = _mm_slli_epi16(temp1, 2);
1303
15.9M
    temp1 = _mm_add_epi16(temp1, temp2);
1304
15.9M
    temp1 = _mm_add_epi16(temp1, const_val4_8x16);
1305
15.9M
    in_macro_hi_16x8 = _mm_srai_epi16(temp1, 3);
1306
1307
15.9M
    in_macro_16x8 = _mm_min_epi16(C_8x16, in_macro_16x8); //CLIP3
1308
15.9M
    in_macro_hi_16x8 = _mm_min_epi16(C_hi_8x16, in_macro_hi_16x8); //CLIP3
1309
15.9M
    C_8x16 = _mm_subs_epi16(zero, C_8x16);
1310
15.9M
    C_hi_8x16 = _mm_subs_epi16(zero, C_hi_8x16);
1311
15.9M
    in_macro_16x8 = _mm_max_epi16(C_8x16, in_macro_16x8); //CLIP3
1312
15.9M
    in_macro_hi_16x8 = _mm_max_epi16(C_hi_8x16, in_macro_hi_16x8); //CLIP3
1313
1314
15.9M
    temp1 = _mm_add_epi16(_mm_unpacklo_epi8(p0_16x8, zero), in_macro_16x8);
1315
15.9M
    temp2 = _mm_add_epi16(_mm_unpackhi_epi8(p0_16x8, zero), in_macro_hi_16x8);
1316
1317
15.9M
    temp1 = _mm_packus_epi16(temp1, temp2);
1318
1319
15.9M
    temp1 = _mm_and_si128(temp1, flag1_16x8);
1320
15.9M
    temp2 = _mm_and_si128(p0_16x8,
1321
15.9M
                          _mm_xor_si128(flag1_16x8, _mm_set1_epi16(0xFFFF)));
1322
1323
15.9M
    temp1 = _mm_add_epi8(temp1, temp2);
1324
1325
15.9M
    _mm_storeu_si128((__m128i *)(pu1_HorzPixel + i16_posP0), temp1);
1326
1327
15.9M
    temp1 = _mm_sub_epi16(_mm_unpacklo_epi8(q0_16x8, zero), in_macro_16x8);
1328
15.9M
    temp2 = _mm_sub_epi16(_mm_unpackhi_epi8(q0_16x8, zero), in_macro_hi_16x8);
1329
1330
15.9M
    temp1 = _mm_packus_epi16(temp1, temp2);
1331
1332
15.9M
    temp1 = _mm_and_si128(temp1, flag1_16x8);
1333
15.9M
    temp2 = _mm_and_si128(q0_16x8,
1334
15.9M
                          _mm_xor_si128(flag1_16x8, _mm_set1_epi16(0xFFFF)));
1335
1336
15.9M
    temp1 = _mm_add_epi8(temp1, temp2);
1337
15.9M
    _mm_storeu_si128((__m128i *)(pu1_src), temp1);
1338
1339
    //if(Ap < Beta)
1340
15.9M
    temp1 = _mm_avg_epu16(_mm_unpacklo_epi8(q0_16x8, zero),
1341
15.9M
                          _mm_unpacklo_epi8(p0_16x8, zero));
1342
15.9M
    temp2 = _mm_slli_epi16(_mm_unpacklo_epi8(p1_16x8, zero), 1);
1343
    //temp2 = _mm_subs_epi16(zero,temp2);
1344
15.9M
    temp2 = _mm_subs_epi16(_mm_unpacklo_epi8(p2_16x8, zero), temp2);
1345
15.9M
    temp2 = _mm_add_epi16(temp1, temp2);
1346
15.9M
    in_macro_16x8 = _mm_srai_epi16(temp2, 1);
1347
1348
15.9M
    temp1 = _mm_avg_epu16(_mm_unpackhi_epi8(q0_16x8, zero),
1349
15.9M
                          _mm_unpackhi_epi8(p0_16x8, zero));
1350
15.9M
    temp2 = _mm_slli_epi16(_mm_unpackhi_epi8(p1_16x8, zero), 1);
1351
    //temp2 = _mm_subs_epi16(zero,temp2);
1352
15.9M
    temp2 = _mm_subs_epi16(_mm_unpackhi_epi8(p2_16x8, zero), temp2);
1353
15.9M
    temp2 = _mm_add_epi16(temp1, temp2);
1354
15.9M
    in_macro_hi_16x8 = _mm_srai_epi16(temp2, 1);
1355
1356
15.9M
    in_macro_16x8 = _mm_min_epi16(C0_8x16, in_macro_16x8); //CLIP3
1357
15.9M
    in_macro_hi_16x8 = _mm_min_epi16(C0_hi_8x16, in_macro_hi_16x8); //CLIP3
1358
15.9M
    C0_8x16 = _mm_subs_epi16(zero, C0_8x16);
1359
15.9M
    C0_hi_8x16 = _mm_subs_epi16(zero, C0_hi_8x16);
1360
15.9M
    in_macro_16x8 = _mm_max_epi16(C0_8x16, in_macro_16x8); //CLIP3
1361
15.9M
    in_macro_hi_16x8 = _mm_max_epi16(C0_hi_8x16, in_macro_hi_16x8); //CLIP3
1362
1363
15.9M
    temp1 = _mm_add_epi16(_mm_unpacklo_epi8(p1_16x8, zero), in_macro_16x8);
1364
15.9M
    temp2 = _mm_add_epi16(_mm_unpackhi_epi8(p1_16x8, zero), in_macro_hi_16x8);
1365
1366
15.9M
    temp1 = _mm_packus_epi16(temp1, temp2);
1367
1368
15.9M
    temp1 = _mm_and_si128(temp1, flag2_16x8);
1369
15.9M
    temp2 = _mm_and_si128(p1_16x8,
1370
15.9M
                          _mm_xor_si128(flag2_16x8, _mm_set1_epi16(0xFFFF)));
1371
15.9M
    temp1 = _mm_add_epi8(temp1, temp2);
1372
15.9M
    _mm_storeu_si128((__m128i *)(pu1_HorzPixel + i16_posP1), temp1);
1373
1374
    //if(Aq < Beta)
1375
15.9M
    temp1 = _mm_avg_epu16(_mm_unpacklo_epi8(q0_16x8, zero),
1376
15.9M
                          _mm_unpacklo_epi8(p0_16x8, zero));
1377
15.9M
    temp2 = _mm_slli_epi16(_mm_unpacklo_epi8(q1_16x8, zero), 1);
1378
    //temp2 = _mm_slli_epi16 (temp2, 1);
1379
15.9M
    temp2 = _mm_subs_epi16(_mm_unpacklo_epi8(q2_16x8, zero), temp2);
1380
15.9M
    temp2 = _mm_add_epi16(temp1, temp2);
1381
15.9M
    in_macro_16x8 = _mm_srai_epi16(temp2, 1);
1382
1383
15.9M
    temp1 = _mm_avg_epu16(_mm_unpackhi_epi8(q0_16x8, zero),
1384
15.9M
                          _mm_unpackhi_epi8(p0_16x8, zero));
1385
15.9M
    temp2 = _mm_slli_epi16(_mm_unpackhi_epi8(q1_16x8, zero), 1);
1386
    //temp2 = _mm_slli_epi16 (temp2, 1);
1387
15.9M
    temp2 = _mm_subs_epi16(_mm_unpackhi_epi8(q2_16x8, zero), temp2);
1388
15.9M
    temp2 = _mm_add_epi16(temp1, temp2);
1389
15.9M
    in_macro_hi_16x8 = _mm_srai_epi16(temp2, 1);
1390
1391
15.9M
    in_macro_16x8 = _mm_max_epi16(C0_8x16, in_macro_16x8); //CLIP3
1392
15.9M
    in_macro_hi_16x8 = _mm_max_epi16(C0_hi_8x16, in_macro_hi_16x8); //CLIP3
1393
15.9M
    C0_8x16 = _mm_subs_epi16(zero, C0_8x16);
1394
15.9M
    C0_hi_8x16 = _mm_subs_epi16(zero, C0_hi_8x16);
1395
15.9M
    in_macro_16x8 = _mm_min_epi16(C0_8x16, in_macro_16x8); //CLIP3
1396
15.9M
    in_macro_hi_16x8 = _mm_min_epi16(C0_hi_8x16, in_macro_hi_16x8); //CLIP3
1397
1398
15.9M
    temp1 = _mm_add_epi16(_mm_unpacklo_epi8(q1_16x8, zero), in_macro_16x8);
1399
15.9M
    temp2 = _mm_add_epi16(_mm_unpackhi_epi8(q1_16x8, zero), in_macro_hi_16x8);
1400
1401
15.9M
    temp1 = _mm_packus_epi16(temp1, temp2);
1402
1403
15.9M
    temp1 = _mm_and_si128(temp1, flag3_16x8);
1404
15.9M
    temp2 = _mm_and_si128(q1_16x8,
1405
15.9M
                          _mm_xor_si128(flag3_16x8, _mm_set1_epi16(0xFFFF)));
1406
15.9M
    temp1 = _mm_add_epi8(temp1, temp2);
1407
1408
15.9M
    _mm_storeu_si128((__m128i *)(pu1_src + i16_posQ1), temp1);
1409
1410
15.9M
}
1411
1412
/*****************************************************************************/
1413
/*                                                                           */
1414
/*  Function Name : ih264_deblk_luma_vert_bs4_mbaff_ssse3()                  */
1415
/*                                                                           */
1416
/*  Description   : This function performs filtering of a luma block         */
1417
/*                  vertical edge when boundary strength is set to 4.        */
1418
/*                                                                           */
1419
/*  Inputs        : pu1_src       - pointer to the src sample q0             */
1420
/*                  src_strd      - source stride                            */
1421
/*                  alpha         - alpha value for the boundary             */
1422
/*                  beta          - beta value for the boundary              */
1423
/*                                                                           */
1424
/*  Globals       : None                                                     */
1425
/*                                                                           */
1426
/*  Processing    : When the function is called twice, this operation is as  */
1427
/*                  described in Sec. 8.7.2.3 under the title "Filtering     */
1428
/*                  process for edges for bS equal to 4" in ITU T Rec H.264. */
1429
/*                                                                           */
1430
/*  Outputs       : None                                                     */
1431
/*                                                                           */
1432
/*  Returns       : None                                                     */
1433
/*                                                                           */
1434
/*  Issues        : None                                                     */
1435
/*                                                                           */
1436
/*  Revision History:                                                        */
1437
/*                                                                           */
1438
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1439
/*         12 02 2015   Naveen Kumar P  Initial version                      */
1440
/*                                                                           */
1441
/*****************************************************************************/
1442
void ih264_deblk_luma_vert_bs4_mbaff_ssse3(UWORD8 *pu1_src,
1443
                                           WORD32 src_strd,
1444
                                           WORD32 alpha,
1445
                                           WORD32 beta)
1446
23.5k
{
1447
23.5k
    __m128i zero = _mm_setzero_si128();
1448
23.5k
    __m128i q0_16x8, q1_16x8, q2_16x8, q3_16x8;
1449
23.5k
    __m128i p0_16x8, p1_16x8, p2_16x8, p3_16x8;
1450
23.5k
    __m128i q0_8x16, q1_8x16, q2_8x16, q3_8x16;
1451
23.5k
    __m128i p0_8x16, p1_8x16, p2_8x16, p3_8x16;
1452
23.5k
    __m128i q0_16x8_1;
1453
23.5k
    __m128i p0_16x8_1;
1454
23.5k
    __m128i q0_16x8_2, q1_16x8_2, q2_16x8_2;
1455
23.5k
    __m128i p0_16x8_2, p1_16x8_2, p2_16x8_2;
1456
23.5k
    __m128i temp1, temp2, temp3, temp4, temp5, temp6;
1457
23.5k
    __m128i Alpha_8x16, Beta_8x16;
1458
23.5k
    __m128i flag1_16x8, flag2_16x8, flag3_16x8, flag4_16x8;
1459
23.5k
    __m128i const_val2_16x8 = _mm_set1_epi16(2);
1460
23.5k
    __m128i line1, line2, line3, line4, line5, line6, line7, line8;
1461
1462
23.5k
    Alpha_8x16 = _mm_set1_epi16(alpha);
1463
23.5k
    Beta_8x16 = _mm_set1_epi16(beta);
1464
1465
23.5k
    line1 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 0 * src_strd));
1466
23.5k
    line2 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 1 * src_strd));
1467
23.5k
    line3 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 2 * src_strd));
1468
23.5k
    line4 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 3 * src_strd));
1469
23.5k
    line5 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 4 * src_strd));
1470
23.5k
    line6 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 5 * src_strd));
1471
23.5k
    line7 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 6 * src_strd));
1472
23.5k
    line8 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 7 * src_strd));
1473
1474
23.5k
    temp1 = _mm_unpacklo_epi8(line1, line2);
1475
23.5k
    temp2 = _mm_unpacklo_epi8(line3, line4);
1476
23.5k
    temp3 = _mm_unpacklo_epi8(line5, line6);
1477
23.5k
    temp4 = _mm_unpacklo_epi8(line7, line8);
1478
1479
23.5k
    line1 = _mm_unpacklo_epi16(temp1, temp2);
1480
23.5k
    line2 = _mm_unpackhi_epi16(temp1, temp2);
1481
23.5k
    line3 = _mm_unpacklo_epi16(temp3, temp4);
1482
23.5k
    line4 = _mm_unpackhi_epi16(temp3, temp4);
1483
1484
23.5k
    p1_8x16 = _mm_unpacklo_epi32(line1, line3);
1485
23.5k
    p0_8x16 = _mm_unpackhi_epi32(line1, line3);
1486
23.5k
    q0_8x16 = _mm_unpacklo_epi32(line2, line4);
1487
23.5k
    q1_8x16 = _mm_unpackhi_epi32(line2, line4);
1488
1489
23.5k
    p3_16x8 = _mm_unpacklo_epi64(p1_8x16, zero);
1490
23.5k
    p2_16x8 = _mm_unpackhi_epi64(p1_8x16, zero);
1491
23.5k
    q2_16x8 = _mm_unpacklo_epi64(q1_8x16, zero);
1492
23.5k
    q3_16x8 = _mm_unpackhi_epi64(q1_8x16, zero);
1493
23.5k
    p1_16x8 = _mm_unpacklo_epi64(p0_8x16, zero);
1494
23.5k
    p0_16x8 = _mm_unpackhi_epi64(p0_8x16, zero);
1495
23.5k
    q0_16x8 = _mm_unpacklo_epi64(q0_8x16, zero);
1496
23.5k
    q1_16x8 = _mm_unpackhi_epi64(q0_8x16, zero);
1497
1498
    //Cond1 (ABS(p0 - q0) < alpha)
1499
23.5k
    temp1 = _mm_subs_epu8(q0_16x8, p0_16x8);
1500
23.5k
    temp2 = _mm_subs_epu8(p0_16x8, q0_16x8);
1501
23.5k
    temp1 = _mm_add_epi8(temp1, temp2);
1502
1503
23.5k
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1504
23.5k
    temp1 = _mm_unpackhi_epi8(temp1, zero);
1505
1506
23.5k
    temp2 = _mm_cmpgt_epi16(Alpha_8x16, temp2);
1507
23.5k
    temp1 = _mm_cmpgt_epi16(Alpha_8x16, temp1);
1508
1509
23.5k
    flag1_16x8 = _mm_packs_epi16(temp2, temp1);
1510
1511
    //Cond2 (ABS(q1 - q0) < beta)
1512
23.5k
    temp1 = _mm_subs_epu8(q0_16x8, q1_16x8);
1513
23.5k
    temp2 = _mm_subs_epu8(q1_16x8, q0_16x8);
1514
23.5k
    temp1 = _mm_add_epi8(temp1, temp2);
1515
1516
23.5k
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1517
23.5k
    temp1 = _mm_unpackhi_epi8(temp1, zero);
1518
1519
23.5k
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1520
23.5k
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
1521
1522
23.5k
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
1523
1524
23.5k
    flag1_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
1525
1526
    //Cond3 (ABS(p1 - p0) < beta)
1527
23.5k
    temp1 = _mm_subs_epu8(p0_16x8, p1_16x8);
1528
23.5k
    temp2 = _mm_subs_epu8(p1_16x8, p0_16x8);
1529
23.5k
    temp1 = _mm_add_epi8(temp1, temp2);
1530
1531
23.5k
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1532
23.5k
    temp1 = _mm_unpackhi_epi8(temp1, zero);
1533
1534
23.5k
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1535
23.5k
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
1536
1537
23.5k
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
1538
1539
    // !((ABS(p0 - q0) < alpha) || (ABS(q1 - q0) < beta) || (ABS(p1 - p0) < beta))
1540
23.5k
    flag1_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
1541
1542
    // (ABS(p0 - q0) < ((alpha >> 2) + 2))
1543
23.5k
    temp1 = _mm_subs_epu8(p0_16x8, q0_16x8);
1544
23.5k
    temp2 = _mm_subs_epu8(q0_16x8, p0_16x8);
1545
23.5k
    temp1 = _mm_add_epi8(temp1, temp2);
1546
23.5k
    Alpha_8x16 = _mm_srai_epi16(Alpha_8x16, 2);
1547
23.5k
    Alpha_8x16 = _mm_add_epi16(Alpha_8x16, const_val2_16x8);
1548
1549
23.5k
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1550
23.5k
    temp1 = _mm_unpackhi_epi8(temp1, zero);
1551
23.5k
    temp2 = _mm_cmpgt_epi16(Alpha_8x16, temp2);
1552
23.5k
    temp1 = _mm_cmpgt_epi16(Alpha_8x16, temp1);
1553
1554
23.5k
    flag2_16x8 = _mm_packs_epi16(temp2, temp1);
1555
23.5k
    flag2_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
1556
1557
    // (ABS(p2 - p0) < beta)
1558
23.5k
    temp1 = _mm_subs_epu8(p0_16x8, p2_16x8);
1559
23.5k
    temp2 = _mm_subs_epu8(p2_16x8, p0_16x8);
1560
23.5k
    temp1 = _mm_add_epi8(temp1, temp2);
1561
1562
23.5k
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1563
23.5k
    temp1 = _mm_unpackhi_epi8(temp1, zero);
1564
23.5k
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1565
23.5k
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
1566
1567
23.5k
    flag3_16x8 = _mm_packs_epi16(temp2, temp1);
1568
23.5k
    flag3_16x8 = _mm_and_si128(flag3_16x8, flag2_16x8);
1569
1570
    // (ABS(q2 - q0) < beta)
1571
23.5k
    temp1 = _mm_subs_epu8(q0_16x8, q2_16x8);
1572
23.5k
    temp2 = _mm_subs_epu8(q2_16x8, q0_16x8);
1573
23.5k
    temp1 = _mm_add_epi8(temp1, temp2);
1574
1575
23.5k
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1576
23.5k
    temp1 = _mm_unpackhi_epi8(temp1, zero);
1577
23.5k
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1578
23.5k
    temp1 = _mm_cmpgt_epi16(Beta_8x16, temp1);
1579
1580
23.5k
    flag4_16x8 = _mm_packs_epi16(temp2, temp1);
1581
23.5k
    flag4_16x8 = _mm_and_si128(flag4_16x8, flag2_16x8);
1582
1583
    // First 8 pixels
1584
23.5k
    p3_8x16 = _mm_unpacklo_epi8(p3_16x8, zero);
1585
23.5k
    p2_8x16 = _mm_unpacklo_epi8(p2_16x8, zero);
1586
23.5k
    p1_8x16 = _mm_unpacklo_epi8(p1_16x8, zero);
1587
23.5k
    p0_8x16 = _mm_unpacklo_epi8(p0_16x8, zero);
1588
23.5k
    q0_8x16 = _mm_unpacklo_epi8(q0_16x8, zero);
1589
23.5k
    q1_8x16 = _mm_unpacklo_epi8(q1_16x8, zero);
1590
23.5k
    q2_8x16 = _mm_unpacklo_epi8(q2_16x8, zero);
1591
23.5k
    q3_8x16 = _mm_unpacklo_epi8(q3_16x8, zero);
1592
1593
    // p0_1 and q0_1
1594
23.5k
    temp1 = _mm_add_epi16(p0_8x16, q1_8x16);
1595
23.5k
    temp2 = _mm_add_epi16(p1_8x16, q0_8x16);
1596
23.5k
    temp5 = _mm_add_epi16(temp1, const_val2_16x8);
1597
23.5k
    temp6 = _mm_add_epi16(temp2, const_val2_16x8);
1598
23.5k
    temp3 = _mm_slli_epi16(p1_8x16, 1);
1599
23.5k
    temp4 = _mm_slli_epi16(q1_8x16, 1);
1600
23.5k
    temp1 = _mm_add_epi16(temp5, temp3);
1601
23.5k
    temp2 = _mm_add_epi16(temp6, temp4);
1602
23.5k
    p0_16x8_1 = _mm_srai_epi16(temp1, 2);
1603
23.5k
    q0_16x8_1 = _mm_srai_epi16(temp2, 2);
1604
1605
    // p1_2 and q1_2
1606
23.5k
    temp6 = _mm_add_epi16(temp6, p0_8x16);
1607
23.5k
    temp5 = _mm_add_epi16(temp5, q0_8x16);
1608
23.5k
    temp1 = _mm_add_epi16(temp6, p2_8x16);
1609
23.5k
    temp2 = _mm_add_epi16(temp5, q2_8x16);
1610
23.5k
    p1_16x8_2 = _mm_srai_epi16(temp1, 2);
1611
23.5k
    q1_16x8_2 = _mm_srai_epi16(temp2, 2);
1612
1613
    // p0_2 and q0_2
1614
23.5k
    temp1 = _mm_add_epi16(temp3, p2_8x16);
1615
23.5k
    temp2 = _mm_add_epi16(temp4, q2_8x16);
1616
23.5k
    temp1 = _mm_add_epi16(temp1, q1_8x16);
1617
23.5k
    temp2 = _mm_add_epi16(temp2, p1_8x16);
1618
23.5k
    temp3 = _mm_add_epi16(p0_8x16, q0_8x16);
1619
23.5k
    temp3 = _mm_slli_epi16(temp3, 1);
1620
23.5k
    temp1 = _mm_add_epi16(temp1, temp3);
1621
23.5k
    temp2 = _mm_add_epi16(temp2, temp3);
1622
23.5k
    temp1 = _mm_add_epi16(temp1, _mm_set1_epi16(4));
1623
23.5k
    temp2 = _mm_add_epi16(temp2, _mm_set1_epi16(4));
1624
23.5k
    p0_16x8_2 = _mm_srai_epi16(temp1, 3);
1625
23.5k
    q0_16x8_2 = _mm_srai_epi16(temp2, 3);
1626
1627
    // p2_2 and q2_2
1628
23.5k
    temp1 = _mm_add_epi16(temp6, const_val2_16x8);
1629
23.5k
    temp2 = _mm_add_epi16(temp5, const_val2_16x8);
1630
23.5k
    temp3 = _mm_slli_epi16(p2_8x16, 1);
1631
23.5k
    temp4 = _mm_slli_epi16(q2_8x16, 1);
1632
23.5k
    temp3 = _mm_add_epi16(p2_8x16, temp3);
1633
23.5k
    temp4 = _mm_add_epi16(q2_8x16, temp4);
1634
23.5k
    temp5 = _mm_slli_epi16(p3_8x16, 1);
1635
23.5k
    temp6 = _mm_slli_epi16(q3_8x16, 1);
1636
23.5k
    temp1 = _mm_add_epi16(temp1, temp3);
1637
23.5k
    temp2 = _mm_add_epi16(temp2, temp4);
1638
23.5k
    temp1 = _mm_add_epi16(temp1, temp5);
1639
23.5k
    temp2 = _mm_add_epi16(temp2, temp6);
1640
23.5k
    p2_16x8_2 = _mm_srai_epi16(temp1, 3);
1641
23.5k
    q2_16x8_2 = _mm_srai_epi16(temp2, 3);
1642
1643
    // p0_1 and q0_1
1644
23.5k
    p0_16x8_1 = _mm_packus_epi16(p0_16x8_1, zero);
1645
23.5k
    q0_16x8_1 = _mm_packus_epi16(q0_16x8_1, zero);
1646
1647
    // p1_2 and q1_2
1648
23.5k
    p1_16x8_2 = _mm_packus_epi16(p1_16x8_2, zero);
1649
23.5k
    q1_16x8_2 = _mm_packus_epi16(q1_16x8_2, zero);
1650
1651
    // p0_2 and q0_2
1652
23.5k
    p0_16x8_2 = _mm_packus_epi16(p0_16x8_2, zero);
1653
23.5k
    q0_16x8_2 = _mm_packus_epi16(q0_16x8_2, zero);
1654
1655
    // p2_2 and q2_2
1656
23.5k
    p2_16x8_2 = _mm_packus_epi16(p2_16x8_2, zero);
1657
23.5k
    q2_16x8_2 = _mm_packus_epi16(q2_16x8_2, zero);
1658
1659
    // p0 and q0
1660
23.5k
    p0_16x8 = _mm_and_si128(p0_16x8,
1661
23.5k
                            _mm_xor_si128(flag1_16x8, _mm_set1_epi8(0xFF)));
1662
23.5k
    p0_16x8_1 = _mm_and_si128(p0_16x8_1, flag1_16x8);
1663
23.5k
    p0_16x8 = _mm_add_epi8(p0_16x8, p0_16x8_1);
1664
23.5k
    q0_16x8 = _mm_and_si128(q0_16x8,
1665
23.5k
                            _mm_xor_si128(flag1_16x8, _mm_set1_epi8(0xFF)));
1666
23.5k
    q0_16x8_1 = _mm_and_si128(q0_16x8_1, flag1_16x8);
1667
23.5k
    q0_16x8 = _mm_add_epi8(q0_16x8, q0_16x8_1);
1668
1669
    // p0 and q0
1670
23.5k
    p0_16x8 = _mm_and_si128(p0_16x8,
1671
23.5k
                            _mm_xor_si128(flag3_16x8, _mm_set1_epi8(0xFF)));
1672
23.5k
    p0_16x8_2 = _mm_and_si128(p0_16x8_2, flag3_16x8);
1673
23.5k
    p0_16x8 = _mm_add_epi8(p0_16x8, p0_16x8_2);
1674
23.5k
    q0_16x8 = _mm_and_si128(q0_16x8,
1675
23.5k
                            _mm_xor_si128(flag4_16x8, _mm_set1_epi8(0xFF)));
1676
23.5k
    q0_16x8_2 = _mm_and_si128(q0_16x8_2, flag4_16x8);
1677
23.5k
    q0_16x8 = _mm_add_epi8(q0_16x8, q0_16x8_2);
1678
1679
    // p1 and q1
1680
23.5k
    p1_16x8 = _mm_and_si128(p1_16x8,
1681
23.5k
                            _mm_xor_si128(flag3_16x8, _mm_set1_epi8(0xFF)));
1682
23.5k
    p1_16x8_2 = _mm_and_si128(p1_16x8_2, flag3_16x8);
1683
23.5k
    p1_16x8 = _mm_add_epi8(p1_16x8, p1_16x8_2);
1684
23.5k
    q1_16x8 = _mm_and_si128(q1_16x8,
1685
23.5k
                            _mm_xor_si128(flag4_16x8, _mm_set1_epi8(0xFF)));
1686
23.5k
    q1_16x8_2 = _mm_and_si128(q1_16x8_2, flag4_16x8);
1687
23.5k
    q1_16x8 = _mm_add_epi8(q1_16x8, q1_16x8_2);
1688
1689
    // p2 and q2
1690
23.5k
    p2_16x8 = _mm_and_si128(p2_16x8,
1691
23.5k
                            _mm_xor_si128(flag3_16x8, _mm_set1_epi8(0xFF)));
1692
23.5k
    p2_16x8_2 = _mm_and_si128(p2_16x8_2, flag3_16x8);
1693
23.5k
    p2_16x8 = _mm_add_epi8(p2_16x8, p2_16x8_2);
1694
23.5k
    q2_16x8 = _mm_and_si128(q2_16x8,
1695
23.5k
                            _mm_xor_si128(flag4_16x8, _mm_set1_epi8(0xFF)));
1696
23.5k
    q2_16x8_2 = _mm_and_si128(q2_16x8_2, flag4_16x8);
1697
23.5k
    q2_16x8 = _mm_add_epi8(q2_16x8, q2_16x8_2);
1698
1699
23.5k
    temp1 = _mm_unpacklo_epi8(p3_16x8, p2_16x8);
1700
23.5k
    temp2 = _mm_unpacklo_epi8(p1_16x8, p0_16x8);
1701
23.5k
    temp3 = _mm_unpacklo_epi8(q0_16x8, q1_16x8);
1702
23.5k
    temp4 = _mm_unpacklo_epi8(q2_16x8, q3_16x8);
1703
1704
23.5k
    p3_8x16 = _mm_unpacklo_epi16(temp1, temp2);
1705
23.5k
    p2_8x16 = _mm_unpackhi_epi16(temp1, temp2);
1706
23.5k
    q2_8x16 = _mm_unpacklo_epi16(temp3, temp4);
1707
23.5k
    q3_8x16 = _mm_unpackhi_epi16(temp3, temp4);
1708
1709
23.5k
    line1 = _mm_unpacklo_epi32(p3_8x16, q2_8x16);
1710
23.5k
    line2 = _mm_srli_si128(line1, 8);
1711
23.5k
    line3 = _mm_unpackhi_epi32(p3_8x16, q2_8x16);
1712
23.5k
    line4 = _mm_srli_si128(line3, 8);
1713
23.5k
    line5 = _mm_unpacklo_epi32(p2_8x16, q3_8x16);
1714
23.5k
    line6 = _mm_srli_si128(line5, 8);
1715
23.5k
    line7 = _mm_unpackhi_epi32(p2_8x16, q3_8x16);
1716
23.5k
    line8 = _mm_srli_si128(line7, 8);
1717
1718
23.5k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 0 * src_strd), line1);
1719
23.5k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 1 * src_strd), line2);
1720
23.5k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 2 * src_strd), line3);
1721
23.5k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 3 * src_strd), line4);
1722
23.5k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 4 * src_strd), line5);
1723
23.5k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 5 * src_strd), line6);
1724
23.5k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 6 * src_strd), line7);
1725
23.5k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 7 * src_strd), line8);
1726
1727
23.5k
}
1728
1729
/*****************************************************************************/
1730
/*                                                                           */
1731
/*  Function Name : ih264_deblk_luma_vert_bslt4_mbaff_ssse3()                */
1732
/*                                                                           */
1733
/*  Description   : This function performs filtering of a luma block         */
1734
/*                  vertical edge when boundary strength is less than 4.     */
1735
/*                                                                           */
1736
/*  Inputs        : pu1_src       - pointer to the src sample q0             */
1737
/*                  src_strd      - source stride                            */
1738
/*                  alpha         - alpha value for the boundary             */
1739
/*                  beta          - beta value for the boundary              */
1740
/*                  u4_bs         - packed Boundary strength array           */
1741
/*                  pu1_cliptab   - tc0_table                                */
1742
/*                                                                           */
1743
/*  Globals       : None                                                     */
1744
/*                                                                           */
1745
/*  Processing    : When the function is called twice, this operation is as  */
1746
/*                  described in Sec. 8.7.2.3 under the title "Filtering     */
1747
/*                  process for edges for bS less than 4" in ITU T Rec H.264.*/
1748
/*                                                                           */
1749
/*  Outputs       : None                                                     */
1750
/*                                                                           */
1751
/*  Returns       : None                                                     */
1752
/*                                                                           */
1753
/*  Issues        : None                                                     */
1754
/*                                                                           */
1755
/*  Revision History:                                                        */
1756
/*                                                                           */
1757
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
1758
/*         12 02 2015   Naveen Kumar P  Initial version                      */
1759
/*                                                                           */
1760
/*****************************************************************************/
1761
void ih264_deblk_luma_vert_bslt4_mbaff_ssse3(UWORD8 *pu1_src,
1762
                                             WORD32 src_strd,
1763
                                             WORD32 alpha,
1764
                                             WORD32 beta,
1765
                                             UWORD32 u4_bs,
1766
                                             const UWORD8 *pu1_cliptab)
1767
2.35k
{
1768
2.35k
    __m128i zero = _mm_setzero_si128();
1769
2.35k
    __m128i bs_flag_16x8b, C0_16x8, C0_8x16, C_8x16;
1770
2.35k
    __m128i q0_16x8, q1_16x8, q2_16x8, q3_16x8;
1771
2.35k
    __m128i p0_16x8, p1_16x8, p2_16x8, p3_16x8;
1772
2.35k
    __m128i temp1, temp2, temp3, temp4;
1773
2.35k
    __m128i Alpha_8x16, Beta_8x16, flag1_16x8, flag2_16x8, flag3_16x8;
1774
2.35k
    __m128i in_macro_16x8;
1775
2.35k
    __m128i const_val4_8x16;
1776
2.35k
    UWORD8 u1_Bs0, u1_Bs1, u1_Bs2, u1_Bs3;
1777
2.35k
    UWORD8 clip0, clip1, clip2, clip3;
1778
2.35k
    __m128i line1, line2, line3, line4, line5, line6, line7, line8;
1779
2.35k
    __m128i q0_16x8_1, q1_16x8_1, q0_16x8_2;
1780
2.35k
    __m128i p0_16x8_1, p1_16x8_1, p0_16x8_2;
1781
1782
2.35k
    line1 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 0 * src_strd));
1783
2.35k
    line2 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 1 * src_strd));
1784
2.35k
    line3 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 2 * src_strd));
1785
2.35k
    line4 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 3 * src_strd));
1786
2.35k
    line5 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 4 * src_strd));
1787
2.35k
    line6 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 5 * src_strd));
1788
2.35k
    line7 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 6 * src_strd));
1789
2.35k
    line8 = _mm_loadl_epi64((__m128i *)(pu1_src - 4 + 7 * src_strd));
1790
1791
2.35k
    temp1 = _mm_unpacklo_epi8(line1, line2);
1792
2.35k
    temp2 = _mm_unpacklo_epi8(line3, line4);
1793
2.35k
    temp3 = _mm_unpacklo_epi8(line5, line6);
1794
2.35k
    temp4 = _mm_unpacklo_epi8(line7, line8);
1795
1796
2.35k
    line1 = _mm_unpacklo_epi16(temp1, temp2);
1797
2.35k
    line2 = _mm_unpackhi_epi16(temp1, temp2);
1798
2.35k
    line3 = _mm_unpacklo_epi16(temp3, temp4);
1799
2.35k
    line4 = _mm_unpackhi_epi16(temp3, temp4);
1800
1801
2.35k
    temp1 = _mm_unpacklo_epi32(line1, line3);
1802
2.35k
    temp2 = _mm_unpackhi_epi32(line1, line3);
1803
2.35k
    temp3 = _mm_unpacklo_epi32(line2, line4);
1804
2.35k
    temp4 = _mm_unpackhi_epi32(line2, line4);
1805
1806
2.35k
    p3_16x8 = _mm_unpacklo_epi64(temp1, zero);
1807
2.35k
    p2_16x8 = _mm_unpackhi_epi64(temp1, zero);
1808
2.35k
    q2_16x8 = _mm_unpacklo_epi64(temp4, zero);
1809
2.35k
    q3_16x8 = _mm_unpackhi_epi64(temp4, zero);
1810
2.35k
    p1_16x8 = _mm_unpacklo_epi64(temp2, zero);
1811
2.35k
    p0_16x8 = _mm_unpackhi_epi64(temp2, zero);
1812
2.35k
    q0_16x8 = _mm_unpacklo_epi64(temp3, zero);
1813
2.35k
    q1_16x8 = _mm_unpackhi_epi64(temp3, zero);
1814
1815
2.35k
    u1_Bs0 = (u4_bs >> 24) & 0xff;
1816
2.35k
    u1_Bs1 = (u4_bs >> 16) & 0xff;
1817
2.35k
    u1_Bs2 = (u4_bs >> 8) & 0xff;
1818
2.35k
    u1_Bs3 = (u4_bs >> 0) & 0xff;
1819
2.35k
    clip0 = pu1_cliptab[u1_Bs0];
1820
2.35k
    clip1 = pu1_cliptab[u1_Bs1];
1821
2.35k
    clip2 = pu1_cliptab[u1_Bs2];
1822
2.35k
    clip3 = pu1_cliptab[u1_Bs3];
1823
1824
2.35k
    Alpha_8x16 = _mm_set1_epi16(alpha);
1825
2.35k
    Beta_8x16 = _mm_set1_epi16(beta);
1826
1827
2.35k
    bs_flag_16x8b = _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, u1_Bs3, u1_Bs3, u1_Bs2,
1828
2.35k
                                 u1_Bs2, u1_Bs1, u1_Bs1, u1_Bs0, u1_Bs0);
1829
1830
2.35k
    C0_16x8 = _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, clip3, clip3, clip2, clip2,
1831
2.35k
                           clip1, clip1, clip0, clip0);
1832
1833
2.35k
    bs_flag_16x8b = _mm_cmpeq_epi8(bs_flag_16x8b, zero);
1834
2.35k
    bs_flag_16x8b = _mm_xor_si128(bs_flag_16x8b, _mm_set1_epi8(0xFF)); //Invert for required mask
1835
2.35k
    C0_8x16 = _mm_unpacklo_epi8(C0_16x8, zero);
1836
1837
    //Cond1 (ABS(p0 - q0) < alpha)
1838
2.35k
    temp1 = _mm_subs_epu8(q0_16x8, p0_16x8);
1839
2.35k
    temp2 = _mm_subs_epu8(p0_16x8, q0_16x8);
1840
2.35k
    temp1 = _mm_add_epi8(temp1, temp2);
1841
1842
2.35k
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1843
2.35k
    temp2 = _mm_cmpgt_epi16(Alpha_8x16, temp2);
1844
1845
2.35k
    flag1_16x8 = _mm_packs_epi16(temp2, zero);
1846
2.35k
    flag1_16x8 = _mm_and_si128(flag1_16x8, bs_flag_16x8b);
1847
1848
    //Cond2 (ABS(q1 - q0) < beta)
1849
2.35k
    temp1 = _mm_subs_epu8(q0_16x8, q1_16x8);
1850
2.35k
    temp2 = _mm_subs_epu8(q1_16x8, q0_16x8);
1851
2.35k
    temp1 = _mm_add_epi8(temp1, temp2);
1852
1853
2.35k
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1854
2.35k
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1855
1856
2.35k
    flag2_16x8 = _mm_packs_epi16(temp2, zero);
1857
2.35k
    flag1_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
1858
1859
    //Cond3 (ABS(p1 - p0) < beta)
1860
2.35k
    temp1 = _mm_subs_epu8(p0_16x8, p1_16x8);
1861
2.35k
    temp2 = _mm_subs_epu8(p1_16x8, p0_16x8);
1862
2.35k
    temp1 = _mm_add_epi8(temp1, temp2);
1863
1864
2.35k
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1865
2.35k
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1866
1867
2.35k
    flag2_16x8 = _mm_packs_epi16(temp2, zero);
1868
1869
    // !((ABS(p0 - q0) < alpha) || (ABS(q1 - q0) < beta) || (ABS(p1 - p0) < beta))
1870
2.35k
    flag1_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
1871
1872
    // (ABS(p2 - p0) < beta)
1873
2.35k
    temp1 = _mm_subs_epu8(p0_16x8, p2_16x8);
1874
2.35k
    temp2 = _mm_subs_epu8(p2_16x8, p0_16x8);
1875
2.35k
    temp1 = _mm_add_epi8(temp1, temp2);
1876
1877
2.35k
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1878
2.35k
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1879
1880
2.35k
    flag2_16x8 = _mm_packs_epi16(temp2, zero);
1881
2.35k
    flag2_16x8 = _mm_and_si128(flag1_16x8, flag2_16x8);
1882
1883
2.35k
    temp2 = _mm_subs_epi16(zero, temp2);
1884
1885
2.35k
    C_8x16 = _mm_add_epi16(C0_8x16, temp2);
1886
1887
    // (ABS(q2 - q0) < beta)
1888
2.35k
    temp1 = _mm_subs_epu8(q0_16x8, q2_16x8);
1889
2.35k
    temp2 = _mm_subs_epu8(q2_16x8, q0_16x8);
1890
2.35k
    temp1 = _mm_add_epi8(temp1, temp2);
1891
1892
2.35k
    temp2 = _mm_unpacklo_epi8(temp1, zero);
1893
2.35k
    temp2 = _mm_cmpgt_epi16(Beta_8x16, temp2);
1894
1895
2.35k
    flag3_16x8 = _mm_packs_epi16(temp2, zero);
1896
2.35k
    flag3_16x8 = _mm_and_si128(flag1_16x8, flag3_16x8);
1897
1898
2.35k
    temp2 = _mm_subs_epi16(zero, temp2);
1899
1900
2.35k
    C_8x16 = _mm_add_epi16(C_8x16, temp2);
1901
1902
2.35k
    const_val4_8x16 = _mm_set1_epi16(4);
1903
2.35k
    temp1 = _mm_subs_epi16(_mm_unpacklo_epi8(q0_16x8, zero),
1904
2.35k
                           _mm_unpacklo_epi8(p0_16x8, zero));
1905
2.35k
    temp2 = _mm_subs_epi16(_mm_unpacklo_epi8(p1_16x8, zero),
1906
2.35k
                           _mm_unpacklo_epi8(q1_16x8, zero));
1907
2.35k
    temp1 = _mm_slli_epi16(temp1, 2);
1908
2.35k
    temp1 = _mm_add_epi16(temp1, temp2);
1909
2.35k
    temp1 = _mm_add_epi16(temp1, const_val4_8x16);
1910
2.35k
    in_macro_16x8 = _mm_srai_epi16(temp1, 3);
1911
1912
2.35k
    in_macro_16x8 = _mm_min_epi16(C_8x16, in_macro_16x8); //CLIP3
1913
2.35k
    C_8x16 = _mm_subs_epi16(zero, C_8x16);
1914
2.35k
    in_macro_16x8 = _mm_max_epi16(C_8x16, in_macro_16x8); //CLIP3
1915
1916
    // p0
1917
2.35k
    temp1 = _mm_add_epi16(_mm_unpacklo_epi8(p0_16x8, zero), in_macro_16x8);
1918
1919
2.35k
    temp1 = _mm_packus_epi16(temp1, zero);
1920
1921
2.35k
    p0_16x8_1 = _mm_and_si128(temp1, flag1_16x8);
1922
2.35k
    p0_16x8_2 = _mm_and_si128(
1923
2.35k
                    p0_16x8, _mm_xor_si128(flag1_16x8, _mm_set1_epi16(0xFFFF)));
1924
1925
2.35k
    p0_16x8_1 = _mm_add_epi8(p0_16x8_1, p0_16x8_2);
1926
1927
    // q0
1928
2.35k
    temp1 = _mm_sub_epi16(_mm_unpacklo_epi8(q0_16x8, zero), in_macro_16x8);
1929
1930
2.35k
    temp1 = _mm_packus_epi16(temp1, zero);
1931
1932
2.35k
    q0_16x8_1 = _mm_and_si128(temp1, flag1_16x8);
1933
2.35k
    q0_16x8_2 = _mm_and_si128(
1934
2.35k
                    q0_16x8, _mm_xor_si128(flag1_16x8, _mm_set1_epi16(0xFFFF)));
1935
1936
2.35k
    q0_16x8_1 = _mm_add_epi8(q0_16x8_1, q0_16x8_2);
1937
1938
    //if(Ap < Beta)
1939
2.35k
    temp1 = _mm_avg_epu16(_mm_unpacklo_epi8(q0_16x8, zero),
1940
2.35k
                          _mm_unpacklo_epi8(p0_16x8, zero));
1941
2.35k
    temp2 = _mm_slli_epi16(_mm_unpacklo_epi8(p1_16x8, zero), 1);
1942
    //temp2 = _mm_subs_epi16(zero,temp2);
1943
2.35k
    temp2 = _mm_subs_epi16(_mm_unpacklo_epi8(p2_16x8, zero), temp2);
1944
2.35k
    temp2 = _mm_add_epi16(temp1, temp2);
1945
2.35k
    in_macro_16x8 = _mm_srai_epi16(temp2, 1);
1946
1947
2.35k
    in_macro_16x8 = _mm_min_epi16(C0_8x16, in_macro_16x8); //CLIP3
1948
2.35k
    C0_8x16 = _mm_subs_epi16(zero, C0_8x16);
1949
2.35k
    in_macro_16x8 = _mm_max_epi16(C0_8x16, in_macro_16x8); //CLIP3
1950
1951
    // p1
1952
2.35k
    temp1 = _mm_add_epi16(_mm_unpacklo_epi8(p1_16x8, zero), in_macro_16x8);
1953
1954
2.35k
    temp1 = _mm_packus_epi16(temp1, zero);
1955
1956
2.35k
    p1_16x8_1 = _mm_and_si128(temp1, flag2_16x8);
1957
2.35k
    p1_16x8 = _mm_and_si128(p1_16x8,
1958
2.35k
                            _mm_xor_si128(flag2_16x8, _mm_set1_epi16(0xFFFF)));
1959
2.35k
    p1_16x8 = _mm_add_epi8(p1_16x8, p1_16x8_1);
1960
1961
    //if(Aq < Beta)
1962
2.35k
    temp1 = _mm_avg_epu16(_mm_unpacklo_epi8(q0_16x8, zero),
1963
2.35k
                          _mm_unpacklo_epi8(p0_16x8, zero));
1964
2.35k
    temp2 = _mm_slli_epi16(_mm_unpacklo_epi8(q1_16x8, zero), 1);
1965
    //temp2 = _mm_slli_epi16 (temp2, 1);
1966
2.35k
    temp2 = _mm_subs_epi16(_mm_unpacklo_epi8(q2_16x8, zero), temp2);
1967
2.35k
    temp2 = _mm_add_epi16(temp1, temp2);
1968
2.35k
    in_macro_16x8 = _mm_srai_epi16(temp2, 1);
1969
1970
2.35k
    in_macro_16x8 = _mm_max_epi16(C0_8x16, in_macro_16x8); //CLIP3
1971
2.35k
    C0_8x16 = _mm_subs_epi16(zero, C0_8x16);
1972
2.35k
    in_macro_16x8 = _mm_min_epi16(C0_8x16, in_macro_16x8); //CLIP3
1973
1974
2.35k
    temp1 = _mm_add_epi16(_mm_unpacklo_epi8(q1_16x8, zero), in_macro_16x8);
1975
1976
    // q1
1977
2.35k
    temp1 = _mm_packus_epi16(temp1, zero);
1978
1979
2.35k
    q1_16x8_1 = _mm_and_si128(temp1, flag3_16x8);
1980
2.35k
    q1_16x8 = _mm_and_si128(q1_16x8,
1981
2.35k
                            _mm_xor_si128(flag3_16x8, _mm_set1_epi16(0xFFFF)));
1982
2.35k
    q1_16x8 = _mm_add_epi8(q1_16x8, q1_16x8_1);
1983
1984
2.35k
    temp1 = _mm_unpacklo_epi8(p3_16x8, p2_16x8);
1985
2.35k
    temp2 = _mm_unpacklo_epi8(p1_16x8, p0_16x8_1);
1986
2.35k
    temp3 = _mm_unpacklo_epi8(q0_16x8_1, q1_16x8);
1987
2.35k
    temp4 = _mm_unpacklo_epi8(q2_16x8, q3_16x8);
1988
1989
2.35k
    line7 = _mm_unpacklo_epi16(temp1, temp2);
1990
2.35k
    temp1 = _mm_unpackhi_epi16(temp1, temp2);
1991
2.35k
    line8 = _mm_unpacklo_epi16(temp3, temp4);
1992
2.35k
    temp2 = _mm_unpackhi_epi16(temp3, temp4);
1993
1994
2.35k
    line1 = _mm_unpacklo_epi32(line7, line8);
1995
2.35k
    line2 = _mm_srli_si128(line1, 8);
1996
2.35k
    line3 = _mm_unpackhi_epi32(line7, line8);
1997
2.35k
    line4 = _mm_srli_si128(line3, 8);
1998
2.35k
    line5 = _mm_unpacklo_epi32(temp1, temp2);
1999
2.35k
    line6 = _mm_srli_si128(line5, 8);
2000
2.35k
    line7 = _mm_unpackhi_epi32(temp1, temp2);
2001
2.35k
    line8 = _mm_srli_si128(line7, 8);
2002
2003
2.35k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 0 * src_strd), line1);
2004
2.35k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 1 * src_strd), line2);
2005
2.35k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 2 * src_strd), line3);
2006
2.35k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 3 * src_strd), line4);
2007
2.35k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 4 * src_strd), line5);
2008
2.35k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 5 * src_strd), line6);
2009
2.35k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 6 * src_strd), line7);
2010
2.35k
    _mm_storel_epi64((__m128i *)(pu1_src - 4 + 7 * src_strd), line8);
2011
2.35k
}
2012