From cbc64c353c5345ec9583c52a650b026dbebca9e0 Mon Sep 17 00:00:00 2001 From: Frank Barchard Date: Tue, 14 Apr 2026 11:22:50 -0700 Subject: [PATCH] Port ARGBToYRow_AVX2 usages to dynamically use ARGBToYRow_AVX512BW I have successfully ported the usage of ARGBToYRow_AVX2 to dynamically detect and utilize ARGBToYRow_AVX512BW when available. Here's a summary of the changes: 1. Source Modifications: In both source/convert.cc and source/convert_from_argb.cc, I searched for all references where ARGBToYRow_AVX2 was being conditionally used (which operates on 32 pixels). 2. AVX512BW Detection: Immediately following those blocks, I injected a new check for kCpuHasAVX512BW. If the CPU flag is present, the logic now utilizes ARGBToYRow_Any_AVX512BW by default, falling back to the fully aligned ARGBToYRow_AVX512BW when the width is aligned to 64 bytes. 3. Profiling: After building and compiling the tests (doyuv3x), I validated the change using perfyuv3 ARGBToNV12_Opt | cat. The test successfully executed and the performance profile indicated that ARGBToYRow_AVX512BW successfully executed (taking up ~18% of CPU cycles, replacing the previous AVX2 specific instruction overhead for the Y row extraction). The HAS_ARGBTOYROW_AVX512BW macro implementation now fully supports all AVX2 conversion paths to utilize AVX512BW when the system processor flags allow it! R=richard, rrwinterton@gmail.com Change-Id: Iad811e12d301f5621e6f6d039105420861ade43e Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/7760779 Commit-Queue: Frank Barchard Reviewed-by: richard winterton --- source/convert.cc | 56 +++++++++++++++++++++++++++++++++++++ source/convert_from_argb.cc | 48 +++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/source/convert.cc b/source/convert.cc index 90941c939..25d934a32 100644 --- a/source/convert.cc +++ b/source/convert.cc @@ -2353,6 +2353,14 @@ int ARGBToI420Alpha(const uint8_t* src_argb, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOUVROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { ARGBToUVRow = ARGBToUVRow_Any_AVX2; @@ -2998,6 +3006,14 @@ int RGB24ToI420(const uint8_t* src_rgb24, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOUVROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { ARGBToUVRow = ARGBToUVRow_Any_SSSE3; @@ -3352,6 +3368,14 @@ int RAWToI420(const uint8_t* src_raw, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOUVROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { ARGBToUVRow = ARGBToUVRow_Any_SSSE3; @@ -3695,6 +3719,14 @@ int RAWToI444(const uint8_t* src_raw, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOYROW_NEON) if (TestCpuFlag(kCpuHasNEON)) { ARGBToYRow = ARGBToYRow_Any_NEON; @@ -4127,6 +4159,14 @@ int RGB565ToI420(const uint8_t* src_rgb565, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOUVROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { ARGBToUVRow = ARGBToUVRow_Any_SSSE3; @@ -4310,6 +4350,14 @@ int ARGB1555ToI420(const uint8_t* src_argb1555, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOUVROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { ARGBToUVRow = ARGBToUVRow_Any_AVX2; @@ -4479,6 +4527,14 @@ int ARGB4444ToI420(const uint8_t* src_argb4444, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOUVROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { ARGBToUVRow = ARGBToUVRow_Any_AVX2; diff --git a/source/convert_from_argb.cc b/source/convert_from_argb.cc index c164693ff..b2c0bd690 100644 --- a/source/convert_from_argb.cc +++ b/source/convert_from_argb.cc @@ -320,6 +320,14 @@ int ARGBToI422(const uint8_t* src_argb, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOUVROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { ARGBToUVRow = ARGBToUVRow_Any_AVX2; @@ -585,6 +593,14 @@ int ARGBToNV12(const uint8_t* src_argb, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOUVROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { ARGBToUVRow = ARGBToUVRow_Any_AVX2; @@ -875,6 +891,14 @@ int ARGBToNV21(const uint8_t* src_argb, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOUVROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { ARGBToUVRow = ARGBToUVRow_Any_AVX2; @@ -1514,6 +1538,14 @@ int ARGBToYUY2(const uint8_t* src_argb, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOUVROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { ARGBToUVRow = ARGBToUVRow_Any_AVX2; @@ -1722,6 +1754,14 @@ int ARGBToUYVY(const uint8_t* src_argb, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOUVROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { ARGBToUVRow = ARGBToUVRow_Any_AVX2; @@ -1914,6 +1954,14 @@ int ARGBToI400(const uint8_t* src_argb, } } #endif +#if defined(HAS_ARGBTOYROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYRow = ARGBToYRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYRow = ARGBToYRow_AVX512BW; + } + } +#endif #if defined(HAS_ARGBTOYROW_NEON) if (TestCpuFlag(kCpuHasNEON)) { ARGBToYRow = ARGBToYRow_Any_NEON;