Frank Barchard c6700f48dd [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc
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>
2026-11-03 13:03:56 -08:00
build_overrides [vpython] Migrate .vpython3 to vpython.toml 2026-09-18 00:28:26 -07:00
docs [libyuv] Implement 8, 16, and 32-bit transpose using x86 ACEv1 2026-11-02 10:20:25 -08:00
include [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
infra/config Use default xcode version in libyuv 2025-11-24 07:54:14 -08:00
riscv_script [libyuv] Fix RISC-V CMake/GN/Bazel builds and C compiler driver linking 2026-09-28 10:59:30 -07:00
source [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
tools_libyuv Remove libyuv dependency on base/ 2025-01-08 09:04:21 -08:00
unit_test [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
util [libyuv] Implement 8, 16, and 32-bit transpose using x86 ACEv1 2026-11-02 10:20:25 -08:00
.clang-format clang-format libyuv 2016-11-07 17:37:23 -08:00
.gitignore DetilePlane and unittest for NEON 2022-01-31 20:05:55 +00:00
.gn [libyuv] Fix x86 SIMD OOB, math, alignment, MSan & GCC bugs 2026-10-30 14:51:16 -07:00
Android.bp [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
Android.mk [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
AUTHORS Fix same-width vertical point upsampling 2026-08-24 19:28:50 -07:00
BUILD.bazel [libyuv] Add WASM SIMD128 and Relaxed SIMD for RAWToRGB24Row 2026-10-05 17:45:41 -07:00
BUILD.gn [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
CM_linux_packages.cmake Use grep extended regex for version 2024-11-13 02:11:17 +00:00
CMakeLists.txt [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
codereview.settings [infra] remove no longer supported git cl upload setting. 2021-04-28 12:47:52 +00:00
DEPS [build] Use hermetic python3 for script_executable in .gn 2026-09-28 06:02:39 -07:00
DIR_METADATA Move metadata in OWNERS files to DIR_METADATA files 2021-02-09 19:34:43 +00:00
download_vs_toolchain.py Update pylintrc to a pep-8 like style 2024-12-18 05:38:56 -08:00
GEMINI.md [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
libyuv.bzl [libyuv] Simplify RVV configuration in BUILD.bazel and libyuv.bzl 2026-09-08 17:50:17 -07:00
libyuv.gni [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
libyuv.gyp Stop setting --dynamic-linker for target_os="android" 2026-05-27 04:34:07 -07:00
libyuv.gypi [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
LICENSE Update Copyright notice to follow new chromium conventions. 2012-08-08 19:04:24 +00:00
linux.mk [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
OWNERS Remove magjed from OWNERS 2026-08-24 10:43:21 -07:00
PATENTS LibYuv: Adding PATENT and LICENSE files 2011-10-25 16:15:49 +00:00
PRESUBMIT.py Update pylintrc to a pep-8 like style 2024-12-18 05:38:56 -08:00
public.mk use unix line endings 2018-06-20 23:19:59 +00:00
pylintrc Update pylintrc to a pep-8 like style 2024-12-18 05:38:56 -08:00
README.chromium [libyuv] Consolidate LoongArch LSX and LASX inline asm into *_la.cc 2026-11-03 13:03:56 -08:00
README.md Update README.md and environment_variables.md for Arm 2024-09-20 00:29:33 +00:00
vpython.toml [vpython] Migrate .vpython3 to vpython.toml 2026-09-18 00:28:26 -07:00
vpython.toml.uv.lock [vpython] Migrate .vpython3 to vpython.toml 2026-09-18 00:28:26 -07:00
winarm.mk NV12 Copy, include scale_uv.h 2020-12-08 18:54:16 +00:00
WORKSPACE.bazel Add Bazel build support 2026-04-15 18:20:26 -07:00

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.