On a AMD 7950x Zen 4 shuffle_bytes_0321_c: 56.5 ( 1.00x) shuffle_bytes_0321_ssse3: 15.2 ( 3.70x) shuffle_bytes_0321_avx2: 10.2 ( 5.51x) shuffle_bytes_0321_avx512icl: 9.2 ( 6.11x) shuffle_bytes_1230_c: 84.5 ( 1.00x) shuffle_bytes_1230_ssse3: 14.2 ( 5.93x) shuffle_bytes_1230_avx2: 15.2 ( 5.54x) shuffle_bytes_1230_avx512icl: 11.2 ( 7.51x) shuffle_bytes_2103_c: 48.5 ( 1.00x) shuffle_bytes_2103_ssse3: 21.2 ( 2.28x) shuffle_bytes_2103_avx2: 13.8 ( 3.53x) shuffle_bytes_2103_avx512icl: 9.2 ( 5.24x) shuffle_bytes_3012_c: 84.5 ( 1.00x) shuffle_bytes_3012_ssse3: 14.2 ( 5.93x) shuffle_bytes_3012_avx2: 16.2 ( 5.20x) shuffle_bytes_3012_avx512icl: 10.2 ( 8.24x) shuffle_bytes_3210_c: 89.2 ( 1.00x) shuffle_bytes_3210_ssse3: 24.2 ( 3.68x) shuffle_bytes_3210_avx2: 16.2 ( 5.49x) shuffle_bytes_3210_avx512icl: 9.2 ( 9.65x)
Unified · Split
| @@ -2364,6 +2364,16 @@ void ff_shuffle_bytes_2013_avx2(const uint8_t *src, uint8_t *dst, int src_size); · 2363 unmodified lines | ||
| 2364 | 2364 | void ff_shuffle_bytes_2130_avx2(const uint8_t *src, uint8_t *dst, int src_size); |
| 2365 | 2365 | void ff_shuffle_bytes_1203_avx2(const uint8_t *src, uint8_t *dst, int src_size); |
| 2366 | 2366 | |
| 2367 | +void ff_shuffle_bytes_2103_avx512icl(const uint8_t *src, uint8_t *dst, int src_size); | |
| 2368 | +void ff_shuffle_bytes_0321_avx512icl(const uint8_t *src, uint8_t *dst, int src_size); | |
| 2369 | +void ff_shuffle_bytes_1230_avx512icl(const uint8_t *src, uint8_t *dst, int src_size); | |
| 2370 | +void ff_shuffle_bytes_3012_avx512icl(const uint8_t *src, uint8_t *dst, int src_size); | |
| 2371 | +void ff_shuffle_bytes_3210_avx512icl(const uint8_t *src, uint8_t *dst, int src_size); | |
| 2372 | +void ff_shuffle_bytes_3102_avx512icl(const uint8_t *src, uint8_t *dst, int src_size); | |
| 2373 | +void ff_shuffle_bytes_2013_avx512icl(const uint8_t *src, uint8_t *dst, int src_size); | |
| 2374 | +void ff_shuffle_bytes_2130_avx512icl(const uint8_t *src, uint8_t *dst, int src_size); | |
| 2375 | +void ff_shuffle_bytes_1203_avx512icl(const uint8_t *src, uint8_t *dst, int src_size); | |
| 2376 | + | |
| 2367 | 2377 | void ff_uyvytoyuv422_sse2(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, |
| 2368 | 2378 | const uint8_t *src, int width, int height, |
| 2369 | 2379 | int lumStride, int chromStride, int srcStride); |
| @@ -2454,6 +2464,17 @@ av_cold void rgb2rgb_init_x86(void) · 84 unmodified lines | ||
| 2454 | 2464 | shuffle_bytes_2130 = ff_shuffle_bytes_2130_avx2; |
| 2455 | 2465 | shuffle_bytes_1203 = ff_shuffle_bytes_1203_avx2; |
| 2456 | 2466 | } |
| 2467 | + if (EXTERNAL_AVX512ICL(cpu_flags)) { | |
| 2468 | + shuffle_bytes_0321 = ff_shuffle_bytes_0321_avx512icl; | |
| 2469 | + shuffle_bytes_2103 = ff_shuffle_bytes_2103_avx512icl; | |
| 2470 | + shuffle_bytes_1230 = ff_shuffle_bytes_1230_avx512icl; | |
| 2471 | + shuffle_bytes_3012 = ff_shuffle_bytes_3012_avx512icl; | |
| 2472 | + shuffle_bytes_3210 = ff_shuffle_bytes_3210_avx512icl; | |
| 2473 | + shuffle_bytes_3102 = ff_shuffle_bytes_3102_avx512icl; | |
| 2474 | + shuffle_bytes_2013 = ff_shuffle_bytes_2013_avx512icl; | |
| 2475 | + shuffle_bytes_2130 = ff_shuffle_bytes_2130_avx512icl; | |
| 2476 | + shuffle_bytes_1203 = ff_shuffle_bytes_1203_avx512icl; | |
| 2477 | + } | |
| 2457 | 2478 | if (EXTERNAL_AVX2_FAST(cpu_flags)) { |
| 2458 | 2479 | uyvytoyuv422 = ff_uyvytoyuv422_avx2; |
| 2459 | 2480 | #endif |
| @@ -57,40 +57,53 @@ SECTION .text · 56 unmodified lines | ||
| 57 | 57 | %macro SHUFFLE_BYTES 4 |
| 58 | 58 | cglobal shuffle_bytes_%1%2%3%4, 3, 5, 2, src, dst, w, tmp, x |
| 59 | 59 | VBROADCASTI128 m0, [pb_shuffle%1%2%3%4] |
| 60 | − movsxdifnidn wq, wd | |
| 61 | − mov xq, wq | |
| 62 | − | |
| 63 | − add srcq, wq | |
| 64 | − add dstq, wq | |
| 65 | − neg wq | |
| 66 | − | |
| 67 | −;calc scalar loop | |
| 60 | + movsxdifnidn wq, wd | |
| 61 | + mov xq, wq | |
| 62 | + | |
| 63 | + add srcq, wq | |
| 64 | + add dstq, wq | |
| 65 | + neg wq | |
| 66 | + | |
| 67 | +%if mmsize == 64 | |
| 68 | + and xq, mmsize - 4 | |
| 69 | + shr xq, 2 | |
| 70 | + mov tmpd, -1 | |
| 71 | + shlx tmpd, tmpd, xd | |
| 72 | + not tmpd | |
| 73 | + kmovw k7, tmpd | |
| 74 | + vmovdqu32 m1{k7}{z}, [srcq + wq] | |
| 75 | + pshufb m1, m0 | |
| 76 | + vmovdqu32 [dstq + wq]{k7}, m1 | |
| 77 | + lea wq, [wq + 4 * xq] | |
| 78 | +%else | |
| 79 | + ;calc scalar loop | |
| 68 | 80 | and xq, mmsize-4 |
| 69 | 81 | je .loop_simd |
| 70 | 82 | |
| 71 | −.loop_scalar: | |
| 72 | − mov tmpb, [srcq + wq + %1] | |
| 73 | − mov [dstq+wq + 0], tmpb | |
| 74 | − mov tmpb, [srcq + wq + %2] | |
| 75 | − mov [dstq+wq + 1], tmpb | |
| 76 | − mov tmpb, [srcq + wq + %3] | |
| 77 | − mov [dstq+wq + 2], tmpb | |
| 78 | − mov tmpb, [srcq + wq + %4] | |
| 79 | − mov [dstq+wq + 3], tmpb | |
| 80 | − add wq, 4 | |
| 81 | − sub xq, 4 | |
| 82 | − jg .loop_scalar | |
| 83 | − | |
| 84 | −;check if src_size < mmsize | |
| 85 | −cmp wq, 0 | |
| 86 | −jge .end | |
| 87 | − | |
| 88 | −.loop_simd: | |
| 89 | − movu m1, [srcq+wq] | |
| 90 | − pshufb m1, m0 | |
| 91 | − movu [dstq+wq], m1 | |
| 92 | − add wq, mmsize | |
| 93 | − jl .loop_simd | |
| 83 | + .loop_scalar: | |
| 84 | + mov tmpb, [srcq + wq + %1] | |
| 85 | + mov [dstq+wq + 0], tmpb | |
| 86 | + mov tmpb, [srcq + wq + %2] | |
| 87 | + mov [dstq+wq + 1], tmpb | |
| 88 | + mov tmpb, [srcq + wq + %3] | |
| 89 | + mov [dstq+wq + 2], tmpb | |
| 90 | + mov tmpb, [srcq + wq + %4] | |
| 91 | + mov [dstq+wq + 3], tmpb | |
| 92 | + add wq, 4 | |
| 93 | + sub xq, 4 | |
| 94 | + jg .loop_scalar | |
| 95 | +%endif | |
| 96 | + | |
| 97 | + ;check if src_size < mmsize | |
| 98 | + cmp wq, 0 | |
| 99 | + jge .end | |
| 100 | + | |
| 101 | + .loop_simd: | |
| 102 | + movu m1, [srcq + wq] | |
| 103 | + pshufb m1, m0 | |
| 104 | + movu [dstq + wq], m1 | |
| 105 | + add wq, mmsize | |
| 106 | + jl .loop_simd | |
| 94 | 107 | |
| 95 | 108 | .end: |
| 96 | 109 | RET |
| @@ -122,6 +135,21 @@ SHUFFLE_BYTES 1, 2, 0, 3 · 25 unmodified lines | ||
| 122 | 135 | %endif |
| 123 | 136 | %endif |
| 124 | 137 | |
| 138 | +%if ARCH_X86_64 | |
| 139 | +%if HAVE_AVX512ICL_EXTERNAL | |
| 140 | +INIT_ZMM avx512icl | |
| 141 | +SHUFFLE_BYTES 2, 1, 0, 3 | |
| 142 | +SHUFFLE_BYTES 0, 3, 2, 1 | |
| 143 | +SHUFFLE_BYTES 1, 2, 3, 0 | |
| 144 | +SHUFFLE_BYTES 3, 0, 1, 2 | |
| 145 | +SHUFFLE_BYTES 3, 2, 1, 0 | |
| 146 | +SHUFFLE_BYTES 3, 1, 0, 2 | |
| 147 | +SHUFFLE_BYTES 2, 0, 1, 3 | |
| 148 | +SHUFFLE_BYTES 2, 1, 3, 0 | |
| 149 | +SHUFFLE_BYTES 1, 2, 0, 3 | |
| 150 | +%endif | |
| 151 | +%endif | |
| 152 | + | |
| 125 | 153 | ;----------------------------------------------------------------------------------------------- |
| 126 | 154 | ; uyvytoyuv422(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, |
| 127 | 155 | ; const uint8_t *src, int width, int height, |