mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2026-11-09 14:49:57 +08:00
Upgrade all remaining SSE2 and SSSE3 max-ISA kernels across row, scale,
rotate, and compare to AVX2 while removing superseded pre-AVX2 versions.
Implement AVX2 for ARGBDetectRow, HalfRow, HalfRow_16,
HalfWidthRow_16To8_Odd, AYUVTo{Y,UV,VU}Row, AR30To{ARGB,ABGR,AB30}Row,
and TransposeWx8_16, and port all remaining Arm NEON (or higher) kernels
to AVX2 (TransposeWxH_32, ScaleRowDown2*_16, ScaleUVRowDown2*,
ScaleUVRowDownEven, ScaleColsUp2, GaussCol*, Scale*Samples, and
UnpackMT2T).
Port 32-bit x86 (-m32 -fPIC) inline assembly across row_gcc.cc,
rotate_gcc.cc, and compare_gcc.cc (including 5-GPR PIC support for
I422ToAR30Row and I444/I422/I210/I410AlphaToARGBRow) so x86_32 matches
x64 SIMD coverage across all 187 supported row/rotate/compare kernels.
Handle 1..7 remainder elements directly in inline assembly without
calling *_C in ARGBDetectRow_AVX2, ARGBSepiaRow_AVX2,
ARGBColorMatrixRow_AVX2, ARGBQuantizeRow_AVX2, ARGBShadeRow_AVX2,
ARGBAffineRow_AVX2, GaussRow*_AVX2, GaussCol*_AVX2, and
*ColorTableRow_AVX2. Fix unsigned 16-bit packing in
ScaleRowUp2_{Linear,Bilinear}_16_SSE2.
Add 64-bit AVX-512 (AVX512BW, AVX512VBMI, and AVX512VNNI, including
SumSquareError_AVX512VNNI) implementations in *_gcc.cc and *_win.cc
wherever Arm64 exceeds NEON, and handle arbitrary tail widths via
opmasks in Mirror*_AVX512BW without _Any_ wrappers. Bring row_win.cc,
scale_win.cc, rotate_win.cc, and compare_win.cc C++ intrinsics (and
64-bit VISUALC_HAS_AVX2) to 100% parity with *_gcc.cc for MSVC and
MemorySanitizer.
Wire YUY2ToUVRow_HVX and UYVYToUVRow_HVX in YUY2ToI420 and UYVYToI420,
implement all 13 missing ScaleUV*_16_C kernels so UVScale_16 supports
downscaling and general upscaling, make Ssim8x8, TransposeWxH,
TransposeUVWxH, and TransposeWxH_16 static internal helpers, clean up
HAS_* guards, enable direct row unittests so all 279 *_C functions have
active test coverage, and add Intel AMX-TF32 (kCpuHasAMXTF32, CPUID
leaf 7 subleaf 1 EAX bit 4, LIBYUV_DISABLE_AMXTF32) detection.
Mark 16-bit RGB formats (RGB565, ARGB1555, and ARGB4444) and legacy
fixed-matrix 16-bit RGB-to-YUV row functions as deprecated in headers
and GEMINI.md, using two-step ARGB wrapper row functions in
row_common.cc.
AMD Zen 6 Benchmark (1280 width, 10000 iterations):
----------------------------------------------------------------
Function Before (ms) After (ms) Improvement
----------------------------------------------------------------
ARGB1555ToARGBRow 0.83 0.49 1.69x
ARGB1555ToUVRow 16.00 3.21 4.99x
ARGB1555ToYRow 7.82 1.38 5.66x
ARGB4444ToUVRow 15.04 2.58 5.83x
ARGB4444ToYRow 7.42 1.07 6.94x
ARGBAffineRow 3.51 2.75 1.28x
ARGBColorMatrixRow 4.09 1.13 3.63x
ARGBColorTableRow 11.21 8.93 1.26x
ARGBLumaColorTableRow 10.01 10.21 0.98x
ARGBQuantizeRow 2.23 1.21 1.84x
ARGBSepiaRow 3.29 0.81 4.04x
ARGBSetRow 0.21 0.21 1.02x
ARGBShadeRow 1.66 0.87 1.91x
ARGBToRGB565DitherRow 1.22 0.50 2.43x
ARGBToRGB565Row 1.09 0.44 2.47x
ByteToFloatRow 0.88 0.41 2.14x
Convert8To8Row 0.21 0.11 1.88x
CopyRow_16 0.11 0.11 0.97x
DetileRow 0.21 0.12 1.75x
DetileRow_16 0.23 0.14 1.67x
DetileSplitUVRow 0.29 0.21 1.38x
DivideRow_16 0.14 0.11 1.30x
GaussRow 3.29 1.27 2.59x
GaussRow_F32 1.93 0.89 2.17x
HalfFloatRow 1.16 0.74 1.57x
I210AlphaToARGBRow 1.83 0.92 2.00x
I210ToAR30Row 2.21 0.96 2.30x
I210ToARGBRow 1.75 0.87 2.00x
I212ToAR30Row 2.21 0.96 2.31x
I212ToARGBRow 1.75 0.87 2.01x
I410AlphaToARGBRow 1.73 0.86 2.00x
I410ToAR30Row 2.04 0.89 2.28x
I410ToARGBRow 1.64 0.82 2.00x
I422ToARGB1555Row 2.94 2.27 1.30x
I422ToARGB4444Row 2.94 2.27 1.29x
I422ToRGB565Row 2.63 1.27 2.07x
I422ToRGBARow 1.51 0.82 1.83x
I444AlphaToARGBRow 1.52 0.87 1.73x
I444ToARGBRow 1.48 0.81 1.82x
I444ToRGB24Row 2.13 0.72 2.98x
MergeUVRow_16 0.87 0.32 2.74x
P210ToAR30Row 1.77 0.70 2.54x
P210ToARGBRow 1.38 0.62 2.24x
P410ToAR30Row 1.94 0.85 2.28x
P410ToARGBRow 1.45 0.77 1.90x
RGB565ToUVRow 15.84 2.88 5.49x
RGB565ToYRow 7.82 1.22 6.42x
RGBColorTableRow 8.42 6.95 1.21x
SetRow 0.11 0.11 1.04x
SobelRow 0.80 0.43 1.87x
SobelToPlaneRow 0.27 0.12 2.25x
SobelXRow 1.58 0.85 1.85x
SobelXYRow 0.80 0.55 1.44x
SobelYRow 1.58 0.85 1.85x
UYVYToARGBRow 1.28 0.65 1.96x
UYVYToUVRow 0.38 0.21 1.78x
UYVYToYRow 0.21 0.11 1.87x
YUY2ToARGBRow 1.28 0.65 1.96x
YUY2ToUVRow 0.40 0.21 1.87x
YUY2ToYRow 0.21 0.11 1.88x
----------------------------------------------------------------
Row/Rotate/Compare SIMD ISA per *_C (* = uncalled in library):
------------------------------------------------------------------------
C Function arm64 x86_32 x64 row_win
------------------------------------------------------------------------
AB64ToARGBRow_C NEON AVX2 AVX2 AVX2
ABGRToAR30Row_C NEON AVX2 AVX512BW AVX512BW
AR30ToAB30Row_C NEON AVX2 AVX512BW AVX512BW
AR30ToABGRRow_C NEON AVX2 AVX512BW AVX512BW
AR30ToARGBRow_C NEON AVX2 AVX512BW AVX512BW
AR64ShuffleRow_C NEON AVX2 AVX512BW AVX512BW
AR64ToAB64Row_C NEON AVX2 AVX512BW AVX512BW
AR64ToARGBRow_C NEON AVX2 AVX2 AVX2
ARGB1555ToARGBRow_C SVE2 AVX2 AVX512BW AVX512BW
ARGB1555ToUVMatrixRow_C NEON AVX2 AVX2 AVX2
ARGB1555ToUVRow_C * NEON AVX2 AVX2 AVX2
ARGB1555ToYMatrixRow_C NEON AVX2 AVX2 AVX2
ARGB1555ToYRow_C * NEON AVX2 AVX2 AVX2
ARGB4444ToARGBRow_C NEON AVX2 AVX2 AVX2
ARGB4444ToUVMatrixRow_C NEON AVX2 AVX2 AVX2
ARGB4444ToUVRow_C * NEON AVX2 AVX2 AVX2
ARGB4444ToYMatrixRow_C NEON AVX2 AVX2 AVX2
ARGB4444ToYRow_C * NEON AVX2 AVX2 AVX2
ARGBAddRow_C NEON AVX2 AVX2 AVX2
ARGBAffineRow_C * NEON AVX2 AVX2 AVX2
ARGBAlphaBlendRow_C SME AVX2 AVX512BW AVX512BW
ARGBAttenuateRow_C NEON AVX2 AVX512BW AVX512BW
ARGBBlendRow_C NEON AVX2 AVX512BW AVX512BW
ARGBColorMatrixRow_C I8MM AVX2 AVX512VNNI AVX512VNNI
ARGBColorTableRow_C NEON AVX2 AVX2 AVX2
ARGBCopyAlphaRow_C NEON AVX2 AVX2 AVX2
ARGBCopyYToAlphaRow_C NEON AVX2 AVX512BW AVX512BW
ARGBDetectRow_C - AVX2 AVX2 AVX2
ARGBExtractAlphaRow_C NEON AVX2 AVX512BW AVX512BW
ARGBGrayRow_C DOTPROD AVX2 AVX512VNNI AVX512VNNI
ARGBLumaColorTableRow_C NEON AVX2 AVX2 AVX2
ARGBMirrorRow_C NEON AVX2 AVX512BW AVX512BW
ARGBMultiplyRow_C SME AVX2 AVX512BW AVX512BW
ARGBOrRow_C SME AVX2 AVX512BW AVX512BW
ARGBPolynomialRow_C NEON AVX2 AVX2 AVX2
ARGBQuantizeRow_C NEON AVX2 AVX2 AVX2
ARGBSepiaRow_C DOTPROD AVX2 AVX512VNNI AVX512VNNI
ARGBSetRow_C NEON AVX2 AVX2 AVX2
ARGBShadeRow_C NEON AVX2 AVX2 AVX2
ARGBShuffleRow_C NEON AVX2 AVX512BW AVX512BW
ARGBSubtractRow_C NEON AVX2 AVX2 AVX2
ARGBToAB64Row_C NEON AVX2 AVX2 AVX2
ARGBToABGRRow_C NEON AVX2 AVX512BW AVX512BW
ARGBToAR30Row_C NEON AVX2 AVX512BW AVX512BW
ARGBToAR64Row_C NEON AVX2 AVX2 AVX2
ARGBToARGB1555Row_C NEON AVX2 AVX2 AVX2
ARGBToARGB4444Row_C NEON AVX2 AVX2 AVX2
ARGBToBGRARow_C NEON AVX2 AVX512BW AVX512BW
ARGBToRAWRow_C SVE2 AVX2 AVX512BW AVX512BW
ARGBToRGB24Row_C SVE2 AVX2 AVX512BW AVX512BW
ARGBToRGB565DitherRow_C SVE2 AVX2 AVX512BW AVX512BW
ARGBToRGB565Row_C SVE2 AVX2 AVX512BW AVX512BW
ARGBToRGBARow_C NEON AVX2 AVX512BW AVX512BW
ARGBToUV444MatrixRow_C I8MM AVX2 AVX512VNNI AVX512VNNI
ARGBToUVMatrixRow_C SME AVX2 AVX512VNNI AVX512VNNI
ARGBToYMatrixRow_C SME AVX2 AVX512VNNI AVX512VNNI
ARGBUnattenuateRow_C NEON AVX2 AVX2 AVX2
AYUVToUVRow_C SVE2 AVX2 AVX512VBMI AVX512VBMI
AYUVToVURow_C SVE2 AVX2 AVX512VBMI AVX512VBMI
AYUVToYRow_C NEON AVX2 AVX512VBMI AVX512VBMI
BlendPlaneRow_C NEON AVX2 AVX512BW AVX512BW
ByteToFloatRow_C NEON AVX2 AVX2 AVX2
ComputeCumulativeSumRow_C NEON AVX2 AVX2 AVX2
Convert16To8Row_C SME AVX2 AVX512BW AVX512BW
Convert8To16Row_C SME AVX2 AVX512BW AVX512BW
Convert8To8Row_C SME AVX2 AVX512BW AVX512BW
CopyRow_16_C NEON AVX2 AVX2 AVX2
CopyRow_C SME AVX AVX512BW AVX512BW
CumulativeSumToAverageRow_C NEON AVX2 AVX2 AVX2
DetileRow_16_C NEON AVX2 AVX2 AVX2
DetileRow_C NEON AVX2 AVX2 AVX2
DetileSplitUVRow_C NEON AVX2 AVX2 AVX2
DetileToYUY2_C NEON AVX2 AVX2 AVX2
DivideRow_16_C SVE2 AVX2 AVX512BW AVX512BW
GaussCol_C * NEON AVX2 AVX2 AVX2
GaussCol_F32_C NEON AVX2 AVX2 AVX2
GaussRow_C * NEON AVX2 AVX2 AVX2
GaussRow_F32_C NEON AVX2 AVX2 AVX2
HalfFloatRow_C SVE2 AVX2 AVX512BW AVX512BW
HalfMergeUVRow_C SVE2 AVX2 AVX512BW AVX512BW
HalfRow_16To8_C SME AVX2 AVX512BW AVX512BW
HalfRow_16_C - AVX2 AVX2 AVX2
HalfRow_C - AVX2 AVX2 AVX2
HalfWidthRow_16To8_C SME AVX2 AVX512BW AVX512BW
HalfWidthRow_16To8_Odd_C - AVX2 AVX2 AVX2
HammingDistance_C DOTPROD AVX2 AVX512BW AVX512BW
HashDjb2_C NEON AVX2 AVX512BW AVX512BW
I210AlphaToARGBRow_C SME AVX2 AVX512BW AVX512BW
I210ToAR30Row_C SME AVX2 AVX512BW AVX512BW
I210ToARGBRow_C SME AVX2 AVX512BW AVX512BW
I212ToAR30Row_C SME AVX2 AVX512BW AVX512BW
I212ToARGBRow_C SME AVX2 AVX512BW AVX512BW
I400ToARGBRow_C SME AVX2 AVX512BW AVX512BW
I410AlphaToARGBRow_C SME AVX2 AVX512BW AVX512BW
I410ToAR30Row_C SME AVX2 AVX512BW AVX512BW
I410ToARGBRow_C SME AVX2 AVX512BW AVX512BW
I422AlphaToARGBRow_C SME AVX2 AVX512BW AVX512BW
I422ToAR30Row_C SME AVX2 AVX512BW AVX512BW
I422ToARGB1555Row_C SME AVX2 AVX512BW AVX512BW
I422ToARGB4444Row_C SME AVX2 AVX512BW AVX512BW
I422ToARGBRow_C SME AVX2 AVX512BW AVX512BW
I422ToRGB24Row_C SME AVX2 AVX512VBMI AVX512VBMI
I422ToRGB565Row_C SME AVX2 AVX512BW AVX512BW
I422ToRGBARow_C SME AVX2 AVX512BW AVX512BW
I422ToUYVYRow_C NEON AVX2 AVX2 AVX2
I422ToYUY2Row_C NEON AVX2 AVX2 AVX2
I444AlphaToARGBRow_C SME AVX2 AVX512BW AVX512BW
I444ToARGBRow_C SME AVX2 AVX512BW AVX512BW
I444ToRGB24Row_C SME AVX2 AVX512VBMI AVX512VBMI
InterpolateRow_16_C SME AVX2 AVX512BW AVX512BW
InterpolateRow_C SME AVX2 AVX512BW AVX512BW
J400ToARGBRow_C NEON AVX2 AVX512BW AVX512BW
MergeAR64Row_C NEON AVX2 AVX2 AVX2
MergeARGB16To8Row_C NEON AVX2 AVX2 AVX2
MergeARGBRow_C NEON AVX2 AVX2 AVX2
MergeRGBRow_C NEON AVX2 AVX512VBMI AVX512VBMI
MergeUVRow_16_C SME AVX2 AVX512BW AVX512BW
MergeUVRow_C SME AVX2 AVX512BW AVX512BW
MergeXR30Row_C NEON AVX2 AVX512BW AVX512BW
MergeXR64Row_C NEON AVX2 AVX2 AVX2
MergeXRGB16To8Row_C NEON AVX2 AVX2 AVX2
MergeXRGBRow_C NEON AVX2 AVX2 AVX2
MirrorRow_16_C NEON AVX2 AVX512BW AVX512BW
MirrorRow_C NEON AVX2 AVX512BW AVX512BW
MirrorSplitUVRow_C NEON AVX2 AVX512BW AVX512BW
MirrorUVRow_C NEON AVX2 AVX512BW AVX512BW
MultiplyRow_16_C SME AVX2 AVX512BW AVX512BW
NV12ToARGBRow_C SME AVX2 AVX512BW AVX512BW
NV12ToRGB24Row_C SME AVX2 AVX512VBMI AVX512VBMI
NV12ToRGB565Row_C NEON AVX2 AVX2 AVX2
NV21ToARGBRow_C SME AVX2 AVX512BW AVX512BW
NV21ToRGB24Row_C SME AVX2 AVX512VBMI AVX512VBMI
NV21ToYUV24Row_C NEON AVX2 AVX2 AVX2
P210ToAR30Row_C SME AVX2 AVX512BW AVX512BW
P210ToARGBRow_C SME AVX2 AVX512BW AVX512BW
P410ToAR30Row_C SME AVX2 AVX512BW AVX512BW
P410ToARGBRow_C SME AVX2 AVX512BW AVX512BW
RAWToARGBRow_C SVE2 AVX2 AVX512BW AVX512BW
RAWToRGB24Row_C SVE2 AVX2 AVX512VBMI AVX512VBMI
RAWToRGBARow_C SVE2 AVX2 AVX512VBMI AVX512VBMI
RGB24MirrorRow_C NEON AVX2 AVX512VBMI AVX512VBMI
RGB24ToARGBRow_C SVE2 AVX2 AVX512BW AVX512BW
RGB565ToARGBRow_C NEON AVX2 AVX2 AVX2
RGB565ToUVMatrixRow_C NEON AVX2 AVX2 AVX2
RGB565ToUVRow_C * NEON AVX2 AVX2 AVX2
RGB565ToYMatrixRow_C NEON AVX2 AVX2 AVX2
RGB565ToYRow_C * NEON AVX2 AVX2 AVX2
RGBAToARGBRow_C NEON AVX2 AVX512BW AVX512BW
RGBColorTableRow_C NEON AVX2 AVX2 AVX2
RGBToUV444MatrixRow_C NEON AVX2 AVX512BW AVX512BW
RGBToUVMatrixRow_C NEON AVX2 AVX512BW AVX512BW
RGBToYMatrixRow_C DOTPROD AVX2 AVX512BW AVX512BW
ScaleMaxSamples_C * NEON AVX2 AVX2 AVX2
ScaleSamples_C * NEON AVX2 AVX2 AVX2
ScaleSumSamples_C * NEON AVX2 AVX2 AVX2
SetRow_C NEON AVX2 AVX2 AVX2
SobelRow_C NEON AVX2 AVX2 AVX2
SobelToPlaneRow_C NEON AVX2 AVX2 AVX2
SobelXRow_C NEON AVX2 AVX2 AVX2
SobelXYRow_C NEON AVX2 AVX2 AVX2
SobelYRow_C NEON AVX2 AVX2 AVX2
SplitARGBRow_C NEON AVX2 AVX2 AVX2
SplitRGBRow_C NEON AVX2 AVX2 AVX2
SplitUVRow_16_C NEON AVX2 AVX2 AVX2
SplitUVRow_C SVE2 AVX2 AVX512BW AVX512BW
SplitXRGBRow_C NEON AVX2 AVX2 AVX2
Ssim4x4Row_C SME AVX2 AVX512BW AVX512BW
SsimWindowRow_C SME AVX2 AVX512BW AVX512BW
SumSquareError_C DOTPROD AVX2 AVX512VNNI AVX512VNNI
SwapUVRow_C NEON AVX2 AVX512BW AVX512BW
TransposeUVWx16_C - AVX2 AVX512BW AVX512BW
TransposeUVWx8_C NEON AVX2 AVX2 AVX2
TransposeWx16_C NEON AVX2 AVX512BW AVX512BW
TransposeWx4_32_C * SVE2 AVX2 AVX512BW AVX512BW
TransposeWx8_16_C SVE2 AVX2 AVX512BW AVX512BW
TransposeWx8_C - AVX2 AVX2 AVX2
TransposeWxH_32_C NEON AVX2 AVX2 AVX2
UYVYToARGBRow_C SME AVX2 AVX512BW AVX512BW
UYVYToUV422Row_C NEON AVX2 AVX2 AVX2
UYVYToUVRow_C SVE2 AVX2 AVX512BW AVX512BW
UYVYToYRow_C SVE2 AVX2 AVX512BW AVX512BW
UnpackMT2T_C NEON AVX2 AVX2 AVX2
YUY2ToARGBRow_C SME AVX2 AVX512BW AVX512BW
YUY2ToNVUVRow_C NEON AVX2 AVX2 AVX2
YUY2ToUV422Row_C NEON AVX2 AVX2 AVX2
YUY2ToUVRow_C SVE2 AVX2 AVX512BW AVX512BW
YUY2ToYRow_C SVE2 AVX2 AVX512BW AVX512BW
------------------------------------------------------------------------
SIMD (187 row/rot/cmp) 181 97% 187 100% 187 100% 187 100%
------------------------------------------------------------------------
Scale SIMD ISA supported per *_C function:
------------------------------------------------------------------------
C Function arm64 x86_32 x64 row_win
------------------------------------------------------------------------
FixedDiv1_C - X86 X86 X86
FixedDiv_C - X86 X86 X86
ScaleARGBCols64_C - - - -
ScaleARGBColsUp2_C - AVX2 AVX2 AVX2
ScaleARGBCols_C NEON AVX2 AVX2 AVX2
ScaleARGBFilterCols64_C - - - -
ScaleARGBFilterCols_C NEON AVX2 AVX2 AVX2
ScaleARGBRowDown2Box_C SME AVX2 AVX2 AVX2
ScaleARGBRowDown2Linear_C SME AVX2 AVX2 AVX2
ScaleARGBRowDown2_C SME AVX2 AVX2 AVX2
ScaleARGBRowDownEvenBox_C NEON AVX2 AVX2 AVX2
ScaleARGBRowDownEven_C NEON AVX2 AVX2 AVX2
ScaleAddCols0_C - - - -
ScaleAddCols1_16_C - - - -
ScaleAddCols1_C - - AVX512BW AVX512BW
ScaleAddCols2_16_C - - - -
ScaleAddCols2_C - - AVX512BW AVX512BW
ScaleAddRow_16_C - - - -
ScaleAddRow_C NEON AVX2 AVX512BW AVX512BW
ScaleColsUp2_16_C - - - -
ScaleColsUp2_C - AVX2 AVX2 AVX2
ScaleCols_16_C - - - -
ScaleCols_C - - - -
ScaleFilterCols64_16_C - - - -
ScaleFilterCols64_C - - - -
ScaleFilterCols_16_C - - - -
ScaleFilterCols_C NEON AVX2 AVX2 AVX2
ScaleRowDown2Box_16_C SME AVX2 AVX2 AVX2
ScaleRowDown2Box_C SME AVX2 AVX512BW AVX512BW
ScaleRowDown2Box_Odd_C - - AVX512BW AVX512BW
ScaleRowDown2Linear_16_C SME AVX2 AVX2 AVX2
ScaleRowDown2Linear_C SME AVX2 AVX512BW AVX512BW
ScaleRowDown2_16_C SME AVX2 AVX2 AVX2
ScaleRowDown2_C SME AVX2 AVX512BW AVX512BW
ScaleRowDown34_0_Box_16_C - - - -
ScaleRowDown34_0_Box_C NEON AVX2 AVX2 AVX2
ScaleRowDown34_16_C - - - -
ScaleRowDown34_1_Box_16_C - - - -
ScaleRowDown34_1_Box_C NEON AVX2 AVX2 AVX2
ScaleRowDown34_C NEON AVX2 AVX2 AVX2
ScaleRowDown38_16_C - - - -
ScaleRowDown38_2_Box_16_C - - - -
ScaleRowDown38_2_Box_C NEON AVX2 AVX2 AVX2
ScaleRowDown38_3_Box_16_C - - - -
ScaleRowDown38_3_Box_C NEON AVX2 AVX2 AVX2
ScaleRowDown38_C NEON AVX2 AVX2 AVX2
ScaleRowDown4Box_16_C - - - -
ScaleRowDown4Box_C NEON AVX2 AVX2 AVX2
ScaleRowDown4_16_C - - - -
ScaleRowDown4_C NEON AVX2 AVX2 AVX2
ScaleRowUp2_Bilinear_16_Any_C NEON AVX2 AVX2 AVX2
ScaleRowUp2_Bilinear_16_C NEON AVX2 AVX2 AVX2
ScaleRowUp2_Bilinear_Any_C NEON AVX2 AVX2 AVX2
ScaleRowUp2_Bilinear_C NEON AVX2 AVX2 AVX2
ScaleRowUp2_Linear_16_Any_C NEON AVX2 AVX2 AVX2
ScaleRowUp2_Linear_16_C NEON AVX2 AVX2 AVX2
ScaleRowUp2_Linear_Any_C NEON AVX2 AVX2 AVX2
ScaleRowUp2_Linear_C NEON AVX2 AVX2 AVX2
ScaleUVAddCols1_16_C - - - -
ScaleUVAddCols1_C - - - -
ScaleUVAddCols2_16_C - - - -
ScaleUVAddCols2_C - - - -
ScaleUVAddCols3_16_C - - - -
ScaleUVAddCols3_C SME AVX2 AVX512VBMI AVX512VBMI
ScaleUVCols64_16_C - - - -
ScaleUVCols64_C - - - -
ScaleUVColsUp2_16_C - - - -
ScaleUVColsUp2_C - - - -
ScaleUVCols_16_C - - - -
ScaleUVCols_C - - - -
ScaleUVFilterCols64_16_C - - - -
ScaleUVFilterCols64_C - - - -
ScaleUVFilterCols_16_C - - - -
ScaleUVFilterCols_C - - - -
ScaleUVRowDown2Box_16_C - - - -
ScaleUVRowDown2Box_C SME AVX2 AVX2 AVX2
ScaleUVRowDown2Linear_16_C - - - -
ScaleUVRowDown2Linear_C SME AVX2 AVX2 AVX2
ScaleUVRowDown2_16_C - - - -
ScaleUVRowDown2_C SME AVX2 AVX2 AVX2
ScaleUVRowDownEvenBox_16_C - - - -
ScaleUVRowDownEvenBox_C - - - -
ScaleUVRowDownEven_16_C - - - -
ScaleUVRowDownEven_C NEON AVX2 AVX2 AVX2
ScaleUVRowUp2_Bilinear_16_Any_C NEON AVX2 AVX2 AVX2
ScaleUVRowUp2_Bilinear_16_C NEON AVX2 AVX2 AVX2
ScaleUVRowUp2_Bilinear_Any_C NEON AVX2 AVX2 AVX2
ScaleUVRowUp2_Bilinear_C NEON AVX2 AVX2 AVX2
ScaleUVRowUp2_Linear_16_Any_C NEON AVX2 AVX2 AVX2
ScaleUVRowUp2_Linear_16_C NEON AVX2 AVX2 AVX2
ScaleUVRowUp2_Linear_Any_C NEON AVX2 AVX2 AVX2
ScaleUVRowUp2_Linear_C NEON AVX2 AVX2 AVX2
------------------------------------------------------------------------
SIMD (92 scale *_C) 44 48% 48 52% 51 55% 51 55%
------------------------------------------------------------------------
Test: libyuv_unittest
Bug: none
Change-Id: I2b4a832f2a7fe1fe93487b453240cd15c1f5f940
Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8676400
Commit-Queue: Frank Barchard <fbarchard@google.com>
Reviewed-by: richard winterton <rrwinterton@gmail.com>
|
||
|---|---|---|
| build_overrides | ||
| docs | ||
| include | ||
| infra/config | ||
| riscv_script | ||
| source | ||
| tools_libyuv | ||
| unit_test | ||
| util | ||
| .clang-format | ||
| .gitignore | ||
| .gn | ||
| Android.bp | ||
| Android.mk | ||
| AUTHORS | ||
| BUILD.bazel | ||
| BUILD.gn | ||
| CM_linux_packages.cmake | ||
| CMakeLists.txt | ||
| codereview.settings | ||
| DEPS | ||
| DIR_METADATA | ||
| download_vs_toolchain.py | ||
| GEMINI.md | ||
| libyuv.bzl | ||
| libyuv.gni | ||
| libyuv.gyp | ||
| libyuv.gypi | ||
| LICENSE | ||
| linux.mk | ||
| OWNERS | ||
| PATENTS | ||
| PRESUBMIT.py | ||
| public.mk | ||
| pylintrc | ||
| README.chromium | ||
| README.md | ||
| vpython.toml | ||
| vpython.toml.uv.lock | ||
| winarm.mk | ||
| WORKSPACE.bazel | ||
libyuv is an open source project that includes YUV scaling and conversion functionality.
- Scale YUV to prepare content for compression, with point, bilinear or box filter.
- Convert to YUV from webcam formats for compression.
- Convert to RGB formats for rendering/effects.
- Rotate by 90/180/270 degrees to adjust for mobile devices in portrait mode.
- Optimized for SSSE3/AVX2 on x86/x64.
- Optimized for Neon/SVE2/SME on Arm.
- Optimized for MSA on Mips.
- Optimized for RVV on RISC-V.
Development
See Getting started for instructions on how to get started developing.
You can also browse the docs directory for more documentation.