From 98b42bb3f29be4f66c1a8a0c6c2d6edeb210c623 Mon Sep 17 00:00:00 2001 From: tangaac Date: Wed, 22 Jul 2026 09:53:08 +0800 Subject: [PATCH 1/2] loongarch: Add portable intrinsics::simd implementations for VSAT intrinsics Implement LSX/LASX saturation (VSAT) intrinsics using intrinsics::simd instead of LLVM intrinsic FFI bindings, enabling support on non-LLVM backends. Covers both signed (Sat_S) and unsigned (Sat_U) saturation for byte/half/word/double element types. --- .../src/loongarch64/lasx/generated.rs | 88 ------------------- .../src/loongarch64/lasx/portable.rs | 74 ++++++++++++++++ .../src/loongarch64/lsx/generated.rs | 88 ------------------- .../core_arch/src/loongarch64/lsx/portable.rs | 67 ++++++++++++++ crates/core_arch/src/loongarch64/simd.rs | 30 +++++++ crates/stdarch-gen-loongarch/lasx.spec | 8 ++ crates/stdarch-gen-loongarch/lsx.spec | 8 ++ .../src/portable-intrinsics.txt | 16 ++++ 8 files changed, 203 insertions(+), 176 deletions(-) diff --git a/crates/core_arch/src/loongarch64/lasx/generated.rs b/crates/core_arch/src/loongarch64/lasx/generated.rs index 711ade4039..3cb29f9ebf 100644 --- a/crates/core_arch/src/loongarch64/lasx/generated.rs +++ b/crates/core_arch/src/loongarch64/lasx/generated.rs @@ -75,22 +75,6 @@ unsafe extern "unadjusted" { fn __lasx_xvsubi_wu(a: __v8i32, b: u32) -> __v8i32; #[link_name = "llvm.loongarch.lasx.xvsubi.du"] fn __lasx_xvsubi_du(a: __v4i64, b: u32) -> __v4i64; - #[link_name = "llvm.loongarch.lasx.xvsat.b"] - fn __lasx_xvsat_b(a: __v32i8, b: u32) -> __v32i8; - #[link_name = "llvm.loongarch.lasx.xvsat.h"] - fn __lasx_xvsat_h(a: __v16i16, b: u32) -> __v16i16; - #[link_name = "llvm.loongarch.lasx.xvsat.w"] - fn __lasx_xvsat_w(a: __v8i32, b: u32) -> __v8i32; - #[link_name = "llvm.loongarch.lasx.xvsat.d"] - fn __lasx_xvsat_d(a: __v4i64, b: u32) -> __v4i64; - #[link_name = "llvm.loongarch.lasx.xvsat.bu"] - fn __lasx_xvsat_bu(a: __v32u8, b: u32) -> __v32u8; - #[link_name = "llvm.loongarch.lasx.xvsat.hu"] - fn __lasx_xvsat_hu(a: __v16u16, b: u32) -> __v16u16; - #[link_name = "llvm.loongarch.lasx.xvsat.wu"] - fn __lasx_xvsat_wu(a: __v8u32, b: u32) -> __v8u32; - #[link_name = "llvm.loongarch.lasx.xvsat.du"] - fn __lasx_xvsat_du(a: __v4u64, b: u32) -> __v4u64; #[link_name = "llvm.loongarch.lasx.xvavg.b"] fn __lasx_xvavg_b(a: __v32i8, b: __v32i8) -> __v32i8; #[link_name = "llvm.loongarch.lasx.xvavg.h"] @@ -1211,78 +1195,6 @@ pub fn lasx_xvsubi_du(a: m256i) -> m256i { unsafe { transmute(__lasx_xvsubi_du(transmute(a), IMM5)) } } -#[inline] -#[target_feature(enable = "lasx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lasx_xvsat_b(a: m256i) -> m256i { - static_assert_uimm_bits!(IMM3, 3); - unsafe { transmute(__lasx_xvsat_b(transmute(a), IMM3)) } -} - -#[inline] -#[target_feature(enable = "lasx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lasx_xvsat_h(a: m256i) -> m256i { - static_assert_uimm_bits!(IMM4, 4); - unsafe { transmute(__lasx_xvsat_h(transmute(a), IMM4)) } -} - -#[inline] -#[target_feature(enable = "lasx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lasx_xvsat_w(a: m256i) -> m256i { - static_assert_uimm_bits!(IMM5, 5); - unsafe { transmute(__lasx_xvsat_w(transmute(a), IMM5)) } -} - -#[inline] -#[target_feature(enable = "lasx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lasx_xvsat_d(a: m256i) -> m256i { - static_assert_uimm_bits!(IMM6, 6); - unsafe { transmute(__lasx_xvsat_d(transmute(a), IMM6)) } -} - -#[inline] -#[target_feature(enable = "lasx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lasx_xvsat_bu(a: m256i) -> m256i { - static_assert_uimm_bits!(IMM3, 3); - unsafe { transmute(__lasx_xvsat_bu(transmute(a), IMM3)) } -} - -#[inline] -#[target_feature(enable = "lasx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lasx_xvsat_hu(a: m256i) -> m256i { - static_assert_uimm_bits!(IMM4, 4); - unsafe { transmute(__lasx_xvsat_hu(transmute(a), IMM4)) } -} - -#[inline] -#[target_feature(enable = "lasx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lasx_xvsat_wu(a: m256i) -> m256i { - static_assert_uimm_bits!(IMM5, 5); - unsafe { transmute(__lasx_xvsat_wu(transmute(a), IMM5)) } -} - -#[inline] -#[target_feature(enable = "lasx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lasx_xvsat_du(a: m256i) -> m256i { - static_assert_uimm_bits!(IMM6, 6); - unsafe { transmute(__lasx_xvsat_du(transmute(a), IMM6)) } -} - #[inline] #[target_feature(enable = "lasx")] #[unstable(feature = "stdarch_loongarch", issue = "117427")] diff --git a/crates/core_arch/src/loongarch64/lasx/portable.rs b/crates/core_arch/src/loongarch64/lasx/portable.rs index 73ea74d9dc..698430b89b 100644 --- a/crates/core_arch/src/loongarch64/lasx/portable.rs +++ b/crates/core_arch/src/loongarch64/lasx/portable.rs @@ -896,6 +896,80 @@ impl_vvvv!("lasx", lasx_xvfnmsub_d, simd_ext_fnmsub, m256d, f64x4); impl_vugv!("lasx", lasx_xvinsgr2vr_w, simd_insert, m256i, i32x8, i32, 3); impl_vugv!("lasx", lasx_xvinsgr2vr_d, simd_insert, m256i, i64x4, i64, 2); +// VSAT — signed saturation +#[inline] +#[target_feature(enable = "lasx")] +#[rustc_legacy_const_generics(1)] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lasx_xvsat_b(a: m256i) -> m256i { + static_assert_uimm_bits!(IMM, 3); + unsafe { transmute(simd_ext_sat_signed(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lasx")] +#[rustc_legacy_const_generics(1)] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lasx_xvsat_h(a: m256i) -> m256i { + static_assert_uimm_bits!(IMM, 4); + unsafe { transmute(simd_ext_sat_signed(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lasx")] +#[rustc_legacy_const_generics(1)] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lasx_xvsat_w(a: m256i) -> m256i { + static_assert_uimm_bits!(IMM, 5); + unsafe { transmute(simd_ext_sat_signed(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lasx")] +#[rustc_legacy_const_generics(1)] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lasx_xvsat_d(a: m256i) -> m256i { + static_assert_uimm_bits!(IMM, 6); + unsafe { transmute(simd_ext_sat_signed(transmute::(a), IMM)) } +} + +// VSATU — unsigned saturation +#[inline] +#[target_feature(enable = "lasx")] +#[rustc_legacy_const_generics(1)] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lasx_xvsat_bu(a: m256i) -> m256i { + static_assert_uimm_bits!(IMM, 3); + unsafe { transmute(simd_ext_sat_unsigned(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lasx")] +#[rustc_legacy_const_generics(1)] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lasx_xvsat_hu(a: m256i) -> m256i { + static_assert_uimm_bits!(IMM, 4); + unsafe { transmute(simd_ext_sat_unsigned(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lasx")] +#[rustc_legacy_const_generics(1)] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lasx_xvsat_wu(a: m256i) -> m256i { + static_assert_uimm_bits!(IMM, 5); + unsafe { transmute(simd_ext_sat_unsigned(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lasx")] +#[rustc_legacy_const_generics(1)] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lasx_xvsat_du(a: m256i) -> m256i { + static_assert_uimm_bits!(IMM, 6); + unsafe { transmute(simd_ext_sat_unsigned(transmute::(a), IMM)) } +} + #[cfg(test)] mod tests { use crate::{ diff --git a/crates/core_arch/src/loongarch64/lsx/generated.rs b/crates/core_arch/src/loongarch64/lsx/generated.rs index 1542633a34..bba07cf147 100644 --- a/crates/core_arch/src/loongarch64/lsx/generated.rs +++ b/crates/core_arch/src/loongarch64/lsx/generated.rs @@ -75,22 +75,6 @@ unsafe extern "unadjusted" { fn __lsx_vsubi_wu(a: __v4i32, b: u32) -> __v4i32; #[link_name = "llvm.loongarch.lsx.vsubi.du"] fn __lsx_vsubi_du(a: __v2i64, b: u32) -> __v2i64; - #[link_name = "llvm.loongarch.lsx.vsat.b"] - fn __lsx_vsat_b(a: __v16i8, b: u32) -> __v16i8; - #[link_name = "llvm.loongarch.lsx.vsat.h"] - fn __lsx_vsat_h(a: __v8i16, b: u32) -> __v8i16; - #[link_name = "llvm.loongarch.lsx.vsat.w"] - fn __lsx_vsat_w(a: __v4i32, b: u32) -> __v4i32; - #[link_name = "llvm.loongarch.lsx.vsat.d"] - fn __lsx_vsat_d(a: __v2i64, b: u32) -> __v2i64; - #[link_name = "llvm.loongarch.lsx.vsat.bu"] - fn __lsx_vsat_bu(a: __v16u8, b: u32) -> __v16u8; - #[link_name = "llvm.loongarch.lsx.vsat.hu"] - fn __lsx_vsat_hu(a: __v8u16, b: u32) -> __v8u16; - #[link_name = "llvm.loongarch.lsx.vsat.wu"] - fn __lsx_vsat_wu(a: __v4u32, b: u32) -> __v4u32; - #[link_name = "llvm.loongarch.lsx.vsat.du"] - fn __lsx_vsat_du(a: __v2u64, b: u32) -> __v2u64; #[link_name = "llvm.loongarch.lsx.vavg.b"] fn __lsx_vavg_b(a: __v16i8, b: __v16i8) -> __v16i8; #[link_name = "llvm.loongarch.lsx.vavg.h"] @@ -1131,78 +1115,6 @@ pub fn lsx_vsubi_du(a: m128i) -> m128i { unsafe { transmute(__lsx_vsubi_du(transmute(a), IMM5)) } } -#[inline] -#[target_feature(enable = "lsx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lsx_vsat_b(a: m128i) -> m128i { - static_assert_uimm_bits!(IMM3, 3); - unsafe { transmute(__lsx_vsat_b(transmute(a), IMM3)) } -} - -#[inline] -#[target_feature(enable = "lsx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lsx_vsat_h(a: m128i) -> m128i { - static_assert_uimm_bits!(IMM4, 4); - unsafe { transmute(__lsx_vsat_h(transmute(a), IMM4)) } -} - -#[inline] -#[target_feature(enable = "lsx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lsx_vsat_w(a: m128i) -> m128i { - static_assert_uimm_bits!(IMM5, 5); - unsafe { transmute(__lsx_vsat_w(transmute(a), IMM5)) } -} - -#[inline] -#[target_feature(enable = "lsx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lsx_vsat_d(a: m128i) -> m128i { - static_assert_uimm_bits!(IMM6, 6); - unsafe { transmute(__lsx_vsat_d(transmute(a), IMM6)) } -} - -#[inline] -#[target_feature(enable = "lsx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lsx_vsat_bu(a: m128i) -> m128i { - static_assert_uimm_bits!(IMM3, 3); - unsafe { transmute(__lsx_vsat_bu(transmute(a), IMM3)) } -} - -#[inline] -#[target_feature(enable = "lsx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lsx_vsat_hu(a: m128i) -> m128i { - static_assert_uimm_bits!(IMM4, 4); - unsafe { transmute(__lsx_vsat_hu(transmute(a), IMM4)) } -} - -#[inline] -#[target_feature(enable = "lsx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lsx_vsat_wu(a: m128i) -> m128i { - static_assert_uimm_bits!(IMM5, 5); - unsafe { transmute(__lsx_vsat_wu(transmute(a), IMM5)) } -} - -#[inline] -#[target_feature(enable = "lsx")] -#[rustc_legacy_const_generics(1)] -#[unstable(feature = "stdarch_loongarch", issue = "117427")] -pub fn lsx_vsat_du(a: m128i) -> m128i { - static_assert_uimm_bits!(IMM6, 6); - unsafe { transmute(__lsx_vsat_du(transmute(a), IMM6)) } -} - #[inline] #[target_feature(enable = "lsx")] #[unstable(feature = "stdarch_loongarch", issue = "117427")] diff --git a/crates/core_arch/src/loongarch64/lsx/portable.rs b/crates/core_arch/src/loongarch64/lsx/portable.rs index 31467bf013..0e2ff2b7ba 100644 --- a/crates/core_arch/src/loongarch64/lsx/portable.rs +++ b/crates/core_arch/src/loongarch64/lsx/portable.rs @@ -574,6 +574,73 @@ impl_vugv!("lsx", lsx_vinsgr2vr_h, simd_insert, m128i, i16x8, i32, 3); impl_vugv!("lsx", lsx_vinsgr2vr_w, simd_insert, m128i, i32x4, i32, 2); impl_vugv!("lsx", lsx_vinsgr2vr_d, simd_insert, m128i, i64x2, i64, 1); +// VSAT — signed saturation to IMM+1 bits +#[inline] +#[target_feature(enable = "lsx")] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lsx_vsat_b(a: m128i) -> m128i { + static_assert_uimm_bits!(IMM, 3); + unsafe { transmute(simd_ext_sat_signed(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lsx")] +#[rustc_legacy_const_generics(1)] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lsx_vsat_h(a: m128i) -> m128i { + static_assert_uimm_bits!(IMM, 4); + unsafe { transmute(simd_ext_sat_signed(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lsx")] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lsx_vsat_w(a: m128i) -> m128i { + static_assert_uimm_bits!(IMM, 5); + unsafe { transmute(simd_ext_sat_signed(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lsx")] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lsx_vsat_d(a: m128i) -> m128i { + static_assert_uimm_bits!(IMM, 6); + unsafe { transmute(simd_ext_sat_signed(transmute::(a), IMM)) } +} + +// VSATU — unsigned saturation to IMM+1 bits +#[inline] +#[target_feature(enable = "lsx")] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lsx_vsat_bu(a: m128i) -> m128i { + static_assert_uimm_bits!(IMM, 3); + unsafe { transmute(simd_ext_sat_unsigned(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lsx")] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lsx_vsat_hu(a: m128i) -> m128i { + static_assert_uimm_bits!(IMM, 4); + unsafe { transmute(simd_ext_sat_unsigned(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lsx")] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lsx_vsat_wu(a: m128i) -> m128i { + static_assert_uimm_bits!(IMM, 5); + unsafe { transmute(simd_ext_sat_unsigned(transmute::(a), IMM)) } +} + +#[inline] +#[target_feature(enable = "lsx")] +#[unstable(feature = "stdarch_loongarch", issue = "117427")] +pub fn lsx_vsat_du(a: m128i) -> m128i { + static_assert_uimm_bits!(IMM, 6); + unsafe { transmute(simd_ext_sat_unsigned(transmute::(a), IMM)) } +} + #[cfg(test)] mod tests { use crate::{ diff --git a/crates/core_arch/src/loongarch64/simd.rs b/crates/core_arch/src/loongarch64/simd.rs index 1d83333e2f..73fc3a85ae 100644 --- a/crates/core_arch/src/loongarch64/simd.rs +++ b/crates/core_arch/src/loongarch64/simd.rs @@ -1,6 +1,7 @@ //! LoongArch64 SIMD helpers use crate::intrinsics::simd::*; +use crate::core_arch::simd::*; // Internal extension trait for concrete `Simd` types. // @@ -304,6 +305,35 @@ pub(super) const unsafe fn simd_ext_stx(a: T, b: *mut i8, c: i64) { core::ptr::write_unaligned(b, a); } +#[inline(always)] +#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")] +pub(super) const unsafe fn simd_ext_sat_signed(a: T, imm: u32) -> T { + let bits = (size_of::() * 8) as u32; + if imm >= bits - 1 { + return a; + } + let min_val = -(1i64 << imm); + let max_val = (1i64 << imm) - 1; + simd_imax( + simd_imin(a, simd_ext_splat(max_val)), + simd_ext_splat(min_val), + ) +} + +#[inline(always)] +#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")] +pub(super) const unsafe fn simd_ext_sat_unsigned(a: T, imm: u32) -> T { + let bits = (size_of::() * 8) as u32; + if imm >= bits - 1 { + return a; + } + let max_val = (1i64 << (imm + 1)) - 1; + simd_imax( + simd_imin(a, simd_ext_splat(max_val)), + simd_ext_splat(0), + ) +} + macro_rules! impl_vv { ($ft:literal, $name:ident, $op:ident, $oty:ty, $ity:ty) => { #[inline] diff --git a/crates/stdarch-gen-loongarch/lasx.spec b/crates/stdarch-gen-loongarch/lasx.spec index 9eff3d01fa..7ebe17d969 100644 --- a/crates/stdarch-gen-loongarch/lasx.spec +++ b/crates/stdarch-gen-loongarch/lasx.spec @@ -884,41 +884,49 @@ asm-fmts = xd, xj, ui5 data-types = V4DI, UV4DI, UQI /// lasx_xvsat_b +impl = portable name = lasx_xvsat_b asm-fmts = xd, xj, ui3 data-types = V32QI, V32QI, UQI /// lasx_xvsat_h +impl = portable name = lasx_xvsat_h asm-fmts = xd, xj, ui4 data-types = V16HI, V16HI, UQI /// lasx_xvsat_w +impl = portable name = lasx_xvsat_w asm-fmts = xd, xj, ui5 data-types = V8SI, V8SI, UQI /// lasx_xvsat_d +impl = portable name = lasx_xvsat_d asm-fmts = xd, xj, ui6 data-types = V4DI, V4DI, UQI /// lasx_xvsat_bu +impl = portable name = lasx_xvsat_bu asm-fmts = xd, xj, ui3 data-types = UV32QI, UV32QI, UQI /// lasx_xvsat_hu +impl = portable name = lasx_xvsat_hu asm-fmts = xd, xj, ui4 data-types = UV16HI, UV16HI, UQI /// lasx_xvsat_wu +impl = portable name = lasx_xvsat_wu asm-fmts = xd, xj, ui5 data-types = UV8SI, UV8SI, UQI /// lasx_xvsat_du +impl = portable name = lasx_xvsat_du asm-fmts = xd, xj, ui6 data-types = UV4DI, UV4DI, UQI diff --git a/crates/stdarch-gen-loongarch/lsx.spec b/crates/stdarch-gen-loongarch/lsx.spec index ba2554b0cf..1bf4f60750 100644 --- a/crates/stdarch-gen-loongarch/lsx.spec +++ b/crates/stdarch-gen-loongarch/lsx.spec @@ -884,41 +884,49 @@ asm-fmts = vd, vj, ui5 data-types = V2DI, UV2DI, UQI /// lsx_vsat_b +impl = portable name = lsx_vsat_b asm-fmts = vd, vj, ui3 data-types = V16QI, V16QI, UQI /// lsx_vsat_h +impl = portable name = lsx_vsat_h asm-fmts = vd, vj, ui4 data-types = V8HI, V8HI, UQI /// lsx_vsat_w +impl = portable name = lsx_vsat_w asm-fmts = vd, vj, ui5 data-types = V4SI, V4SI, UQI /// lsx_vsat_d +impl = portable name = lsx_vsat_d asm-fmts = vd, vj, ui6 data-types = V2DI, V2DI, UQI /// lsx_vsat_bu +impl = portable name = lsx_vsat_bu asm-fmts = vd, vj, ui3 data-types = UV16QI, UV16QI, UQI /// lsx_vsat_hu +impl = portable name = lsx_vsat_hu asm-fmts = vd, vj, ui4 data-types = UV8HI, UV8HI, UQI /// lsx_vsat_wu +impl = portable name = lsx_vsat_wu asm-fmts = vd, vj, ui5 data-types = UV4SI, UV4SI, UQI /// lsx_vsat_du +impl = portable name = lsx_vsat_du asm-fmts = vd, vj, ui6 data-types = UV2DI, UV2DI, UQI diff --git a/crates/stdarch-gen-loongarch/src/portable-intrinsics.txt b/crates/stdarch-gen-loongarch/src/portable-intrinsics.txt index 8b8c82b3bb..0ed8da986b 100644 --- a/crates/stdarch-gen-loongarch/src/portable-intrinsics.txt +++ b/crates/stdarch-gen-loongarch/src/portable-intrinsics.txt @@ -219,6 +219,14 @@ lsx_vssub_bu lsx_vssub_hu lsx_vssub_wu lsx_vssub_du +lsx_vsat_b +lsx_vsat_h +lsx_vsat_w +lsx_vsat_d +lsx_vsat_bu +lsx_vsat_hu +lsx_vsat_wu +lsx_vsat_du lsx_vadda_b lsx_vadda_h lsx_vadda_w @@ -512,6 +520,14 @@ lasx_xvssub_bu lasx_xvssub_hu lasx_xvssub_wu lasx_xvssub_du +lasx_xvsat_b +lasx_xvsat_h +lasx_xvsat_w +lasx_xvsat_d +lasx_xvsat_bu +lasx_xvsat_hu +lasx_xvsat_wu +lasx_xvsat_du lasx_xvadda_b lasx_xvadda_h lasx_xvadda_w From 2a88ff601f7e15b1f0c15b485d5324028b5708e2 Mon Sep 17 00:00:00 2001 From: tangaac Date: Wed, 22 Jul 2026 10:58:10 +0800 Subject: [PATCH 2/2] update style --- crates/core_arch/src/loongarch64/simd.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/crates/core_arch/src/loongarch64/simd.rs b/crates/core_arch/src/loongarch64/simd.rs index 73fc3a85ae..1caba3d863 100644 --- a/crates/core_arch/src/loongarch64/simd.rs +++ b/crates/core_arch/src/loongarch64/simd.rs @@ -1,7 +1,7 @@ //! LoongArch64 SIMD helpers -use crate::intrinsics::simd::*; use crate::core_arch::simd::*; +use crate::intrinsics::simd::*; // Internal extension trait for concrete `Simd` types. // @@ -328,10 +328,7 @@ pub(super) const unsafe fn simd_ext_sat_unsigned(a: T, return a; } let max_val = (1i64 << (imm + 1)) - 1; - simd_imax( - simd_imin(a, simd_ext_splat(max_val)), - simd_ext_splat(0), - ) + simd_imax(simd_imin(a, simd_ext_splat(max_val)), simd_ext_splat(0)) } macro_rules! impl_vv {