mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2026-10-28 18:07:12 +08:00
Update trademarks, document `arm_sve.h` and add guidance to prefer fully predicated loop iterations for SVE/SME implementations. Change-Id: I4039b982ba816193019df62a523fd29f474c3d10 Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8256407 Reviewed-by: Wan-Teh Chang <wtc@google.com> Reviewed-by: Frank Barchard <fbarchard@google.com>
3.1 KiB
3.1 KiB
Gemini Project Context: libyuv Row Functions
This file provides context for the core row-processing architecture of
libyuv. Use these guidelines when refactoring, reviewing, or generating
code within the row_*.cc files.
Architectural Overview
Libyuv uses a dispatch system where high-level conversion functions call optimized "Row" functions. These functions are categorized by SIMD architecture and compiler compatibility.
Source File Map
x86 Architectures (32-bit and 64-bit)
- row_gcc.cc: Master copy. Contains inline assembly in GCC syntax for GCC and Clang. Supports AVX, and AVX512. AVX512 implementations are strictly for 64-bit targets.
- row_win.cc: Derivative of
row_gcc.cc. Contains C++ intrinsics specifically for Visual C++ (MSVC). Can be tested with Clang using-DLIBYUV_ENABLE_ROWWIN. - Note: Use either
row_gccorrow_win, never both.
Arm Architecture (32-bit)
- row_neon.cc: 32-bit Arm. Written entirely in inline assembly for GCC/Clang.
Arm Architecture (AArch64) (64-bit)
- row_neon64.cc: 64-bit Arm (AArch64) Neon. Written entirely in inline assembly for GCC/Clang.
- row_sve.cc: Armv9 Scalable Vector Extension (SVE2).
- row_sme.cc: Armv9 Scalable Matrix Extension (SME) and Streaming SVE (SSVE).
- row_sve.h: Streaming-compatible implementations shared across row_sve.cc and row_sme.cc.
Other Architectures
- row_rvv.cc: RISC-V Vector (RVV). Implemented using intrinsics. Optimized for SiFive X280.
- row_lsx.cc / row_lasx.cc: Loongarch MIPS-like extensions.
Utility and Fallbacks
- row_common.cc: Portable C/C++ versions. This is the reference implementation.
- row_any.cc: Handles "remainder" pixels for widths not multiples of SIMD register size. Used for x86, Neon, and MIPS. Not required for SVE2, SME, or RVV due to hardware-level masking.
Coding Guidelines
- Feature Macros: Use the
HAS_macros ininclude/libyuv/row.hto enable or disable specific instruction set extensions.
x86 Architectures (32-bit and 64-bit)
- AVX512 Logic: AVX512 row functions are strictly enabled for 64-bit x86 only.
- MSVC Intrinsics (
row_win.cc): When convertingrow_gcc.cctorow_win.cc, use_mm512_permutex2var_epi8, not_mm512_permi2var_epi8intrinsic.
AArch64
- For SVE2/SME, aim to use full predicates (
ptrue) and full vectors for the main loop body and use predication only to mask the tail loop as needed. Pointer updates should be done withinc[bhwd]oradd, not byincp.
Changelist (CL) Format Guidelines
When adding new code, remove trailing spaces. When generating descriptions, follow the Chromium standard format. Wrap commit message text at 72 characters
Changelist (CL) Description Example
libyuv] Optimized ARGBToRGB24 for AVX2
Detailed technical explanation of the change. Describe the SIMD
optimization logic and any platform-specific constraints. Mention
if this impacts specific row files like row_gcc.cc.
Test: libyuv_unittest --gunit_filter=*ARGBToRGB24*
Bug: libyuv:12345, b/67890