39#if defined(OJPH_ARCH_I386) || defined(OJPH_ARCH_X86_64)
60 __m256i avx2_mm256_srai_epi64(__m256i a,
int amt, __m256i m)
64 __m256i x = _mm256_srli_epi64(a, amt);
65 x = _mm256_xor_si256(x, m);
66 __m256i result = _mm256_sub_epi64(x, m);
72 void avx2_deinterleave32(
float* dpl,
float* dph,
float* sp,
int width)
74 for (; width > 0; width -= 16, sp += 16, dpl += 8, dph += 8)
76 __m256 a = _mm256_load_ps(sp);
77 __m256 b = _mm256_load_ps(sp + 8);
78 __m256 c = _mm256_permute2f128_ps(a, b, (2 << 4) | (0));
79 __m256 d = _mm256_permute2f128_ps(a, b, (3 << 4) | (1));
80 __m256 e = _mm256_shuffle_ps(c, d, _MM_SHUFFLE(2, 0, 2, 0));
81 __m256 f = _mm256_shuffle_ps(c, d, _MM_SHUFFLE(3, 1, 3, 1));
82 _mm256_store_ps(dpl, e);
83 _mm256_store_ps(dph, f);
89 void avx2_interleave32(
float* dp,
float* spl,
float* sph,
int width)
91 for (; width > 0; width -= 16, dp += 16, spl += 8, sph += 8)
93 __m256 a = _mm256_load_ps(spl);
94 __m256 b = _mm256_load_ps(sph);
95 __m256 c = _mm256_unpacklo_ps(a, b);
96 __m256 d = _mm256_unpackhi_ps(a, b);
97 __m256 e = _mm256_permute2f128_ps(c, d, (2 << 4) | (0));
98 __m256 f = _mm256_permute2f128_ps(c, d, (3 << 4) | (1));
99 _mm256_store_ps(dp, e);
100 _mm256_store_ps(dp + 8, f);
106 void avx2_deinterleave64(
double* dpl,
double* dph,
double* sp,
int width)
108 for (; width > 0; width -= 8, sp += 8, dpl += 4, dph += 4)
110 __m256d a = _mm256_load_pd(sp);
111 __m256d b = _mm256_load_pd(sp + 4);
112 __m256d c = _mm256_permute2f128_pd(a, b, (2 << 4) | (0));
113 __m256d d = _mm256_permute2f128_pd(a, b, (3 << 4) | (1));
114 __m256d e = _mm256_shuffle_pd(c, d, 0x0);
115 __m256d f = _mm256_shuffle_pd(c, d, 0xF);
116 _mm256_store_pd(dpl, e);
117 _mm256_store_pd(dph, f);
123 void avx2_interleave64(
double* dp,
double* spl,
double* sph,
int width)
125 for (; width > 0; width -= 8, dp += 8, spl += 4, sph += 4)
127 __m256d a = _mm256_load_pd(spl);
128 __m256d b = _mm256_load_pd(sph);
129 __m256d c = _mm256_unpacklo_pd(a, b);
130 __m256d d = _mm256_unpackhi_pd(a, b);
131 __m256d e = _mm256_permute2f128_pd(c, d, (2 << 4) | (0));
132 __m256d f = _mm256_permute2f128_pd(c, d, (3 << 4) | (1));
133 _mm256_store_pd(dp, e);
134 _mm256_store_pd(dp + 4, f);
140 void avx2_rev_vert_step32(
const lifting_step* s,
const line_buf* sig,
141 const line_buf* other,
const line_buf* aug,
142 ui32 repeat,
bool synthesis)
144 const si32 a = s->rev.Aatk;
145 const si32 b = s->rev.Batk;
146 const ui8 e = s->rev.Eatk;
147 __m256i va = _mm256_set1_epi32(a);
148 __m256i vb = _mm256_set1_epi32(b);
150 si32* dst = aug->i32;
151 const si32* src1 = sig->i32, * src2 = other->i32;
159 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
161 __m256i s1 = _mm256_load_si256((__m256i*)src1);
162 __m256i s2 = _mm256_load_si256((__m256i*)src2);
163 __m256i d = _mm256_load_si256((__m256i*)dst);
164 __m256i t = _mm256_add_epi32(s1, s2);
165 __m256i v = _mm256_add_epi32(vb, t);
166 __m256i w = _mm256_srai_epi32(v, e);
167 d = _mm256_sub_epi32(d, w);
168 _mm256_store_si256((__m256i*)dst, d);
171 for (; i > 0; i -= 8, 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 __m256i t = _mm256_add_epi32(s1, s2);
177 __m256i v = _mm256_add_epi32(vb, t);
178 __m256i w = _mm256_srai_epi32(v, e);
179 d = _mm256_add_epi32(d, w);
180 _mm256_store_si256((__m256i*)dst, d);
183 else if (a == -1 && b == 1 && e == 1)
187 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
189 __m256i s1 = _mm256_load_si256((__m256i*)src1);
190 __m256i s2 = _mm256_load_si256((__m256i*)src2);
191 __m256i d = _mm256_load_si256((__m256i*)dst);
192 __m256i t = _mm256_add_epi32(s1, s2);
193 __m256i w = _mm256_srai_epi32(t, e);
194 d = _mm256_add_epi32(d, w);
195 _mm256_store_si256((__m256i*)dst, d);
198 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
200 __m256i s1 = _mm256_load_si256((__m256i*)src1);
201 __m256i s2 = _mm256_load_si256((__m256i*)src2);
202 __m256i d = _mm256_load_si256((__m256i*)dst);
203 __m256i t = _mm256_add_epi32(s1, s2);
204 __m256i w = _mm256_srai_epi32(t, e);
205 d = _mm256_sub_epi32(d, w);
206 _mm256_store_si256((__m256i*)dst, d);
213 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
215 __m256i s1 = _mm256_load_si256((__m256i*)src1);
216 __m256i s2 = _mm256_load_si256((__m256i*)src2);
217 __m256i d = _mm256_load_si256((__m256i*)dst);
218 __m256i t = _mm256_add_epi32(s1, s2);
219 __m256i v = _mm256_sub_epi32(vb, t);
220 __m256i w = _mm256_srai_epi32(v, e);
221 d = _mm256_sub_epi32(d, w);
222 _mm256_store_si256((__m256i*)dst, d);
225 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
227 __m256i s1 = _mm256_load_si256((__m256i*)src1);
228 __m256i s2 = _mm256_load_si256((__m256i*)src2);
229 __m256i d = _mm256_load_si256((__m256i*)dst);
230 __m256i t = _mm256_add_epi32(s1, s2);
231 __m256i v = _mm256_sub_epi32(vb, t);
232 __m256i w = _mm256_srai_epi32(v, e);
233 d = _mm256_add_epi32(d, w);
234 _mm256_store_si256((__m256i*)dst, d);
240 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
242 __m256i s1 = _mm256_load_si256((__m256i*)src1);
243 __m256i s2 = _mm256_load_si256((__m256i*)src2);
244 __m256i d = _mm256_load_si256((__m256i*)dst);
245 __m256i t = _mm256_add_epi32(s1, s2);
246 __m256i u = _mm256_mullo_epi32(va, t);
247 __m256i v = _mm256_add_epi32(vb, u);
248 __m256i w = _mm256_srai_epi32(v, e);
249 d = _mm256_sub_epi32(d, w);
250 _mm256_store_si256((__m256i*)dst, d);
253 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
255 __m256i s1 = _mm256_load_si256((__m256i*)src1);
256 __m256i s2 = _mm256_load_si256((__m256i*)src2);
257 __m256i d = _mm256_load_si256((__m256i*)dst);
258 __m256i t = _mm256_add_epi32(s1, s2);
259 __m256i u = _mm256_mullo_epi32(va, t);
260 __m256i v = _mm256_add_epi32(vb, u);
261 __m256i w = _mm256_srai_epi32(v, e);
262 d = _mm256_add_epi32(d, w);
263 _mm256_store_si256((__m256i*)dst, d);
270 void avx2_rev_vert_step64(
const lifting_step* s,
const line_buf* sig,
271 const line_buf* other,
const line_buf* aug,
272 ui32 repeat,
bool synthesis)
274 const si32 a = s->rev.Aatk;
275 const si32 b = s->rev.Batk;
276 const ui8 e = s->rev.Eatk;
277 __m256i vb = _mm256_set1_epi64x(b);
278 __m256i ve = _mm256_set1_epi64x(1LL << (63 - e));
280 si64* dst = aug->i64;
281 const si64* src1 = sig->i64, * src2 = other->i64;
289 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
291 __m256i s1 = _mm256_load_si256((__m256i*)src1);
292 __m256i s2 = _mm256_load_si256((__m256i*)src2);
293 __m256i d = _mm256_load_si256((__m256i*)dst);
294 __m256i t = _mm256_add_epi64(s1, s2);
295 __m256i v = _mm256_add_epi64(vb, t);
296 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
297 d = _mm256_sub_epi64(d, w);
298 _mm256_store_si256((__m256i*)dst, d);
301 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
303 __m256i s1 = _mm256_load_si256((__m256i*)src1);
304 __m256i s2 = _mm256_load_si256((__m256i*)src2);
305 __m256i d = _mm256_load_si256((__m256i*)dst);
306 __m256i t = _mm256_add_epi64(s1, s2);
307 __m256i v = _mm256_add_epi64(vb, t);
308 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
309 d = _mm256_add_epi64(d, w);
310 _mm256_store_si256((__m256i*)dst, d);
313 else if (a == -1 && b == 1 && e == 1)
317 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
319 __m256i s1 = _mm256_load_si256((__m256i*)src1);
320 __m256i s2 = _mm256_load_si256((__m256i*)src2);
321 __m256i d = _mm256_load_si256((__m256i*)dst);
322 __m256i t = _mm256_add_epi64(s1, s2);
323 __m256i w = avx2_mm256_srai_epi64(t, e, ve);
324 d = _mm256_add_epi64(d, w);
325 _mm256_store_si256((__m256i*)dst, d);
328 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
330 __m256i s1 = _mm256_load_si256((__m256i*)src1);
331 __m256i s2 = _mm256_load_si256((__m256i*)src2);
332 __m256i d = _mm256_load_si256((__m256i*)dst);
333 __m256i t = _mm256_add_epi64(s1, s2);
334 __m256i w = avx2_mm256_srai_epi64(t, e, ve);
335 d = _mm256_sub_epi64(d, w);
336 _mm256_store_si256((__m256i*)dst, d);
343 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
345 __m256i s1 = _mm256_load_si256((__m256i*)src1);
346 __m256i s2 = _mm256_load_si256((__m256i*)src2);
347 __m256i d = _mm256_load_si256((__m256i*)dst);
348 __m256i t = _mm256_add_epi64(s1, s2);
349 __m256i v = _mm256_sub_epi64(vb, t);
350 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
351 d = _mm256_sub_epi64(d, w);
352 _mm256_store_si256((__m256i*)dst, d);
355 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
357 __m256i s1 = _mm256_load_si256((__m256i*)src1);
358 __m256i s2 = _mm256_load_si256((__m256i*)src2);
359 __m256i d = _mm256_load_si256((__m256i*)dst);
360 __m256i t = _mm256_add_epi64(s1, s2);
361 __m256i v = _mm256_sub_epi64(vb, t);
362 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
363 d = _mm256_add_epi64(d, w);
364 _mm256_store_si256((__m256i*)dst, d);
371 for (
ui32 i = repeat; i > 0; --i)
372 *dst++ -= (b + a * (*src1++ + *src2++)) >> e;
374 for (
ui32 i = repeat; i > 0; --i)
375 *dst++ += (b + a * (*src1++ + *src2++)) >> e;
381 const line_buf* other,
const line_buf* aug,
382 ui32 repeat,
bool synthesis)
391 avx2_rev_vert_step32(s, sig, other, aug, repeat, synthesis);
398 avx2_rev_vert_step64(s, sig, other, aug, repeat, synthesis);
404 void avx2_rev_horz_ana32(
const param_atk* atk,
const line_buf* ldst,
405 const line_buf* hdst,
const line_buf* src,
406 ui32 width,
bool even)
412 float* dpl = even ? ldst->f32 : hdst->f32;
413 float* dph = even ? hdst->f32 : ldst->f32;
414 float* sp = src->f32;
416 avx2_deinterleave32(dpl, dph, sp, w);
419 si32* hp = hdst->i32, * lp = ldst->i32;
420 ui32 l_width = (width + (even ? 1 : 0)) >> 1;
421 ui32 h_width = (width + (even ? 0 : 1)) >> 1;
422 ui32 num_steps = atk->get_num_steps();
423 for (
ui32 j = num_steps; j > 0; --j)
428 const si32 b = s->rev.Batk;
429 const ui8 e = s->rev.Eatk;
430 __m256i va = _mm256_set1_epi32(a);
431 __m256i vb = _mm256_set1_epi32(b);
435 lp[l_width] = lp[l_width - 1];
441 int i = (int)h_width;
444 for (; i > 0; i -= 8, sp += 8, dp += 8)
446 __m256i s1 = _mm256_load_si256((__m256i*)sp);
447 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
448 __m256i d = _mm256_load_si256((__m256i*)dp);
449 __m256i t = _mm256_add_epi32(s1, s2);
450 __m256i v = _mm256_add_epi32(vb, t);
451 __m256i w = _mm256_srai_epi32(v, e);
452 d = _mm256_add_epi32(d, w);
453 _mm256_store_si256((__m256i*)dp, d);
458 for (; i > 0; i -= 8, sp += 8, dp += 8)
460 __m256i s1 = _mm256_load_si256((__m256i*)sp);
461 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
462 __m256i d = _mm256_load_si256((__m256i*)dp);
463 __m256i t = _mm256_add_epi32(s1, s2);
464 __m256i v = _mm256_add_epi32(vb, t);
465 __m256i w = _mm256_srai_epi32(v, e);
466 d = _mm256_add_epi32(d, w);
467 _mm256_store_si256((__m256i*)dp, d);
471 else if (a == -1 && b == 1 && e == 1)
473 int i = (int)h_width;
475 for (; i > 0; i -= 8, sp += 8, dp += 8)
477 __m256i s1 = _mm256_load_si256((__m256i*)sp);
478 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
479 __m256i d = _mm256_load_si256((__m256i*)dp);
480 __m256i t = _mm256_add_epi32(s1, s2);
481 __m256i w = _mm256_srai_epi32(t, e);
482 d = _mm256_sub_epi32(d, w);
483 _mm256_store_si256((__m256i*)dp, d);
486 for (; i > 0; i -= 8, sp += 8, dp += 8)
488 __m256i s1 = _mm256_load_si256((__m256i*)sp);
489 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
490 __m256i d = _mm256_load_si256((__m256i*)dp);
491 __m256i t = _mm256_add_epi32(s1, s2);
492 __m256i w = _mm256_srai_epi32(t, e);
493 d = _mm256_sub_epi32(d, w);
494 _mm256_store_si256((__m256i*)dp, d);
499 int i = (int)h_width;
501 for (; i > 0; i -= 8, sp += 8, dp += 8)
503 __m256i s1 = _mm256_load_si256((__m256i*)sp);
504 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
505 __m256i d = _mm256_load_si256((__m256i*)dp);
506 __m256i t = _mm256_add_epi32(s1, s2);
507 __m256i v = _mm256_sub_epi32(vb, t);
508 __m256i w = _mm256_srai_epi32(v, e);
509 d = _mm256_add_epi32(d, w);
510 _mm256_store_si256((__m256i*)dp, d);
513 for (; i > 0; i -= 8, sp += 8, dp += 8)
515 __m256i s1 = _mm256_load_si256((__m256i*)sp);
516 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
517 __m256i d = _mm256_load_si256((__m256i*)dp);
518 __m256i t = _mm256_add_epi32(s1, s2);
519 __m256i v = _mm256_sub_epi32(vb, t);
520 __m256i w = _mm256_srai_epi32(v, e);
521 d = _mm256_add_epi32(d, w);
522 _mm256_store_si256((__m256i*)dp, d);
527 int i = (int)h_width;
529 for (; i > 0; i -= 8, sp += 8, dp += 8)
531 __m256i s1 = _mm256_load_si256((__m256i*)sp);
532 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
533 __m256i d = _mm256_load_si256((__m256i*)dp);
534 __m256i t = _mm256_add_epi32(s1, s2);
535 __m256i u = _mm256_mullo_epi32(va, t);
536 __m256i v = _mm256_add_epi32(vb, u);
537 __m256i w = _mm256_srai_epi32(v, e);
538 d = _mm256_add_epi32(d, w);
539 _mm256_store_si256((__m256i*)dp, d);
542 for (; i > 0; i -= 8, sp += 8, dp += 8)
544 __m256i s1 = _mm256_load_si256((__m256i*)sp);
545 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
546 __m256i d = _mm256_load_si256((__m256i*)dp);
547 __m256i t = _mm256_add_epi32(s1, s2);
548 __m256i u = _mm256_mullo_epi32(va, t);
549 __m256i v = _mm256_add_epi32(vb, u);
550 __m256i w = _mm256_srai_epi32(v, e);
551 d = _mm256_add_epi32(d, w);
552 _mm256_store_si256((__m256i*)dp, d);
557 si32* t = lp; lp = hp; hp = t;
559 ui32 w = l_width; l_width = h_width; h_width = w;
564 ldst->i32[0] = src->i32[0];
566 hdst->i32[0] = src->i32[0] << 1;
572 void avx2_rev_horz_ana64(
const param_atk* atk,
const line_buf* ldst,
573 const line_buf* hdst,
const line_buf* src,
574 ui32 width,
bool even)
580 double* dpl = (
double*)(even ? ldst->p : hdst->p);
581 double* dph = (
double*)(even ? hdst->p : ldst->p);
582 double* sp = (
double*)src->p;
584 avx2_deinterleave64(dpl, dph, sp, w);
587 si64* hp = hdst->i64, * lp = ldst->i64;
588 ui32 l_width = (width + (even ? 1 : 0)) >> 1;
589 ui32 h_width = (width + (even ? 0 : 1)) >> 1;
590 ui32 num_steps = atk->get_num_steps();
591 for (
ui32 j = num_steps; j > 0; --j)
596 const si32 b = s->rev.Batk;
597 const ui8 e = s->rev.Eatk;
598 __m256i vb = _mm256_set1_epi64x(b);
599 __m256i ve = _mm256_set1_epi64x(1LL << (63 - e));
603 lp[l_width] = lp[l_width - 1];
609 int i = (int)h_width;
612 for (; i > 0; i -= 4, sp += 4, dp += 4)
614 __m256i s1 = _mm256_load_si256((__m256i*)sp);
615 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
616 __m256i d = _mm256_load_si256((__m256i*)dp);
617 __m256i t = _mm256_add_epi64(s1, s2);
618 __m256i v = _mm256_add_epi64(vb, t);
619 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
620 d = _mm256_add_epi64(d, w);
621 _mm256_store_si256((__m256i*)dp, d);
626 for (; i > 0; i -= 4, sp += 4, dp += 4)
628 __m256i s1 = _mm256_load_si256((__m256i*)sp);
629 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
630 __m256i d = _mm256_load_si256((__m256i*)dp);
631 __m256i t = _mm256_add_epi64(s1, s2);
632 __m256i v = _mm256_add_epi64(vb, t);
633 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
634 d = _mm256_add_epi64(d, w);
635 _mm256_store_si256((__m256i*)dp, d);
639 else if (a == -1 && b == 1 && e == 1)
641 int i = (int)h_width;
643 for (; i > 0; i -= 4, sp += 4, dp += 4)
645 __m256i s1 = _mm256_load_si256((__m256i*)sp);
646 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
647 __m256i d = _mm256_load_si256((__m256i*)dp);
648 __m256i t = _mm256_add_epi64(s1, s2);
649 __m256i w = avx2_mm256_srai_epi64(t, e, ve);
650 d = _mm256_sub_epi64(d, w);
651 _mm256_store_si256((__m256i*)dp, d);
654 for (; i > 0; i -= 4, sp += 4, dp += 4)
656 __m256i s1 = _mm256_load_si256((__m256i*)sp);
657 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
658 __m256i d = _mm256_load_si256((__m256i*)dp);
659 __m256i t = _mm256_add_epi64(s1, s2);
660 __m256i w = avx2_mm256_srai_epi64(t, e, ve);
661 d = _mm256_sub_epi64(d, w);
662 _mm256_store_si256((__m256i*)dp, d);
667 int i = (int)h_width;
669 for (; i > 0; i -= 4, sp += 4, dp += 4)
671 __m256i s1 = _mm256_load_si256((__m256i*)sp);
672 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
673 __m256i d = _mm256_load_si256((__m256i*)dp);
674 __m256i t = _mm256_add_epi64(s1, s2);
675 __m256i v = _mm256_sub_epi64(vb, t);
676 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
677 d = _mm256_add_epi64(d, w);
678 _mm256_store_si256((__m256i*)dp, d);
681 for (; i > 0; i -= 4, sp += 4, dp += 4)
683 __m256i s1 = _mm256_load_si256((__m256i*)sp);
684 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
685 __m256i d = _mm256_load_si256((__m256i*)dp);
686 __m256i t = _mm256_add_epi64(s1, s2);
687 __m256i v = _mm256_sub_epi64(vb, t);
688 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
689 d = _mm256_add_epi64(d, w);
690 _mm256_store_si256((__m256i*)dp, d);
698 for (
ui32 i = h_width; i > 0; --i, sp++, dp++)
699 *dp += (b + a * (sp[0] + sp[1])) >> e;
701 for (
ui32 i = h_width; i > 0; --i, sp++, dp++)
702 *dp += (b + a * (sp[-1] + sp[0])) >> e;
706 si64* t = lp; lp = hp; hp = t;
708 ui32 w = l_width; l_width = h_width; h_width = w;
713 ldst->i64[0] = src->i64[0];
715 hdst->i64[0] = src->i64[0] << 1;
721 const line_buf* hdst,
const line_buf* src,
722 ui32 width,
bool even)
728 avx2_rev_horz_ana32(atk, ldst, hdst, src, width, even);
735 avx2_rev_horz_ana64(atk, ldst, hdst, src, width, even);
741 void avx2_rev_horz_syn32(
const param_atk* atk,
const line_buf* dst,
742 const line_buf* lsrc,
const line_buf* hsrc,
743 ui32 width,
bool even)
748 si32* oth = hsrc->i32, * aug = lsrc->i32;
749 ui32 aug_width = (width + (even ? 1 : 0)) >> 1;
750 ui32 oth_width = (width + (even ? 0 : 1)) >> 1;
751 ui32 num_steps = atk->get_num_steps();
752 for (
ui32 j = 0; j < num_steps; ++j)
756 const si32 b = s->rev.Batk;
757 const ui8 e = s->rev.Eatk;
758 __m256i va = _mm256_set1_epi32(a);
759 __m256i vb = _mm256_set1_epi32(b);
763 oth[oth_width] = oth[oth_width - 1];
765 const si32* sp = oth;
769 int i = (int)aug_width;
772 for (; i > 0; i -= 8, sp += 8, dp += 8)
774 __m256i s1 = _mm256_load_si256((__m256i*)sp);
775 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
776 __m256i d = _mm256_load_si256((__m256i*)dp);
777 __m256i t = _mm256_add_epi32(s1, s2);
778 __m256i v = _mm256_add_epi32(vb, t);
779 __m256i w = _mm256_srai_epi32(v, e);
780 d = _mm256_sub_epi32(d, w);
781 _mm256_store_si256((__m256i*)dp, d);
786 for (; i > 0; i -= 8, sp += 8, dp += 8)
788 __m256i s1 = _mm256_load_si256((__m256i*)sp);
789 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
790 __m256i d = _mm256_load_si256((__m256i*)dp);
791 __m256i t = _mm256_add_epi32(s1, s2);
792 __m256i v = _mm256_add_epi32(vb, t);
793 __m256i w = _mm256_srai_epi32(v, e);
794 d = _mm256_sub_epi32(d, w);
795 _mm256_store_si256((__m256i*)dp, d);
799 else if (a == -1 && b == 1 && e == 1)
801 int i = (int)aug_width;
803 for (; i > 0; i -= 8, sp += 8, dp += 8)
805 __m256i s1 = _mm256_load_si256((__m256i*)sp);
806 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
807 __m256i d = _mm256_load_si256((__m256i*)dp);
808 __m256i t = _mm256_add_epi32(s1, s2);
809 __m256i w = _mm256_srai_epi32(t, e);
810 d = _mm256_add_epi32(d, w);
811 _mm256_store_si256((__m256i*)dp, d);
814 for (; i > 0; i -= 8, sp += 8, dp += 8)
816 __m256i s1 = _mm256_load_si256((__m256i*)sp);
817 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
818 __m256i d = _mm256_load_si256((__m256i*)dp);
819 __m256i t = _mm256_add_epi32(s1, s2);
820 __m256i w = _mm256_srai_epi32(t, e);
821 d = _mm256_add_epi32(d, w);
822 _mm256_store_si256((__m256i*)dp, d);
827 int i = (int)aug_width;
829 for (; i > 0; i -= 8, sp += 8, dp += 8)
831 __m256i s1 = _mm256_load_si256((__m256i*)sp);
832 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
833 __m256i d = _mm256_load_si256((__m256i*)dp);
834 __m256i t = _mm256_add_epi32(s1, s2);
835 __m256i v = _mm256_sub_epi32(vb, t);
836 __m256i w = _mm256_srai_epi32(v, e);
837 d = _mm256_sub_epi32(d, w);
838 _mm256_store_si256((__m256i*)dp, d);
841 for (; i > 0; i -= 8, sp += 8, dp += 8)
843 __m256i s1 = _mm256_load_si256((__m256i*)sp);
844 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
845 __m256i d = _mm256_load_si256((__m256i*)dp);
846 __m256i t = _mm256_add_epi32(s1, s2);
847 __m256i v = _mm256_sub_epi32(vb, t);
848 __m256i w = _mm256_srai_epi32(v, e);
849 d = _mm256_sub_epi32(d, w);
850 _mm256_store_si256((__m256i*)dp, d);
855 int i = (int)aug_width;
857 for (; i > 0; i -= 8, sp += 8, dp += 8)
859 __m256i s1 = _mm256_load_si256((__m256i*)sp);
860 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
861 __m256i d = _mm256_load_si256((__m256i*)dp);
862 __m256i t = _mm256_add_epi32(s1, s2);
863 __m256i u = _mm256_mullo_epi32(va, t);
864 __m256i v = _mm256_add_epi32(vb, u);
865 __m256i w = _mm256_srai_epi32(v, e);
866 d = _mm256_sub_epi32(d, w);
867 _mm256_store_si256((__m256i*)dp, d);
870 for (; i > 0; i -= 8, sp += 8, dp += 8)
872 __m256i s1 = _mm256_load_si256((__m256i*)sp);
873 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
874 __m256i d = _mm256_load_si256((__m256i*)dp);
875 __m256i t = _mm256_add_epi32(s1, s2);
876 __m256i u = _mm256_mullo_epi32(va, t);
877 __m256i v = _mm256_add_epi32(vb, u);
878 __m256i w = _mm256_srai_epi32(v, e);
879 d = _mm256_sub_epi32(d, w);
880 _mm256_store_si256((__m256i*)dp, d);
885 si32* t = aug; aug = oth; oth = t;
887 ui32 w = aug_width; aug_width = oth_width; oth_width = w;
892 float* dp = dst->f32;
893 float* spl = even ? lsrc->f32 : hsrc->f32;
894 float* sph = even ? hsrc->f32 : lsrc->f32;
896 avx2_interleave32(dp, spl, sph, w);
901 dst->i32[0] = lsrc->i32[0];
903 dst->i32[0] = hsrc->i32[0] >> 1;
909 void avx2_rev_horz_syn64(
const param_atk* atk,
const line_buf* dst,
910 const line_buf* lsrc,
const line_buf* hsrc,
911 ui32 width,
bool even)
916 si64* oth = hsrc->i64, * aug = lsrc->i64;
917 ui32 aug_width = (width + (even ? 1 : 0)) >> 1;
918 ui32 oth_width = (width + (even ? 0 : 1)) >> 1;
919 ui32 num_steps = atk->get_num_steps();
920 for (
ui32 j = 0; j < num_steps; ++j)
924 const si32 b = s->rev.Batk;
925 const ui8 e = s->rev.Eatk;
926 __m256i vb = _mm256_set1_epi64x(b);
927 __m256i ve = _mm256_set1_epi64x(1LL << (63 - e));
931 oth[oth_width] = oth[oth_width - 1];
933 const si64* sp = oth;
937 int i = (int)aug_width;
940 for (; i > 0; i -= 4, sp += 4, dp += 4)
942 __m256i s1 = _mm256_load_si256((__m256i*)sp);
943 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
944 __m256i d = _mm256_load_si256((__m256i*)dp);
945 __m256i t = _mm256_add_epi64(s1, s2);
946 __m256i v = _mm256_add_epi64(vb, t);
947 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
948 d = _mm256_sub_epi64(d, w);
949 _mm256_store_si256((__m256i*)dp, d);
954 for (; i > 0; i -= 4, sp += 4, dp += 4)
956 __m256i s1 = _mm256_load_si256((__m256i*)sp);
957 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
958 __m256i d = _mm256_load_si256((__m256i*)dp);
959 __m256i t = _mm256_add_epi64(s1, s2);
960 __m256i v = _mm256_add_epi64(vb, t);
961 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
962 d = _mm256_sub_epi64(d, w);
963 _mm256_store_si256((__m256i*)dp, d);
967 else if (a == -1 && b == 1 && e == 1)
969 int i = (int)aug_width;
971 for (; i > 0; i -= 4, sp += 4, dp += 4)
973 __m256i s1 = _mm256_load_si256((__m256i*)sp);
974 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
975 __m256i d = _mm256_load_si256((__m256i*)dp);
976 __m256i t = _mm256_add_epi64(s1, s2);
977 __m256i w = avx2_mm256_srai_epi64(t, e, ve);
978 d = _mm256_add_epi64(d, w);
979 _mm256_store_si256((__m256i*)dp, d);
982 for (; i > 0; i -= 4, sp += 4, dp += 4)
984 __m256i s1 = _mm256_load_si256((__m256i*)sp);
985 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
986 __m256i d = _mm256_load_si256((__m256i*)dp);
987 __m256i t = _mm256_add_epi64(s1, s2);
988 __m256i w = avx2_mm256_srai_epi64(t, e, ve);
989 d = _mm256_add_epi64(d, w);
990 _mm256_store_si256((__m256i*)dp, d);
995 int i = (int)aug_width;
997 for (; i > 0; i -= 4, sp += 4, dp += 4)
999 __m256i s1 = _mm256_load_si256((__m256i*)sp);
1000 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
1001 __m256i d = _mm256_load_si256((__m256i*)dp);
1002 __m256i t = _mm256_add_epi64(s1, s2);
1003 __m256i v = _mm256_sub_epi64(vb, t);
1004 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
1005 d = _mm256_sub_epi64(d, w);
1006 _mm256_store_si256((__m256i*)dp, d);
1009 for (; i > 0; i -= 4, sp += 4, dp += 4)
1011 __m256i s1 = _mm256_load_si256((__m256i*)sp);
1012 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
1013 __m256i d = _mm256_load_si256((__m256i*)dp);
1014 __m256i t = _mm256_add_epi64(s1, s2);
1015 __m256i v = _mm256_sub_epi64(vb, t);
1016 __m256i w = avx2_mm256_srai_epi64(v, e, ve);
1017 d = _mm256_sub_epi64(d, w);
1018 _mm256_store_si256((__m256i*)dp, d);
1026 for (
ui32 i = aug_width; i > 0; --i, sp++, dp++)
1027 *dp -= (b + a * (sp[-1] + sp[0])) >> e;
1029 for (
ui32 i = aug_width; i > 0; --i, sp++, dp++)
1030 *dp -= (b + a * (sp[0] + sp[1])) >> e;
1034 si64* t = aug; aug = oth; oth = t;
1036 ui32 w = aug_width; aug_width = oth_width; oth_width = w;
1041 double* dp = (
double*)dst->p;
1042 double* spl = (
double*)(even ? lsrc->p : hsrc->p);
1043 double* sph = (
double*)(even ? hsrc->p : lsrc->p);
1045 avx2_interleave64(dp, spl, sph, w);
1050 dst->i64[0] = lsrc->i64[0];
1052 dst->i64[0] = hsrc->i64[0] >> 1;
1058 const line_buf* lsrc,
const line_buf* hsrc,
1059 ui32 width,
bool even)
1065 avx2_rev_horz_syn32(atk, dst, lsrc, hsrc, width, even);
1072 avx2_rev_horz_syn64(atk, dst, lsrc, hsrc, width, even);
void avx2_rev_horz_syn(const param_atk *atk, const line_buf *dst, const line_buf *lsrc, const line_buf *hsrc, ui32 width, bool even)
void avx2_rev_vert_step(const lifting_step *s, const line_buf *sig, const line_buf *other, const line_buf *aug, ui32 repeat, bool synthesis)
void avx2_rev_horz_ana(const param_atk *atk, const line_buf *ldst, const line_buf *hdst, const line_buf *src, ui32 width, bool even)