mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2026-11-09 14:49:57 +08:00
Merge 64-bit LoongArch LSX and LASX inline assembly implementations from rotate_lsx.cc, rotate_lasx.cc, row_lsx.cc, row_lasx.cc, and scale_lsx.cc into compare_la.cc, rotate_la.cc, row_la.cc, and scale_la.cc, and remove the obsolete loongson_intrinsics.h header. Because all LSX and LASX kernels use inline assembly rather than compiler intrinsics, separate libyuv_lsx/libyuv_lasx build targets and -mlsx/-mlasx compiler flags are no longer required. Guard HAS_*_LSX and HAS_*_LASX macros with defined(__loongarch_lp64) so runtime CPU dispatch enables LASX and LSX without requiring global -mlasx/-mlsx flags, and wrap every function and helper in *_la.cc with its corresponding #ifdef HAS_* guard. Also fix bugs found during LoongArch verification: - Replace illegal vldi/xvldi -1 immediate encodings (si13 = 0x1fff, which raises SIGILL at runtime) in ARGBDetectRow_LSX and ARGBDetectRow_LASX with vseqi.b/xvseqi.b -1. - Set simd_size to 16 for LSX and 32 for LASX in ComputeHammingDistance and ComputeSumSquareError. - Remove orphaned dead BGRAToUVRow, ABGRToUVRow, RGBAToUVRow, and XRGBToUVHelper functions in row_la.cc. - Remove dead alpha shifts in ARGB1555ToYRow/UVRow_LSX/LASX and hoist channel masks out of the loop in RGB565ToUVRow/ARGB1555ToUVRow. Compare SIMD ISA per *_C: ------------------------------------------------------------------------ C Function LSX LASX ------------------------------------------------------------------------ ARGBDetectRow_C LSX LASX HammingDistance_C LSX LASX HashDjb2_C LSX LASX Ssim4x4Row_C LSX LASX SsimWindowRow_C LSX LASX SumSquareError_C LSX LASX ------------------------------------------------------------------------ Compare: 6 (100%) 6 (100%) 6 (100%) ------------------------------------------------------------------------ Convert SIMD ISA per *_C: ------------------------------------------------------------------------ C Function LSX LASX ------------------------------------------------------------------------ AB64ToARGBRow_C - - ABGRToAR30Row_C - - AR30ToAB30Row_C - - AR30ToABGRRow_C - - AR30ToARGBRow_C - - AR64ShuffleRow_C LSX LASX AR64ToAB64Row_C LSX LASX AR64ToARGBRow_C - - ARGB1555ToARGBRow_C LSX LASX ARGB1555ToUVMatrixRow_C - - ARGB1555ToUVRow_C LSX LASX ARGB1555ToYMatrixRow_C - - ARGB1555ToYRow_C LSX LASX ARGB4444ToARGBRow_C LSX LASX ARGB4444ToUVMatrixRow_C - - ARGB4444ToUVRow_C - - ARGB4444ToYMatrixRow_C - - ARGB4444ToYRow_C - - ARGBAddRow_C LSX LASX ARGBAffineRow_C - - ARGBAlphaBlendRow_C LSX LASX ARGBAttenuateRow_C LSX LASX ARGBBlendRow_C LSX LASX ARGBColorMatrixRow_C LSX LASX ARGBColorTableRow_C - - ARGBCopyAlphaRow_C - - ARGBCopyYToAlphaRow_C - - ARGBExtractAlphaRow_C LSX LASX ARGBGrayRow_C LSX LASX ARGBLumaColorTableRow_C - - ARGBMirrorRow_C LSX LASX ARGBMultiplyRow_C LSX LASX ARGBOrRow_C LSX LASX ARGBPolynomialRow_C - - ARGBQuantizeRow_C LSX LASX ARGBSepiaRow_C LSX LASX ARGBSetRow_C LSX LASX ARGBShadeRow_C LSX LASX ARGBShuffleRow_C LSX LASX ARGBSubtractRow_C LSX LASX ARGBToAB64Row_C - - ARGBToABGRRow_C LSX LASX ARGBToAR30Row_C - - ARGBToAR64Row_C - - ARGBToARGB1555Row_C LSX LASX ARGBToARGB4444Row_C LSX LASX ARGBToBGRARow_C LSX LASX ARGBToRAWRow_C LSX LASX ARGBToRGB24Row_C LSX LASX ARGBToRGB565DitherRow_C LSX LASX ARGBToRGB565Row_C LSX LASX ARGBToRGBARow_C LSX LASX ARGBToUV444MatrixRow_C - - ARGBToUVMatrixRow_C - - ARGBToYMatrixRow_C LSX LASX ARGBUnattenuateRow_C - - AYUVToUVRow_C - - AYUVToVURow_C - - AYUVToYRow_C - - BlendPlaneRow_C - - ByteToFloatRow_C - - ComputeCumulativeSumRow_C - - Convert16To8Row_C - - Convert8To16Row_C - - Convert8To8Row_C - - CopyRow_16_C - - CopyRow_C LSX LASX CumulativeSumToAverageRow_C - - DetileRow_16_C - - DetileRow_C - - DetileSplitUVRow_C - - DetileToYUY2_C - - DivideRow_16_C - - GaussCol_C - - GaussCol_F32_C - - GaussRow_C - - GaussRow_F32_C - - HalfFloatRow_C LSX LASX HalfMergeUVRow_C - - HalfRow_16To8_C - - HalfRow_16_C - - HalfRow_C - - HalfWidthRow_16To8_C - - HalfWidthRow_16To8_Odd_C - - I210AlphaToARGBRow_C - - I210ToAR30Row_C - - I210ToARGBRow_C - - I212ToAR30Row_C - - I212ToARGBRow_C - - I400ToARGBRow_C LSX LASX I410AlphaToARGBRow_C - - I410ToAR30Row_C - - I410ToARGBRow_C - - I422AlphaToARGBRow_C LSX LASX I422ToAR30Row_C - - I422ToARGB1555Row_C LSX LASX I422ToARGB4444Row_C LSX LASX I422ToARGBRow_C LSX LASX I422ToRGB24Row_C LSX LASX I422ToRGB565Row_C LSX LASX I422ToRGBARow_C LSX LASX I422ToUYVYRow_C LSX LASX I422ToYUY2Row_C LSX LASX I444AlphaToARGBRow_C - - I444ToARGBRow_C LSX LASX I444ToRGB24Row_C - - InterpolateRow_16_C - - InterpolateRow_C LSX LASX J400ToARGBRow_C LSX LASX MergeAR64Row_C - - MergeARGB16To8Row_C - - MergeARGBRow_C - - MergeRGBRow_C - - MergeUVRow_16_C - - MergeUVRow_C LSX LASX MergeXR30Row_C - - MergeXR64Row_C - - MergeXRGB16To8Row_C - - MergeXRGBRow_C - - MirrorRow_16_C LSX LASX MirrorRow_C LSX LASX MirrorSplitUVRow_C LSX LASX MirrorUVRow_C LSX LASX MultiplyRow_16_C - - NV12ToARGBRow_C LSX LASX NV12ToRGB24Row_C - - NV12ToRGB565Row_C LSX LASX NV21ToARGBRow_C LSX LASX NV21ToRGB24Row_C - - NV21ToYUV24Row_C - - P210ToAR30Row_C - - P210ToARGBRow_C - - P410ToAR30Row_C - - P410ToARGBRow_C - - RAWToARGBRow_C LSX LASX RAWToRGB24Row_C LSX LASX RAWToRGBARow_C - - RGB24MirrorRow_C - - RGB24ToARGBRow_C LSX LASX RGB565ToARGBRow_C LSX LASX RGB565ToUVMatrixRow_C - - RGB565ToUVRow_C LSX LASX RGB565ToYMatrixRow_C - - RGB565ToYRow_C LSX LASX RGBAToARGBRow_C LSX LASX RGBColorTableRow_C - - RGBToUV444MatrixRow_C - - RGBToUVMatrixRow_C - - RGBToYMatrixRow_C LSX LASX ScaleMaxSamples_C - - ScaleSamples_C - - ScaleSumSamples_C - - SetRow_C LSX LASX SobelRow_C LSX LASX SobelToPlaneRow_C LSX LASX SobelXRow_C - - SobelXYRow_C LSX LASX SobelYRow_C - - SplitARGBRow_C - - SplitRGBRow_C - - SplitUVRow_16_C - - SplitUVRow_C LSX LASX SplitXRGBRow_C - - SwapUVRow_C - - UYVYToARGBRow_C LSX LASX UYVYToUV422Row_C LSX LASX UYVYToUVRow_C LSX LASX UYVYToYRow_C LSX LASX UnpackMT2T_C - - YUY2ToARGBRow_C LSX LASX YUY2ToNVUVRow_C - - YUY2ToUV422Row_C LSX LASX YUY2ToUVRow_C LSX LASX YUY2ToYRow_C LSX LASX ------------------------------------------------------------------------ Convert: 174 (100%) 76 (44%) 76 (44%) ------------------------------------------------------------------------ Rotate SIMD ISA per *_C: ------------------------------------------------------------------------ C Function LSX LASX ------------------------------------------------------------------------ TransposeUVWx16_C - LASX TransposeUVWx8_C LSX - TransposeWx16_C - LASX TransposeWx4_32_C LSX LASX TransposeWx8_16_C LSX LASX TransposeWx8_C LSX - TransposeWxH_32_C - - ------------------------------------------------------------------------ Rotate: 7 (100%) 4 (57%) 4 (57%) ------------------------------------------------------------------------ Scale SIMD ISA per *_C: ------------------------------------------------------------------------ C Function LSX LASX ------------------------------------------------------------------------ FixedDiv1_C - - FixedDiv_C - - ScaleARGBCols64_C - - ScaleARGBColsUp2_C - - ScaleARGBCols_C LSX - ScaleARGBFilterCols64_C - - ScaleARGBFilterCols_C LSX - ScaleARGBRowDown2Box_C LSX - ScaleARGBRowDown2Linear_C LSX - ScaleARGBRowDown2_C LSX - ScaleARGBRowDownEvenBox_C LSX - ScaleARGBRowDownEven_C LSX - ScaleAddCols0_C - - ScaleAddCols1_16_C - - ScaleAddCols1_C - - ScaleAddCols2_16_C - - ScaleAddCols2_C - - ScaleAddRow_16_C - - ScaleAddRow_C LSX - ScaleColsUp2_16_C - - ScaleColsUp2_C - - ScaleCols_16_C - - ScaleCols_C - - ScaleFilterCols64_16_C - - ScaleFilterCols64_C - - ScaleFilterCols_16_C - - ScaleFilterCols_C LSX - ScaleRowDown2Box_16_C - - ScaleRowDown2Box_C LSX - ScaleRowDown2Box_Odd_C - - ScaleRowDown2Linear_16_C - - ScaleRowDown2Linear_C LSX - ScaleRowDown2_16_C - - ScaleRowDown2_C LSX - ScaleRowDown34_0_Box_16_C - - ScaleRowDown34_0_Box_C LSX - ScaleRowDown34_16_C - - ScaleRowDown34_1_Box_16_C - - ScaleRowDown34_1_Box_C LSX - ScaleRowDown34_C LSX - ScaleRowDown38_16_C - - ScaleRowDown38_2_Box_16_C - - ScaleRowDown38_2_Box_C LSX - ScaleRowDown38_3_Box_16_C - - ScaleRowDown38_3_Box_C LSX - ScaleRowDown38_C LSX - ScaleRowDown4Box_16_C - - ScaleRowDown4Box_C LSX - ScaleRowDown4_16_C - - ScaleRowDown4_C LSX - ScaleRowUp2_Bilinear_16_Any_C - - ScaleRowUp2_Bilinear_16_C - - ScaleRowUp2_Bilinear_Any_C - - ScaleRowUp2_Bilinear_C - - ScaleRowUp2_Linear_16_Any_C - - ScaleRowUp2_Linear_16_C - - ScaleRowUp2_Linear_Any_C - - ScaleRowUp2_Linear_C - - ScaleUVAddCols1_16_C - - ScaleUVAddCols1_C - - ScaleUVAddCols2_16_C - - ScaleUVAddCols2_C - - ScaleUVAddCols3_16_C - - ScaleUVAddCols3_C 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 - - ScaleUVRowDown2Linear_16_C - - ScaleUVRowDown2Linear_C - - ScaleUVRowDown2_16_C - - ScaleUVRowDown2_C - - ScaleUVRowDownEvenBox_16_C - - ScaleUVRowDownEvenBox_C - - ScaleUVRowDownEven_16_C - - ScaleUVRowDownEven_C - - ScaleUVRowUp2_Bilinear_16_Any_C - - ScaleUVRowUp2_Bilinear_16_C - - ScaleUVRowUp2_Bilinear_Any_C - - ScaleUVRowUp2_Bilinear_C - - ScaleUVRowUp2_Linear_16_Any_C - - ScaleUVRowUp2_Linear_16_C - - ScaleUVRowUp2_Linear_Any_C - - ScaleUVRowUp2_Linear_C - - ------------------------------------------------------------------------ Scale: 92 (100%) 21 (23%) 0 (0%) ------------------------------------------------------------------------ Test: qemu-loongarch64 -cpu la464 ./libyuv_unittest Bug: none Change-Id: I7990bc8c2524dc9434441b5379cf839012e73d5f Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8701144 Reviewed-by: richard winterton <rrwinterton@gmail.com> Commit-Queue: Frank Barchard <fbarchard@google.com> |
||
|---|---|---|
| build_overrides | ||
| docs | ||
| include | ||
| infra/config | ||
| riscv_script | ||
| source | ||
| tools_libyuv | ||
| unit_test | ||
| util | ||
| .clang-format | ||
| .gitignore | ||
| .gn | ||
| Android.bp | ||
| Android.mk | ||
| AUTHORS | ||
| BUILD.bazel | ||
| BUILD.gn | ||
| CM_linux_packages.cmake | ||
| CMakeLists.txt | ||
| codereview.settings | ||
| DEPS | ||
| DIR_METADATA | ||
| download_vs_toolchain.py | ||
| GEMINI.md | ||
| libyuv.bzl | ||
| libyuv.gni | ||
| libyuv.gyp | ||
| libyuv.gypi | ||
| LICENSE | ||
| linux.mk | ||
| OWNERS | ||
| PATENTS | ||
| PRESUBMIT.py | ||
| public.mk | ||
| pylintrc | ||
| README.chromium | ||
| README.md | ||
| vpython.toml | ||
| vpython.toml.uv.lock | ||
| winarm.mk | ||
| WORKSPACE.bazel | ||
libyuv is an open source project that includes YUV scaling and conversion functionality.
- Scale YUV to prepare content for compression, with point, bilinear or box filter.
- Convert to YUV from webcam formats for compression.
- Convert to RGB formats for rendering/effects.
- Rotate by 90/180/270 degrees to adjust for mobile devices in portrait mode.
- Optimized for SSSE3/AVX2 on x86/x64.
- Optimized for Neon/SVE2/SME on Arm.
- Optimized for MSA on Mips.
- Optimized for RVV on RISC-V.
Development
See Getting started for instructions on how to get started developing.
You can also browse the docs directory for more documentation.