57 const si32 *src1 = line_src1->
i32, *src2 = line_src2->
i32;
59 for (
ui32 i = (repeat + 7) >> 3; i > 0; --i, dst+=8, src1+=8, src2+=8)
61 __m256i s1 = _mm256_load_si256((__m256i*)src1);
62 __m256i s2 = _mm256_load_si256((__m256i*)src2);
63 __m256i d = _mm256_load_si256((__m256i*)dst);
64 s1 = _mm256_srai_epi32(_mm256_add_epi32(s1, s2), 1);
65 d = _mm256_sub_epi32(d, s1);
66 _mm256_store_si256((__m256i*)dst, d);
76 const si32 *src1 = line_src1->
i32, *src2 = line_src2->
i32;
78 __m256i offset = _mm256_set1_epi32(2);
79 for (
ui32 i = (repeat + 7) >> 3; i > 0; --i, dst+=8, src1+=8, src2+=8)
81 __m256i s1 = _mm256_load_si256((__m256i*)src1);
82 s1 = _mm256_add_epi32(s1, offset);
83 __m256i s2 = _mm256_load_si256((__m256i*)src2);
84 s2 = _mm256_add_epi32(s2, s1);
85 __m256i d = _mm256_load_si256((__m256i*)dst);
86 d = _mm256_add_epi32(d, _mm256_srai_epi32(s2, 2));
87 _mm256_store_si256((__m256i*)dst, d);
98 si32 *ldst = line_ldst->
i32, *hdst = line_hdst->
i32;
100 const ui32 L_width = (width + (even ? 1 : 0)) >> 1;
101 const ui32 H_width = (width + (even ? 0 : 1)) >> 1;
105 src[width] = src[width-2];
107 const si32* sp = src + (even ? 1 : 0);
109 const __m256i mask = _mm256_setr_epi32(0, 2, 4, 6, 1, 3, 5, 7);
110 for (
ui32 i = (H_width + 7) >> 3; i > 0; --i, dph+=8)
113 __m256i s1 = _mm256_loadu_si256((__m256i*)(sp-1));
114 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp+1));
115 __m256i d = _mm256_loadu_si256((__m256i*)sp);
116 s1 = _mm256_srai_epi32(_mm256_add_epi32(s1, s2), 1);
117 __m256i d1 = _mm256_sub_epi32(d, s1);
119 s1 = _mm256_loadu_si256((__m256i*)(sp-1));
120 s2 = _mm256_loadu_si256((__m256i*)(sp+1));
121 d = _mm256_loadu_si256((__m256i*)sp);
122 s1 = _mm256_srai_epi32(_mm256_add_epi32(s1, s2), 1);
123 __m256i d2 = _mm256_sub_epi32(d, s1);
125 d1 = _mm256_permutevar8x32_epi32(d1, mask);
126 d2 = _mm256_permutevar8x32_epi32(d2, mask);
127 d = _mm256_permute2x128_si256(d1, d2, (2 << 4) | 0);
128 _mm256_store_si256((__m256i*)dph, d);
133 hdst[H_width] = hdst[H_width-1];
135 sp = src + (even ? 0 : 1);
136 const si32* sph = hdst + (even ? 0 : 1);
138 __m256i offset = _mm256_set1_epi32(2);
139 for (
ui32 i = (L_width + 7) >> 3; i > 0; --i, sp+=16, sph+=8, dpl+=8)
141 __m256i s1 = _mm256_loadu_si256((__m256i*)(sph-1));
142 s1 = _mm256_add_epi32(s1, offset);
143 __m256i s2 = _mm256_loadu_si256((__m256i*)sph);
144 s2 = _mm256_add_epi32(s2, s1);
145 __m256i d1 = _mm256_loadu_si256((__m256i*)sp);
146 __m256i d2 = _mm256_loadu_si256((__m256i*)sp + 1);
147 d1 = _mm256_permutevar8x32_epi32(d1, mask);
148 d2 = _mm256_permutevar8x32_epi32(d2, mask);
149 __m256i d = _mm256_permute2x128_si256(d1, d2, (2 << 4) | 0);
150 d = _mm256_add_epi32(d, _mm256_srai_epi32(s2, 2));
151 _mm256_store_si256((__m256i*)dpl, d);
157 line_ldst->
i32[0] = line_src->
i32[0];
159 line_hdst->
i32[0] = line_src->
i32[0] << 1;
169 const si32 *src1 = line_src1->
i32, *src2 = line_src2->
i32;
171 for (
ui32 i = (repeat + 7) >> 3; i > 0; --i, dst+=8, src1+=8, src2+=8)
173 __m256i s1 = _mm256_load_si256((__m256i*)src1);
174 __m256i s2 = _mm256_load_si256((__m256i*)src2);
175 __m256i d = _mm256_load_si256((__m256i*)dst);
176 s1 = _mm256_srai_epi32(_mm256_add_epi32(s1, s2), 1);
177 d = _mm256_add_epi32(d, s1);
178 _mm256_store_si256((__m256i*)dst, d);
188 const si32 *src1 = line_src1->
i32, *src2 = line_src2->
i32;
190 __m256i offset = _mm256_set1_epi32(2);
191 for (
ui32 i = (repeat + 7) >> 3; i > 0; --i, dst+=8, src1+=8, src2+=8)
193 __m256i s1 = _mm256_load_si256((__m256i*)src1);
194 s1 = _mm256_add_epi32(s1, offset);
195 __m256i s2 = _mm256_load_si256((__m256i*)src2);
196 s2 = _mm256_add_epi32(s2, s1);
197 __m256i d = _mm256_load_si256((__m256i*)dst);
198 d = _mm256_sub_epi32(d, _mm256_srai_epi32(s2, 2));
199 _mm256_store_si256((__m256i*)dst, d);
209 si32 *lsrc = line_lsrc->
i32, *hsrc = line_hsrc->
i32;
212 const ui32 L_width = (width + (even ? 1 : 0)) >> 1;
213 const ui32 H_width = (width + (even ? 0 : 1)) >> 1;
217 hsrc[H_width] = hsrc[H_width-1];
219 const si32 *sph = hsrc + (even ? 0 : 1);
221 __m256i offset = _mm256_set1_epi32(2);
222 for (
ui32 i = (L_width + 7) >> 3; i > 0; --i, sph+=8, spl+=8)
224 __m256i s1 = _mm256_loadu_si256((__m256i*)(sph-1));
225 s1 = _mm256_add_epi32(s1, offset);
226 __m256i s2 = _mm256_loadu_si256((__m256i*)sph);
227 s2 = _mm256_add_epi32(s2, s1);
228 __m256i d = _mm256_load_si256((__m256i*)spl);
229 d = _mm256_sub_epi32(d, _mm256_srai_epi32(s2, 2));
230 _mm256_store_si256((__m256i*)spl, d);
235 lsrc[L_width] = lsrc[L_width - 1];
237 si32 *dp = dst + (even ? 0 : -1);
238 spl = lsrc + (even ? 0 : -1);
240 ui32 width = L_width + (even ? 0 : 1);
241 for (
ui32 i = (width + 7) >> 3; i > 0; --i, sph+=8, spl+=8, dp+=16)
243 __m256i s1 = _mm256_loadu_si256((__m256i*)spl);
244 __m256i s2 = _mm256_loadu_si256((__m256i*)(spl+1));
245 __m256i d = _mm256_load_si256((__m256i*)sph);
246 s2 = _mm256_srai_epi32(_mm256_add_epi32(s1, s2), 1);
247 d = _mm256_add_epi32(d, s2);
248 s2 = _mm256_unpackhi_epi32(s1, d);
249 s1 = _mm256_unpacklo_epi32(s1, d);
250 d = _mm256_permute2x128_si256(s1, s2, (2 << 4) | 0);
251 _mm256_storeu_si256((__m256i*)dp, d);
252 d = _mm256_permute2x128_si256(s1, s2, (3 << 4) | 1);
253 _mm256_storeu_si256((__m256i*)dp + 1, d);
259 line_dst->
i32[0] = line_lsrc->
i32[0];
261 line_dst->
i32[0] = line_hsrc->
i32[0] >> 1;
void avx2_rev_vert_wvlt_fwd_update(const line_buf *line_src1, const line_buf *line_src2, line_buf *line_dst, ui32 repeat)
void avx2_rev_horz_wvlt_fwd_tx(line_buf *line_src, line_buf *line_ldst, line_buf *line_hdst, ui32 width, bool even)
void avx2_rev_vert_wvlt_fwd_predict(const line_buf *line_src1, const line_buf *line_src2, line_buf *line_dst, ui32 repeat)
void avx2_rev_vert_wvlt_bwd_predict(const line_buf *line_src1, const line_buf *line_src2, line_buf *line_dst, ui32 repeat)
void avx2_rev_horz_wvlt_bwd_tx(line_buf *line_dst, line_buf *line_lsrc, line_buf *line_hsrc, ui32 width, bool even)
void avx2_rev_vert_wvlt_bwd_update(const line_buf *line_src1, const line_buf *line_src2, line_buf *line_dst, ui32 repeat)