140 ui32 repeat,
bool synthesis)
145 __m256i va = _mm256_set1_epi32(a);
146 __m256i vb = _mm256_set1_epi32(b);
149 const si32* src1 = sig->
i32, * src2 = other->
i32;
157 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
159 __m256i s1 = _mm256_load_si256((__m256i*)src1);
160 __m256i s2 = _mm256_load_si256((__m256i*)src2);
161 __m256i d = _mm256_load_si256((__m256i*)dst);
162 __m256i t = _mm256_add_epi32(s1, s2);
163 __m256i v = _mm256_add_epi32(vb, t);
164 __m256i w = _mm256_srai_epi32(v, e);
165 d = _mm256_sub_epi32(d, w);
166 _mm256_store_si256((__m256i*)dst, d);
169 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
171 __m256i s1 = _mm256_load_si256((__m256i*)src1);
172 __m256i s2 = _mm256_load_si256((__m256i*)src2);
173 __m256i d = _mm256_load_si256((__m256i*)dst);
174 __m256i t = _mm256_add_epi32(s1, s2);
175 __m256i v = _mm256_add_epi32(vb, t);
176 __m256i w = _mm256_srai_epi32(v, e);
177 d = _mm256_add_epi32(d, w);
178 _mm256_store_si256((__m256i*)dst, d);
181 else if (a == -1 && b == 1 && e == 1)
185 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
187 __m256i s1 = _mm256_load_si256((__m256i*)src1);
188 __m256i s2 = _mm256_load_si256((__m256i*)src2);
189 __m256i d = _mm256_load_si256((__m256i*)dst);
190 __m256i t = _mm256_add_epi32(s1, s2);
191 __m256i w = _mm256_srai_epi32(t, e);
192 d = _mm256_add_epi32(d, w);
193 _mm256_store_si256((__m256i*)dst, d);
196 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
198 __m256i s1 = _mm256_load_si256((__m256i*)src1);
199 __m256i s2 = _mm256_load_si256((__m256i*)src2);
200 __m256i d = _mm256_load_si256((__m256i*)dst);
201 __m256i t = _mm256_add_epi32(s1, s2);
202 __m256i w = _mm256_srai_epi32(t, e);
203 d = _mm256_sub_epi32(d, w);
204 _mm256_store_si256((__m256i*)dst, d);
211 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
213 __m256i s1 = _mm256_load_si256((__m256i*)src1);
214 __m256i s2 = _mm256_load_si256((__m256i*)src2);
215 __m256i d = _mm256_load_si256((__m256i*)dst);
216 __m256i t = _mm256_add_epi32(s1, s2);
217 __m256i v = _mm256_sub_epi32(vb, t);
218 __m256i w = _mm256_srai_epi32(v, e);
219 d = _mm256_sub_epi32(d, w);
220 _mm256_store_si256((__m256i*)dst, d);
223 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
225 __m256i s1 = _mm256_load_si256((__m256i*)src1);
226 __m256i s2 = _mm256_load_si256((__m256i*)src2);
227 __m256i d = _mm256_load_si256((__m256i*)dst);
228 __m256i t = _mm256_add_epi32(s1, s2);
229 __m256i v = _mm256_sub_epi32(vb, t);
230 __m256i w = _mm256_srai_epi32(v, e);
231 d = _mm256_add_epi32(d, w);
232 _mm256_store_si256((__m256i*)dst, d);
238 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
240 __m256i s1 = _mm256_load_si256((__m256i*)src1);
241 __m256i s2 = _mm256_load_si256((__m256i*)src2);
242 __m256i d = _mm256_load_si256((__m256i*)dst);
243 __m256i t = _mm256_add_epi32(s1, s2);
244 __m256i u = _mm256_mullo_epi32(va, t);
245 __m256i v = _mm256_add_epi32(vb, u);
246 __m256i w = _mm256_srai_epi32(v, e);
247 d = _mm256_sub_epi32(d, w);
248 _mm256_store_si256((__m256i*)dst, d);
251 for (; i > 0; i -= 8, dst += 8, src1 += 8, src2 += 8)
253 __m256i s1 = _mm256_load_si256((__m256i*)src1);
254 __m256i s2 = _mm256_load_si256((__m256i*)src2);
255 __m256i d = _mm256_load_si256((__m256i*)dst);
256 __m256i t = _mm256_add_epi32(s1, s2);
257 __m256i u = _mm256_mullo_epi32(va, t);
258 __m256i v = _mm256_add_epi32(vb, u);
259 __m256i w = _mm256_srai_epi32(v, e);
260 d = _mm256_add_epi32(d, w);
261 _mm256_store_si256((__m256i*)dst, d);
270 ui32 repeat,
bool synthesis)
275 __m256i vb = _mm256_set1_epi64x(b);
276 __m256i ve = _mm256_set1_epi64x(1LL << (63 - e));
279 const si64* src1 = sig->
i64, * src2 = other->
i64;
287 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
289 __m256i s1 = _mm256_load_si256((__m256i*)src1);
290 __m256i s2 = _mm256_load_si256((__m256i*)src2);
291 __m256i d = _mm256_load_si256((__m256i*)dst);
292 __m256i t = _mm256_add_epi64(s1, s2);
293 __m256i v = _mm256_add_epi64(vb, t);
295 d = _mm256_sub_epi64(d, w);
296 _mm256_store_si256((__m256i*)dst, d);
299 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
301 __m256i s1 = _mm256_load_si256((__m256i*)src1);
302 __m256i s2 = _mm256_load_si256((__m256i*)src2);
303 __m256i d = _mm256_load_si256((__m256i*)dst);
304 __m256i t = _mm256_add_epi64(s1, s2);
305 __m256i v = _mm256_add_epi64(vb, t);
307 d = _mm256_add_epi64(d, w);
308 _mm256_store_si256((__m256i*)dst, d);
311 else if (a == -1 && b == 1 && e == 1)
315 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
317 __m256i s1 = _mm256_load_si256((__m256i*)src1);
318 __m256i s2 = _mm256_load_si256((__m256i*)src2);
319 __m256i d = _mm256_load_si256((__m256i*)dst);
320 __m256i t = _mm256_add_epi64(s1, s2);
322 d = _mm256_add_epi64(d, w);
323 _mm256_store_si256((__m256i*)dst, d);
326 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
328 __m256i s1 = _mm256_load_si256((__m256i*)src1);
329 __m256i s2 = _mm256_load_si256((__m256i*)src2);
330 __m256i d = _mm256_load_si256((__m256i*)dst);
331 __m256i t = _mm256_add_epi64(s1, s2);
333 d = _mm256_sub_epi64(d, w);
334 _mm256_store_si256((__m256i*)dst, d);
341 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
343 __m256i s1 = _mm256_load_si256((__m256i*)src1);
344 __m256i s2 = _mm256_load_si256((__m256i*)src2);
345 __m256i d = _mm256_load_si256((__m256i*)dst);
346 __m256i t = _mm256_add_epi64(s1, s2);
347 __m256i v = _mm256_sub_epi64(vb, t);
349 d = _mm256_sub_epi64(d, w);
350 _mm256_store_si256((__m256i*)dst, d);
353 for (; i > 0; i -= 4, dst += 4, src1 += 4, src2 += 4)
355 __m256i s1 = _mm256_load_si256((__m256i*)src1);
356 __m256i s2 = _mm256_load_si256((__m256i*)src2);
357 __m256i d = _mm256_load_si256((__m256i*)dst);
358 __m256i t = _mm256_add_epi64(s1, s2);
359 __m256i v = _mm256_sub_epi64(vb, t);
361 d = _mm256_add_epi64(d, w);
362 _mm256_store_si256((__m256i*)dst, d);
369 for (
ui32 i = repeat; i > 0; --i)
370 *dst++ -= (b + a * (*src1++ + *src2++)) >> e;
372 for (
ui32 i = repeat; i > 0; --i)
373 *dst++ += (b + a * (*src1++ + *src2++)) >> e;
404 ui32 width,
bool even)
410 float* dpl = even ? ldst->
f32 : hdst->
f32;
411 float* dph = even ? hdst->
f32 : ldst->
f32;
412 float* sp = src->
f32;
418 ui32 l_width = (width + (even ? 1 : 0)) >> 1;
419 ui32 h_width = (width + (even ? 0 : 1)) >> 1;
421 for (
ui32 j = num_steps; j > 0; --j)
428 __m256i va = _mm256_set1_epi32(a);
429 __m256i vb = _mm256_set1_epi32(b);
433 lp[l_width] = lp[l_width - 1];
439 int i = (int)h_width;
442 for (; i > 0; i -= 8, sp += 8, dp += 8)
444 __m256i s1 = _mm256_load_si256((__m256i*)sp);
445 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
446 __m256i d = _mm256_load_si256((__m256i*)dp);
447 __m256i t = _mm256_add_epi32(s1, s2);
448 __m256i v = _mm256_add_epi32(vb, t);
449 __m256i w = _mm256_srai_epi32(v, e);
450 d = _mm256_add_epi32(d, w);
451 _mm256_store_si256((__m256i*)dp, d);
456 for (; i > 0; i -= 8, sp += 8, dp += 8)
458 __m256i s1 = _mm256_load_si256((__m256i*)sp);
459 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
460 __m256i d = _mm256_load_si256((__m256i*)dp);
461 __m256i t = _mm256_add_epi32(s1, s2);
462 __m256i v = _mm256_add_epi32(vb, t);
463 __m256i w = _mm256_srai_epi32(v, e);
464 d = _mm256_add_epi32(d, w);
465 _mm256_store_si256((__m256i*)dp, d);
469 else if (a == -1 && b == 1 && e == 1)
471 int i = (int)h_width;
473 for (; i > 0; i -= 8, sp += 8, dp += 8)
475 __m256i s1 = _mm256_load_si256((__m256i*)sp);
476 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
477 __m256i d = _mm256_load_si256((__m256i*)dp);
478 __m256i t = _mm256_add_epi32(s1, s2);
479 __m256i w = _mm256_srai_epi32(t, e);
480 d = _mm256_sub_epi32(d, w);
481 _mm256_store_si256((__m256i*)dp, d);
484 for (; i > 0; i -= 8, sp += 8, dp += 8)
486 __m256i s1 = _mm256_load_si256((__m256i*)sp);
487 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
488 __m256i d = _mm256_load_si256((__m256i*)dp);
489 __m256i t = _mm256_add_epi32(s1, s2);
490 __m256i w = _mm256_srai_epi32(t, e);
491 d = _mm256_sub_epi32(d, w);
492 _mm256_store_si256((__m256i*)dp, d);
497 int i = (int)h_width;
499 for (; i > 0; i -= 8, sp += 8, dp += 8)
501 __m256i s1 = _mm256_load_si256((__m256i*)sp);
502 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
503 __m256i d = _mm256_load_si256((__m256i*)dp);
504 __m256i t = _mm256_add_epi32(s1, s2);
505 __m256i v = _mm256_sub_epi32(vb, t);
506 __m256i w = _mm256_srai_epi32(v, e);
507 d = _mm256_add_epi32(d, w);
508 _mm256_store_si256((__m256i*)dp, d);
511 for (; i > 0; i -= 8, sp += 8, dp += 8)
513 __m256i s1 = _mm256_load_si256((__m256i*)sp);
514 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
515 __m256i d = _mm256_load_si256((__m256i*)dp);
516 __m256i t = _mm256_add_epi32(s1, s2);
517 __m256i v = _mm256_sub_epi32(vb, t);
518 __m256i w = _mm256_srai_epi32(v, e);
519 d = _mm256_add_epi32(d, w);
520 _mm256_store_si256((__m256i*)dp, d);
525 int i = (int)h_width;
527 for (; i > 0; i -= 8, sp += 8, dp += 8)
529 __m256i s1 = _mm256_load_si256((__m256i*)sp);
530 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
531 __m256i d = _mm256_load_si256((__m256i*)dp);
532 __m256i t = _mm256_add_epi32(s1, s2);
533 __m256i u = _mm256_mullo_epi32(va, t);
534 __m256i v = _mm256_add_epi32(vb, u);
535 __m256i w = _mm256_srai_epi32(v, e);
536 d = _mm256_add_epi32(d, w);
537 _mm256_store_si256((__m256i*)dp, d);
540 for (; i > 0; i -= 8, sp += 8, dp += 8)
542 __m256i s1 = _mm256_load_si256((__m256i*)sp);
543 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
544 __m256i d = _mm256_load_si256((__m256i*)dp);
545 __m256i t = _mm256_add_epi32(s1, s2);
546 __m256i u = _mm256_mullo_epi32(va, t);
547 __m256i v = _mm256_add_epi32(vb, u);
548 __m256i w = _mm256_srai_epi32(v, e);
549 d = _mm256_add_epi32(d, w);
550 _mm256_store_si256((__m256i*)dp, d);
555 si32* t = lp; lp = hp; hp = t;
557 ui32 w = l_width; l_width = h_width; h_width = w;
562 ldst->
i32[0] = src->
i32[0];
564 hdst->
i32[0] = src->
i32[0] << 1;
572 ui32 width,
bool even)
578 double* dpl = (
double*)(even ? ldst->
p : hdst->
p);
579 double* dph = (
double*)(even ? hdst->
p : ldst->
p);
580 double* sp = (
double*)src->
p;
586 ui32 l_width = (width + (even ? 1 : 0)) >> 1;
587 ui32 h_width = (width + (even ? 0 : 1)) >> 1;
589 for (
ui32 j = num_steps; j > 0; --j)
596 __m256i vb = _mm256_set1_epi64x(b);
597 __m256i ve = _mm256_set1_epi64x(1LL << (63 - e));
601 lp[l_width] = lp[l_width - 1];
607 int i = (int)h_width;
610 for (; i > 0; i -= 4, sp += 4, dp += 4)
612 __m256i s1 = _mm256_load_si256((__m256i*)sp);
613 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
614 __m256i d = _mm256_load_si256((__m256i*)dp);
615 __m256i t = _mm256_add_epi64(s1, s2);
616 __m256i v = _mm256_add_epi64(vb, t);
618 d = _mm256_add_epi64(d, w);
619 _mm256_store_si256((__m256i*)dp, d);
624 for (; i > 0; i -= 4, sp += 4, dp += 4)
626 __m256i s1 = _mm256_load_si256((__m256i*)sp);
627 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
628 __m256i d = _mm256_load_si256((__m256i*)dp);
629 __m256i t = _mm256_add_epi64(s1, s2);
630 __m256i v = _mm256_add_epi64(vb, t);
632 d = _mm256_add_epi64(d, w);
633 _mm256_store_si256((__m256i*)dp, d);
637 else if (a == -1 && b == 1 && e == 1)
639 int i = (int)h_width;
641 for (; i > 0; i -= 4, sp += 4, dp += 4)
643 __m256i s1 = _mm256_load_si256((__m256i*)sp);
644 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
645 __m256i d = _mm256_load_si256((__m256i*)dp);
646 __m256i t = _mm256_add_epi64(s1, s2);
648 d = _mm256_sub_epi64(d, w);
649 _mm256_store_si256((__m256i*)dp, d);
652 for (; i > 0; i -= 4, sp += 4, dp += 4)
654 __m256i s1 = _mm256_load_si256((__m256i*)sp);
655 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
656 __m256i d = _mm256_load_si256((__m256i*)dp);
657 __m256i t = _mm256_add_epi64(s1, s2);
659 d = _mm256_sub_epi64(d, w);
660 _mm256_store_si256((__m256i*)dp, d);
665 int i = (int)h_width;
667 for (; i > 0; i -= 4, sp += 4, dp += 4)
669 __m256i s1 = _mm256_load_si256((__m256i*)sp);
670 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
671 __m256i d = _mm256_load_si256((__m256i*)dp);
672 __m256i t = _mm256_add_epi64(s1, s2);
673 __m256i v = _mm256_sub_epi64(vb, t);
675 d = _mm256_add_epi64(d, w);
676 _mm256_store_si256((__m256i*)dp, d);
679 for (; i > 0; i -= 4, sp += 4, dp += 4)
681 __m256i s1 = _mm256_load_si256((__m256i*)sp);
682 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
683 __m256i d = _mm256_load_si256((__m256i*)dp);
684 __m256i t = _mm256_add_epi64(s1, s2);
685 __m256i v = _mm256_sub_epi64(vb, t);
687 d = _mm256_add_epi64(d, w);
688 _mm256_store_si256((__m256i*)dp, d);
696 for (
ui32 i = h_width; i > 0; --i, sp++, dp++)
697 *dp += (b + a * (sp[0] + sp[1])) >> e;
699 for (
ui32 i = h_width; i > 0; --i, sp++, dp++)
700 *dp += (b + a * (sp[-1] + sp[0])) >> e;
704 si64* t = lp; lp = hp; hp = t;
706 ui32 w = l_width; l_width = h_width; h_width = w;
711 ldst->
i64[0] = src->
i64[0];
713 hdst->
i64[0] = src->
i64[0] << 1;
741 ui32 width,
bool even)
747 ui32 aug_width = (width + (even ? 1 : 0)) >> 1;
748 ui32 oth_width = (width + (even ? 0 : 1)) >> 1;
750 for (
ui32 j = 0; j < num_steps; ++j)
756 __m256i va = _mm256_set1_epi32(a);
757 __m256i vb = _mm256_set1_epi32(b);
761 oth[oth_width] = oth[oth_width - 1];
763 const si32* sp = oth;
767 int i = (int)aug_width;
770 for (; i > 0; i -= 8, sp += 8, dp += 8)
772 __m256i s1 = _mm256_load_si256((__m256i*)sp);
773 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
774 __m256i d = _mm256_load_si256((__m256i*)dp);
775 __m256i t = _mm256_add_epi32(s1, s2);
776 __m256i v = _mm256_add_epi32(vb, t);
777 __m256i w = _mm256_srai_epi32(v, e);
778 d = _mm256_sub_epi32(d, w);
779 _mm256_store_si256((__m256i*)dp, d);
784 for (; i > 0; i -= 8, sp += 8, dp += 8)
786 __m256i s1 = _mm256_load_si256((__m256i*)sp);
787 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
788 __m256i d = _mm256_load_si256((__m256i*)dp);
789 __m256i t = _mm256_add_epi32(s1, s2);
790 __m256i v = _mm256_add_epi32(vb, t);
791 __m256i w = _mm256_srai_epi32(v, e);
792 d = _mm256_sub_epi32(d, w);
793 _mm256_store_si256((__m256i*)dp, d);
797 else if (a == -1 && b == 1 && e == 1)
799 int i = (int)aug_width;
801 for (; i > 0; i -= 8, sp += 8, dp += 8)
803 __m256i s1 = _mm256_load_si256((__m256i*)sp);
804 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
805 __m256i d = _mm256_load_si256((__m256i*)dp);
806 __m256i t = _mm256_add_epi32(s1, s2);
807 __m256i w = _mm256_srai_epi32(t, e);
808 d = _mm256_add_epi32(d, w);
809 _mm256_store_si256((__m256i*)dp, d);
812 for (; i > 0; i -= 8, sp += 8, dp += 8)
814 __m256i s1 = _mm256_load_si256((__m256i*)sp);
815 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
816 __m256i d = _mm256_load_si256((__m256i*)dp);
817 __m256i t = _mm256_add_epi32(s1, s2);
818 __m256i w = _mm256_srai_epi32(t, e);
819 d = _mm256_add_epi32(d, w);
820 _mm256_store_si256((__m256i*)dp, d);
825 int i = (int)aug_width;
827 for (; i > 0; i -= 8, sp += 8, dp += 8)
829 __m256i s1 = _mm256_load_si256((__m256i*)sp);
830 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
831 __m256i d = _mm256_load_si256((__m256i*)dp);
832 __m256i t = _mm256_add_epi32(s1, s2);
833 __m256i v = _mm256_sub_epi32(vb, t);
834 __m256i w = _mm256_srai_epi32(v, e);
835 d = _mm256_sub_epi32(d, w);
836 _mm256_store_si256((__m256i*)dp, d);
839 for (; i > 0; i -= 8, sp += 8, dp += 8)
841 __m256i s1 = _mm256_load_si256((__m256i*)sp);
842 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
843 __m256i d = _mm256_load_si256((__m256i*)dp);
844 __m256i t = _mm256_add_epi32(s1, s2);
845 __m256i v = _mm256_sub_epi32(vb, t);
846 __m256i w = _mm256_srai_epi32(v, e);
847 d = _mm256_sub_epi32(d, w);
848 _mm256_store_si256((__m256i*)dp, d);
853 int i = (int)aug_width;
855 for (; i > 0; i -= 8, sp += 8, dp += 8)
857 __m256i s1 = _mm256_load_si256((__m256i*)sp);
858 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
859 __m256i d = _mm256_load_si256((__m256i*)dp);
860 __m256i t = _mm256_add_epi32(s1, s2);
861 __m256i u = _mm256_mullo_epi32(va, t);
862 __m256i v = _mm256_add_epi32(vb, u);
863 __m256i w = _mm256_srai_epi32(v, e);
864 d = _mm256_sub_epi32(d, w);
865 _mm256_store_si256((__m256i*)dp, d);
868 for (; i > 0; i -= 8, sp += 8, dp += 8)
870 __m256i s1 = _mm256_load_si256((__m256i*)sp);
871 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
872 __m256i d = _mm256_load_si256((__m256i*)dp);
873 __m256i t = _mm256_add_epi32(s1, s2);
874 __m256i u = _mm256_mullo_epi32(va, t);
875 __m256i v = _mm256_add_epi32(vb, u);
876 __m256i w = _mm256_srai_epi32(v, e);
877 d = _mm256_sub_epi32(d, w);
878 _mm256_store_si256((__m256i*)dp, d);
883 si32* t = aug; aug = oth; oth = t;
885 ui32 w = aug_width; aug_width = oth_width; oth_width = w;
890 float* dp = dst->
f32;
891 float* spl = even ? lsrc->
f32 : hsrc->
f32;
892 float* sph = even ? hsrc->
f32 : lsrc->
f32;
899 dst->
i32[0] = lsrc->
i32[0];
901 dst->
i32[0] = hsrc->
i32[0] >> 1;
909 ui32 width,
bool even)
915 ui32 aug_width = (width + (even ? 1 : 0)) >> 1;
916 ui32 oth_width = (width + (even ? 0 : 1)) >> 1;
918 for (
ui32 j = 0; j < num_steps; ++j)
924 __m256i vb = _mm256_set1_epi64x(b);
925 __m256i ve = _mm256_set1_epi64x(1LL << (63 - e));
929 oth[oth_width] = oth[oth_width - 1];
931 const si64* sp = oth;
935 int i = (int)aug_width;
938 for (; i > 0; i -= 4, sp += 4, dp += 4)
940 __m256i s1 = _mm256_load_si256((__m256i*)sp);
941 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
942 __m256i d = _mm256_load_si256((__m256i*)dp);
943 __m256i t = _mm256_add_epi64(s1, s2);
944 __m256i v = _mm256_add_epi64(vb, t);
946 d = _mm256_sub_epi64(d, w);
947 _mm256_store_si256((__m256i*)dp, d);
952 for (; i > 0; i -= 4, sp += 4, dp += 4)
954 __m256i s1 = _mm256_load_si256((__m256i*)sp);
955 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
956 __m256i d = _mm256_load_si256((__m256i*)dp);
957 __m256i t = _mm256_add_epi64(s1, s2);
958 __m256i v = _mm256_add_epi64(vb, t);
960 d = _mm256_sub_epi64(d, w);
961 _mm256_store_si256((__m256i*)dp, d);
965 else if (a == -1 && b == 1 && e == 1)
967 int i = (int)aug_width;
969 for (; i > 0; i -= 4, sp += 4, dp += 4)
971 __m256i s1 = _mm256_load_si256((__m256i*)sp);
972 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
973 __m256i d = _mm256_load_si256((__m256i*)dp);
974 __m256i t = _mm256_add_epi64(s1, s2);
976 d = _mm256_add_epi64(d, w);
977 _mm256_store_si256((__m256i*)dp, d);
980 for (; i > 0; i -= 4, sp += 4, dp += 4)
982 __m256i s1 = _mm256_load_si256((__m256i*)sp);
983 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
984 __m256i d = _mm256_load_si256((__m256i*)dp);
985 __m256i t = _mm256_add_epi64(s1, s2);
987 d = _mm256_add_epi64(d, w);
988 _mm256_store_si256((__m256i*)dp, d);
993 int i = (int)aug_width;
995 for (; i > 0; i -= 4, sp += 4, dp += 4)
997 __m256i s1 = _mm256_load_si256((__m256i*)sp);
998 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp - 1));
999 __m256i d = _mm256_load_si256((__m256i*)dp);
1000 __m256i t = _mm256_add_epi64(s1, s2);
1001 __m256i v = _mm256_sub_epi64(vb, t);
1003 d = _mm256_sub_epi64(d, w);
1004 _mm256_store_si256((__m256i*)dp, d);
1007 for (; i > 0; i -= 4, sp += 4, dp += 4)
1009 __m256i s1 = _mm256_load_si256((__m256i*)sp);
1010 __m256i s2 = _mm256_loadu_si256((__m256i*)(sp + 1));
1011 __m256i d = _mm256_load_si256((__m256i*)dp);
1012 __m256i t = _mm256_add_epi64(s1, s2);
1013 __m256i v = _mm256_sub_epi64(vb, t);
1015 d = _mm256_sub_epi64(d, w);
1016 _mm256_store_si256((__m256i*)dp, d);
1024 for (
ui32 i = aug_width; i > 0; --i, sp++, dp++)
1025 *dp -= (b + a * (sp[-1] + sp[0])) >> e;
1027 for (
ui32 i = aug_width; i > 0; --i, sp++, dp++)
1028 *dp -= (b + a * (sp[0] + sp[1])) >> e;
1032 si64* t = aug; aug = oth; oth = t;
1034 ui32 w = aug_width; aug_width = oth_width; oth_width = w;
1039 double* dp = (
double*)dst->
p;
1040 double* spl = (
double*)(even ? lsrc->
p : hsrc->
p);
1041 double* sph = (
double*)(even ? hsrc->
p : lsrc->
p);
1048 dst->
i64[0] = lsrc->
i64[0];
1050 dst->
i64[0] = hsrc->
i64[0] >> 1;