[libyuv] Fix x86 SIMD OOB, math, alignment, MSan & GCC bugs

Address x86 SIMD correctness, sanitizer, alignment, and compiler guard
bugs across row_gcc.cc, row_win.cc, row_any.cc, row_common.cc, and
caller dispatchers:

- MSan & row_win.cc: Replace _mm512_ternarylogic_epi32 in row_win.cc
  (ARGBGrayRow_AVX512VNNI, ARGBToUV444MatrixRow_AVX512VNNIVBMI, and
  I422ToAR30Row_AVX512BW) with bitwise intrinsics modeled bit-by-bit by
  LLVM MSan, document the MSan intrinsic rules in GEMINI.md, and fix
  standalone MSan ELF PT_INTERP in BUILD.gn. Add missing USE_ROW_WIN
  DivideRow_16_AVX2, HalfMergeUVRow_AVX2, and Convert8To8Row_AVX2.
- Out-of-bounds & AVX-512 opmask tails: Fix RGBToUVMatrixRow_Any_SSSE3
  MASK from 7 to 15 (24-byte overread), guard UnpackMT2T_C and
  UnpackMT2T_AVX2 against partial < 80-byte tail blocks, add inline
  k1-k7 opmask tails to all 17 remaining AVX-512 row kernels (removing
  all *_Any_AVX512* wrappers), and enable opmask-tailed
  NV21ToYUV24Row_AVX512VBMI.
- Math, saturation & pointer bugs: Fix MirrorRow_16_AVX512BW 64-bit
  width sign extension, ARGBPolynomialRow_AVX2 vpackssdw clamping,
  CumulativeSumToAverageRow_AVX2 small-area (area <= 1) handling and
  vdivss precision, HalfWidthRow_16To8_{SSSE3,AVX2,AVX512BW} unsigned
  pair summation for samples >= 0x8000, HalfRow_16To8_AVX512BW
  non-power-of-two scale multiplication, DivideRow_16 SIMD
  scale == 65536 (16-bit depth) truncation, ARGBLumaColorTableRow_AVX2
  unsigned luma weight accumulation, Merge{ARGB,XRGB}16To8Row_AVX2
  depth == 8 clamping, custom ArgbConstants::kAddUV loading, 16-bit YUV
  unsigned shifts/ORs, and null-pointer checks in NV16ToI420/NV24ToI420.
- Alignment (#GP), ISA (#UD), UBSan & 32-bit x86: Use unaligned loads
  for ArgbConstants, YuvConstants, and ARGBPolynomialRow_SSE2 float
  coefficients; remove AVX2 instructions from HalfFloat{,1}Row_F16C;
  fix Merge{AR,XR}64Row_AVX2 depth == 16 shift UB and ByteToFloatRow_C /
  TestByteToFloat float alignment UB; and fix 32-bit -m32 -fPIC ASan
  inline asm register pressure and operand suffixes.
- GCC & compiler guards: Enable GCC_HAS_AVX512 for GCC >= 9 on x86_64
  with per-function target attributes, gate HAS_*_AVX2 and HAS_*_AVX512*
  macros on compiler version macros, add missing #ifdef HAS_* guards in
  row_gcc.cc, fix _Any / IS_ALIGNED step mismatches, wire missing
  dispatchers (ARGBSobelize, SplitRotateUV180, HalfMergeUVPlane,
  ARGBPolynomial), and silence GCC 15 -Werror=stringop-overflow=.

Convert SIMD ISA per *_C (* = uncalled in library):
------------------------------------------------------------------------
C Function              arm     x86        riscv  hexagon wasm    loong
------------------------------------------------------------------------
AB64ToARGBRow_C         NEON    AVX2       RVV    HVX     -       -
ABGRToAR30Row_C         NEON    AVX512BW   -      -       -       -
AR30ToAB30Row_C         NEON    AVX512BW   -      -       -       -
AR30ToABGRRow_C         NEON    AVX512BW   -      -       -       -
AR30ToARGBRow_C         NEON    AVX512BW   -      -       -       -
AR64ShuffleRow_C        NEON    AVX512BW   RVV    -       RELAXED LASX
AR64ToAB64Row_C         NEON    AVX512BW   RVV    HVX     RELAXED LASX
AR64ToARGBRow_C         NEON    AVX2       RVV    HVX     -       -
ARGB1555ToARGBRow_C     SVE2    AVX512BW   -      -       SIMD    LASX
ARGB1555ToUVMatrixRow_C NEON    AVX2       -      -       SIMD    -
ARGB1555ToUVRow_C *     NEON    AVX2       -      -       -       LASX
ARGB1555ToYMatrixRow_C  NEON    AVX2       -      -       SIMD    -
ARGB1555ToYRow_C *      NEON    AVX2       -      -       -       LASX
ARGB4444ToARGBRow_C     NEON    AVX2       -      -       SIMD    LASX
ARGB4444ToUVMatrixRow_C NEON    AVX2       -      -       SIMD    -
ARGB4444ToUVRow_C *     NEON    AVX2       -      -       -       -
ARGB4444ToYMatrixRow_C  NEON    AVX2       -      -       SIMD    -
ARGB4444ToYRow_C *      NEON    AVX2       -      -       -       -
ARGBAddRow_C            NEON    AVX2       -      HVX     -       LASX
ARGBAffineRow_C *       NEON    AVX2       -      -       -       -
ARGBAlphaBlendRow_C     SME     AVX512BW   RVV    HVX     SIMD    LASX
ARGBAttenuateRow_C      NEON    AVX512BW   RVV    HVX     -       LASX
ARGBBlendRow_C          NEON    AVX512BW   RVV    HVX     RELAXED LASX
ARGBColorMatrixRow_C    I8MM    AVX512VNNI -      -       -       LASX
ARGBColorTableRow_C     NEON    AVX2       -      -       -       -
ARGBCopyAlphaRow_C      NEON    AVX2       -      HVX     -       -
ARGBCopyYToAlphaRow_C   NEON    AVX512BW   RVV    HVX     RELAXED -
ARGBExtractAlphaRow_C   NEON    AVX512BW   RVV    HVX     SIMD    LASX
ARGBGrayRow_C           DOTPROD AVX512VNNI -      -       -       LASX
ARGBLumaColorTableRow_C NEON    AVX2       -      -       -       -
ARGBMirrorRow_C         NEON    AVX512BW   RVV    HVX     SIMD    LASX
ARGBMultiplyRow_C       SME     AVX512BW   RVV    HVX     -       LASX
ARGBOrRow_C             SME     AVX512BW   RVV    HVX     SIMD    LASX
ARGBPolynomialRow_C     NEON    AVX2       -      -       -       -
ARGBQuantizeRow_C       NEON    AVX2       -      -       -       LASX
ARGBSepiaRow_C          DOTPROD AVX512VNNI -      -       -       LASX
ARGBSetRow_C            NEON    AVX2       RVV    HVX     -       LASX
ARGBShadeRow_C          NEON    AVX2       -      -       -       LASX
ARGBShuffleRow_C        NEON    AVX512BW   RVV    -       RELAXED LASX
ARGBSubtractRow_C       NEON    AVX2       -      HVX     -       LASX
ARGBToAB64Row_C         NEON    AVX2       RVV    HVX     -       -
ARGBToABGRRow_C         NEON    AVX512BW   RVV    HVX     RELAXED LASX
ARGBToAR30Row_C         NEON    AVX512BW   -      -       -       -
ARGBToAR64Row_C         NEON    AVX2       RVV    HVX     -       -
ARGBToARGB1555Row_C     NEON    AVX2       -      -       SIMD    LASX
ARGBToARGB4444Row_C     NEON    AVX2       -      -       SIMD    LASX
ARGBToBGRARow_C         NEON    AVX512BW   RVV    HVX     RELAXED LASX
ARGBToRAWRow_C          SVE2    AVX512BW   RVV    -       -       LASX
ARGBToRGB24Row_C        SVE2    AVX512BW   RVV    -       -       LASX
ARGBToRGB565DitherRow_C SVE2    AVX512BW   -      -       SIMD    LASX
ARGBToRGB565Row_C       SVE2    AVX512BW   -      -       SIMD    LASX
ARGBToRGBARow_C         NEON    AVX512BW   RVV    HVX     RELAXED LASX
ARGBToUV444MatrixRow_C  I8MM    AVX512VNNI RVV    HVX     RELAXED -
ARGBToUVMatrixRow_C     SME     AVX512VNNI RVV    HVX     SIMD    -
ARGBToYMatrixRow_C      SME     AVX512VNNI RVV    HVX     SIMD    LASX
ARGBUnattenuateRow_C    NEON    AVX2       -      -       -       -
AYUVToUVRow_C           SVE2    AVX512VBMI -      -       -       -
AYUVToVURow_C           SVE2    AVX512VBMI -      -       -       -
AYUVToYRow_C            NEON    AVX512VBMI -      -       -       -
BlendPlaneRow_C         NEON    AVX512BW   RVV    HVX     SIMD    -
ByteToFloatRow_C        NEON    AVX2       -      -       -       -
ComputeCumulativeSumRow_C NEON  AVX2       -      -       -       -
Convert16To8Row_C       SME     AVX512BW   RVV    HVX     -       -
Convert8To16Row_C       SME     AVX512BW   RVV    HVX     SIMD    -
Convert8To8Row_C        SME     AVX512BW   -      HVX     -       -
CopyRow_16_C            NEON    AVX2       -      HVX     -       -
CopyRow_C               SME     AVX512BW   RVV    HVX     -       LASX
CumulativeSumToAverageRow_C NEON AVX2      -      -       -       -
DetileRow_16_C          NEON    AVX2       -      -       -       -
DetileRow_C             NEON    AVX2       -      -       -       -
DetileSplitUVRow_C      NEON    AVX2       -      -       -       -
DetileToYUY2_C          NEON    AVX2       -      -       -       -
DivideRow_16_C          SVE2    AVX512BW   -      HVX     -       -
GaussCol_C *            NEON    AVX2       -      -       -       -
GaussCol_F32_C          NEON    AVX2       -      -       -       -
GaussRow_C *            NEON    AVX2       -      -       -       -
GaussRow_F32_C          NEON    AVX2       -      -       -       -
HalfFloatRow_C          SVE2    AVX512BW   -      -       -       LASX
HalfMergeUVRow_C        SVE2    AVX512BW   -      -       -       -
HalfRow_16To8_C         SME     AVX512BW   RVV    HVX     -       -
HalfRow_16_C            -       AVX2       -      -       -       -
HalfRow_C               -       AVX2       -      -       -       -
HalfWidthRow_16To8_C    SME     AVX512BW   RVV    -       -       -
HalfWidthRow_16To8_Odd_C -      AVX2       -      -       -       -
I210AlphaToARGBRow_C    SME     AVX512BW   -      -       -       -
I210ToAR30Row_C         SME     AVX512BW   -      -       -       -
I210ToARGBRow_C         SME     AVX512BW   -      -       -       -
I212ToAR30Row_C         SME     AVX512BW   -      -       -       -
I212ToARGBRow_C         SME     AVX512BW   -      -       -       -
I400ToARGBRow_C         SME     AVX512BW   RVV    HVX     -       LASX
I410AlphaToARGBRow_C    SME     AVX512BW   -      -       -       -
I410ToAR30Row_C         SME     AVX512BW   -      -       -       -
I410ToARGBRow_C         SME     AVX512BW   -      -       -       -
I422AlphaToARGBRow_C    SME     AVX512BW   RVV    HVX     -       LASX
I422ToAR30Row_C         SME     AVX512BW   RVV    -       SIMD    -
I422ToARGB1555Row_C     SME     AVX512BW   -      -       SIMD    LASX
I422ToARGB4444Row_C     SME     AVX512BW   -      -       SIMD    LASX
I422ToARGBRow_C         SME     AVX512BW   RVV    HVX     SIMD    LASX
I422ToRGB24Row_C        SME     AVX512VBMI RVV    -       RELAXED LASX
I422ToRGB565Row_C       SME     AVX512BW   -      -       SIMD    LASX
I422ToRGBARow_C         SME     AVX512BW   RVV    HVX     -       LASX
I422ToUYVYRow_C         NEON    AVX2       -      -       -       LASX
I422ToYUY2Row_C         NEON    AVX2       -      -       -       LASX
I444AlphaToARGBRow_C    SME     AVX512BW   RVV    HVX     -       -
I444ToARGBRow_C         SME     AVX512BW   RVV    HVX     -       LASX
I444ToRGB24Row_C        SME     AVX512VBMI RVV    -       -       -
InterpolateRow_16_C     SME     AVX512BW   -      HVX     SIMD    -
InterpolateRow_C        SME     AVX512BW   RVV    HVX     SIMD    LASX
J400ToARGBRow_C         NEON    AVX512BW   RVV    HVX     RELAXED LASX
MergeAR64Row_C          NEON    AVX2       -      -       -       -
MergeARGB16To8Row_C     NEON    AVX2       -      -       -       -
MergeARGBRow_C          NEON    AVX2       RVV    HVX     -       -
MergeRGBRow_C           NEON    AVX512VBMI RVV    -       -       -
MergeUVRow_16_C         SME     AVX512BW   -      HVX     -       -
MergeUVRow_C            SME     AVX512BW   RVV    HVX     SIMD    LASX
MergeXR30Row_C          NEON    AVX512BW   -      -       -       -
MergeXR64Row_C          NEON    AVX2       -      -       -       -
MergeXRGB16To8Row_C     NEON    AVX2       -      -       -       -
MergeXRGBRow_C          NEON    AVX2       RVV    HVX     -       -
MirrorRow_16_C          NEON    AVX512BW   RVV    HVX     RELAXED LASX
MirrorRow_C             NEON    AVX512BW   -      HVX     RELAXED LASX
MirrorSplitUVRow_C      NEON    AVX512BW   -      HVX     RELAXED LASX
MirrorUVRow_C           NEON    AVX512BW   RVV    HVX     RELAXED LASX
MultiplyRow_16_C        SME     AVX512BW   RVV    HVX     SIMD    -
NV12ToARGBRow_C         SME     AVX512BW   RVV    HVX     SIMD    LASX
NV12ToRGB24Row_C        SME     AVX512VBMI RVV    -       -       -
NV12ToRGB565Row_C       NEON    AVX2       -      -       SIMD    LASX
NV21ToARGBRow_C         SME     AVX512BW   RVV    HVX     SIMD    LASX
NV21ToRGB24Row_C        SME     AVX512VBMI RVV    -       -       -
NV21ToYUV24Row_C        NEON    AVX512VBMI -      -       -       -
P210ToAR30Row_C         SME     AVX512BW   -      -       -       -
P210ToARGBRow_C         SME     AVX512BW   -      -       -       -
P410ToAR30Row_C         SME     AVX512BW   -      -       -       -
P410ToARGBRow_C         SME     AVX512BW   -      -       -       -
RAWToARGBRow_C          SVE2    AVX512BW   RVV    -       RELAXED LASX
RAWToRGB24Row_C         SVE2    AVX512VBMI RVV    -       RELAXED LASX
RAWToRGBARow_C          SVE2    AVX512VBMI RVV    -       -       -
RGB24MirrorRow_C        NEON    AVX512VBMI -      -       RELAXED -
RGB24ToARGBRow_C        SVE2    AVX512BW   RVV    -       RELAXED LASX
RGB565ToARGBRow_C       NEON    AVX2       -      -       SIMD    LASX
RGB565ToUVMatrixRow_C   NEON    AVX2       -      -       SIMD    -
RGB565ToUVRow_C *       NEON    AVX2       -      -       -       LASX
RGB565ToYMatrixRow_C    NEON    AVX2       -      -       SIMD    -
RGB565ToYRow_C *        NEON    AVX2       -      -       -       LASX
RGBAToARGBRow_C         NEON    AVX512BW   RVV    HVX     RELAXED LASX
RGBColorTableRow_C      NEON    AVX2       -      -       -       -
RGBToUV444MatrixRow_C   NEON    AVX512BW   RVV    -       RELAXED -
RGBToUVMatrixRow_C      NEON    AVX512BW   RVV    -       RELAXED -
RGBToYMatrixRow_C       DOTPROD AVX512BW   RVV    -       RELAXED LASX
ScaleMaxSamples_C *     NEON    AVX2       -      -       -       -
ScaleSamples_C *        NEON    AVX2       -      -       -       -
ScaleSumSamples_C *     NEON    AVX2       -      -       -       -
SetRow_C                NEON    AVX2       -      HVX     -       LASX
SobelRow_C              NEON    AVX2       -      -       -       LASX
SobelToPlaneRow_C       NEON    AVX2       -      -       -       LASX
SobelXRow_C             NEON    AVX2       -      -       -       -
SobelXYRow_C            NEON    AVX2       -      -       -       LASX
SobelYRow_C             NEON    AVX2       -      -       -       -
SplitARGBRow_C          NEON    AVX2       RVV    HVX     -       -
SplitRGBRow_C           NEON    AVX2       RVV    -       -       -
SplitUVRow_16_C         NEON    AVX2       -      HVX     -       -
SplitUVRow_C            SVE2    AVX512BW   RVV    HVX     -       LASX
SplitXRGBRow_C          NEON    AVX2       RVV    HVX     -       -
SwapUVRow_C             NEON    AVX512BW   RVV    HVX     SIMD    -
UYVYToARGBRow_C         SME     AVX512BW   -      -       -       LASX
UYVYToUV422Row_C        NEON    AVX2       -      HVX     -       LASX
UYVYToUVRow_C           SVE2    AVX512BW   -      HVX     -       LASX
UYVYToYRow_C            SVE2    AVX512BW   -      HVX     -       LASX
UnpackMT2T_C            NEON    AVX2       -      -       -       -
YUY2ToARGBRow_C         SME     AVX512BW   -      -       -       LASX
YUY2ToNVUVRow_C         NEON    AVX2       -      -       -       -
YUY2ToUV422Row_C        NEON    AVX2       -      HVX     -       LASX
YUY2ToUVRow_C           SVE2    AVX512BW   -      HVX     -       LASX
YUY2ToYRow_C            SVE2    AVX512BW   -      HVX     -       LASX
------------------------------------------------------------------------
SIMD (174 convert)      171 98% 174 100%   65 37% 64 37%  57 33%  76 44%
------------------------------------------------------------------------

Rotate SIMD ISA per *_C (* = uncalled in library):
------------------------------------------------------------------------
C Function              arm     x86        riscv  hexagon wasm    loong
------------------------------------------------------------------------
TransposeUVWx16_C       -       AVX512BW   -      -       SIMD    LASX
TransposeUVWx8_C        NEON    AVX512BW   -      HVX     SIMD    LASX
TransposeWx16_C         NEON    AVX512BW   -      -       SIMD    LASX
TransposeWx4_32_C *     SVE2    AVX512BW   RVV    HVX     SIMD    LASX
TransposeWx8_16_C       SVE2    AVX512BW   RVV    HVX     SIMD    LASX
TransposeWx8_C          NEON    AVX512BW   -      HVX     SIMD    LASX
TransposeWxH_32_C       NEON    AVX2       RVV    HVX     -       -
------------------------------------------------------------------------
SIMD (7 rotate)         6 86%   7 100%     3 43%  5 71%   6 86%   6 86%
------------------------------------------------------------------------

Compare SIMD ISA per *_C:
------------------------------------------------------------------------
C Function              arm     x86        riscv  hexagon wasm    loong
------------------------------------------------------------------------
ARGBDetectRow_C         -       AVX2       -      -       -       -
HammingDistance_C       DOTPROD AVX512BW   -      HVX     SIMD    -
HashDjb2_C              NEON    AVX512BW   -      HVX     SIMD    -
Ssim4x4Row_C            SME     AVX512BW   RVV    HVX     SIMD    LASX
SsimWindowRow_C         SME     AVX512BW   RVV    -       -       -
SumSquareError_C        DOTPROD AVX512VNNI -      HVX     SIMD    -
------------------------------------------------------------------------
SIMD (6 compare)        5 83%   6 100%     2 33%  4 67%   4 67%   1 17%
------------------------------------------------------------------------

Scale SIMD ISA per *_C:
------------------------------------------------------------------------
C Function              arm     x86        riscv  hexagon wasm    loong
------------------------------------------------------------------------
FixedDiv1_C             -       X86        -      -       -       -
FixedDiv_C              -       X86        -      -       -       -
ScaleARGBCols64_C       -       -          -      -       -       -
ScaleARGBColsUp2_C      -       AVX2       -      -       SIMD    -
ScaleARGBCols_C         NEON    AVX2       -      -       SIMD    LSX
ScaleARGBFilterCols64_C -       -          -      -       -       -
ScaleARGBFilterCols_C   NEON    AVX2       RVV    -       SIMD    LSX
ScaleARGBRowDown2Box_C  SME     AVX2       RVV    HVX     SIMD    LSX
ScaleARGBRowDown2Linear_C SME   AVX2       RVV    HVX     SIMD    LSX
ScaleARGBRowDown2_C     SME     AVX2       RVV    HVX     SIMD    LSX
ScaleARGBRowDownEvenBox_C NEON  AVX2       RVV    -       SIMD    LSX
ScaleARGBRowDownEven_C  NEON    AVX2       -      -       SIMD    LSX
ScaleAddCols0_C         -       -          -      -       -       -
ScaleAddCols1_16_C      -       -          -      -       -       -
ScaleAddCols1_C         -       AVX512BW   -      -       -       -
ScaleAddCols2_16_C      -       -          -      -       -       -
ScaleAddCols2_C         -       AVX512BW   -      -       -       -
ScaleAddRow_16_C        -       -          -      -       -       -
ScaleAddRow_C           NEON    AVX512BW   RVV    HVX     SIMD    LSX
ScaleColsUp2_16_C       -       -          -      -       -       -
ScaleColsUp2_C          -       AVX2       -      -       -       -
ScaleCols_16_C          -       -          -      -       -       -
ScaleCols_C             -       -          -      -       -       -
ScaleFilterCols64_16_C  -       -          -      -       -       -
ScaleFilterCols64_C     -       -          -      -       -       -
ScaleFilterCols_16_C    -       -          -      -       -       -
ScaleFilterCols_C       NEON    AVX2       -      -       SIMD    LSX
ScaleRowDown2Box_16_C   SME     AVX2       -      HVX     -       -
ScaleRowDown2Box_C      SME     AVX512BW   RVV    HVX     SIMD    LSX
ScaleRowDown2Box_Odd_C  -       AVX512BW   -      HVX     -       -
ScaleRowDown2Linear_16_C SME    AVX2       -      HVX     -       -
ScaleRowDown2Linear_C   SME     AVX512BW   RVV    HVX     SIMD    LSX
ScaleRowDown2_16_C      SME     AVX2       -      HVX     -       -
ScaleRowDown2_C         SME     AVX512BW   RVV    HVX     SIMD    LSX
ScaleRowDown34_0_Box_16_C -     -          -      -       -       -
ScaleRowDown34_0_Box_C  NEON    AVX2       RVV    -       RELAXED LSX
ScaleRowDown34_16_C     -       -          -      -       -       -
ScaleRowDown34_1_Box_16_C -     -          -      -       -       -
ScaleRowDown34_1_Box_C  NEON    AVX2       RVV    -       RELAXED LSX
ScaleRowDown34_C        NEON    AVX2       RVV    -       RELAXED LSX
ScaleRowDown38_16_C     -       -          -      -       -       -
ScaleRowDown38_2_Box_16_C -     -          -      -       -       -
ScaleRowDown38_2_Box_C  NEON    AVX2       RVV    -       RELAXED LSX
ScaleRowDown38_3_Box_16_C -     -          -      -       -       -
ScaleRowDown38_3_Box_C  NEON    AVX2       RVV    -       RELAXED LSX
ScaleRowDown38_C        NEON    AVX2       RVV    -       RELAXED LSX
ScaleRowDown4Box_16_C   -       -          -      -       -       -
ScaleRowDown4Box_C      NEON    AVX2       RVV    HVX     SIMD    LSX
ScaleRowDown4_16_C      -       -          -      -       -       -
ScaleRowDown4_C         NEON    AVX2       RVV    HVX     SIMD    LSX
ScaleRowUp2_Bilinear_16_Any_C NEON AVX2    -      -       -       -
ScaleRowUp2_Bilinear_16_C NEON  AVX2       -      -       -       -
ScaleRowUp2_Bilinear_Any_C NEON AVX2       RVV    -       -       -
ScaleRowUp2_Bilinear_C  NEON    AVX2       RVV    -       -       -
ScaleRowUp2_Linear_16_Any_C NEON AVX2      -      -       -       -
ScaleRowUp2_Linear_16_C NEON    AVX2       -      -       -       -
ScaleRowUp2_Linear_Any_C NEON   AVX2       RVV    -       -       -
ScaleRowUp2_Linear_C    NEON    AVX2       RVV    -       -       -
ScaleUVAddCols1_16_C    -       -          -      -       -       -
ScaleUVAddCols1_C       -       -          -      -       -       -
ScaleUVAddCols2_16_C    -       -          -      -       -       -
ScaleUVAddCols2_C       -       -          -      -       -       -
ScaleUVAddCols3_16_C    -       -          -      -       -       -
ScaleUVAddCols3_C       SME     AVX512VBMI RVV    HVX     SIMD    LSX
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       RVV    HVX     -       -
ScaleUVRowDown2Linear_16_C -    -          -      -       -       -
ScaleUVRowDown2Linear_C SME     AVX2       RVV    HVX     -       -
ScaleUVRowDown2_16_C    -       -          -      -       -       -
ScaleUVRowDown2_C       SME     AVX2       RVV    HVX     -       -
ScaleUVRowDownEvenBox_16_C -    -          -      -       -       -
ScaleUVRowDownEvenBox_C -       -          -      -       -       -
ScaleUVRowDownEven_16_C -       -          -      -       -       -
ScaleUVRowDownEven_C    NEON    AVX2       RVV    -       -       -
ScaleUVRowUp2_Bilinear_16_Any_C NEON AVX2  -      -       -       -
ScaleUVRowUp2_Bilinear_16_C NEON AVX2      -      -       -       -
ScaleUVRowUp2_Bilinear_Any_C NEON AVX2     RVV    -       -       -
ScaleUVRowUp2_Bilinear_C NEON   AVX2       RVV    -       -       -
ScaleUVRowUp2_Linear_16_Any_C NEON AVX2    -      -       -       -
ScaleUVRowUp2_Linear_16_C NEON  AVX2       -      -       -       -
ScaleUVRowUp2_Linear_Any_C NEON AVX2       RVV    -       -       -
ScaleUVRowUp2_Linear_C  NEON    AVX2       RVV    -       -       -
------------------------------------------------------------------------
SIMD (92 scale)         44 48%  51 55%     30 33% 17 18%  22 24%  21 23%
------------------------------------------------------------------------

Test: libyuv_unittest (Release, row_win, x86_32, Sanitizers, GCC 15)
Bug: 388428508, 578615529, 579659306
Change-Id: Id4eaf5f7fd85c75a60984a3b1559bfdb07b21afc
Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8686033
Reviewed-by: richard winterton <rrwinterton@gmail.com>
This commit is contained in:
Frank Barchard 2026-10-29 23:12:37 -07:00
parent bb310b4e7e
commit 79ca9187e5
27 changed files with 3813 additions and 1844 deletions

2
.gn
View File

@ -32,8 +32,10 @@ exec_script_allowlist = build_dotfile_settings.exec_script_allowlist +
[ "//build_overrides/build.gni" ]
default_args = {
android_static_analysis = "off"
mac_sdk_min = "10.12"
ios_deployment_target = "12.0"
# Use Siso instead of Ninja.
use_siso = true
}

View File

@ -34,13 +34,15 @@ extern "C" {
#define HAS_HASHDJB2_SSE41
#define HAS_SSIM4X4ROW_SSE2
#define HAS_SSIMWINDOWROW_SSE2
#if defined(VISUALC_HAS_AVX2)
#define HAS_HAMMINGDISTANCE_AVX2
#define HAS_SUMSQUAREERROR_AVX2
#define HAS_HASHDJB2_AVX2
#define HAS_SSIM4X4ROW_AVX2
#define HAS_SSIMWINDOWROW_AVX2
#define HAS_ARGBDETECTROW_AVX2
#if defined(__x86_64__) || defined(_M_X64)
#endif
#if defined(VISUALC_HAS_AVX512)
#define HAS_HAMMINGDISTANCE_AVX512BW
#define HAS_HAMMINGDISTANCE_AVX512VNNI
#define HAS_SUMSQUAREERROR_AVX512BW
@ -73,7 +75,8 @@ extern "C" {
#define HAS_SSIMWINDOWROW_AVX2
#define HAS_ARGBDETECTROW_AVX2
#endif
#if defined(__x86_64__) && defined(CLANG_HAS_AVX512)
#if defined(__x86_64__) && \
(defined(CLANG_HAS_AVX512) || defined(GCC_HAS_AVX512))
#define HAS_HAMMINGDISTANCE_AVX512BW
#define HAS_HAMMINGDISTANCE_AVX512VNNI
#define HAS_SUMSQUAREERROR_AVX512BW

View File

@ -55,13 +55,42 @@ extern "C" {
#endif // __clang__
// GCC >= 4.7.0 required for AVX2.
#if defined(__GNUC__) && !defined(LIBYUV_ENABLE_ROWWIN) && \
#if defined(__GNUC__) && !defined(__clang__) && \
!defined(LIBYUV_ENABLE_ROWWIN) && \
(defined(__x86_64__) || defined(__i386__))
#if (__GNUC__ > 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 7))
#define GCC_HAS_AVX2 1
#endif // GNUC >= 4.7
#endif // __GNUC__
// GCC >= 9.0.0 required for AVX512 (including VNNI and VBMI).
#if defined(__GNUC__) && !defined(__clang__) && \
!defined(LIBYUV_ENABLE_ROWWIN) && defined(__x86_64__)
#if (__GNUC__ >= 9)
#define GCC_HAS_AVX512 1
#endif // GNUC >= 9
#endif // __GNUC__
// Function target attributes so GCC enables zmm16..zmm31 and k1..k7 clobbers
// inside AVX512 functions without emitting AVX512 in non-AVX512 functions.
#if defined(GCC_HAS_AVX512)
#define LIBYUV_TARGET_AVX512BW \
__attribute__((target("avx512bw,avx512vl,avx512f,bmi2")))
#define LIBYUV_TARGET_AVX512VBMI \
__attribute__((target("avx512vbmi,avx512bw,avx512vl,avx512f,bmi2")))
#define LIBYUV_TARGET_AVX512VNNI \
__attribute__((target("avx512vnni,avx512bw,avx512vl,avx512f,bmi2")))
#define LIBYUV_TARGET_AVX512VNNIVBMI \
__attribute__(( \
target("avx512vnni,avx512vbmi,avx512bw,avx512vl,avx512f,bmi2")))
#elif !defined(LIBYUV_ENABLE_ROWWIN) && \
!(defined(_MSC_VER) && !defined(__clang__))
#define LIBYUV_TARGET_AVX512BW
#define LIBYUV_TARGET_AVX512VBMI
#define LIBYUV_TARGET_AVX512VNNI
#define LIBYUV_TARGET_AVX512VNNIVBMI
#endif
// clang >= 3.4.0 required for AVX2.
#if defined(__clang__) && !defined(LIBYUV_ENABLE_ROWWIN) && \
(defined(__x86_64__) || defined(__i386__))
@ -70,7 +99,7 @@ extern "C" {
#endif // clang >= 3.4
#endif // __clang__
// clang >= 6.0.0 required for AVX512.
// clang >= 7.0.0 required for AVX512.
#if defined(__clang__) && !defined(LIBYUV_ENABLE_ROWWIN) && \
(defined(__x86_64__) || defined(__i386__))
// clang in xcode follows a different versioning scheme.
@ -80,13 +109,25 @@ extern "C" {
#endif // clang >= 7
#endif // __clang__
// Visual C 2012 required for AVX2.
#if (defined(_M_IX86) || defined(_M_X64)) && \
(!defined(__clang__) || defined(LIBYUV_ENABLE_ROWWIN)) && \
defined(_MSC_VER) && _MSC_VER >= 1700
// Visual C 2012 (or clang >= 3.4 with LIBYUV_ENABLE_ROWWIN) required for AVX2.
#if ((defined(_M_IX86) || defined(_M_X64)) && !defined(__clang__) && \
defined(_MSC_VER) && _MSC_VER >= 1700) || \
(defined(LIBYUV_ENABLE_ROWWIN) && defined(__clang__) && \
(defined(__x86_64__) || defined(__i386__) || defined(_M_X64) || \
defined(_M_IX86)) && \
((__clang_major__ > 3) || \
(__clang_major__ == 3 && (__clang_minor__ >= 4))))
#define VISUALC_HAS_AVX2 1
#endif // VisualStudio >= 2012
// Visual C 2019 (or clang >= 7 with LIBYUV_ENABLE_ROWWIN) required for AVX512.
#if (defined(_M_X64) || defined(__x86_64__)) && \
((!defined(__clang__) && defined(_MSC_VER) && _MSC_VER >= 1920) || \
(defined(LIBYUV_ENABLE_ROWWIN) && defined(__clang__) && \
(__clang_major__ >= 7) && !defined(__APPLE__)))
#define VISUALC_HAS_AVX512 1
#endif // VisualStudio >= 2019
#if defined(LIBYUV_ENABLE_SME)
#undef LIBYUV_DISABLE_SME
#endif

View File

@ -29,6 +29,7 @@ extern "C" {
defined(_M_IX86)) && \
((defined(_MSC_VER) && !defined(__clang__)) || \
defined(LIBYUV_ENABLE_ROWWIN))
#if defined(VISUALC_HAS_AVX2)
#define HAS_TRANSPOSEWX8_AVX2
#define HAS_TRANSPOSEUVWX8_AVX2
#define HAS_TRANSPOSEWX8_16_AVX2
@ -38,7 +39,8 @@ extern "C" {
#define HAS_TRANSPOSEWXH_32_AVX2
#define HAS_TRANSPOSEWX16_AVX2
#define HAS_TRANSPOSEUVWX16_AVX2
#if defined(__x86_64__) || defined(_M_X64)
#endif
#if defined(VISUALC_HAS_AVX512)
#define HAS_TRANSPOSEWX16_AVX512BW
#define HAS_TRANSPOSEUVWX16_AVX512BW
#define HAS_TRANSPOSEWX32_16_AVX512BW
@ -48,9 +50,10 @@ extern "C" {
// The following are available for 32/64 bit GCC and clang, as inline assembly
// in rotate_gcc.cc:
#if !defined(LIBYUV_DISABLE_X86) && \
(defined(__x86_64__) || defined(__i386__)) && \
!defined(LIBYUV_ENABLE_ROWWIN) && \
#if !defined(LIBYUV_DISABLE_X86) && \
(defined(__x86_64__) || defined(__i386__)) && \
(defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2)) && \
!defined(LIBYUV_ENABLE_ROWWIN) && \
(!defined(_MSC_VER) || defined(__clang__))
#define HAS_TRANSPOSEWX8_AVX2
#define HAS_TRANSPOSEUVWX8_AVX2
@ -63,9 +66,10 @@ extern "C" {
#define HAS_TRANSPOSEUVWX16_AVX2
#endif
// The following are available for AVX512 clang x64 platforms:
#if !defined(LIBYUV_DISABLE_X86) && defined(__x86_64__) && \
defined(CLANG_HAS_AVX512) && !defined(LIBYUV_ENABLE_ROWWIN) && \
// The following are available for AVX512 GCC/clang x64 platforms:
#if !defined(LIBYUV_DISABLE_X86) && defined(__x86_64__) && \
(defined(CLANG_HAS_AVX512) || defined(GCC_HAS_AVX512)) && \
!defined(LIBYUV_ENABLE_ROWWIN) && \
(!defined(_MSC_VER) || defined(__clang__))
#define HAS_TRANSPOSEWX16_AVX512BW
#define HAS_TRANSPOSEUVWX16_AVX512BW

View File

@ -90,9 +90,9 @@ extern "C" {
// The following are available on all x86 platforms, but
// require VS2012, clang 3.4 or gcc 4.7.
#if !defined(LIBYUV_DISABLE_X86) && \
(defined(__x86_64__) || defined(__i386__) || defined(_M_X64) || \
defined(_M_IX86))
#if !defined(LIBYUV_DISABLE_X86) && \
(defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2) || \
defined(GCC_HAS_AVX2))
#define HAS_ARGBMIRRORROW_AVX2
#define HAS_RGB24MIRRORROW_AVX2
#define HAS_ARGBTOUVMATRIXROW_AVX2
@ -181,6 +181,7 @@ extern "C" {
#define HAS_I422TOAR30ROW_SSSE3
#define HAS_MERGEARGBROW_SSE2
#define HAS_MERGEXRGBROW_SSE2
#define HAS_MIRRORSPLITUVROW_SSSE3
#define HAS_MIRRORUVROW_SSSE3
#define HAS_NV21TOYUV24ROW_SSSE3
#define HAS_P210TOAR30ROW_SSSE3
@ -188,11 +189,6 @@ extern "C" {
#define HAS_P210TOARGBROW_SSSE3
#define HAS_P410TOAR30ROW_SSSE3
#define HAS_P410TOARGBROW_SSSE3
#define HAS_RAWTOARGBROW_AVX2
#define HAS_RGB24TOARGBROW_AVX2
#define HAS_RGB565TOARGBROW_AVX2
#define HAS_ARGB1555TOARGBROW_AVX2
#define HAS_ARGB4444TOARGBROW_AVX2
#define HAS_SPLITARGBROW_SSE2
#define HAS_SPLITARGBROW_SSSE3
#define HAS_SPLITRGBROW_SSE41
@ -233,11 +229,11 @@ extern "C" {
#define HAS_ARGBTORGB565ROW_AVX2
#define HAS_ARGBTOARGB1555ROW_AVX2
#define HAS_ARGBTOARGB4444ROW_AVX2
#define HAS_ARGBTOUVMATRIXROW_AVX2
#define HAS_RGBTOUVMATRIXROW_AVX2
#define HAS_RGB565TOUVMATRIXROW_AVX2
#define HAS_ARGB1555TOUVMATRIXROW_AVX2
#define HAS_ARGB4444TOUVMATRIXROW_AVX2
#define HAS_RAWTOARGBROW_AVX2
#define HAS_RGB24TOARGBROW_AVX2
#define HAS_RGB565TOARGBROW_AVX2
#define HAS_ARGB1555TOARGBROW_AVX2
#define HAS_ARGB4444TOARGBROW_AVX2
#define HAS_ARGBTOUV444MATRIXROW_AVX2
#define HAS_RGBTOUV444MATRIXROW_AVX2
#define HAS_ARGBTOYMATRIXROW_AVX2
@ -318,7 +314,6 @@ extern "C" {
#define HAS_MERGEXR64ROW_AVX2
#define HAS_MERGEXRGB16TO8ROW_AVX2
#define HAS_MERGEXRGBROW_AVX2
#define HAS_MIRRORUVROW_AVX2
#define HAS_MULTIPLYROW_16_AVX2
#define HAS_NV21TOYUV24ROW_AVX2
#define HAS_P210TOAR30ROW_AVX2
@ -343,6 +338,10 @@ extern "C" {
((defined(_MSC_VER) && !defined(__clang__)) || \
defined(LIBYUV_ENABLE_ROWWIN))
#define HAS_RAWTORGB24ROW_SSSE3
#define HAS_ARGBALPHABLENDROW_SSSE3
#define HAS_ARGBORROW_SSE2
#define HAS_MIRRORSPLITUVROW_SSSE3
#if defined(VISUALC_HAS_AVX2)
#define HAS_RAWTORGB24ROW_AVX2
#define HAS_RAWTOARGBROW_AVX2
#define HAS_I422TORGB24ROW_AVX2
@ -360,6 +359,7 @@ extern "C" {
#define HAS_I422TOARGB4444ROW_AVX2
#define HAS_NV12TORGB565ROW_AVX2
#define HAS_CONVERT8TO16ROW_AVX2
#define HAS_CONVERT8TO8ROW_AVX2
#define HAS_I422TOAR30ROW_AVX2
#define HAS_AR30TOAB30ROW_AVX2
#define HAS_AR30TOABGRROW_AVX2
@ -367,7 +367,108 @@ extern "C" {
#define HAS_AYUVTOUVROW_AVX2
#define HAS_AYUVTOVUROW_AVX2
#define HAS_AYUVTOYROW_AVX2
#if defined(__x86_64__) || defined(_M_X64)
#define HAS_ARGB1555TOUVROW_AVX2
#define HAS_ARGB1555TOYROW_AVX2
#define HAS_ARGB4444TOUVROW_AVX2
#define HAS_ARGB4444TOYROW_AVX2
#define HAS_ARGBAFFINEROW_AVX2
#define HAS_ARGBCOLORMATRIXROW_AVX2
#define HAS_ARGBCOLORTABLEROW_AVX2
#define HAS_ARGBLUMACOLORTABLEROW_AVX2
#define HAS_ARGBQUANTIZEROW_AVX2
#define HAS_ARGBSEPIAROW_AVX2
#define HAS_ARGBSETROW_AVX2
#define HAS_ARGBSHADEROW_AVX2
#define HAS_BYTETOFLOATROW_AVX2
#define HAS_COPYROW_16_AVX2
#define HAS_DETILEROW_16_AVX2
#define HAS_DETILEROW_AVX2
#define HAS_DETILESPLITUVROW_AVX2
#define HAS_GAUSSROW_AVX2
#define HAS_GAUSSROW_F32_AVX2
#define HAS_RGB565TOUVROW_AVX2
#define HAS_RGB565TOYROW_AVX2
#define HAS_RGBCOLORTABLEROW_AVX2
#define HAS_SETROW_AVX2
#define HAS_SOBELROW_AVX2
#define HAS_SOBELTOPLANEROW_AVX2
#define HAS_SOBELXROW_AVX2
#define HAS_SOBELXYROW_AVX2
#define HAS_SOBELYROW_AVX2
#define HAS_ARGBALPHABLENDROW_AVX2
#define HAS_ARGBORROW_AVX2
#define HAS_ARGBTOYMATRIXROW_AVX2
#define HAS_RGBTOYMATRIXROW_AVX2
#define HAS_RGB565TOYMATRIXROW_AVX2
#define HAS_ARGB1555TOYMATRIXROW_AVX2
#define HAS_ARGB4444TOYMATRIXROW_AVX2
#define HAS_ARGBTOUV444MATRIXROW_AVX2
#define HAS_RGBTOUV444MATRIXROW_AVX2
#define HAS_J400TOARGBROW_AVX2
#define HAS_MULTIPLYROW_16_AVX2
#define HAS_SWAPUVROW_AVX2
#define HAS_AB64TOARGBROW_AVX2
#define HAS_AR64TOARGBROW_AVX2
#define HAS_ARGBADDROW_AVX2
#define HAS_ARGBBLENDROW_AVX2
#define HAS_ARGBCOPYALPHAROW_AVX2
#define HAS_ARGBGRAYROW_AVX2
#define HAS_ARGBPOLYNOMIALROW_AVX2
#define HAS_ARGBSUBTRACTROW_AVX2
#define HAS_ARGBTOAB64ROW_AVX2
#define HAS_ARGBTOAR64ROW_AVX2
#define HAS_ARGBTORAWROW_AVX2
#define HAS_ARGBTORGB24ROW_AVX2
#define HAS_ARGBUNATTENUATEROW_AVX2
#define HAS_COMPUTECUMULATIVESUMROW_AVX2
#define HAS_CONVERT16TO8ROW_AVX2
#define HAS_COPYROW_AVX
#define HAS_CUMULATIVESUMTOAVERAGEROW_AVX2
#define HAS_DETILETOYUY2_AVX2
#define HAS_DIVIDEROW_16_AVX2
#define HAS_GAUSSCOL_AVX2
#define HAS_GAUSSCOL_F32_AVX2
#define HAS_HALFMERGEUVROW_AVX2
#define HAS_HALFROW_16_AVX2
#define HAS_HALFROW_16TO8_AVX2
#define HAS_HALFROW_AVX2
#define HAS_HALFWIDTHROW_16TO8_AVX2
#define HAS_HALFWIDTHROW_16TO8_ODD_AVX2
#define HAS_I422TOUYVYROW_AVX2
#define HAS_I422TOYUY2ROW_AVX2
#define HAS_I444TOARGBROW_AVX2
#define HAS_I444TORGB24ROW_AVX2
#define HAS_MERGEAR64ROW_AVX2
#define HAS_MERGEARGB16TO8ROW_AVX2
#define HAS_MERGEARGBROW_AVX2
#define HAS_MERGERGBROW_AVX2
#define HAS_MERGEUVROW_16_AVX2
#define HAS_MERGEXR30ROW_AVX2
#define HAS_MERGEXR64ROW_AVX2
#define HAS_MERGEXRGB16TO8ROW_AVX2
#define HAS_MERGEXRGBROW_AVX2
#define HAS_NV12TORGB24ROW_AVX2
#define HAS_NV21TORGB24ROW_AVX2
#define HAS_NV21TOYUV24ROW_AVX2
#define HAS_RAWTORGBAROW_AVX2
#define HAS_SCALEMAXSAMPLES_AVX2
#define HAS_SCALESAMPLES_AVX2
#define HAS_SCALESUMSAMPLES_AVX2
#define HAS_SPLITARGBROW_AVX2
#define HAS_SPLITRGBROW_AVX2
#define HAS_SPLITUVROW_16_AVX2
#define HAS_SPLITUVROW_AVX2
#define HAS_SPLITXRGBROW_AVX2
#define HAS_UNPACKMT2T_AVX2
#define HAS_UYVYTOUV422ROW_AVX2
#define HAS_UYVYTOUVROW_AVX2
#define HAS_UYVYTOYROW_AVX2
#define HAS_YUY2TONVUVROW_AVX2
#define HAS_YUY2TOUV422ROW_AVX2
#define HAS_YUY2TOUVROW_AVX2
#define HAS_YUY2TOYROW_AVX2
#endif
#if defined(VISUALC_HAS_AVX512)
#define HAS_RAWTOARGBROW_AVX512BW
#define HAS_RGB24TOARGBROW_AVX512BW
#define HAS_RAWTORGB24ROW_AVX512BW
@ -397,6 +498,7 @@ extern "C" {
#define HAS_NV21TOARGBROW_AVX512BW
#define HAS_NV12TORGB24ROW_AVX512VBMI
#define HAS_NV21TORGB24ROW_AVX512VBMI
#define HAS_NV21TOYUV24ROW_AVX512VBMI
#define HAS_I422ALPHATOARGBROW_AVX512BW
#define HAS_SWAPUVROW_AVX512BW
#define HAS_HALFMERGEUVROW_AVX512BW
@ -453,120 +555,6 @@ extern "C" {
#define HAS_YUY2TOARGBROW_AVX512BW
#define HAS_YUY2TOUVROW_AVX512BW
#define HAS_YUY2TOYROW_AVX512BW
#endif
#define HAS_ARGB1555TOUVROW_AVX2
#define HAS_ARGB1555TOYROW_AVX2
#define HAS_ARGB4444TOUVROW_AVX2
#define HAS_ARGB4444TOYROW_AVX2
#define HAS_ARGBAFFINEROW_AVX2
#define HAS_ARGBCOLORMATRIXROW_AVX2
#define HAS_ARGBCOLORTABLEROW_AVX2
#define HAS_ARGBLUMACOLORTABLEROW_AVX2
#define HAS_ARGBQUANTIZEROW_AVX2
#define HAS_ARGBSEPIAROW_AVX2
#define HAS_ARGBSETROW_AVX2
#define HAS_ARGBSHADEROW_AVX2
#define HAS_BYTETOFLOATROW_AVX2
#define HAS_COPYROW_16_AVX2
#define HAS_DETILEROW_16_AVX2
#define HAS_DETILEROW_AVX2
#define HAS_DETILESPLITUVROW_AVX2
#define HAS_GAUSSROW_AVX2
#define HAS_GAUSSROW_F32_AVX2
#define HAS_RGB565TOUVROW_AVX2
#define HAS_RGB565TOYROW_AVX2
#define HAS_RGBCOLORTABLEROW_AVX2
#define HAS_SETROW_AVX2
#define HAS_SOBELROW_AVX2
#define HAS_SOBELTOPLANEROW_AVX2
#define HAS_SOBELXROW_AVX2
#define HAS_SOBELXYROW_AVX2
#define HAS_SOBELYROW_AVX2
#define HAS_ARGBALPHABLENDROW_SSSE3
#define HAS_ARGBORROW_SSE2
#define HAS_ARGBALPHABLENDROW_AVX2
#define HAS_ARGBORROW_AVX2
#define HAS_ARGBTOYMATRIXROW_AVX2
#define HAS_RGBTOYMATRIXROW_AVX2
#define HAS_RGB565TOYMATRIXROW_AVX2
#define HAS_ARGB1555TOYMATRIXROW_AVX2
#define HAS_ARGB4444TOYMATRIXROW_AVX2
#define HAS_ARGBTOUVMATRIXROW_AVX2
#define HAS_ARGBTOUV444MATRIXROW_AVX2
#define HAS_RGBTOUV444MATRIXROW_AVX2
#define HAS_J400TOARGBROW_AVX2
#define HAS_I422TOARGBROW_AVX2
#define HAS_NV12TOARGBROW_AVX2
#define HAS_NV21TOARGBROW_AVX2
#define HAS_MERGEUVROW_AVX2
#define HAS_MIRRORROW_AVX2
#define HAS_MIRRORUVROW_AVX2
#define HAS_MIRRORSPLITUVROW_AVX2
#define HAS_RGB24MIRRORROW_AVX2
#define HAS_ARGBMIRRORROW_AVX2
#define HAS_INTERPOLATEROW_AVX2
#define HAS_INTERPOLATEROW_16_AVX2
#define HAS_MULTIPLYROW_16_AVX2
#define HAS_SWAPUVROW_AVX2
#define HAS_AB64TOARGBROW_AVX2
#define HAS_AR64TOARGBROW_AVX2
#define HAS_ARGBADDROW_AVX2
#define HAS_ARGBBLENDROW_AVX2
#define HAS_ARGBCOPYALPHAROW_AVX2
#define HAS_ARGBGRAYROW_AVX2
#define HAS_ARGBPOLYNOMIALROW_AVX2
#define HAS_ARGBSUBTRACTROW_AVX2
#define HAS_ARGBTOAB64ROW_AVX2
#define HAS_ARGBTOAR64ROW_AVX2
#define HAS_ARGBTORAWROW_AVX2
#define HAS_ARGBTORGB24ROW_AVX2
#define HAS_ARGBUNATTENUATEROW_AVX2
#define HAS_COMPUTECUMULATIVESUMROW_AVX2
#define HAS_CONVERT16TO8ROW_AVX2
#define HAS_COPYROW_AVX
#define HAS_CUMULATIVESUMTOAVERAGEROW_AVX2
#define HAS_DETILETOYUY2_AVX2
#define HAS_GAUSSCOL_AVX2
#define HAS_GAUSSCOL_F32_AVX2
#define HAS_HALFROW_16_AVX2
#define HAS_HALFROW_16TO8_AVX2
#define HAS_HALFROW_AVX2
#define HAS_HALFWIDTHROW_16TO8_AVX2
#define HAS_HALFWIDTHROW_16TO8_ODD_AVX2
#define HAS_I422TOUYVYROW_AVX2
#define HAS_I422TOYUY2ROW_AVX2
#define HAS_I444TOARGBROW_AVX2
#define HAS_I444TORGB24ROW_AVX2
#define HAS_MERGEAR64ROW_AVX2
#define HAS_MERGEARGB16TO8ROW_AVX2
#define HAS_MERGEARGBROW_AVX2
#define HAS_MERGERGBROW_AVX2
#define HAS_MERGEUVROW_16_AVX2
#define HAS_MERGEXR30ROW_AVX2
#define HAS_MERGEXR64ROW_AVX2
#define HAS_MERGEXRGB16TO8ROW_AVX2
#define HAS_MERGEXRGBROW_AVX2
#define HAS_NV12TORGB24ROW_AVX2
#define HAS_NV21TORGB24ROW_AVX2
#define HAS_NV21TOYUV24ROW_AVX2
#define HAS_RAWTORGBAROW_AVX2
#define HAS_SCALEMAXSAMPLES_AVX2
#define HAS_SCALESAMPLES_AVX2
#define HAS_SCALESUMSAMPLES_AVX2
#define HAS_SPLITARGBROW_AVX2
#define HAS_SPLITRGBROW_AVX2
#define HAS_SPLITUVROW_16_AVX2
#define HAS_SPLITUVROW_AVX2
#define HAS_SPLITXRGBROW_AVX2
#define HAS_UNPACKMT2T_AVX2
#define HAS_UYVYTOUV422ROW_AVX2
#define HAS_UYVYTOUVROW_AVX2
#define HAS_UYVYTOYROW_AVX2
#define HAS_YUY2TONVUVROW_AVX2
#define HAS_YUY2TOUV422ROW_AVX2
#define HAS_YUY2TOUVROW_AVX2
#define HAS_YUY2TOYROW_AVX2
#if defined(__x86_64__) || defined(_M_X64)
#define HAS_ARGBTORAWROW_AVX512BW
#define HAS_ARGBTORGB24ROW_AVX512BW
#define HAS_ARGBTOUV444MATRIXROW_AVX512BW
@ -589,10 +577,10 @@ extern "C" {
#endif
#endif
// The following are available for AVX512 clang x64 platforms:
// TODO(fbarchard): Port to GCC and Visual C
#if !defined(LIBYUV_DISABLE_X86) && \
(defined(__x86_64__) || defined(_M_X64)) && defined(CLANG_HAS_AVX512)
// The following are available for AVX512 GCC/clang x64 platforms:
#if !defined(LIBYUV_DISABLE_X86) && defined(USE_ROW_GCC) && \
defined(__x86_64__) && \
(defined(CLANG_HAS_AVX512) || defined(GCC_HAS_AVX512))
#define HAS_COPYROW_AVX512BW
#define HAS_RAWTOARGBROW_AVX512BW
#define HAS_RGB24TOARGBROW_AVX512BW
@ -605,12 +593,6 @@ extern "C" {
#define HAS_HALFROW_16TO8_AVX512BW
#define HAS_HALFWIDTHROW_16TO8_AVX512BW
#define HAS_MULTIPLYROW_16_AVX512BW
#endif
// The following are available for AVX512 clang x64 platforms:
// TODO(fbarchard): Port to x86
#if !defined(LIBYUV_DISABLE_X86) && \
(defined(__x86_64__) || defined(_M_X64)) && defined(CLANG_HAS_AVX512)
#define HAS_I422TOARGBROW_AVX512BW
#define HAS_I422TOAR30ROW_AVX512BW
#define HAS_ARGBSHUFFLEROW_AVX512BW
@ -648,6 +630,7 @@ extern "C" {
#define HAS_NV21TOARGBROW_AVX512BW
#define HAS_NV12TORGB24ROW_AVX512VBMI
#define HAS_NV21TORGB24ROW_AVX512VBMI
#define HAS_NV21TOYUV24ROW_AVX512VBMI
#define HAS_I422ALPHATOARGBROW_AVX512BW
#define HAS_SWAPUVROW_AVX512BW
#define HAS_HALFMERGEUVROW_AVX512BW
@ -2611,18 +2594,6 @@ void ARGBToYMatrixRow_Any_AVX2(const uint8_t* src_argb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void ARGBToYMatrixRow_Any_AVX512BW(const uint8_t* src_argb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void ARGBToYMatrixRow_Any_AVX512VNNI(const uint8_t* src_argb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void ARGBToYMatrixRow_Any_AVX512VNNIVBMI(const uint8_t* src_argb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void RGBToYMatrixRow_NEON(const uint8_t* src_rgb,
uint8_t* dst_y,
@ -2726,10 +2697,6 @@ void RGBToYMatrixRow_AVX512BW(const uint8_t* src_rgb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void RGBToYMatrixRow_Any_AVX512BW(const uint8_t* src_rgb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void ARGBToYMatrixRow_Any_NEON_DotProd(const uint8_t* src_argb,
uint8_t* dst_y,
@ -2826,21 +2793,6 @@ void ARGBToUV444MatrixRow_Any_AVX2(const uint8_t* src_argb,
uint8_t* dst_v,
int width,
const struct ArgbConstants* c);
void ARGBToUV444MatrixRow_Any_AVX512BW(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width,
const struct ArgbConstants* c);
void ARGBToUV444MatrixRow_Any_AVX512VNNI(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width,
const struct ArgbConstants* c);
void ARGBToUV444MatrixRow_Any_AVX512VNNIVBMI(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width,
const struct ArgbConstants* c);
void RGBToUV444MatrixRow_Any_SSSE3(const uint8_t* src_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
@ -2851,11 +2803,6 @@ void RGBToUV444MatrixRow_Any_AVX2(const uint8_t* src_rgb,
uint8_t* dst_v,
int width,
const struct ArgbConstants* c);
void RGBToUV444MatrixRow_Any_AVX512BW(const uint8_t* src_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width,
const struct ArgbConstants* c);
// Deprecated.
void RGB565ToYRow_C(const uint8_t* src_rgb565, uint8_t* dst_y, int width);
@ -3041,6 +2988,18 @@ void MirrorSplitUVRow_AVX2(const uint8_t* src,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void MirrorSplitUVRow_SSSE3(const uint8_t* src,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void MirrorSplitUVRow_Any_AVX2(const uint8_t* src_uv,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void MirrorSplitUVRow_Any_SSSE3(const uint8_t* src_uv,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void MirrorSplitUVRow_NEON(const uint8_t* src_uv,
uint8_t* dst_u,
uint8_t* dst_v,
@ -3147,10 +3106,6 @@ void SplitUVRow_RVV(const uint8_t* src_uv,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void SplitUVRow_Any_AVX512BW(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void SplitUVRow_Any_SSE2(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
@ -3317,10 +3272,6 @@ void MergeUVRow_Any_AVX2(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
int width);
void MergeUVRow_Any_AVX512BW(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
int width);
void MergeUVRow_Any_NEON(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
@ -3374,6 +3325,18 @@ void HalfMergeUVRow_AVX512BW(const uint8_t* src_u,
int src_stride_v,
uint8_t* dst_uv,
int width);
void HalfMergeUVRow_Any_SSSE3(const uint8_t* src_u,
int src_stride_u,
const uint8_t* src_v,
int src_stride_v,
uint8_t* dst_uv,
int width);
void HalfMergeUVRow_Any_AVX2(const uint8_t* src_u,
int src_stride_u,
const uint8_t* src_v,
int src_stride_v,
uint8_t* dst_uv,
int width);
void SplitRGBRow_C(const uint8_t* src_rgb,
uint8_t* dst_r,
@ -3917,10 +3880,6 @@ void MultiplyRow_16_AVX512BW(const uint16_t* src_y,
uint16_t* dst_y,
int scale,
int width);
void MultiplyRow_16_Any_AVX512BW(const uint16_t* src_ptr,
uint16_t* dst_ptr,
int scale,
int width);
void MultiplyRow_16_NEON(const uint16_t* src_y,
uint16_t* dst_y,
int scale,
@ -3991,10 +3950,6 @@ void Convert8To16Row_Any_AVX2(const uint8_t* src_ptr,
uint16_t* dst_ptr,
int bits,
int width);
void Convert8To16Row_Any_AVX512BW(const uint8_t* src_ptr,
uint16_t* dst_ptr,
int bits,
int width);
void Convert8To16Row_NEON(const uint8_t* src_y,
uint16_t* dst_y,
int bits,
@ -4036,10 +3991,6 @@ void Convert16To8Row_Any_AVX2(const uint16_t* src_ptr,
uint8_t* dst_ptr,
int scale,
int width);
void Convert16To8Row_Any_AVX512BW(const uint16_t* src_ptr,
uint8_t* dst_ptr,
int scale,
int width);
void Convert16To8Row_NEON(const uint16_t* src_y,
uint8_t* dst_y,
int scale,
@ -4117,11 +4068,6 @@ void HalfRow_16To8_Any_AVX2(const uint16_t* src_ptr,
uint8_t* dst_ptr,
int scale,
int width);
void HalfRow_16To8_Any_AVX512BW(const uint16_t* src_ptr,
ptrdiff_t src_stride,
uint8_t* dst_ptr,
int scale,
int width);
void HalfRow_16To8_NEON(const uint16_t* src_uv,
ptrdiff_t src_uv_stride,
uint8_t* dst_uv,
@ -4188,11 +4134,6 @@ void HalfWidthRow_16To8_Any_AVX2(const uint16_t* src_ptr,
uint8_t* dst_ptr,
int scale,
int width);
void HalfWidthRow_16To8_Any_AVX512BW(const uint16_t* src_ptr,
ptrdiff_t src_stride,
uint8_t* dst_ptr,
int scale,
int width);
void HalfWidthRow_16To8_NEON(const uint16_t* src_uv,
ptrdiff_t src_uv_stride,
uint8_t* dst_uv,
@ -4603,12 +4544,6 @@ void RAWToRGB24Row_Any_SSSE3(const uint8_t* src_ptr,
void RAWToRGB24Row_Any_AVX2(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void RAWToRGB24Row_Any_AVX512BW(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void RAWToRGB24Row_Any_AVX512VBMI(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void RGB565ToARGBRow_Any_AVX2(const uint8_t* src_ptr,
uint8_t* dst_ptr,
@ -4867,9 +4802,6 @@ void J400ToARGBRow_LSX(const uint8_t* src_y, uint8_t* dst_argb, int width);
void J400ToARGBRow_LASX(const uint8_t* src_y, uint8_t* dst_argb, int width);
void J400ToARGBRow_RVV(const uint8_t* src_y, uint8_t* dst_argb, int width);
void J400ToARGBRow_C(const uint8_t* src_y, uint8_t* dst_argb, int width);
void J400ToARGBRow_Any_AVX512BW(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void J400ToARGBRow_Any_AVX2(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
@ -5453,6 +5385,10 @@ void NV21ToYUV24Row_AVX2(const uint8_t* src_y,
const uint8_t* src_vu,
uint8_t* dst_yuv24,
int width);
void NV21ToYUV24Row_AVX512VBMI(const uint8_t* src_y,
const uint8_t* src_vu,
uint8_t* dst_yuv24,
int width);
void NV21ToARGBRow_SSSE3(const uint8_t* y_buf,
const uint8_t* vu_buf,
@ -7825,6 +7761,14 @@ void ARGBPolynomialRow_AVX2(const uint8_t* src_argb,
uint8_t* dst_argb,
const float* poly,
int width);
void ARGBPolynomialRow_Any_SSE2(const uint8_t* src_ptr,
uint8_t* dst_ptr,
const float* param,
int width);
void ARGBPolynomialRow_Any_AVX2(const uint8_t* src_ptr,
uint8_t* dst_ptr,
const float* param,
int width);
void ARGBPolynomialRow_NEON(const uint8_t* src_argb,
uint8_t* dst_argb,
const float* poly,

View File

@ -59,12 +59,9 @@ extern "C" {
// The following are available on all x86 platforms, but
// require VS2012, clang 3.4 or gcc 4.7.
#if !defined(LIBYUV_DISABLE_X86) && \
(defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2) || \
defined(GCC_HAS_AVX2) || \
(defined(LIBYUV_ENABLE_ROWWIN) && \
(defined(__x86_64__) || defined(__i386__) || \
defined(_M_X64) || defined(_M_IX86))))
#if !defined(LIBYUV_DISABLE_X86) && \
(defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2) || \
defined(GCC_HAS_AVX2))
#define HAS_SCALEADDROW_AVX2
#define HAS_SCALEARGBCOLS_AVX2
#define HAS_SCALEARGBCOLSUP2_AVX2
@ -96,11 +93,10 @@ extern "C" {
#endif
// The following are available for AVX512 x64 platforms:
#if !defined(LIBYUV_DISABLE_X86) && \
(defined(__x86_64__) || defined(_M_X64)) && \
(defined(CLANG_HAS_AVX512) || \
(defined(_MSC_VER) && !defined(__clang__)) || \
defined(LIBYUV_ENABLE_ROWWIN))
#if !defined(LIBYUV_DISABLE_X86) && \
(defined(__x86_64__) || defined(_M_X64)) && \
(defined(CLANG_HAS_AVX512) || defined(GCC_HAS_AVX512) || \
defined(VISUALC_HAS_AVX512))
#define HAS_SCALEADDROW_AVX512BW
#define HAS_SCALEADDCOLS1_AVX512BW
#define HAS_SCALEADDCOLS2_AVX512BW

View File

@ -389,6 +389,7 @@ static uint64_t LowBytesMask64(int n) {
#ifdef HAS_HAMMINGDISTANCE_AVX512BW
// Process 64 bytes per loop and the remainder of 1 to 63 bytes with masked
// loads that read zeros, so any count is supported.
LIBYUV_TARGET_AVX512BW
uint32_t HammingDistance_AVX512BW(const uint8_t* src_a,
const uint8_t* src_b,
int count) {
@ -527,6 +528,7 @@ uint32_t HammingDistance_AVX512VNNI(const uint8_t* src_a,
#ifdef HAS_SUMSQUAREERROR_AVX512BW
// Process 64 bytes per loop and the remainder of 1 to 63 bytes with masked
// loads that read zeros, so any count is supported.
LIBYUV_TARGET_AVX512BW
uint32_t SumSquareError_AVX512BW(const uint8_t* src_a,
const uint8_t* src_b,
int count) {
@ -596,6 +598,7 @@ uint32_t SumSquareError_AVX512BW(const uint8_t* src_a,
#ifdef HAS_SUMSQUAREERROR_AVX512VNNI
// Process 64 bytes per loop and the remainder of 1 to 63 bytes with masked
// loads that read zeros, so any count is supported.
LIBYUV_TARGET_AVX512VNNI
uint32_t SumSquareError_AVX512VNNI(const uint8_t* src_a,
const uint8_t* src_b,
int count) {
@ -811,6 +814,7 @@ static uint32_t Pow33(int n) {
// Process 64 bytes per loop. The remainder of n = 1 to 63 bytes is loaded
// into the high n bytes with a masked load ending at src + count, so the
// same multipliers apply, and hash is multiplied by 33 ^ n.
LIBYUV_TARGET_AVX512BW
uint32_t HashDjb2_AVX512BW(const uint8_t* src, int count, uint32_t seed) {
const int n = count & 63;
const uint64_t mask = n ? ~0ULL << (64 - n) : 0ULL;
@ -1150,6 +1154,7 @@ void Ssim4x4Row_AVX2(const uint8_t* src_a,
// Process 64 pixels (16 4x4 tiles) per loop and the remainder of 4 to 60
// pixels (1 to 15 tiles) with masked loads and stores.
LIBYUV_TARGET_AVX512BW
void Ssim4x4Row_AVX512BW(const uint8_t* src_a,
int stride_a,
const uint8_t* src_b,
@ -1433,6 +1438,7 @@ float SsimWindowRow_AVX2(const uint32_t* row0,
// Process 16 8x8 windows per loop and the remainder of 1 to 15 windows with
// masked loads and masked accumulation.
LIBYUV_TARGET_AVX512BW
float SsimWindowRow_AVX512BW(const uint32_t* row0,
const uint32_t* row1,
int num_windows) {

View File

@ -291,10 +291,7 @@ static int I41xToI420(const uint16_t* src_y,
#endif
#if defined(HAS_CONVERT16TO8ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Convert16To8Row = Convert16To8Row_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
Convert16To8Row = Convert16To8Row_AVX512BW;
}
Convert16To8Row = Convert16To8Row_AVX512BW;
}
#endif
#if defined(HAS_CONVERT16TO8ROW_RVV)
@ -345,10 +342,7 @@ static int I41xToI420(const uint16_t* src_y,
#endif
#if defined(HAS_HALFWIDTHROW_16TO8_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
HalfWidthRow_16To8 = HalfWidthRow_16To8_Any_AVX512BW;
if (IS_ALIGNED(uv_width, 32)) {
HalfWidthRow_16To8 = HalfWidthRow_16To8_AVX512BW;
}
HalfWidthRow_16To8 = HalfWidthRow_16To8_AVX512BW;
}
#endif
#if defined(HAS_HALFWIDTHROW_16TO8_RVV)
@ -466,10 +460,7 @@ static int I21xToI420(const uint16_t* src_y,
#endif
#if defined(HAS_CONVERT16TO8ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Convert16To8Row = Convert16To8Row_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
Convert16To8Row = Convert16To8Row_AVX512BW;
}
Convert16To8Row = Convert16To8Row_AVX512BW;
}
#endif
#if defined(HAS_CONVERT16TO8ROW_RVV)
@ -519,10 +510,7 @@ static int I21xToI420(const uint16_t* src_y,
#endif
#if defined(HAS_HALFROW_16TO8_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
HalfRow_16To8 = HalfRow_16To8_Any_AVX512BW;
if (IS_ALIGNED(uv_width, 64)) {
HalfRow_16To8 = HalfRow_16To8_AVX512BW;
}
HalfRow_16To8 = HalfRow_16To8_AVX512BW;
}
#endif
#if defined(HAS_HALFROW_16TO8_RVV)
@ -962,10 +950,7 @@ int I010ToNV12(const uint16_t* src_y,
#endif
#if defined(HAS_CONVERT16TO8ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Convert16To8Row = Convert16To8Row_Any_AVX512BW;
if (IS_ALIGNED(halfwidth, 64)) {
Convert16To8Row = Convert16To8Row_AVX512BW;
}
Convert16To8Row = Convert16To8Row_AVX512BW;
}
#endif
#if defined(HAS_CONVERT16TO8ROW_HVX)
@ -985,17 +970,14 @@ int I010ToNV12(const uint16_t* src_y,
#if defined(HAS_MERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
MergeUVRow = MergeUVRow_Any_AVX2;
if (IS_ALIGNED(halfwidth, 32)) {
if (IS_ALIGNED(halfwidth, 16)) {
MergeUVRow = MergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_MERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MergeUVRow = MergeUVRow_Any_AVX512BW;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_AVX512BW;
}
MergeUVRow = MergeUVRow_AVX512BW;
}
#endif
#if defined(HAS_MERGEUVROW_NEON)
@ -1503,17 +1485,14 @@ int I422ToNV21(const uint8_t* src_y,
#if defined(HAS_MERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
MergeUVRow = MergeUVRow_Any_AVX2;
if (IS_ALIGNED(halfwidth, 32)) {
if (IS_ALIGNED(halfwidth, 16)) {
MergeUVRow = MergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_MERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MergeUVRow = MergeUVRow_Any_AVX512BW;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_AVX512BW;
}
MergeUVRow = MergeUVRow_AVX512BW;
}
#endif
#if defined(HAS_MERGEUVROW_NEON)
@ -2096,10 +2075,7 @@ static int Px10ToI420(const uint16_t* src_y,
#endif
#if defined(HAS_CONVERT16TO8ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Convert16To8Row = Convert16To8Row_Any_AVX512BW;
if (IS_ALIGNED(uv_packed, 64)) {
Convert16To8Row = Convert16To8Row_AVX512BW;
}
Convert16To8Row = Convert16To8Row_AVX512BW;
}
#endif
#if defined(HAS_CONVERT16TO8ROW_RVV)
@ -2130,10 +2106,7 @@ static int Px10ToI420(const uint16_t* src_y,
#endif
#if defined(HAS_SPLITUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
SplitUVRow = SplitUVRow_Any_AVX512BW;
if (IS_ALIGNED(src_uv_width, 64)) {
SplitUVRow = SplitUVRow_AVX512BW;
}
SplitUVRow = SplitUVRow_AVX512BW;
}
#endif
#if defined(HAS_SPLITUVROW_NEON)
@ -2262,10 +2235,7 @@ static int Px10ToI420(const uint16_t* src_y,
#endif
#if defined(HAS_HALFROW_16TO8_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Half16To8 = HalfRow_16To8_Any_AVX512BW;
if (IS_ALIGNED(dst_uv_width, 64)) {
Half16To8 = HalfRow_16To8_AVX512BW;
}
Half16To8 = HalfRow_16To8_AVX512BW;
}
#endif
#if defined(HAS_HALFROW_16TO8_RVV)
@ -2315,10 +2285,7 @@ static int Px10ToI420(const uint16_t* src_y,
#endif
#if defined(HAS_HALFWIDTHROW_16TO8_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Half16To8 = HalfWidthRow_16To8_Any_AVX512BW;
if (IS_ALIGNED(dst_uv_width, 32)) {
Half16To8 = HalfWidthRow_16To8_AVX512BW;
}
Half16To8 = HalfWidthRow_16To8_AVX512BW;
}
#endif
#if defined(HAS_HALFWIDTHROW_16TO8_RVV)
@ -2919,26 +2886,17 @@ int ARGBToI420Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -3043,7 +3001,7 @@ int ARGBToI420Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2;
}
}
@ -3187,26 +3145,17 @@ int ARGBToI420Alpha(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -3311,7 +3260,7 @@ int ARGBToI420Alpha(const uint8_t* src_argb,
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2;
}
}
@ -3598,26 +3547,17 @@ static int AR30ToI420Matrix(const uint8_t* src_ar30,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -3683,7 +3623,7 @@ static int AR30ToI420Matrix(const uint8_t* src_ar30,
#if defined(HAS_ARGBTOUVMATRIXROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_SSSE3;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_SSSE3;
}
}
@ -3691,7 +3631,7 @@ static int AR30ToI420Matrix(const uint8_t* src_ar30,
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2;
}
}
@ -3857,10 +3797,7 @@ int RGB24ToI420(const uint8_t* src_rgb24,
#endif
#if defined(HAS_RGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_RGBTOUVMATRIXROW_SSSE3)
@ -4018,10 +3955,7 @@ int RGB24ToJ420(const uint8_t* src_rgb24,
#endif
#if defined(HAS_RGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_RGBTOUVMATRIXROW_SSSE3)
@ -4178,10 +4112,7 @@ int RAWToI420(const uint8_t* src_raw,
#endif
#if defined(HAS_RGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_RGBTOUVMATRIXROW_SSSE3)
@ -4329,10 +4260,7 @@ int RAWToJ420(const uint8_t* src_raw,
#endif
#if defined(HAS_RGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_RGBTOUVMATRIXROW_SSSE3)
@ -4479,10 +4407,7 @@ static int RAWToI444Matrix(const uint8_t* src_raw,
#endif
#if defined(HAS_RGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_NEON)
@ -4549,10 +4474,7 @@ static int RAWToI444Matrix(const uint8_t* src_raw,
#endif
#if defined(HAS_RGBTOUV444MATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
RGBToUV444MatrixRow = RGBToUV444MatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
RGBToUV444MatrixRow = RGBToUV444MatrixRow_AVX512BW;
}
RGBToUV444MatrixRow = RGBToUV444MatrixRow_AVX512BW;
}
#endif
#if defined(HAS_RGBTOUV444MATRIXROW_NEON)
@ -4974,10 +4896,7 @@ int RGB24ToJ400(const uint8_t* src_rgb24,
#endif
#if defined(HAS_RGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_NEON)
@ -5079,10 +4998,7 @@ int RAWToJ400(const uint8_t* src_raw,
#endif
#if defined(HAS_RGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_NEON)

View File

@ -872,7 +872,7 @@ int I444ToRGB24Matrix(const uint8_t* src_y,
#if defined(HAS_I444TORGB24ROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3)) {
I444ToRGB24Row = I444ToRGB24Row_Any_SSSE3;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I444ToRGB24Row = I444ToRGB24Row_SSSE3;
}
}
@ -3710,10 +3710,7 @@ int J400ToARGB(const uint8_t* src_y,
#endif
#if defined(HAS_J400TOARGBROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
J400ToARGBRow = J400ToARGBRow_Any_AVX512BW;
if (IS_ALIGNED(width, 32)) {
J400ToARGBRow = J400ToARGBRow_AVX512BW;
}
J400ToARGBRow = J400ToARGBRow_AVX512BW;
}
#endif
#if defined(HAS_J400TOARGBROW_NEON)
@ -5446,6 +5443,11 @@ int NV21ToYUV24(const uint8_t* src_y,
NV21ToYUV24Row = NV21ToYUV24Row_AVX2;
}
}
#endif
#if defined(HAS_NV21TOYUV24ROW_AVX512VBMI)
if (TestCpuFlag(kCpuHasAVX512VBMI)) {
NV21ToYUV24Row = NV21ToYUV24Row_AVX512VBMI;
}
#endif
for (y = 0; y < height; ++y) {
NV21ToYUV24Row(src_y, src_vu, dst_yuv24, width);
@ -5491,7 +5493,7 @@ int YUY2ToARGBMatrix(const uint8_t* src_yuy2,
#if defined(HAS_YUY2TOARGBROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3)) {
YUY2ToARGBRow = YUY2ToARGBRow_Any_SSSE3;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
YUY2ToARGBRow = YUY2ToARGBRow_SSSE3;
}
}
@ -5596,7 +5598,7 @@ int UYVYToARGBMatrix(const uint8_t* src_uyvy,
#if defined(HAS_UYVYTOARGBROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3)) {
UYVYToARGBRow = UYVYToARGBRow_Any_SSSE3;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
UYVYToARGBRow = UYVYToARGBRow_SSSE3;
}
}
@ -6216,7 +6218,7 @@ int I420ToRGB24Matrix(const uint8_t* src_y,
#if defined(HAS_I422TORGB24ROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3)) {
I422ToRGB24Row = I422ToRGB24Row_Any_SSSE3;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToRGB24Row = I422ToRGB24Row_SSSE3;
}
}
@ -6447,7 +6449,7 @@ int I422ToRGB24Matrix(const uint8_t* src_y,
#if defined(HAS_I422TORGB24ROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3)) {
I422ToRGB24Row = I422ToRGB24Row_Any_SSSE3;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToRGB24Row = I422ToRGB24Row_SSSE3;
}
}
@ -7758,7 +7760,7 @@ static int I420ToRGB24MatrixBilinear(const uint8_t* src_y,
#if defined(HAS_I444TORGB24ROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3)) {
I444ToRGB24Row = I444ToRGB24Row_Any_SSSE3;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I444ToRGB24Row = I444ToRGB24Row_SSSE3;
}
}
@ -9637,7 +9639,7 @@ static int I422ToRGB24MatrixLinear(const uint8_t* src_y,
#if defined(HAS_I444TORGB24ROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3)) {
I444ToRGB24Row = I444ToRGB24Row_Any_SSSE3;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I444ToRGB24Row = I444ToRGB24Row_SSSE3;
}
}

View File

@ -775,10 +775,7 @@ static int I4xxToPxxx(const uint8_t* src_y,
#endif
#if defined(HAS_CONVERT8TO16ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Convert8To16Row = Convert8To16Row_Any_AVX512BW;
if (IS_ALIGNED(uv_width, 64)) {
Convert8To16Row = Convert8To16Row_AVX512BW;
}
Convert8To16Row = Convert8To16Row_AVX512BW;
}
#endif
#if defined(HAS_CONVERT8TO16ROW_NEON)

View File

@ -78,26 +78,17 @@ int ARGBToI444Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -179,26 +170,17 @@ int ARGBToI444Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512BW;
}
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNI;
}
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNIVBMI;
}
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_NEON)
@ -312,26 +294,17 @@ int ARGBToI422Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -436,7 +409,7 @@ int ARGBToI422Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2;
}
}
@ -547,26 +520,17 @@ int ARGBToNV12Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -671,7 +635,7 @@ int ARGBToNV12Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2;
}
}
@ -732,17 +696,14 @@ int ARGBToNV12Matrix(const uint8_t* src_argb,
#if defined(HAS_MERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
MergeUVRow = MergeUVRow_Any_AVX2;
if (IS_ALIGNED(halfwidth, 32)) {
if (IS_ALIGNED(halfwidth, 16)) {
MergeUVRow = MergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_MERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MergeUVRow = MergeUVRow_Any_AVX512BW;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_AVX512BW;
}
MergeUVRow = MergeUVRow_AVX512BW;
}
#endif
#if defined(HAS_MERGEUVROW_NEON)
@ -875,26 +836,17 @@ int ARGBToNV16Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -999,7 +951,7 @@ int ARGBToNV16Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2;
}
}
@ -1060,17 +1012,14 @@ int ARGBToNV16Matrix(const uint8_t* src_argb,
#if defined(HAS_MERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
MergeUVRow = MergeUVRow_Any_AVX2;
if (IS_ALIGNED(halfwidth, 32)) {
if (IS_ALIGNED(halfwidth, 16)) {
MergeUVRow = MergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_MERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MergeUVRow = MergeUVRow_Any_AVX512BW;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_AVX512BW;
}
MergeUVRow = MergeUVRow_AVX512BW;
}
#endif
#if defined(HAS_MERGEUVROW_NEON)
@ -1197,26 +1146,17 @@ int ARGBToNV24Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -1298,26 +1238,17 @@ int ARGBToNV24Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512BW;
}
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNI;
}
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNIVBMI;
}
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_NEON)
@ -1377,17 +1308,14 @@ int ARGBToNV24Matrix(const uint8_t* src_argb,
#if defined(HAS_MERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
MergeUVRow = MergeUVRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
MergeUVRow = MergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_MERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MergeUVRow = MergeUVRow_Any_AVX512BW;
if (IS_ALIGNED(width, 32)) {
MergeUVRow = MergeUVRow_AVX512BW;
}
MergeUVRow = MergeUVRow_AVX512BW;
}
#endif
#if defined(HAS_MERGEUVROW_NEON)
@ -1502,26 +1430,17 @@ int ARGBToNV21Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -1626,7 +1545,7 @@ int ARGBToNV21Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2;
}
}
@ -1687,17 +1606,14 @@ int ARGBToNV21Matrix(const uint8_t* src_argb,
#if defined(HAS_MERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
MergeUVRow = MergeUVRow_Any_AVX2;
if (IS_ALIGNED(halfwidth, 32)) {
if (IS_ALIGNED(halfwidth, 16)) {
MergeUVRow = MergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_MERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MergeUVRow = MergeUVRow_Any_AVX512BW;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_AVX512BW;
}
MergeUVRow = MergeUVRow_AVX512BW;
}
#endif
#if defined(HAS_MERGEUVROW_NEON)
@ -1816,26 +1732,17 @@ int ARGBToI400Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -1931,26 +1838,17 @@ int ARGBToYUY2Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -2003,7 +1901,7 @@ int ARGBToYUY2Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2;
}
}
@ -2157,26 +2055,17 @@ int ARGBToUYVYMatrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -2229,7 +2118,7 @@ int ARGBToUYVYMatrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2;
}
}
@ -2412,26 +2301,17 @@ int ARGBToP010Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -2536,7 +2416,7 @@ int ARGBToP010Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2;
}
}
@ -2598,10 +2478,7 @@ int ARGBToP010Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_CONVERT8TO16ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Convert8To16Row = Convert8To16Row_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
Convert8To16Row = Convert8To16Row_AVX512BW;
}
Convert8To16Row = Convert8To16Row_AVX512BW;
}
#endif
#if defined(HAS_CONVERT8TO16ROW_NEON)
@ -2645,10 +2522,7 @@ int ARGBToP010Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_MULTIPLYROW_16_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MultiplyRow_16 = MultiplyRow_16_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
MultiplyRow_16 = MultiplyRow_16_AVX512BW;
}
MultiplyRow_16 = MultiplyRow_16_AVX512BW;
}
#endif
#if defined(HAS_MULTIPLYROW_16_NEON)
@ -2693,17 +2567,14 @@ int ARGBToP010Matrix(const uint8_t* src_argb,
#if defined(HAS_MERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
MergeUVRow = MergeUVRow_Any_AVX2;
if (IS_ALIGNED(halfwidth, 32)) {
if (IS_ALIGNED(halfwidth, 16)) {
MergeUVRow = MergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_MERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MergeUVRow = MergeUVRow_Any_AVX512BW;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_AVX512BW;
}
MergeUVRow = MergeUVRow_AVX512BW;
}
#endif
#if defined(HAS_MERGEUVROW_NEON)
@ -2869,26 +2740,17 @@ int ARGBToP210Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -2993,7 +2855,7 @@ int ARGBToP210Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2;
}
}
@ -3055,10 +2917,7 @@ int ARGBToP210Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_CONVERT8TO16ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Convert8To16Row = Convert8To16Row_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
Convert8To16Row = Convert8To16Row_AVX512BW;
}
Convert8To16Row = Convert8To16Row_AVX512BW;
}
#endif
#if defined(HAS_CONVERT8TO16ROW_NEON)
@ -3102,10 +2961,7 @@ int ARGBToP210Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_MULTIPLYROW_16_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MultiplyRow_16 = MultiplyRow_16_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
MultiplyRow_16 = MultiplyRow_16_AVX512BW;
}
MultiplyRow_16 = MultiplyRow_16_AVX512BW;
}
#endif
#if defined(HAS_MULTIPLYROW_16_NEON)
@ -3150,17 +3006,14 @@ int ARGBToP210Matrix(const uint8_t* src_argb,
#if defined(HAS_MERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
MergeUVRow = MergeUVRow_Any_AVX2;
if (IS_ALIGNED(halfwidth, 32)) {
if (IS_ALIGNED(halfwidth, 16)) {
MergeUVRow = MergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_MERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MergeUVRow = MergeUVRow_Any_AVX512BW;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_AVX512BW;
}
MergeUVRow = MergeUVRow_AVX512BW;
}
#endif
#if defined(HAS_MERGEUVROW_NEON)
@ -3311,26 +3164,17 @@ int ARGBToP410Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -3412,26 +3256,17 @@ int ARGBToP410Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512BW;
}
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX512VNNI;
if (IS_ALIGNED(width, 64)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNI;
}
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX512VNNIVBMI;
if (IS_ALIGNED(width, 64)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNIVBMI;
}
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_NEON)
@ -3492,10 +3327,7 @@ int ARGBToP410Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_CONVERT8TO16ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Convert8To16Row = Convert8To16Row_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
Convert8To16Row = Convert8To16Row_AVX512BW;
}
Convert8To16Row = Convert8To16Row_AVX512BW;
}
#endif
#if defined(HAS_CONVERT8TO16ROW_NEON)
@ -3539,10 +3371,7 @@ int ARGBToP410Matrix(const uint8_t* src_argb,
#endif
#if defined(HAS_MULTIPLYROW_16_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MultiplyRow_16 = MultiplyRow_16_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
MultiplyRow_16 = MultiplyRow_16_AVX512BW;
}
MultiplyRow_16 = MultiplyRow_16_AVX512BW;
}
#endif
#if defined(HAS_MULTIPLYROW_16_NEON)
@ -3587,17 +3416,14 @@ int ARGBToP410Matrix(const uint8_t* src_argb,
#if defined(HAS_MERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
MergeUVRow = MergeUVRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
MergeUVRow = MergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_MERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MergeUVRow = MergeUVRow_Any_AVX512BW;
if (IS_ALIGNED(width, 32)) {
MergeUVRow = MergeUVRow_AVX512BW;
}
MergeUVRow = MergeUVRow_AVX512BW;
}
#endif
#if defined(HAS_MERGEUVROW_NEON)
@ -4774,10 +4600,7 @@ static int RAWToNVMatrix(const uint8_t* src_raw,
#endif
#if defined(HAS_RGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
RGBToYMatrixRow = RGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_NEON)
@ -4875,17 +4698,14 @@ static int RAWToNVMatrix(const uint8_t* src_raw,
#if defined(HAS_MERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
MergeUVRow = MergeUVRow_Any_AVX2;
if (IS_ALIGNED(halfwidth, 32)) {
if (IS_ALIGNED(halfwidth, 16)) {
MergeUVRow = MergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_MERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MergeUVRow = MergeUVRow_Any_AVX512BW;
if (IS_ALIGNED(halfwidth, 64)) {
MergeUVRow = MergeUVRow_AVX512BW;
}
MergeUVRow = MergeUVRow_AVX512BW;
}
#endif
#if defined(HAS_MERGEUVROW_NEON)

View File

@ -240,10 +240,7 @@ static int NV24ToARGB(const uint8_t* src_y,
#endif
#if defined(HAS_SPLITUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
SplitUVRow = SplitUVRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
SplitUVRow = SplitUVRow_AVX512BW;
}
SplitUVRow = SplitUVRow_AVX512BW;
}
#endif
#if defined(HAS_SPLITUVROW_NEON)

View File

@ -55,9 +55,11 @@ static int NV16ToI420(const uint8_t* src_y,
if (height < 0) {
height = -height;
halfheight = (height + 1) >> 1;
src_y = src_y + (ptrdiff_t)(height - 1) * src_stride_y;
if (src_y) {
src_y = src_y + (ptrdiff_t)(height - 1) * src_stride_y;
src_stride_y = -src_stride_y;
}
src_uv = src_uv + (ptrdiff_t)(height - 1) * src_stride_uv;
src_stride_y = -src_stride_y;
src_stride_uv = -src_stride_uv;
}
if (dst_y) {
@ -81,10 +83,7 @@ static int NV16ToI420(const uint8_t* src_y,
#endif
#if defined(HAS_SPLITUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
SplitUVRow = SplitUVRow_Any_AVX512BW;
if (IS_ALIGNED(halfwidth, 64)) {
SplitUVRow = SplitUVRow_AVX512BW;
}
SplitUVRow = SplitUVRow_AVX512BW;
}
#endif
#if defined(HAS_SPLITUVROW_NEON)
@ -226,9 +225,11 @@ static int NV24ToI420(const uint8_t* src_y,
if (height < 0) {
height = -height;
halfheight = (height + 1) >> 1;
src_y = src_y + (ptrdiff_t)(height - 1) * src_stride_y;
if (src_y) {
src_y = src_y + (ptrdiff_t)(height - 1) * src_stride_y;
src_stride_y = -src_stride_y;
}
src_uv = src_uv + (ptrdiff_t)(height - 1) * src_stride_uv;
src_stride_y = -src_stride_y;
src_stride_uv = -src_stride_uv;
}
if (dst_y) {

View File

@ -232,10 +232,7 @@ void Convert16To8Plane(const uint16_t* src_y,
#endif
#if defined(HAS_CONVERT16TO8ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Convert16To8Row = Convert16To8Row_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
Convert16To8Row = Convert16To8Row_AVX512BW;
}
Convert16To8Row = Convert16To8Row_AVX512BW;
}
#endif
#if defined(HAS_CONVERT16TO8ROW_HVX)
@ -309,10 +306,7 @@ void Convert8To16Plane(
#endif
#if defined(HAS_CONVERT8TO16ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
Convert8To16Row = Convert8To16Row_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
Convert8To16Row = Convert8To16Row_AVX512BW;
}
Convert8To16Row = Convert8To16Row_AVX512BW;
}
#endif
#if defined(HAS_CONVERT8TO16ROW_NEON)
@ -745,10 +739,7 @@ void SplitUVPlane(const uint8_t* src_uv,
#endif
#if defined(HAS_SPLITUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
SplitUVRow = SplitUVRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
SplitUVRow = SplitUVRow_AVX512BW;
}
SplitUVRow = SplitUVRow_AVX512BW;
}
#endif
#if defined(HAS_SPLITUVROW_NEON)
@ -839,17 +830,14 @@ void MergeUVPlane(const uint8_t* src_u,
#if defined(HAS_MERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
MergeUVRow = MergeUVRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
MergeUVRow = MergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_MERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MergeUVRow = MergeUVRow_Any_AVX512BW;
if (IS_ALIGNED(width, 32)) {
MergeUVRow = MergeUVRow_AVX512BW;
}
MergeUVRow = MergeUVRow_AVX512BW;
}
#endif
#if defined(HAS_MERGEUVROW_NEON)
@ -1092,10 +1080,7 @@ void ConvertToMSBPlane_16(const uint16_t* src_y,
#endif
#if defined(HAS_MULTIPLYROW_16_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MultiplyRow_16 = MultiplyRow_16_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
MultiplyRow_16 = MultiplyRow_16_AVX512BW;
}
MultiplyRow_16 = MultiplyRow_16_AVX512BW;
}
#endif
#if defined(HAS_MULTIPLYROW_16_NEON)
@ -4353,18 +4338,12 @@ int RAWToRGB24(const uint8_t* src_raw,
#endif
#if defined(HAS_RAWTORGB24ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
RAWToRGB24Row = RAWToRGB24Row_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
RAWToRGB24Row = RAWToRGB24Row_AVX512BW;
}
RAWToRGB24Row = RAWToRGB24Row_AVX512BW;
}
#endif
#if defined(HAS_RAWTORGB24ROW_AVX512VBMI)
if (TestCpuFlag(kCpuHasAVX512VBMI)) {
RAWToRGB24Row = RAWToRGB24Row_Any_AVX512VBMI;
if (IS_ALIGNED(width, 64)) {
RAWToRGB24Row = RAWToRGB24Row_AVX512VBMI;
}
RAWToRGB24Row = RAWToRGB24Row_AVX512VBMI;
}
#endif
#if defined(HAS_RAWTORGB24ROW_NEON)
@ -5565,7 +5544,7 @@ int InterpolatePlane_16(const uint16_t* src0,
#if defined(HAS_INTERPOLATEROW_16_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
InterpolateRow_16 = InterpolateRow_16_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
InterpolateRow_16 = InterpolateRow_16_AVX2;
}
}
@ -5981,10 +5960,17 @@ static int ARGBSobelize(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNI)
if (TestCpuFlag(kCpuHasAVX512VNNI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI)
if (TestCpuFlag(kCpuHasAVX512VNNI) && TestCpuFlag(kCpuHasAVX512VBMI)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512VNNIVBMI;
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
@ -6282,14 +6268,19 @@ int ARGBPolynomial(const uint8_t* src_argb,
src_stride_argb = dst_stride_argb = 0;
}
#if defined(HAS_ARGBPOLYNOMIALROW_SSE2)
if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(width, 2)) {
ARGBPolynomialRow = ARGBPolynomialRow_SSE2;
if (TestCpuFlag(kCpuHasSSE2)) {
ARGBPolynomialRow = ARGBPolynomialRow_Any_SSE2;
if (IS_ALIGNED(width, 2)) {
ARGBPolynomialRow = ARGBPolynomialRow_SSE2;
}
}
#endif
#if defined(HAS_ARGBPOLYNOMIALROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2) && TestCpuFlag(kCpuHasFMA3) &&
IS_ALIGNED(width, 2)) {
ARGBPolynomialRow = ARGBPolynomialRow_AVX2;
if (TestCpuFlag(kCpuHasAVX2) && TestCpuFlag(kCpuHasFMA3)) {
ARGBPolynomialRow = ARGBPolynomialRow_Any_AVX2;
if (IS_ALIGNED(width, 2)) {
ARGBPolynomialRow = ARGBPolynomialRow_AVX2;
}
}
#endif
#if defined(HAS_ARGBPOLYNOMIALROW_NEON)
@ -6889,10 +6880,7 @@ int UYVYToNV12(const uint8_t* src_uyvy,
#endif
#if defined(HAS_SPLITUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
SplitUVRow = SplitUVRow_Any_AVX512BW;
if (IS_ALIGNED(awidth, 64)) {
SplitUVRow = SplitUVRow_AVX512BW;
}
SplitUVRow = SplitUVRow_AVX512BW;
}
#endif
#if defined(HAS_SPLITUVROW_NEON)
@ -7068,13 +7056,19 @@ void HalfMergeUVPlane(const uint8_t* src_u,
}
#endif
#if defined(HAS_HALFMERGEUVROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 16)) {
HalfMergeUVRow = HalfMergeUVRow_SSSE3;
if (TestCpuFlag(kCpuHasSSSE3)) {
HalfMergeUVRow = HalfMergeUVRow_Any_SSSE3;
if (IS_ALIGNED(width, 16)) {
HalfMergeUVRow = HalfMergeUVRow_SSSE3;
}
}
#endif
#if defined(HAS_HALFMERGEUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2) && IS_ALIGNED(width, 32)) {
HalfMergeUVRow = HalfMergeUVRow_AVX2;
if (TestCpuFlag(kCpuHasAVX2)) {
HalfMergeUVRow = HalfMergeUVRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
HalfMergeUVRow = HalfMergeUVRow_AVX2;
}
}
#endif
#if defined(HAS_HALFMERGEUVROW_AVX512BW)

View File

@ -559,9 +559,20 @@ void SplitRotateUV180(const uint8_t* src,
MirrorSplitUVRow = MirrorSplitUVRow_NEON;
}
#endif
#if defined(HAS_MIRRORSPLITUVROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3)) {
MirrorSplitUVRow = MirrorSplitUVRow_Any_SSSE3;
if (IS_ALIGNED(width, 8)) {
MirrorSplitUVRow = MirrorSplitUVRow_SSSE3;
}
}
#endif
#if defined(HAS_MIRRORSPLITUVROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2) && IS_ALIGNED(width, 32)) {
MirrorSplitUVRow = MirrorSplitUVRow_AVX2;
if (TestCpuFlag(kCpuHasAVX2)) {
MirrorSplitUVRow = MirrorSplitUVRow_Any_AVX2;
if (IS_ALIGNED(width, 16)) {
MirrorSplitUVRow = MirrorSplitUVRow_AVX2;
}
}
#endif
#if defined(HAS_MIRRORSPLITUVROW_AVX512BW)

View File

@ -189,6 +189,7 @@ static const uint32_t kPermdTranspose_AVX512BW[32] = {
// TODO(fbarchard): Use for ARGB (32 bit) and 16 bit channel transposes.
// TODO(fbarchard): Consider removing in favor of TransposeWx16_Byte_AVX2,
// which is within 10% of AVX512BW on most CPUs.
LIBYUV_TARGET_AVX512BW
static void TransposeWx16_Byte_AVX512BW(const uint8_t* src,
int src_stride,
uint8_t* dst_a,
@ -748,6 +749,7 @@ void TransposeWx16_16_AVX2(const uint16_t* src,
#if defined(HAS_TRANSPOSEWX32_16_AVX512BW)
// Transpose 32 rows of 16 bit plane (arbitrary width) using 8x32 tiles in
// zmm0..zmm15 with k1-masked right tail.
LIBYUV_TARGET_AVX512BW
void TransposeWx32_16_AVX512BW(const uint16_t* src,
int src_stride,
uint16_t* dst,
@ -1553,6 +1555,7 @@ void TransposeWxH_32_AVX2(const uint8_t* src,
#if defined(HAS_TRANSPOSEWX16_32_AVX512BW)
// Transpose 16 rows of 32 bit plane (arbitrary width) using 4x16 ZMM vertical
// tiles in zmm0..zmm7 with k1-masked right tail.
LIBYUV_TARGET_AVX512BW
void TransposeWx16_32_AVX512BW(const uint8_t* src,
int src_stride,
uint8_t* dst,

View File

@ -398,7 +398,7 @@ ANY31C(I422ToARGB1555Row_Any_SSSE3, I422ToARGB1555Row_SSSE3, 1, 0, 2, 7)
ANY31C(I422ToRGB565Row_Any_SSSE3, I422ToRGB565Row_SSSE3, 1, 0, 2, 7)
#endif
#ifdef HAS_I422TORGB24ROW_SSSE3
ANY31C(I422ToRGB24Row_Any_SSSE3, I422ToRGB24Row_SSSE3, 1, 0, 3, 15)
ANY31C(I422ToRGB24Row_Any_SSSE3, I422ToRGB24Row_SSSE3, 1, 0, 3, 7)
#endif
#ifdef HAS_I422TOAR30ROW_SSSE3
ANY31C(I422ToAR30Row_Any_SSSE3, I422ToAR30Row_SSSE3, 1, 0, 4, 7)
@ -410,7 +410,7 @@ ANY31C(I422ToAR30Row_Any_AVX2, I422ToAR30Row_AVX2, 1, 0, 4, 15)
ANY31C(I444ToARGBRow_Any_SSSE3, I444ToARGBRow_SSSE3, 0, 0, 4, 7)
#endif
#ifdef HAS_I444TORGB24ROW_SSSE3
ANY31C(I444ToRGB24Row_Any_SSSE3, I444ToRGB24Row_SSSE3, 0, 0, 3, 15)
ANY31C(I444ToRGB24Row_Any_SSSE3, I444ToRGB24Row_SSSE3, 0, 0, 3, 7)
#endif
#ifdef HAS_I422TORGB24ROW_AVX2
ANY31C(I422ToRGB24Row_Any_AVX2, I422ToRGB24Row_AVX2, 1, 0, 3, 15)
@ -676,10 +676,7 @@ ANY31PT(MergeXRGB16To8Row_Any_NEON,
ANY21(MergeUVRow_Any_SSE2, MergeUVRow_SSE2, 0, 1, 1, 2, 15)
#endif
#ifdef HAS_MERGEUVROW_AVX2
ANY21(MergeUVRow_Any_AVX2, MergeUVRow_AVX2, 0, 1, 1, 2, 31)
#endif
#ifdef HAS_MERGEUVROW_AVX512BW
ANY21(MergeUVRow_Any_AVX512BW, MergeUVRow_AVX512BW, 0, 1, 1, 2, 31)
ANY21(MergeUVRow_Any_AVX2, MergeUVRow_AVX2, 0, 1, 1, 2, 15)
#endif
#ifdef HAS_MERGEUVROW_NEON
ANY21(MergeUVRow_Any_NEON, MergeUVRow_NEON, 0, 1, 1, 2, 15)
@ -829,7 +826,7 @@ ANY21(MergeUVRow_Any_WASMSIMD, MergeUVRow_WASMSIMD, 0, 1, 1, 2, 15)
memcpy(vin, src_yuy2 + np * SBPP, r * SBPP); \
memcpy(vin + (MASK + 1) * SBPP, src_yuy2 + stride_yuy2 + np * SBPP, \
r * SBPP); \
ANY_SIMD(vin, (MASK + 1) * SBPP, vout, MASK + 1); \
ANY_SIMD(vin, (MASK + 1) * SBPP, vout, (MASK + 1) * 2); \
memcpy(dst_uv + np * BPP, vout, r * BPP); \
}
@ -842,6 +839,46 @@ ANY21S(YUY2ToNVUVRow_Any_SSE2, YUY2ToNVUVRow_SSE2, 4, 2, 7)
#ifdef HAS_YUY2TONVUVROW_AVX2
ANY21S(YUY2ToNVUVRow_Any_AVX2, YUY2ToNVUVRow_AVX2, 4, 2, 15)
#endif
#undef ANY21S
// Any 2 planes to 1 half-size merged UV row with stride (2 rows of U and V).
#define ANY21HMS(NAMEANY, ANY_SIMD, MASK) \
void NAMEANY(const uint8_t* src_u, int src_stride_u, const uint8_t* src_v, \
int src_stride_v, uint8_t* dst_uv, int width) { \
SIMD_ALIGNED(uint8_t vin[64 * 4]); \
static_assert(MASK + 1 <= sizeof(vin) / 4, "vin buffer too small"); \
SIMD_ALIGNED(uint8_t vout[64]); \
static_assert(SS(MASK + 1, 1) * 2 <= sizeof(vout), \
"vout buffer too small"); \
MSAN_MEMSET(vin, 0, sizeof(vin)); /* for msan */ \
MSAN_MEMSET(vout, 0, sizeof(vout)); /* for msan */ \
int r = width & MASK; \
int n = width & ~MASK; \
if (n > 0) { \
ANY_SIMD(src_u, src_stride_u, src_v, src_stride_v, dst_uv, n); \
} \
ptrdiff_t np = n; \
memcpy(vin, src_u + np, r); \
memcpy(vin + 64, src_u + src_stride_u + np, r); \
memcpy(vin + 128, src_v + np, r); \
memcpy(vin + 192, src_v + src_stride_v + np, r); \
if (r & 1) { \
vin[r] = vin[r - 1]; \
vin[64 + r] = vin[64 + r - 1]; \
vin[128 + r] = vin[128 + r - 1]; \
vin[192 + r] = vin[192 + r - 1]; \
} \
ANY_SIMD(vin, 64, vin + 128, 64, vout, MASK + 1); \
memcpy(dst_uv + (np >> 1) * 2, vout, SS(r, 1) * 2); \
}
#ifdef HAS_HALFMERGEUVROW_SSSE3
ANY21HMS(HalfMergeUVRow_Any_SSSE3, HalfMergeUVRow_SSSE3, 15)
#endif
#ifdef HAS_HALFMERGEUVROW_AVX2
ANY21HMS(HalfMergeUVRow_Any_AVX2, HalfMergeUVRow_AVX2, 31)
#endif
#undef ANY21HMS
// Any 2 planes to 1 with yuvconstants
#define ANY21C(NAMEANY, ANY_SIMD, UVSHIFT, SBPP, SBPP2, BPP, MASK) \
@ -1133,9 +1170,6 @@ ANY11(ABGRToAR30Row_Any_AVX2, ABGRToAR30Row_AVX2, 0, 4, 4, 7)
ANY11(ARGBToAR30Row_Any_AVX2, ARGBToAR30Row_AVX2, 0, 4, 4, 7)
#endif
#if defined(HAS_J400TOARGBROW_AVX512BW)
ANY11(J400ToARGBRow_Any_AVX512BW, J400ToARGBRow_AVX512BW, 0, 1, 4, 31)
#endif
#if defined(HAS_J400TOARGBROW_AVX2)
ANY11(J400ToARGBRow_Any_AVX2, J400ToARGBRow_AVX2, 0, 1, 4, 15)
#endif
@ -1159,12 +1193,6 @@ ANY11(RAWToRGB24Row_Any_SSSE3, RAWToRGB24Row_SSSE3, 0, 3, 3, 7)
#if defined(HAS_RAWTORGB24ROW_AVX2)
ANY11(RAWToRGB24Row_Any_AVX2, RAWToRGB24Row_AVX2, 0, 3, 3, 31)
#endif
#if defined(HAS_RAWTORGB24ROW_AVX512BW)
ANY11(RAWToRGB24Row_Any_AVX512BW, RAWToRGB24Row_AVX512BW, 0, 3, 3, 63)
#endif
#if defined(HAS_RAWTORGB24ROW_AVX512VBMI)
ANY11(RAWToRGB24Row_Any_AVX512VBMI, RAWToRGB24Row_AVX512VBMI, 0, 3, 3, 63)
#endif
#if defined(HAS_RGB565TOARGBROW_AVX2)
ANY11(RGB565ToARGBRow_Any_AVX2, RGB565ToARGBRow_AVX2, 0, 2, 4, 15)
#endif
@ -1614,6 +1642,22 @@ ANY11P(ARGBOrRow_Any_LASX, ARGBOrRow_LASX, const uint32_t, 4, 4, 7)
#ifdef HAS_ARGBORROW_WASMSIMD
ANY11P(ARGBOrRow_Any_WASMSIMD, ARGBOrRow_WASMSIMD, const uint32_t, 4, 4, 3)
#endif
#ifdef HAS_ARGBPOLYNOMIALROW_SSE2
ANY11P(ARGBPolynomialRow_Any_SSE2,
ARGBPolynomialRow_SSE2,
const float*,
4,
4,
1)
#endif
#ifdef HAS_ARGBPOLYNOMIALROW_AVX2
ANY11P(ARGBPolynomialRow_Any_AVX2,
ARGBPolynomialRow_AVX2,
const float*,
4,
4,
1)
#endif
#ifdef HAS_ARGBPOLYNOMIALROW_NEON
ANY11P(ARGBPolynomialRow_Any_NEON,
ARGBPolynomialRow_NEON,
@ -1623,7 +1667,6 @@ ANY11P(ARGBPolynomialRow_Any_NEON,
1)
#endif
#undef ANY11P
#undef ANY11P
// Any 1 to 1 with type
#define ANY11T(NAMEANY, ANY_SIMD, SBPP, BPP, STYPE, DTYPE, MASK) \
@ -1738,15 +1781,6 @@ ANY11C(Convert16To8Row_Any_AVX2,
uint8_t,
31)
#endif
#ifdef HAS_CONVERT16TO8ROW_AVX512BW
ANY11C(Convert16To8Row_Any_AVX512BW,
Convert16To8Row_AVX512BW,
2,
1,
uint16_t,
uint8_t,
63)
#endif
#ifdef HAS_CONVERT16TO8ROW_NEON
ANY11C(Convert16To8Row_Any_NEON,
Convert16To8Row_NEON,
@ -1774,15 +1808,6 @@ ANY11C(Convert8To16Row_Any_AVX2,
uint16_t,
31)
#endif
#ifdef HAS_CONVERT8TO16ROW_AVX512BW
ANY11C(Convert8To16Row_Any_AVX512BW,
Convert8To16Row_AVX512BW,
1,
2,
uint8_t,
uint16_t,
63)
#endif
#ifdef HAS_CONVERT8TO16ROW_NEON
ANY11C(Convert8To16Row_Any_NEON,
Convert8To16Row_NEON,
@ -1792,15 +1817,6 @@ ANY11C(Convert8To16Row_Any_NEON,
uint16_t,
15)
#endif
#ifdef HAS_MULTIPLYROW_16_AVX512BW
ANY11C(MultiplyRow_16_Any_AVX512BW,
MultiplyRow_16_AVX512BW,
2,
2,
uint16_t,
uint16_t,
63)
#endif
#ifdef HAS_MULTIPLYROW_16_AVX2
ANY11C(MultiplyRow_16_Any_AVX2,
MultiplyRow_16_AVX2,
@ -1959,8 +1975,8 @@ ANY11P16(HalfFloatRow_Any_LASX, HalfFloatRow_LASX, uint16_t, uint16_t, 2, 2, 15)
}
#if defined(HAS_YUY2TOARGBROW_SSSE3)
ANY11C(YUY2ToARGBRow_Any_SSSE3, YUY2ToARGBRow_SSSE3, 1, 4, 4, 15)
ANY11C(UYVYToARGBRow_Any_SSSE3, UYVYToARGBRow_SSSE3, 1, 4, 4, 15)
ANY11C(YUY2ToARGBRow_Any_SSSE3, YUY2ToARGBRow_SSSE3, 1, 4, 4, 7)
ANY11C(UYVYToARGBRow_Any_SSSE3, UYVYToARGBRow_SSSE3, 1, 4, 4, 7)
#endif
#if defined(HAS_YUY2TOARGBROW_AVX2)
ANY11C(YUY2ToARGBRow_Any_AVX2, YUY2ToARGBRow_AVX2, 1, 4, 4, 31)
@ -2121,13 +2137,6 @@ ANY11HS(HalfRow_16To8_Any_SSSE3, HalfRow_16To8_SSSE3, uint16_t, uint8_t, 15)
#ifdef HAS_HALFROW_16TO8_AVX2
ANY11HS(HalfRow_16To8_Any_AVX2, HalfRow_16To8_AVX2, uint16_t, uint8_t, 31)
#endif
#ifdef HAS_HALFROW_16TO8_AVX512BW
ANY11HS(HalfRow_16To8_Any_AVX512BW,
HalfRow_16To8_AVX512BW,
uint16_t,
uint8_t,
63)
#endif
#ifdef HAS_HALFROW_16TO8_NEON
ANY11HS(HalfRow_16To8_Any_NEON, HalfRow_16To8_NEON, uint16_t, uint8_t, 15)
#endif
@ -2172,13 +2181,6 @@ ANY11HWS(HalfWidthRow_16To8_Any_AVX2,
uint8_t,
15)
#endif
#ifdef HAS_HALFWIDTHROW_16TO8_AVX512BW
ANY11HWS(HalfWidthRow_16To8_Any_AVX512BW,
HalfWidthRow_16To8_AVX512BW,
uint16_t,
uint8_t,
31)
#endif
#ifdef HAS_HALFWIDTHROW_16TO8_NEON
ANY11HWS(HalfWidthRow_16To8_Any_NEON,
HalfWidthRow_16To8_NEON,
@ -2302,6 +2304,36 @@ ANY11MT(MirrorRow_16_Any_NEON, MirrorRow_16_NEON, uint16_t, 2, 15)
#endif
#undef ANY11MT
// Any 1 to 2 mirror split UV.
#define ANY12MR(NAMEANY, ANY_SIMD, MASK) \
void NAMEANY(const uint8_t* src_uv, uint8_t* dst_u, uint8_t* dst_v, \
int width) { \
SIMD_ALIGNED(uint8_t vin[128]); \
static_assert((MASK + 1) * 2 <= sizeof(vin), "vin buffer too small"); \
SIMD_ALIGNED(uint8_t vout[64 * 2]); \
static_assert(MASK + 1 <= sizeof(vout) / 2, "vout buffer too small"); \
MSAN_MEMSET(vin, 0, sizeof(vin)); /* for msan */ \
MSAN_MEMSET(vout, 0, sizeof(vout)); /* for msan */ \
int r = width & MASK; \
int n = width & ~MASK; \
if (n > 0) { \
ANY_SIMD(src_uv + r * 2, dst_u, dst_v, n); \
} \
ptrdiff_t np = n; \
memcpy(vin, src_uv, r * 2); \
ANY_SIMD(vin, vout, vout + 64, MASK + 1); \
memcpy(dst_u + np, vout + (MASK + 1 - r), r); \
memcpy(dst_v + np, vout + 64 + (MASK + 1 - r), r); \
}
#ifdef HAS_MIRRORSPLITUVROW_SSSE3
ANY12MR(MirrorSplitUVRow_Any_SSSE3, MirrorSplitUVRow_SSSE3, 7)
#endif
#ifdef HAS_MIRRORSPLITUVROW_AVX2
ANY12MR(MirrorSplitUVRow_Any_AVX2, MirrorSplitUVRow_AVX2, 15)
#endif
#undef ANY12MR
// Any 1 plane. (memset)
#define ANY1(NAMEANY, ANY_SIMD, T, BPP, MASK) \
void NAMEANY(uint8_t* dst_ptr, T v32, int width) { \
@ -2371,9 +2403,6 @@ ANY1(ARGBSetRow_Any_LASX, ARGBSetRow_LASX, uint32_t, 4, 7)
#ifdef HAS_SPLITUVROW_SSE2
ANY12(SplitUVRow_Any_SSE2, SplitUVRow_SSE2, 0, 2, 0, 15)
#endif
#ifdef HAS_SPLITUVROW_AVX512BW
ANY12(SplitUVRow_Any_AVX512BW, SplitUVRow_AVX512BW, 0, 2, 0, 63)
#endif
#ifdef HAS_SPLITUVROW_AVX2
ANY12(SplitUVRow_Any_AVX2, SplitUVRow_AVX2, 0, 2, 0, 31)
#endif
@ -2628,21 +2657,21 @@ ANY12MS(ARGB1555ToUVMatrixRow_Any_NEON, ARGB1555ToUVMatrixRow_NEON, 0, 2, 15)
ANY12MS(ARGB4444ToUVMatrixRow_Any_NEON, ARGB4444ToUVMatrixRow_NEON, 0, 2, 15)
#endif
#ifdef HAS_ARGBTOUVMATRIXROW_AVX2
ANY12MS(ARGBToUVMatrixRow_Any_AVX2, ARGBToUVMatrixRow_AVX2, 0, 4, 31)
ANY12MS(ARGBToUVMatrixRow_Any_AVX2, ARGBToUVMatrixRow_AVX2, 0, 4, 15)
ANY12MS(RGBToUVMatrixRow_Any_AVX2, RGBToUVMatrixRow_AVX2, 0, 3, 31)
ANY12MS(RGB565ToUVMatrixRow_Any_AVX2, RGB565ToUVMatrixRow_AVX2, 0, 2, 31)
ANY12MS(RGB565ToUVMatrixRow_Any_AVX2, RGB565ToUVMatrixRow_AVX2, 0, 2, 15)
#ifdef HAS_ARGB1555TOARGBROW_AVX2
ANY12MS(ARGB1555ToUVMatrixRow_Any_AVX2, ARGB1555ToUVMatrixRow_AVX2, 0, 2, 31)
ANY12MS(ARGB1555ToUVMatrixRow_Any_AVX2, ARGB1555ToUVMatrixRow_AVX2, 0, 2, 15)
#endif
#ifdef HAS_ARGB4444TOARGBROW_AVX2
ANY12MS(ARGB4444ToUVMatrixRow_Any_AVX2, ARGB4444ToUVMatrixRow_AVX2, 0, 2, 31)
ANY12MS(ARGB4444ToUVMatrixRow_Any_AVX2, ARGB4444ToUVMatrixRow_AVX2, 0, 2, 15)
#endif
#endif
#ifdef HAS_ARGBTOUVMATRIXROW_SSSE3
ANY12MS(ARGBToUVMatrixRow_Any_SSSE3, ARGBToUVMatrixRow_SSSE3, 0, 4, 7)
#endif
#ifdef HAS_RGBTOUVMATRIXROW_SSSE3
ANY12MS(RGBToUVMatrixRow_Any_SSSE3, RGBToUVMatrixRow_SSSE3, 0, 3, 7)
ANY12MS(RGBToUVMatrixRow_Any_SSSE3, RGBToUVMatrixRow_SSSE3, 0, 3, 15)
#endif
#ifdef HAS_ARGBTOUV444MATRIXROW_AVX2
ANY12M(ARGBToUV444MatrixRow_Any_AVX2, ARGBToUV444MatrixRow_AVX2, 4, 31)
@ -2650,24 +2679,6 @@ ANY12M(ARGBToUV444MatrixRow_Any_AVX2, ARGBToUV444MatrixRow_AVX2, 4, 31)
#ifdef HAS_RGBTOUV444MATRIXROW_AVX2
ANY12M(RGBToUV444MatrixRow_Any_AVX2, RGBToUV444MatrixRow_AVX2, 3, 31)
#endif
#ifdef HAS_ARGBTOUV444MATRIXROW_AVX512BW
ANY12M(ARGBToUV444MatrixRow_Any_AVX512BW, ARGBToUV444MatrixRow_AVX512BW, 4, 63)
#endif
#ifdef HAS_ARGBTOUV444MATRIXROW_AVX512VNNI
ANY12M(ARGBToUV444MatrixRow_Any_AVX512VNNI,
ARGBToUV444MatrixRow_AVX512VNNI,
4,
63)
#endif
#ifdef HAS_ARGBTOUV444MATRIXROW_AVX512VNNIVBMI
ANY12M(ARGBToUV444MatrixRow_Any_AVX512VNNIVBMI,
ARGBToUV444MatrixRow_AVX512VNNIVBMI,
4,
63)
#endif
#ifdef HAS_RGBTOUV444MATRIXROW_AVX512BW
ANY12M(RGBToUV444MatrixRow_Any_AVX512BW, RGBToUV444MatrixRow_AVX512BW, 3, 63)
#endif
#ifdef HAS_ARGBTOUV444MATRIXROW_SSSE3
ANY12M(ARGBToUV444MatrixRow_Any_SSSE3, ARGBToUV444MatrixRow_SSSE3, 4, 15)
#endif
@ -2752,21 +2763,6 @@ ANY11MC(ARGB1555ToYMatrixRow_Any_AVX2, ARGB1555ToYMatrixRow_AVX2, 2, 31)
ANY11MC(ARGB4444ToYMatrixRow_Any_AVX2, ARGB4444ToYMatrixRow_AVX2, 2, 31)
#endif
#endif
#ifdef HAS_ARGBTOYMATRIXROW_AVX512BW
ANY11MC(ARGBToYMatrixRow_Any_AVX512BW, ARGBToYMatrixRow_AVX512BW, 4, 63)
#endif
#ifdef HAS_ARGBTOYMATRIXROW_AVX512VNNI
ANY11MC(ARGBToYMatrixRow_Any_AVX512VNNI, ARGBToYMatrixRow_AVX512VNNI, 4, 63)
#endif
#ifdef HAS_ARGBTOYMATRIXROW_AVX512VNNIVBMI
ANY11MC(ARGBToYMatrixRow_Any_AVX512VNNIVBMI,
ARGBToYMatrixRow_AVX512VNNIVBMI,
4,
63)
#endif
#ifdef HAS_RGBTOYMATRIXROW_AVX512BW
ANY11MC(RGBToYMatrixRow_Any_AVX512BW, RGBToYMatrixRow_AVX512BW, 3, 63)
#endif
#ifdef HAS_ARGBTOYMATRIXROW_NEON
ANY11MC(ARGBToYMatrixRow_Any_NEON, ARGBToYMatrixRow_NEON, 4, 15)
#endif

View File

@ -2878,7 +2878,7 @@ void DetileToYUY2_C(const uint8_t* src_y,
// packed into 1x4 blocks, whereas the upper bits are packed in normal raster
// order.
void UnpackMT2T_C(const uint8_t* src, uint16_t* dst, size_t size) {
for (size_t i = 0; i < size; i += 80) {
while (size >= 80) {
const uint8_t* src_lower_bits = src;
const uint8_t* src_upper_bits = src + 16;
@ -2892,6 +2892,7 @@ void UnpackMT2T_C(const uint8_t* src, uint16_t* dst, size_t size) {
}
src += 80;
size -= 80;
}
}
@ -3942,7 +3943,7 @@ void ByteToFloatRow_C(const uint8_t* src, float* dst, float scale, int width) {
int i;
for (i = 0; i < width; ++i) {
float value = src[i] * scale;
dst[i] = value;
memcpy(&dst[i], &value, sizeof(value));
}
}

File diff suppressed because it is too large Load Diff

View File

@ -988,6 +988,12 @@ void DivideRow_16_HVX(const uint16_t* src_y,
uint16_t* dst_y,
int scale,
int width) {
if (scale == 65536) { // Divide by 1, so do memcpy.
if (src_y != dst_y) {
memcpy(dst_y, src_y, (size_t)width * 2);
}
return;
}
uint32_t scale32 = ((uint32_t)(uint16_t)scale << 16) | (uint16_t)scale;
while (width > 0) {
int w = width >= 64 ? 64 : width;

View File

@ -8,6 +8,8 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#include <string.h>
#include "libyuv/convert_from_argb.h" // For ArgbConstants
#include "libyuv/row.h"
@ -3819,6 +3821,12 @@ void DivideRow_16_NEON(const uint16_t* src_y,
uint16_t* dst_y,
int scale,
int width) {
if (scale == 65536) { // Divide by 1, so do memcpy.
if (src_y != dst_y) {
memcpy(dst_y, src_y, (size_t)width * 2);
}
return;
}
asm volatile(
"vdup.16 d8, %3 \n"
"1: \n"

View File

@ -8,6 +8,8 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#include <string.h>
#include "libyuv/convert_from_argb.h"
#include "libyuv/row.h"
@ -5464,6 +5466,12 @@ void DivideRow_16_NEON(const uint16_t* src_y,
uint16_t* dst_y,
int scale,
int width) {
if (scale == 65536) { // Divide by 1, so do memcpy.
if (src_y != dst_y) {
memcpy(dst_y, src_y, (size_t)width * 2);
}
return;
}
asm volatile(
"dup v4.8h, %w3 \n"
"1: \n"

View File

@ -8,6 +8,8 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#include <string.h>
#include "libyuv/row_sve.h"
#include "libyuv/compare_row.h"
#include "libyuv/row.h"
@ -772,6 +774,12 @@ void DivideRow_16_SVE2(const uint16_t* src_y,
uint16_t* dst_y,
int scale,
int width) {
if (scale == 65536) { // Divide by 1, so do memcpy.
if (src_y != dst_y) {
memcpy(dst_y, src_y, (size_t)width * 2);
}
return;
}
uint64_t vl;
asm volatile(
"cnth %x[vl] \n"

File diff suppressed because it is too large Load Diff

View File

@ -415,6 +415,7 @@ void ScaleRowDown2Box_16_AVX2(const uint16_t* src_ptr,
#endif // HAS_SCALEROWDOWN2_16_AVX2
#ifdef HAS_SCALEROWDOWN2_AVX512BW
LIBYUV_TARGET_AVX512BW
void ScaleRowDown2_AVX512BW(const uint8_t* src_ptr,
ptrdiff_t src_stride,
uint8_t* dst_ptr,
@ -455,6 +456,7 @@ void ScaleRowDown2_AVX512BW(const uint8_t* src_ptr,
: "memory", "cc", "xmm0", "k1");
}
LIBYUV_TARGET_AVX512BW
void ScaleRowDown2Linear_AVX512BW(const uint8_t* src_ptr,
ptrdiff_t src_stride,
uint8_t* dst_ptr,
@ -500,6 +502,7 @@ void ScaleRowDown2Linear_AVX512BW(const uint8_t* src_ptr,
: "memory", "cc", "xmm0", "xmm4", "xmm5", "k1");
}
LIBYUV_TARGET_AVX512BW
void ScaleRowDown2Box_AVX512BW(const uint8_t* src_ptr,
ptrdiff_t src_stride,
uint8_t* dst_ptr,
@ -2200,6 +2203,7 @@ void ScaleAddRow_AVX2(const uint8_t* src_ptr,
#ifdef HAS_SCALEADDROW_AVX512BW
// Reads 32xN bytes and accumulates to 32xN shorts at a time, with masked tail.
LIBYUV_TARGET_AVX512BW
void ScaleAddRow_AVX512BW(const uint8_t* src_ptr,
uint16_t* dst_ptr,
int src_width) {
@ -2259,6 +2263,7 @@ static const uint8_t kSequence0_15[16] = {0, 1, 2, 3, 4, 5, 6, 7,
#endif
#ifdef HAS_SCALEADDCOLS1_AVX512BW
LIBYUV_TARGET_AVX512BW
void ScaleAddCols1_AVX512BW(int dst_width,
int boxheight,
int x,
@ -2511,6 +2516,7 @@ void ScaleAddCols1_AVX512BW(int dst_width,
#endif // HAS_SCALEADDCOLS1_AVX512BW
#ifdef HAS_SCALEADDCOLS2_AVX512BW
LIBYUV_TARGET_AVX512BW
void ScaleAddCols2_AVX512BW(int dst_width,
int boxheight,
int x,
@ -4246,6 +4252,7 @@ static const uint8_t kPackEvenBytes[64] = {
// Scale UV columns by 3 box filter using AVX512VBMI.
// Processes 32 UV pixels (384 input bytes -> 64 output bytes) per main loop
// iteration, followed by a 16-pixel block and a k-masked tail (1..15 pixels).
LIBYUV_TARGET_AVX512VBMI
void ScaleUVAddCols3_AVX512VBMI(int dst_width,
int scaleval,
const uint16_t* src_uv,

View File

@ -2668,8 +2668,11 @@ static int TestHalfFloatPlane(int benchmark_width,
int mask,
int invert,
int off) {
int i, j;
const int y_plane_size = benchmark_width * benchmark_height * 2;
if (benchmark_width <= 0 || benchmark_height <= 0) {
return 0;
}
const size_t y_plane_size = static_cast<size_t>(benchmark_width) *
static_cast<size_t>(benchmark_height) * 2;
align_buffer_page_end(orig_y, y_plane_size + off);
align_buffer_page_end(dst_c, y_plane_size);
align_buffer_page_end(dst_opt, y_plane_size);
@ -2678,13 +2681,13 @@ static int TestHalfFloatPlane(int benchmark_width,
memset(dst_c, 1, y_plane_size);
memset(dst_opt, 2, y_plane_size);
for (i = 0; i < y_plane_size / 2; ++i) {
for (size_t i = 0; i < y_plane_size / 2; ++i) {
reinterpret_cast<uint16_t*>(orig_y + off)[i] &= mask;
}
// Disable all optimizations.
MaskCpuFlags(disable_cpu_flags);
for (j = 0; j < benchmark_iterations; j++) {
for (int j = 0; j < benchmark_iterations; j++) {
HalfFloatPlane(reinterpret_cast<uint16_t*>(orig_y + off),
benchmark_width * 2, reinterpret_cast<uint16_t*>(dst_c),
benchmark_width * 2, scale, benchmark_width,
@ -2693,7 +2696,7 @@ static int TestHalfFloatPlane(int benchmark_width,
// Enable optimizations.
MaskCpuFlags(benchmark_cpu_info);
for (j = 0; j < benchmark_iterations; j++) {
for (int j = 0; j < benchmark_iterations; j++) {
HalfFloatPlane(reinterpret_cast<uint16_t*>(orig_y + off),
benchmark_width * 2, reinterpret_cast<uint16_t*>(dst_opt),
benchmark_width * 2, scale, benchmark_width,
@ -2701,7 +2704,7 @@ static int TestHalfFloatPlane(int benchmark_width,
}
int max_diff = 0;
for (i = 0; i < y_plane_size / 2; ++i) {
for (size_t i = 0; i < y_plane_size / 2; ++i) {
int abs_diff =
abs(static_cast<int>(reinterpret_cast<uint16_t*>(dst_c)[i]) -
static_cast<int>(reinterpret_cast<uint16_t*>(dst_opt)[i]));
@ -2838,9 +2841,11 @@ static float TestByteToFloat(int benchmark_width,
int i, j;
const int y_plane_size = benchmark_width * benchmark_height;
align_buffer_page_end(orig_y, y_plane_size * (1 + 4 + 4));
float* dst_opt = reinterpret_cast<float*>(orig_y + y_plane_size);
float* dst_c = reinterpret_cast<float*>(orig_y + y_plane_size * 5);
align_buffer_page_end(orig_y, y_plane_size);
align_buffer_page_end(dst_opt_mem, y_plane_size * 4);
align_buffer_page_end(dst_c_mem, y_plane_size * 4);
float* dst_opt = reinterpret_cast<float*>(dst_opt_mem);
float* dst_c = reinterpret_cast<float*>(dst_c_mem);
MemRandomize(orig_y, y_plane_size);
memset(dst_c, 0, y_plane_size * 4);
@ -2865,6 +2870,8 @@ static float TestByteToFloat(int benchmark_width,
}
free_aligned_buffer_page_end(orig_y);
free_aligned_buffer_page_end(dst_opt_mem);
free_aligned_buffer_page_end(dst_c_mem);
return max_diff;
}
@ -4228,9 +4235,9 @@ TEST_F(LibYUVPlanarTest, MultiplyRow_16_Any) {
#if defined(HAS_MULTIPLYROW_16_AVX512BW)
if (has_avx512) {
MultiplyRow_16_Any_AVX512BW(
reinterpret_cast<const uint16_t*>(src_pixels_y),
reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 64, width);
MultiplyRow_16_AVX512BW(reinterpret_cast<const uint16_t*>(src_pixels_y),
reinterpret_cast<uint16_t*>(dst_pixels_y_opt), 64,
width);
} else
#endif
#if defined(HAS_MULTIPLYROW_16_AVX2)
@ -6184,4 +6191,442 @@ TEST_F(LibYUVPlanarTest, MSanUninitializedInputsAndTails) {
free_aligned_buffer_page_end(uv_src);
}
// Regression test for RGBToUVMatrixRow_Any_SSSE3 MASK=15 (previously MASK=7
// overread 24 bytes past src_rgb24 at width=24).
TEST_F(LibYUVPlanarTest, RGB24ToI420_Width24_OOB) {
const int kWidth = 24;
const int kHeight = 2;
align_buffer_page_end(src_rgb24, kWidth * 3 * kHeight);
align_buffer_page_end(dst_y_c, kWidth * kHeight);
align_buffer_page_end(dst_u_c, (kWidth / 2) * (kHeight / 2));
align_buffer_page_end(dst_v_c, (kWidth / 2) * (kHeight / 2));
align_buffer_page_end(dst_y_opt, kWidth * kHeight);
align_buffer_page_end(dst_u_opt, (kWidth / 2) * (kHeight / 2));
align_buffer_page_end(dst_v_opt, (kWidth / 2) * (kHeight / 2));
MemRandomize(src_rgb24, kWidth * 3 * kHeight);
MaskCpuFlags(disable_cpu_flags_);
RGB24ToI420(src_rgb24, kWidth * 3, dst_y_c, kWidth, dst_u_c, kWidth / 2,
dst_v_c, kWidth / 2, kWidth, kHeight);
const int kNoAvx512 =
benchmark_cpu_info_ & ~(kCpuHasAVX512BW | kCpuHasAVX512VL |
kCpuHasAVX512VBMI | kCpuHasAVX512VNNI);
const int kSsse3Only = kNoAvx512 & ~kCpuHasAVX2;
const int kModes[3] = {benchmark_cpu_info_, kNoAvx512, kSsse3Only};
for (int m = 0; m < 3; ++m) {
MaskCpuFlags(kModes[m]);
memset(dst_y_opt, 0, kWidth * kHeight);
memset(dst_u_opt, 0, (kWidth / 2) * (kHeight / 2));
memset(dst_v_opt, 0, (kWidth / 2) * (kHeight / 2));
RGB24ToI420(src_rgb24, kWidth * 3, dst_y_opt, kWidth, dst_u_opt, kWidth / 2,
dst_v_opt, kWidth / 2, kWidth, kHeight);
for (int i = 0; i < kWidth * kHeight; ++i) {
ASSERT_EQ(dst_y_c[i], dst_y_opt[i]);
}
for (int i = 0; i < (kWidth / 2) * (kHeight / 2); ++i) {
ASSERT_EQ(dst_u_c[i], dst_u_opt[i]);
ASSERT_EQ(dst_v_c[i], dst_v_opt[i]);
}
}
MaskCpuFlags(benchmark_cpu_info_);
free_aligned_buffer_page_end(src_rgb24);
free_aligned_buffer_page_end(dst_y_c);
free_aligned_buffer_page_end(dst_u_c);
free_aligned_buffer_page_end(dst_v_c);
free_aligned_buffer_page_end(dst_y_opt);
free_aligned_buffer_page_end(dst_u_opt);
free_aligned_buffer_page_end(dst_v_opt);
}
#ifdef ENABLE_ROW_TESTS
#if defined(HAS_HALFWIDTHROW_16TO8_SSSE3) || \
defined(HAS_HALFWIDTHROW_16TO8_AVX2) || \
defined(HAS_HALFWIDTHROW_16TO8_AVX512BW) || \
defined(HAS_HALFROW_16TO8_AVX512BW)
// Regression test for HalfWidthRow_16To8 (>= 0x8000 unsigned MSB samples and
// exact page-end tail bounds) and HalfRow_16To8 (non-power-of-two scale).
TEST_F(LibYUVPlanarTest, Half16To8_HighBitAndNonPow2Scale) {
const int kWidths[] = {1, 7, 15, 24, 31, 33, 63, 65};
for (size_t w_idx = 0; w_idx < sizeof(kWidths) / sizeof(kWidths[0]);
++w_idx) {
const int w = kWidths[w_idx];
align_buffer_page_end_16(src_uv_hw, w * 4);
align_buffer_page_end(dst_c, w);
align_buffer_page_end(dst_opt, w);
for (int i = 0; i < w * 4; ++i) {
src_uv_hw[i] = static_cast<uint16_t>(0x8000u + ((i * 257u) & 0x7fffu));
}
HalfWidthRow_16To8_C(src_uv_hw, w * 2, dst_c, 256, w);
#if defined(HAS_HALFWIDTHROW_16TO8_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
memset(dst_opt, 0x5a, w);
HalfWidthRow_16To8_AVX512BW(src_uv_hw, w * 2, dst_opt, 256, w);
for (int i = 0; i < w; ++i) {
ASSERT_EQ(dst_c[i], dst_opt[i]) << "AVX512BW w=" << w << " i=" << i;
}
}
#endif
#if defined(HAS_HALFWIDTHROW_16TO8_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
memset(dst_opt, 0x5a, w);
HalfWidthRow_16To8_Any_AVX2(src_uv_hw, w * 2, dst_opt, 256, w);
for (int i = 0; i < w; ++i) {
ASSERT_EQ(dst_c[i], dst_opt[i]) << "AVX2 w=" << w << " i=" << i;
}
}
#endif
#if defined(HAS_HALFWIDTHROW_16TO8_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3)) {
memset(dst_opt, 0x5a, w);
HalfWidthRow_16To8_Any_SSSE3(src_uv_hw, w * 2, dst_opt, 256, w);
for (int i = 0; i < w; ++i) {
ASSERT_EQ(dst_c[i], dst_opt[i]) << "SSSE3 w=" << w << " i=" << i;
}
}
#endif
// HalfRow_16To8 with non-power-of-two scale (e.g. 16320).
align_buffer_page_end_16(src_uv_hr, w * 2);
for (int i = 0; i < w * 2; ++i) {
src_uv_hr[i] = static_cast<uint16_t>((i * 73u) & 1023u);
}
HalfRow_16To8_C(src_uv_hr, w, dst_c, 16320, w);
#if defined(HAS_HALFROW_16TO8_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
memset(dst_opt, 0x5a, w);
HalfRow_16To8_AVX512BW(src_uv_hr, w, dst_opt, 16320, w);
for (int i = 0; i < w; ++i) {
ASSERT_EQ(dst_c[i], dst_opt[i])
<< "HalfRow_16To8_AVX512BW w=" << w << " i=" << i;
}
}
#endif
free_aligned_buffer_page_end_16(src_uv_hr);
free_aligned_buffer_page_end_16(src_uv_hw);
free_aligned_buffer_page_end(dst_c);
free_aligned_buffer_page_end(dst_opt);
}
}
#endif // HAS_HALFWIDTHROW_16TO8_* || HAS_HALFROW_16TO8_AVX512BW
#if defined(HAS_UNPACKMT2T_AVX2)
// Regression test for UnpackMT2T_C and UnpackMT2T_AVX2 when size is not a
// multiple of the 80-byte (64-pixel) MT2T block size.
TEST_F(LibYUVPlanarTest, UnpackMT2T_PartialTail) {
if (!TestCpuFlag(kCpuHasAVX2)) {
return;
}
const size_t kSrcSize = 120; // 1 full 80-byte block + 40 trailing bytes
const size_t kDstCount = (kSrcSize / 80) * 64;
align_buffer_page_end(src, kSrcSize);
align_buffer_page_end_16(dst_c, kDstCount);
align_buffer_page_end_16(dst_opt, kDstCount);
MemRandomize(src, kSrcSize);
UnpackMT2T_C(src, dst_c, kSrcSize);
UnpackMT2T_AVX2(src, dst_opt, kSrcSize);
for (size_t i = 0; i < kDstCount; ++i) {
ASSERT_EQ(dst_c[i], dst_opt[i]) << "i=" << i;
}
// Verify size < 80 performs zero out-of-bounds reads or writes.
UnpackMT2T_C(src + 80, dst_c, 40);
UnpackMT2T_AVX2(src + 80, dst_opt, 40);
for (size_t i = 0; i < kDstCount; ++i) {
ASSERT_EQ(dst_c[i], dst_opt[i]) << "i=" << i;
}
free_aligned_buffer_page_end(src);
free_aligned_buffer_page_end_16(dst_c);
free_aligned_buffer_page_end_16(dst_opt);
}
#endif // HAS_UNPACKMT2T_AVX2
#endif // ENABLE_ROW_TESTS
// Regression test for ConvertToLSBPlane_16 with depth=16 (scale=65536).
TEST_F(LibYUVPlanarTest, ConvertToLSBPlane_16_Depth16) {
const int kWidth = 37;
const int kHeight = 4;
align_buffer_page_end_16(src_y, kWidth * kHeight);
align_buffer_page_end_16(dst_c, kWidth * kHeight);
align_buffer_page_end_16(dst_opt, kWidth * kHeight);
for (int i = 0; i < kWidth * kHeight; ++i) {
src_y[i] = static_cast<uint16_t>(0x1234u + i * 251u);
}
MaskCpuFlags(disable_cpu_flags_);
ConvertToLSBPlane_16(src_y, kWidth, dst_c, kWidth, kWidth, kHeight, 16);
const int kNoAvx512 =
benchmark_cpu_info_ & ~(kCpuHasAVX512BW | kCpuHasAVX512VL);
MaskCpuFlags(benchmark_cpu_info_);
memset(dst_opt, 0, kWidth * kHeight * 2);
ConvertToLSBPlane_16(src_y, kWidth, dst_opt, kWidth, kWidth, kHeight, 16);
for (int i = 0; i < kWidth * kHeight; ++i) {
ASSERT_EQ(dst_c[i], dst_opt[i]);
}
MaskCpuFlags(kNoAvx512);
memset(dst_opt, 0, kWidth * kHeight * 2);
ConvertToLSBPlane_16(src_y, kWidth, dst_opt, kWidth, kWidth, kHeight, 16);
for (int i = 0; i < kWidth * kHeight; ++i) {
ASSERT_EQ(dst_c[i], dst_opt[i]);
}
MaskCpuFlags(benchmark_cpu_info_);
free_aligned_buffer_page_end_16(src_y);
free_aligned_buffer_page_end_16(dst_c);
free_aligned_buffer_page_end_16(dst_opt);
}
// Regression test for ARGBPolynomial saturation on outputs >= 32768 / 65536,
// odd widths, and 4-byte-aligned (non-16-byte-aligned) polynomial arrays.
TEST_F(LibYUVPlanarTest, ARGBPolynomial_LargeOutputAndUnalignedPoly) {
const int kWidth = 37;
const int kHeight = 3;
align_buffer_page_end(src_argb, kWidth * 4 * kHeight);
align_buffer_page_end(dst_c, kWidth * 4 * kHeight);
align_buffer_page_end(dst_opt, kWidth * 4 * kHeight);
align_buffer_page_end(poly_buf, 17 * sizeof(float));
// Offset by +1 float so poly is 4-byte aligned, not 16-byte aligned.
float* poly = reinterpret_cast<float*>(poly_buf) + 1;
for (int c = 0; c < 4; ++c) {
poly[0 + c] = 0.0f;
poly[4 + c] = 300.0f; // 255 * 300 = 76500 >= 65536 -> must clamp to 255
poly[8 + c] = 1.0f; // 200^2 = 40000 in [32768, 65535] -> clamp to 255
poly[12 + c] = 0.0f;
}
for (int i = 0; i < kWidth * 4 * kHeight; ++i) {
src_argb[i] = static_cast<uint8_t>(i & 255);
}
MaskCpuFlags(disable_cpu_flags_);
ARGBPolynomial(src_argb, kWidth * 4, dst_c, kWidth * 4, poly, kWidth,
kHeight);
const int kSse2Only =
benchmark_cpu_info_ & ~(kCpuHasAVX2 | kCpuHasFMA3 | kCpuHasAVX512BW);
const int kModes[2] = {benchmark_cpu_info_, kSse2Only};
for (int m = 0; m < 2; ++m) {
MaskCpuFlags(kModes[m]);
memset(dst_opt, 0, kWidth * 4 * kHeight);
ARGBPolynomial(src_argb, kWidth * 4, dst_opt, kWidth * 4, poly, kWidth,
kHeight);
for (int i = 0; i < kWidth * 4 * kHeight; ++i) {
ASSERT_EQ(dst_c[i], dst_opt[i]) << "mode=" << m << " i=" << i;
}
}
MaskCpuFlags(benchmark_cpu_info_);
free_aligned_buffer_page_end(src_argb);
free_aligned_buffer_page_end(dst_c);
free_aligned_buffer_page_end(dst_opt);
free_aligned_buffer_page_end(poly_buf);
}
// Regression test for ARGBBlur / CumulativeSumToAverageRow_AVX2 when radius=0
// or radius=1 produces small window areas (area == 1 or area == 2) on 0xff.
TEST_F(LibYUVPlanarTest, ARGBBlur_SmallRadiusWhite) {
const int kWidth = 37;
const int kHeight = 4;
const int kCumSumStride32 = (kWidth + 16) * 4;
align_buffer_page_end(src_argb, kWidth * 4 * kHeight);
align_buffer_page_end(dst_c, kWidth * 4 * kHeight);
align_buffer_page_end(dst_opt, kWidth * 4 * kHeight);
align_buffer_page_end(cumsum, kCumSumStride32 * (kHeight + 2) * 4);
memset(src_argb, 0xff, kWidth * 4 * kHeight);
for (int radius = 1; radius <= 2; ++radius) {
MaskCpuFlags(disable_cpu_flags_);
ARGBBlur(src_argb, kWidth * 4, dst_c, kWidth * 4,
reinterpret_cast<int32_t*>(cumsum), kCumSumStride32, kWidth,
kHeight, radius);
MaskCpuFlags(benchmark_cpu_info_);
memset(dst_opt, 0, kWidth * 4 * kHeight);
ARGBBlur(src_argb, kWidth * 4, dst_opt, kWidth * 4,
reinterpret_cast<int32_t*>(cumsum), kCumSumStride32, kWidth,
kHeight, radius);
for (int i = 0; i < kWidth * 4 * kHeight; ++i) {
ASSERT_EQ(dst_c[i], dst_opt[i]) << "radius=" << radius << " i=" << i;
}
}
free_aligned_buffer_page_end(src_argb);
free_aligned_buffer_page_end(dst_c);
free_aligned_buffer_page_end(dst_opt);
free_aligned_buffer_page_end(cumsum);
}
// Regression test for ARGBLumaColorTable with standard BT.601 green weight
// 150 (> 127) and bright pixels where R*77 + G*150 + B*29 > 32767.
TEST_F(LibYUVPlanarTest, ARGBLumaColorTable_BrightPixels) {
const int kWidth = 37;
const int kHeight = 3;
align_buffer_page_end(src_argb, kWidth * 4 * kHeight);
align_buffer_page_end(dst_c, kWidth * 4 * kHeight);
align_buffer_page_end(dst_opt, kWidth * 4 * kHeight);
align_buffer_page_end(luma, 32768);
for (int i = 0; i < 32768; ++i) {
luma[i] = static_cast<uint8_t>(((i >> 8) * 3 + (i & 255)) & 255);
}
for (int i = 0; i < kWidth * kHeight; ++i) {
src_argb[i * 4 + 0] = static_cast<uint8_t>(200 + (i % 56));
src_argb[i * 4 + 1] = static_cast<uint8_t>(200 + ((i * 3) % 56));
src_argb[i * 4 + 2] = static_cast<uint8_t>(200 + ((i * 7) % 56));
src_argb[i * 4 + 3] = static_cast<uint8_t>(i & 255);
}
MaskCpuFlags(disable_cpu_flags_);
ARGBLumaColorTable(src_argb, kWidth * 4, dst_c, kWidth * 4, luma, kWidth,
kHeight);
MaskCpuFlags(benchmark_cpu_info_);
ARGBLumaColorTable(src_argb, kWidth * 4, dst_opt, kWidth * 4, luma, kWidth,
kHeight);
for (int i = 0; i < kWidth * 4 * kHeight; ++i) {
ASSERT_EQ(dst_c[i], dst_opt[i]) << "i=" << i;
}
free_aligned_buffer_page_end(src_argb);
free_aligned_buffer_page_end(dst_c);
free_aligned_buffer_page_end(dst_opt);
free_aligned_buffer_page_end(luma);
}
#if defined(ENABLE_ROW_TESTS) && !defined(LIBYUV_DISABLE_X86) && \
(defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) || \
defined(__i386__))
// Regression test for 2-byte-aligned (non-16/32-byte-aligned) Intel
// YuvConstants and ArgbConstants structs and custom non-0x8000 kAddUV offsets.
TEST_F(LibYUVPlanarTest, UnalignedMatrixConstantsAndCustomKAddUV) {
const int kWidth = 38;
const int kHeight = 4;
align_buffer_page_end(yuvc_buf, sizeof(YuvConstants) + 16);
align_buffer_page_end(argbc_buf, sizeof(ArgbConstants) + 16);
// Offset by +2 bytes (matches alignof == 2, misaligned for movdqa/vmovdqa).
YuvConstants* yuvc = reinterpret_cast<YuvConstants*>(yuvc_buf + 2);
ArgbConstants* argbc = reinterpret_cast<ArgbConstants*>(argbc_buf + 2);
memcpy(yuvc, &kYuvI601Constants, sizeof(YuvConstants));
memcpy(argbc, &kArgbI601Constants, sizeof(ArgbConstants));
for (int i = 0; i < 16; ++i) {
argbc->kAddUV[i] = 0x7200u; // Non-default UV bias (!= 0x8000)
}
align_buffer_page_end(src_argb, kWidth * 4 * kHeight);
align_buffer_page_end(y_c, kWidth * kHeight);
align_buffer_page_end(u_c, kWidth * kHeight);
align_buffer_page_end(v_c, kWidth * kHeight);
align_buffer_page_end(y_opt, kWidth * kHeight);
align_buffer_page_end(u_opt, kWidth * kHeight);
align_buffer_page_end(v_opt, kWidth * kHeight);
align_buffer_page_end(rgb_c, kWidth * 4 * kHeight);
align_buffer_page_end(rgb_opt, kWidth * 4 * kHeight);
MemRandomize(src_argb, kWidth * 4 * kHeight);
MaskCpuFlags(disable_cpu_flags_);
ARGBToI444Matrix(src_argb, kWidth * 4, y_c, kWidth, u_c, kWidth, v_c, kWidth,
argbc, kWidth, kHeight);
I420ToARGBMatrix(y_c, kWidth, u_c, kWidth / 2, v_c, kWidth / 2, rgb_c,
kWidth * 4, yuvc, kWidth, kHeight);
const int kNoAvx512 =
benchmark_cpu_info_ & ~(kCpuHasAVX512BW | kCpuHasAVX512VL |
kCpuHasAVX512VBMI | kCpuHasAVX512VNNI);
const int kSsse3Only = kNoAvx512 & ~kCpuHasAVX2;
const int kModes[3] = {benchmark_cpu_info_, kNoAvx512, kSsse3Only};
for (int m = 0; m < 3; ++m) {
MaskCpuFlags(kModes[m]);
ARGBToI444Matrix(src_argb, kWidth * 4, y_opt, kWidth, u_opt, kWidth, v_opt,
kWidth, argbc, kWidth, kHeight);
I420ToARGBMatrix(y_c, kWidth, u_c, kWidth / 2, v_c, kWidth / 2, rgb_opt,
kWidth * 4, yuvc, kWidth, kHeight);
for (int i = 0; i < kWidth * kHeight; ++i) {
ASSERT_EQ(y_c[i], y_opt[i]);
ASSERT_EQ(u_c[i], u_opt[i]) << "mode=" << m << " i=" << i;
ASSERT_EQ(v_c[i], v_opt[i]) << "mode=" << m << " i=" << i;
}
for (int i = 0; i < kWidth * 4 * kHeight; ++i) {
ASSERT_EQ(rgb_c[i], rgb_opt[i]) << "mode=" << m << " i=" << i;
}
}
// Also test ARGBToI420Matrix with custom kAddUV and I400ToARGBMatrix with
// unaligned YuvConstants.
MaskCpuFlags(disable_cpu_flags_);
ARGBToI420Matrix(src_argb, kWidth * 4, y_c, kWidth, u_c, kWidth / 2, v_c,
kWidth / 2, argbc, kWidth, kHeight);
I400ToARGBMatrix(y_c, kWidth, rgb_c, kWidth * 4, yuvc, kWidth, kHeight);
for (int m = 0; m < 3; ++m) {
MaskCpuFlags(kModes[m]);
ARGBToI420Matrix(src_argb, kWidth * 4, y_opt, kWidth, u_opt, kWidth / 2,
v_opt, kWidth / 2, argbc, kWidth, kHeight);
I400ToARGBMatrix(y_c, kWidth, rgb_opt, kWidth * 4, yuvc, kWidth, kHeight);
for (int i = 0; i < (kWidth / 2) * (kHeight / 2); ++i) {
ASSERT_NEAR(u_c[i], u_opt[i], 1) << "mode=" << m << " i=" << i;
ASSERT_NEAR(v_c[i], v_opt[i], 1) << "mode=" << m << " i=" << i;
}
for (int i = 0; i < kWidth * 4 * kHeight; ++i) {
ASSERT_EQ(rgb_c[i], rgb_opt[i]) << "mode=" << m << " i=" << i;
}
}
MaskCpuFlags(benchmark_cpu_info_);
free_aligned_buffer_page_end(yuvc_buf);
free_aligned_buffer_page_end(argbc_buf);
free_aligned_buffer_page_end(src_argb);
free_aligned_buffer_page_end(y_c);
free_aligned_buffer_page_end(u_c);
free_aligned_buffer_page_end(v_c);
free_aligned_buffer_page_end(y_opt);
free_aligned_buffer_page_end(u_opt);
free_aligned_buffer_page_end(v_opt);
free_aligned_buffer_page_end(rgb_c);
free_aligned_buffer_page_end(rgb_opt);
}
#endif // ENABLE_ROW_TESTS
// Regression test for MergeAR64Plane depth=16 (UBSan shift) and
// MergeARGB16To8Plane depth=8 saturation on out-of-range >255 samples.
TEST_F(LibYUVPlanarTest, MergeAR64Depth16AndMergeARGB16To8Depth8Clamp) {
const int kWidth = 37;
const int kHeight = 2;
align_buffer_page_end_16(src_r, kWidth * kHeight);
align_buffer_page_end_16(src_g, kWidth * kHeight);
align_buffer_page_end_16(src_b, kWidth * kHeight);
align_buffer_page_end_16(src_a, kWidth * kHeight);
align_buffer_page_end_16(ar64_c, kWidth * 4 * kHeight);
align_buffer_page_end_16(ar64_opt, kWidth * 4 * kHeight);
align_buffer_page_end(argb_c, kWidth * 4 * kHeight);
align_buffer_page_end(argb_opt, kWidth * 4 * kHeight);
for (int i = 0; i < kWidth * kHeight; ++i) {
src_r[i] = static_cast<uint16_t>(200u + (i * 19u));
src_g[i] = static_cast<uint16_t>(100u + (i * 37u));
src_b[i] = static_cast<uint16_t>(50u + (i * 53u));
src_a[i] = static_cast<uint16_t>(0x8000u + (i * 101u));
}
MaskCpuFlags(disable_cpu_flags_);
MergeAR64Plane(src_r, kWidth, src_g, kWidth, src_b, kWidth, src_a, kWidth,
ar64_c, kWidth * 4, kWidth, kHeight, 16);
MergeARGB16To8Plane(src_r, kWidth, src_g, kWidth, src_b, kWidth, src_a,
kWidth, argb_c, kWidth * 4, kWidth, kHeight, 8);
MaskCpuFlags(benchmark_cpu_info_);
MergeAR64Plane(src_r, kWidth, src_g, kWidth, src_b, kWidth, src_a, kWidth,
ar64_opt, kWidth * 4, kWidth, kHeight, 16);
MergeARGB16To8Plane(src_r, kWidth, src_g, kWidth, src_b, kWidth, src_a,
kWidth, argb_opt, kWidth * 4, kWidth, kHeight, 8);
for (int i = 0; i < kWidth * 4 * kHeight; ++i) {
ASSERT_EQ(ar64_c[i], ar64_opt[i]);
ASSERT_EQ(argb_c[i], argb_opt[i]);
}
free_aligned_buffer_page_end_16(src_r);
free_aligned_buffer_page_end_16(src_g);
free_aligned_buffer_page_end_16(src_b);
free_aligned_buffer_page_end_16(src_a);
free_aligned_buffer_page_end_16(ar64_c);
free_aligned_buffer_page_end_16(ar64_opt);
free_aligned_buffer_page_end(argb_c);
free_aligned_buffer_page_end(argb_opt);
}
} // namespace libyuv

View File

@ -329,9 +329,12 @@ int main(int argc, const char* argv[]) {
exit(1);
}
if (num_rec <= 0) {
fclose(file_org);
exit(1);
}
// Open all files to compare to
FILE** file_rec = new FILE*[num_rec];
memset(file_rec, 0, num_rec * sizeof(FILE*)); // NOLINT
FILE** file_rec = new FILE*[num_rec]();
for (int cur_rec = 0; cur_rec < num_rec; ++cur_rec) {
file_rec[cur_rec] = fopen(argv[fileindex_rec + cur_rec], "rb");
if (file_rec[cur_rec] == NULL) {