Skip to content

Commit d167cf8

Browse files
authored
Merge pull request #2103 from heiher/vadda
loongarch: Use `intrinsics::simd` for vadda
2 parents c34f026 + c87d3e2 commit d167cf8

8 files changed

Lines changed: 37 additions & 72 deletions

File tree

crates/core_arch/src/loongarch64/lasx/generated.rs

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,6 @@ unsafe extern "unadjusted" {
9191
fn __lasx_xvsat_wu(a: __v8u32, b: u32) -> __v8u32;
9292
#[link_name = "llvm.loongarch.lasx.xvsat.du"]
9393
fn __lasx_xvsat_du(a: __v4u64, b: u32) -> __v4u64;
94-
#[link_name = "llvm.loongarch.lasx.xvadda.b"]
95-
fn __lasx_xvadda_b(a: __v32i8, b: __v32i8) -> __v32i8;
96-
#[link_name = "llvm.loongarch.lasx.xvadda.h"]
97-
fn __lasx_xvadda_h(a: __v16i16, b: __v16i16) -> __v16i16;
98-
#[link_name = "llvm.loongarch.lasx.xvadda.w"]
99-
fn __lasx_xvadda_w(a: __v8i32, b: __v8i32) -> __v8i32;
100-
#[link_name = "llvm.loongarch.lasx.xvadda.d"]
101-
fn __lasx_xvadda_d(a: __v4i64, b: __v4i64) -> __v4i64;
10294
#[link_name = "llvm.loongarch.lasx.xvavg.b"]
10395
fn __lasx_xvavg_b(a: __v32i8, b: __v32i8) -> __v32i8;
10496
#[link_name = "llvm.loongarch.lasx.xvavg.h"]
@@ -1445,34 +1437,6 @@ pub fn lasx_xvsat_du<const IMM6: u32>(a: m256i) -> m256i {
14451437
unsafe { transmute(__lasx_xvsat_du(transmute(a), IMM6)) }
14461438
}
14471439

1448-
#[inline]
1449-
#[target_feature(enable = "lasx")]
1450-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1451-
pub fn lasx_xvadda_b(a: m256i, b: m256i) -> m256i {
1452-
unsafe { transmute(__lasx_xvadda_b(transmute(a), transmute(b))) }
1453-
}
1454-
1455-
#[inline]
1456-
#[target_feature(enable = "lasx")]
1457-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1458-
pub fn lasx_xvadda_h(a: m256i, b: m256i) -> m256i {
1459-
unsafe { transmute(__lasx_xvadda_h(transmute(a), transmute(b))) }
1460-
}
1461-
1462-
#[inline]
1463-
#[target_feature(enable = "lasx")]
1464-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1465-
pub fn lasx_xvadda_w(a: m256i, b: m256i) -> m256i {
1466-
unsafe { transmute(__lasx_xvadda_w(transmute(a), transmute(b))) }
1467-
}
1468-
1469-
#[inline]
1470-
#[target_feature(enable = "lasx")]
1471-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1472-
pub fn lasx_xvadda_d(a: m256i, b: m256i) -> m256i {
1473-
unsafe { transmute(__lasx_xvadda_d(transmute(a), transmute(b))) }
1474-
}
1475-
14761440
#[inline]
14771441
#[target_feature(enable = "lasx")]
14781442
#[unstable(feature = "stdarch_loongarch", issue = "117427")]

crates/core_arch/src/loongarch64/lasx/portable.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ impl_vvv!("lasx", lasx_xvssub_bu, is::simd_saturating_sub, m256i, u8x32);
148148
impl_vvv!("lasx", lasx_xvssub_hu, is::simd_saturating_sub, m256i, u16x16);
149149
impl_vvv!("lasx", lasx_xvssub_wu, is::simd_saturating_sub, m256i, u32x8);
150150
impl_vvv!("lasx", lasx_xvssub_du, is::simd_saturating_sub, m256i, u64x4);
151+
impl_vvv!("lasx", lasx_xvadda_b, ls::simd_adda, m256i, i8x32);
152+
impl_vvv!("lasx", lasx_xvadda_h, ls::simd_adda, m256i, i16x16);
153+
impl_vvv!("lasx", lasx_xvadda_w, ls::simd_adda, m256i, i32x8);
154+
impl_vvv!("lasx", lasx_xvadda_d, ls::simd_adda, m256i, i64x4);
151155

152156
impl_vuv!("lasx", lasx_xvslli_b, is::simd_shl, m256i, i8x32);
153157
impl_vuv!("lasx", lasx_xvslli_h, is::simd_shl, m256i, i16x16);

crates/core_arch/src/loongarch64/lsx/generated.rs

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,6 @@ unsafe extern "unadjusted" {
9191
fn __lsx_vsat_wu(a: __v4u32, b: u32) -> __v4u32;
9292
#[link_name = "llvm.loongarch.lsx.vsat.du"]
9393
fn __lsx_vsat_du(a: __v2u64, b: u32) -> __v2u64;
94-
#[link_name = "llvm.loongarch.lsx.vadda.b"]
95-
fn __lsx_vadda_b(a: __v16i8, b: __v16i8) -> __v16i8;
96-
#[link_name = "llvm.loongarch.lsx.vadda.h"]
97-
fn __lsx_vadda_h(a: __v8i16, b: __v8i16) -> __v8i16;
98-
#[link_name = "llvm.loongarch.lsx.vadda.w"]
99-
fn __lsx_vadda_w(a: __v4i32, b: __v4i32) -> __v4i32;
100-
#[link_name = "llvm.loongarch.lsx.vadda.d"]
101-
fn __lsx_vadda_d(a: __v2i64, b: __v2i64) -> __v2i64;
10294
#[link_name = "llvm.loongarch.lsx.vavg.b"]
10395
fn __lsx_vavg_b(a: __v16i8, b: __v16i8) -> __v16i8;
10496
#[link_name = "llvm.loongarch.lsx.vavg.h"]
@@ -1357,34 +1349,6 @@ pub fn lsx_vsat_du<const IMM6: u32>(a: m128i) -> m128i {
13571349
unsafe { transmute(__lsx_vsat_du(transmute(a), IMM6)) }
13581350
}
13591351

1360-
#[inline]
1361-
#[target_feature(enable = "lsx")]
1362-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1363-
pub fn lsx_vadda_b(a: m128i, b: m128i) -> m128i {
1364-
unsafe { transmute(__lsx_vadda_b(transmute(a), transmute(b))) }
1365-
}
1366-
1367-
#[inline]
1368-
#[target_feature(enable = "lsx")]
1369-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1370-
pub fn lsx_vadda_h(a: m128i, b: m128i) -> m128i {
1371-
unsafe { transmute(__lsx_vadda_h(transmute(a), transmute(b))) }
1372-
}
1373-
1374-
#[inline]
1375-
#[target_feature(enable = "lsx")]
1376-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1377-
pub fn lsx_vadda_w(a: m128i, b: m128i) -> m128i {
1378-
unsafe { transmute(__lsx_vadda_w(transmute(a), transmute(b))) }
1379-
}
1380-
1381-
#[inline]
1382-
#[target_feature(enable = "lsx")]
1383-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1384-
pub fn lsx_vadda_d(a: m128i, b: m128i) -> m128i {
1385-
unsafe { transmute(__lsx_vadda_d(transmute(a), transmute(b))) }
1386-
}
1387-
13881352
#[inline]
13891353
#[target_feature(enable = "lsx")]
13901354
#[unstable(feature = "stdarch_loongarch", issue = "117427")]

crates/core_arch/src/loongarch64/lsx/portable.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ impl_vvv!("lsx", lsx_vssub_bu, is::simd_saturating_sub, m128i, u8x16);
148148
impl_vvv!("lsx", lsx_vssub_hu, is::simd_saturating_sub, m128i, u16x8);
149149
impl_vvv!("lsx", lsx_vssub_wu, is::simd_saturating_sub, m128i, u32x4);
150150
impl_vvv!("lsx", lsx_vssub_du, is::simd_saturating_sub, m128i, u64x2);
151+
impl_vvv!("lsx", lsx_vadda_b, ls::simd_adda, m128i, i8x16);
152+
impl_vvv!("lsx", lsx_vadda_h, ls::simd_adda, m128i, i16x8);
153+
impl_vvv!("lsx", lsx_vadda_w, ls::simd_adda, m128i, i32x4);
154+
impl_vvv!("lsx", lsx_vadda_d, ls::simd_adda, m128i, i64x2);
151155

152156
impl_vuv!("lsx", lsx_vslli_b, is::simd_shl, m128i, i8x16);
153157
impl_vuv!("lsx", lsx_vslli_h, is::simd_shl, m128i, i16x8);

crates/core_arch/src/loongarch64/simd.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,19 @@ impl_simd_ext!(i64x4, i64);
4545
impl_simd_ext!(u64x2, u64);
4646
impl_simd_ext!(u64x4, u64);
4747

48+
#[inline(always)]
49+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
50+
pub(crate) const unsafe fn simd_abs<T: Copy + const SimdExt>(a: T) -> T {
51+
let m: T = is::simd_lt(a, ls::simd_splat(0));
52+
is::simd_select(m, is::simd_neg(a), a)
53+
}
54+
55+
#[inline(always)]
56+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
57+
pub(crate) const unsafe fn simd_adda<T: Copy + const SimdExt>(a: T, b: T) -> T {
58+
is::simd_add(ls::simd_abs(a), ls::simd_abs(b))
59+
}
60+
4861
#[inline(always)]
4962
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
5063
pub(super) const unsafe fn simd_andn<T: Copy + const SimdExt>(a: T, b: T) -> T {

crates/stdarch-gen-loongarch/lasx.spec

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,21 +924,25 @@ asm-fmts = xd, xj, ui6
924924
data-types = UV4DI, UV4DI, UQI
925925

926926
/// lasx_xvadda_b
927+
impl = portable
927928
name = lasx_xvadda_b
928929
asm-fmts = xd, xj, xk
929930
data-types = V32QI, V32QI, V32QI
930931

931932
/// lasx_xvadda_h
933+
impl = portable
932934
name = lasx_xvadda_h
933935
asm-fmts = xd, xj, xk
934936
data-types = V16HI, V16HI, V16HI
935937

936938
/// lasx_xvadda_w
939+
impl = portable
937940
name = lasx_xvadda_w
938941
asm-fmts = xd, xj, xk
939942
data-types = V8SI, V8SI, V8SI
940943

941944
/// lasx_xvadda_d
945+
impl = portable
942946
name = lasx_xvadda_d
943947
asm-fmts = xd, xj, xk
944948
data-types = V4DI, V4DI, V4DI

crates/stdarch-gen-loongarch/lsx.spec

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,21 +924,25 @@ asm-fmts = vd, vj, ui6
924924
data-types = UV2DI, UV2DI, UQI
925925

926926
/// lsx_vadda_b
927+
impl = portable
927928
name = lsx_vadda_b
928929
asm-fmts = vd, vj, vk
929930
data-types = V16QI, V16QI, V16QI
930931

931932
/// lsx_vadda_h
933+
impl = portable
932934
name = lsx_vadda_h
933935
asm-fmts = vd, vj, vk
934936
data-types = V8HI, V8HI, V8HI
935937

936938
/// lsx_vadda_w
939+
impl = portable
937940
name = lsx_vadda_w
938941
asm-fmts = vd, vj, vk
939942
data-types = V4SI, V4SI, V4SI
940943

941944
/// lsx_vadda_d
945+
impl = portable
942946
name = lsx_vadda_d
943947
asm-fmts = vd, vj, vk
944948
data-types = V2DI, V2DI, V2DI

crates/stdarch-gen-loongarch/src/portable-intrinsics.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ lsx_vssub_bu
219219
lsx_vssub_hu
220220
lsx_vssub_wu
221221
lsx_vssub_du
222+
lsx_vadda_b
223+
lsx_vadda_h
224+
lsx_vadda_w
225+
lsx_vadda_d
222226

223227
# LASX intrinsics
224228
lasx_xvsll_b
@@ -435,3 +439,7 @@ lasx_xvssub_bu
435439
lasx_xvssub_hu
436440
lasx_xvssub_wu
437441
lasx_xvssub_du
442+
lasx_xvadda_b
443+
lasx_xvadda_h
444+
lasx_xvadda_w
445+
lasx_xvadda_d

0 commit comments

Comments
 (0)