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 | void ff_shuffle_bytes_2130_avx2(const uint8_t *src, uint8_t *dst, int src_size); | 2364 | void ff_shuffle_bytes_2130_avx2(const uint8_t *src, uint8_t *dst, int src_size); |
| 2365 | void ff_shuffle_bytes_1203_avx2(const uint8_t *src, uint8_t *dst, int src_size); | 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 | void ff_uyvytoyuv422_sse2(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, | 2377 | void ff_uyvytoyuv422_sse2(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, |
| 2368 | const uint8_t *src, int width, int height, | 2378 | const uint8_t *src, int width, int height, |
| 2369 | int lumStride, int chromStride, int srcStride); | 2379 | int lumStride, int chromStride, int srcStride); |
| @@ -2454,6 +2464,17 @@ av_cold void rgb2rgb_init_x86(void) · 84 unmodified lines | |||
| 2454 | shuffle_bytes_2130 = ff_shuffle_bytes_2130_avx2; | 2464 | shuffle_bytes_2130 = ff_shuffle_bytes_2130_avx2; |
| 2455 | shuffle_bytes_1203 = ff_shuffle_bytes_1203_avx2; | 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 | if (EXTERNAL_AVX2_FAST(cpu_flags)) { | 2478 | if (EXTERNAL_AVX2_FAST(cpu_flags)) { |
| 2458 | uyvytoyuv422 = ff_uyvytoyuv422_avx2; | 2479 | uyvytoyuv422 = ff_uyvytoyuv422_avx2; |
| 2459 | #endif | 2480 | #endif |
| @@ -57,40 +57,53 @@ SECTION .text · 56 unmodified lines | |||
| 57 | %macro SHUFFLE_BYTES 4 | 57 | %macro SHUFFLE_BYTES 4 |
| 58 | cglobal shuffle_bytes_%1%2%3%4, 3, 5, 2, src, dst, w, tmp, x | 58 | cglobal shuffle_bytes_%1%2%3%4, 3, 5, 2, src, dst, w, tmp, x |
| 59 | VBROADCASTI128 m0, [pb_shuffle%1%2%3%4] | 59 | VBROADCASTI128 m0, [pb_shuffle%1%2%3%4] |
| 60 | movsxdifnidn wq, wd | 60 | movsxdifnidn wq, wd |
| 61 | mov xq, wq | 61 | mov xq, wq |
| 62 | 62 | ||
| 63 | add srcq, wq | 63 | add srcq, wq |
| 64 | add dstq, wq | 64 | add dstq, wq |
| 65 | neg wq | 65 | neg wq |
| 66 | 66 | ||
| 67 | ;calc scalar loop | 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 | and xq, mmsize-4 | 80 | and xq, mmsize-4 |
| 69 | je .loop_simd | 81 | je .loop_simd |
| 70 | 82 | ||
| 71 | .loop_scalar: | 83 | .loop_scalar: |
| 72 | mov tmpb, [srcq + wq + %1] | 84 | mov tmpb, [srcq + wq + %1] |
| 73 | mov [dstq+wq + 0], tmpb | 85 | mov [dstq+wq + 0], tmpb |
| 74 | mov tmpb, [srcq + wq + %2] | 86 | mov tmpb, [srcq + wq + %2] |
| 75 | mov [dstq+wq + 1], tmpb | 87 | mov [dstq+wq + 1], tmpb |
| 76 | mov tmpb, [srcq + wq + %3] | 88 | mov tmpb, [srcq + wq + %3] |
| 77 | mov [dstq+wq + 2], tmpb | 89 | mov [dstq+wq + 2], tmpb |
| 78 | mov tmpb, [srcq + wq + %4] | 90 | mov tmpb, [srcq + wq + %4] |
| 79 | mov [dstq+wq + 3], tmpb | 91 | mov [dstq+wq + 3], tmpb |
| 80 | add wq, 4 | 92 | add wq, 4 |
| 81 | sub xq, 4 | 93 | sub xq, 4 |
| 82 | jg .loop_scalar | 94 | jg .loop_scalar |
| 83 | 95 | %endif | |
| 84 | ;check if src_size < mmsize | 96 | |
| 85 | cmp wq, 0 | 97 | ;check if src_size < mmsize |
| 86 | jge .end | 98 | cmp wq, 0 |
| 87 | 99 | jge .end | |
| 88 | .loop_simd: | 100 | |
| 89 | movu m1, [srcq+wq] | 101 | .loop_simd: |
| 90 | pshufb m1, m0 | 102 | movu m1, [srcq + wq] |
| 91 | movu [dstq+wq], m1 | 103 | pshufb m1, m0 |
| 92 | add wq, mmsize | 104 | movu [dstq + wq], m1 |
| 93 | jl .loop_simd | 105 | add wq, mmsize |
| 106 | jl .loop_simd | ||
| 94 | 107 | ||
| 95 | .end: | 108 | .end: |
| 96 | RET | 109 | RET |
| @@ -122,6 +135,21 @@ SHUFFLE_BYTES 1, 2, 0, 3 · 25 unmodified lines | |||
| 122 | %endif | 135 | %endif |
| 123 | %endif | 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 | ; uyvytoyuv422(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, | 154 | ; uyvytoyuv422(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, |
| 127 | ; const uint8_t *src, int width, int height, | 155 | ; const uint8_t *src, int width, int height, |