Skip to content

Commit 2b09156

Browse files
authored
Merge pull request #2129 from heiher/vrepl-128-ve-0-i
loongarch: Use `intrinsics::simd` for vrepl{128}ve{0,i}
2 parents 5e930b6 + 52234b6 commit 2b09156

8 files changed

Lines changed: 153 additions & 133 deletions

File tree

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

Lines changed: 0 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -147,14 +147,6 @@ unsafe extern "unadjusted" {
147147
fn __lasx_xvhsubw_wu_hu(a: __v16u16, b: __v16u16) -> __v8i32;
148148
#[link_name = "llvm.loongarch.lasx.xvhsubw.du.wu"]
149149
fn __lasx_xvhsubw_du_wu(a: __v8u32, b: __v8u32) -> __v4i64;
150-
#[link_name = "llvm.loongarch.lasx.xvrepl128vei.b"]
151-
fn __lasx_xvrepl128vei_b(a: __v32i8, b: u32) -> __v32i8;
152-
#[link_name = "llvm.loongarch.lasx.xvrepl128vei.h"]
153-
fn __lasx_xvrepl128vei_h(a: __v16i16, b: u32) -> __v16i16;
154-
#[link_name = "llvm.loongarch.lasx.xvrepl128vei.w"]
155-
fn __lasx_xvrepl128vei_w(a: __v8i32, b: u32) -> __v8i32;
156-
#[link_name = "llvm.loongarch.lasx.xvrepl128vei.d"]
157-
fn __lasx_xvrepl128vei_d(a: __v4i64, b: u32) -> __v4i64;
158150
#[link_name = "llvm.loongarch.lasx.xvpackev.b"]
159151
fn __lasx_xvpackev_b(a: __v32i8, b: __v32i8) -> __v32i8;
160152
#[link_name = "llvm.loongarch.lasx.xvpackev.h"]
@@ -525,16 +517,6 @@ unsafe extern "unadjusted" {
525517
fn __lasx_xvstx(a: __v32i8, b: *mut i8, c: i64);
526518
#[link_name = "llvm.loongarch.lasx.xvextl.qu.du"]
527519
fn __lasx_xvextl_qu_du(a: __v4u64) -> __v4u64;
528-
#[link_name = "llvm.loongarch.lasx.xvreplve0.b"]
529-
fn __lasx_xvreplve0_b(a: __v32i8) -> __v32i8;
530-
#[link_name = "llvm.loongarch.lasx.xvreplve0.h"]
531-
fn __lasx_xvreplve0_h(a: __v16i16) -> __v16i16;
532-
#[link_name = "llvm.loongarch.lasx.xvreplve0.w"]
533-
fn __lasx_xvreplve0_w(a: __v8i32) -> __v8i32;
534-
#[link_name = "llvm.loongarch.lasx.xvreplve0.d"]
535-
fn __lasx_xvreplve0_d(a: __v4i64) -> __v4i64;
536-
#[link_name = "llvm.loongarch.lasx.xvreplve0.q"]
537-
fn __lasx_xvreplve0_q(a: __v32i8) -> __v32i8;
538520
#[link_name = "llvm.loongarch.lasx.vext2xv.h.b"]
539521
fn __lasx_vext2xv_h_b(a: __v32i8) -> __v16i16;
540522
#[link_name = "llvm.loongarch.lasx.vext2xv.w.h"]
@@ -1585,42 +1567,6 @@ pub fn lasx_xvhsubw_du_wu(a: m256i, b: m256i) -> m256i {
15851567
unsafe { transmute(__lasx_xvhsubw_du_wu(transmute(a), transmute(b))) }
15861568
}
15871569

1588-
#[inline]
1589-
#[target_feature(enable = "lasx")]
1590-
#[rustc_legacy_const_generics(1)]
1591-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1592-
pub fn lasx_xvrepl128vei_b<const IMM4: u32>(a: m256i) -> m256i {
1593-
static_assert_uimm_bits!(IMM4, 4);
1594-
unsafe { transmute(__lasx_xvrepl128vei_b(transmute(a), IMM4)) }
1595-
}
1596-
1597-
#[inline]
1598-
#[target_feature(enable = "lasx")]
1599-
#[rustc_legacy_const_generics(1)]
1600-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1601-
pub fn lasx_xvrepl128vei_h<const IMM3: u32>(a: m256i) -> m256i {
1602-
static_assert_uimm_bits!(IMM3, 3);
1603-
unsafe { transmute(__lasx_xvrepl128vei_h(transmute(a), IMM3)) }
1604-
}
1605-
1606-
#[inline]
1607-
#[target_feature(enable = "lasx")]
1608-
#[rustc_legacy_const_generics(1)]
1609-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1610-
pub fn lasx_xvrepl128vei_w<const IMM2: u32>(a: m256i) -> m256i {
1611-
static_assert_uimm_bits!(IMM2, 2);
1612-
unsafe { transmute(__lasx_xvrepl128vei_w(transmute(a), IMM2)) }
1613-
}
1614-
1615-
#[inline]
1616-
#[target_feature(enable = "lasx")]
1617-
#[rustc_legacy_const_generics(1)]
1618-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1619-
pub fn lasx_xvrepl128vei_d<const IMM1: u32>(a: m256i) -> m256i {
1620-
static_assert_uimm_bits!(IMM1, 1);
1621-
unsafe { transmute(__lasx_xvrepl128vei_d(transmute(a), IMM1)) }
1622-
}
1623-
16241570
#[inline]
16251571
#[target_feature(enable = "lasx")]
16261572
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
@@ -2990,41 +2936,6 @@ pub fn lasx_xvextl_qu_du(a: m256i) -> m256i {
29902936
unsafe { transmute(__lasx_xvextl_qu_du(transmute(a))) }
29912937
}
29922938

2993-
#[inline]
2994-
#[target_feature(enable = "lasx")]
2995-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
2996-
pub fn lasx_xvreplve0_b(a: m256i) -> m256i {
2997-
unsafe { transmute(__lasx_xvreplve0_b(transmute(a))) }
2998-
}
2999-
3000-
#[inline]
3001-
#[target_feature(enable = "lasx")]
3002-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
3003-
pub fn lasx_xvreplve0_h(a: m256i) -> m256i {
3004-
unsafe { transmute(__lasx_xvreplve0_h(transmute(a))) }
3005-
}
3006-
3007-
#[inline]
3008-
#[target_feature(enable = "lasx")]
3009-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
3010-
pub fn lasx_xvreplve0_w(a: m256i) -> m256i {
3011-
unsafe { transmute(__lasx_xvreplve0_w(transmute(a))) }
3012-
}
3013-
3014-
#[inline]
3015-
#[target_feature(enable = "lasx")]
3016-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
3017-
pub fn lasx_xvreplve0_d(a: m256i) -> m256i {
3018-
unsafe { transmute(__lasx_xvreplve0_d(transmute(a))) }
3019-
}
3020-
3021-
#[inline]
3022-
#[target_feature(enable = "lasx")]
3023-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
3024-
pub fn lasx_xvreplve0_q(a: m256i) -> m256i {
3025-
unsafe { transmute(__lasx_xvreplve0_q(transmute(a))) }
3026-
}
3027-
30282939
#[inline]
30292940
#[target_feature(enable = "lasx")]
30302941
#[unstable(feature = "stdarch_loongarch", issue = "117427")]

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

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,82 @@ pub(crate) const unsafe fn simd_ilvl_d<T: Copy>(a: T, b: T) -> T {
129129
simd_shuffle!(b, a, [0, 4, 2, 6])
130130
}
131131

132+
#[inline(always)]
133+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
134+
pub(crate) const unsafe fn simd_replvei_b<const I: u32, T: Copy>(a: T) -> T {
135+
simd_shuffle!(
136+
a,
137+
a,
138+
[
139+
I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,
140+
I + 16, I + 16, I + 16, I + 16, I + 16, I + 16, I + 16, I + 16,
141+
I + 16, I + 16, I + 16, I + 16, I + 16, I + 16, I + 16, I + 16
142+
]
143+
)
144+
}
145+
146+
#[inline(always)]
147+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
148+
pub(crate) const unsafe fn simd_replvei_h<const I: u32, T: Copy>(a: T) -> T {
149+
simd_shuffle!(
150+
a,
151+
a,
152+
[
153+
I, I, I, I, I, I, I, I,
154+
I + 8, I + 8, I + 8, I + 8, I + 8, I + 8, I + 8, I + 8
155+
]
156+
)
157+
}
158+
159+
#[inline(always)]
160+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
161+
pub(crate) const unsafe fn simd_replvei_w<const I: u32, T: Copy>(a: T) -> T {
162+
simd_shuffle!(a, a, [I, I, I, I, I + 4, I + 4, I + 4, I + 4])
163+
}
164+
165+
#[inline(always)]
166+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
167+
pub(crate) const unsafe fn simd_replvei_d<const I: u32, T: Copy>(a: T) -> T {
168+
simd_shuffle!(a, a, [I, I, I + 2, I + 2])
169+
}
170+
171+
#[inline(always)]
172+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
173+
pub(super) const unsafe fn simd_replve0_b<T: Copy>(a: T) -> T {
174+
simd_shuffle!(
175+
a,
176+
a,
177+
[
178+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
179+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
180+
]
181+
)
182+
}
183+
184+
#[inline(always)]
185+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
186+
pub(super) const unsafe fn simd_replve0_h<T: Copy>(a: T) -> T {
187+
simd_shuffle!(a, a, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
188+
}
189+
190+
#[inline(always)]
191+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
192+
pub(super) const unsafe fn simd_replve0_w<T: Copy>(a: T) -> T {
193+
simd_shuffle!(a, a, [0, 0, 0, 0, 0, 0, 0, 0])
194+
}
195+
196+
#[inline(always)]
197+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
198+
pub(super) const unsafe fn simd_replve0_d<T: Copy>(a: T) -> T {
199+
simd_shuffle!(a, a, [0, 0, 0, 0])
200+
}
201+
202+
#[inline(always)]
203+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
204+
pub(super) const unsafe fn simd_replve0_q<T: Copy>(a: T) -> T {
205+
simd_shuffle!(a, a, [0, 1, 0, 1])
206+
}
207+
132208
impl_vv!("lasx", lasx_xvpcnt_b, is::simd_ctpop, m256i, i8x32);
133209
impl_vv!("lasx", lasx_xvpcnt_h, is::simd_ctpop, m256i, i16x16);
134210
impl_vv!("lasx", lasx_xvpcnt_w, is::simd_ctpop, m256i, i32x8);
@@ -143,6 +219,11 @@ impl_vv!("lasx", lasx_xvneg_w, is::simd_neg, m256i, i32x8);
143219
impl_vv!("lasx", lasx_xvneg_d, is::simd_neg, m256i, i64x4);
144220
impl_vv!("lasx", lasx_xvfsqrt_s, is::simd_fsqrt, m256, f32x8);
145221
impl_vv!("lasx", lasx_xvfsqrt_d, is::simd_fsqrt, m256d, f64x4);
222+
impl_vv!("lasx", lasx_xvreplve0_b, simd_replve0_b, m256i, i8x32);
223+
impl_vv!("lasx", lasx_xvreplve0_h, simd_replve0_h, m256i, i16x16);
224+
impl_vv!("lasx", lasx_xvreplve0_w, simd_replve0_w, m256i, i32x8);
225+
impl_vv!("lasx", lasx_xvreplve0_d, simd_replve0_d, m256i, i64x4);
226+
impl_vv!("lasx", lasx_xvreplve0_q, simd_replve0_q, m256i, i64x4);
146227

147228
impl_gv!("lasx", lasx_xvreplgr2vr_b, ls::simd_splat, m256i, i8x32, i32);
148229
impl_gv!("lasx", lasx_xvreplgr2vr_h, ls::simd_splat, m256i, i16x16, i32);
@@ -333,6 +414,10 @@ impl_vuv!("lasx", lasx_xvmini_bu, cs::simd_imin, m256i, u8x32, 5);
333414
impl_vuv!("lasx", lasx_xvmini_hu, cs::simd_imin, m256i, u16x16, 5);
334415
impl_vuv!("lasx", lasx_xvmini_wu, cs::simd_imin, m256i, u32x8, 5);
335416
impl_vuv!("lasx", lasx_xvmini_du, cs::simd_imin, m256i, u64x4, 5);
417+
impl_vuv!("lasx", lasx_xvrepl128vei_b, simd_replvei_b, m256i, i8x32, 4, const);
418+
impl_vuv!("lasx", lasx_xvrepl128vei_h, simd_replvei_h, m256i, i16x16, 3, const);
419+
impl_vuv!("lasx", lasx_xvrepl128vei_w, simd_replvei_w, m256i, i32x8, 2, const);
420+
impl_vuv!("lasx", lasx_xvrepl128vei_d, simd_replvei_d, m256i, i64x4, 1, const);
336421

337422
impl_vug!("lasx", lasx_xvpickve2gr_w, is::simd_extract, m256i, i32x8, i32, 3);
338423
impl_vug!("lasx", lasx_xvpickve2gr_d, is::simd_extract, m256i, i64x4, i64, 2);

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

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,6 @@ unsafe extern "unadjusted" {
155155
fn __lsx_vreplve_w(a: __v4i32, b: i32) -> __v4i32;
156156
#[link_name = "llvm.loongarch.lsx.vreplve.d"]
157157
fn __lsx_vreplve_d(a: __v2i64, b: i32) -> __v2i64;
158-
#[link_name = "llvm.loongarch.lsx.vreplvei.b"]
159-
fn __lsx_vreplvei_b(a: __v16i8, b: u32) -> __v16i8;
160-
#[link_name = "llvm.loongarch.lsx.vreplvei.h"]
161-
fn __lsx_vreplvei_h(a: __v8i16, b: u32) -> __v8i16;
162-
#[link_name = "llvm.loongarch.lsx.vreplvei.w"]
163-
fn __lsx_vreplvei_w(a: __v4i32, b: u32) -> __v4i32;
164-
#[link_name = "llvm.loongarch.lsx.vreplvei.d"]
165-
fn __lsx_vreplvei_d(a: __v2i64, b: u32) -> __v2i64;
166158
#[link_name = "llvm.loongarch.lsx.vpackev.b"]
167159
fn __lsx_vpackev_b(a: __v16i8, b: __v16i8) -> __v16i8;
168160
#[link_name = "llvm.loongarch.lsx.vpackev.h"]
@@ -1525,42 +1517,6 @@ pub fn lsx_vreplve_d(a: m128i, b: i32) -> m128i {
15251517
unsafe { transmute(__lsx_vreplve_d(transmute(a), transmute(b))) }
15261518
}
15271519

1528-
#[inline]
1529-
#[target_feature(enable = "lsx")]
1530-
#[rustc_legacy_const_generics(1)]
1531-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1532-
pub fn lsx_vreplvei_b<const IMM4: u32>(a: m128i) -> m128i {
1533-
static_assert_uimm_bits!(IMM4, 4);
1534-
unsafe { transmute(__lsx_vreplvei_b(transmute(a), IMM4)) }
1535-
}
1536-
1537-
#[inline]
1538-
#[target_feature(enable = "lsx")]
1539-
#[rustc_legacy_const_generics(1)]
1540-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1541-
pub fn lsx_vreplvei_h<const IMM3: u32>(a: m128i) -> m128i {
1542-
static_assert_uimm_bits!(IMM3, 3);
1543-
unsafe { transmute(__lsx_vreplvei_h(transmute(a), IMM3)) }
1544-
}
1545-
1546-
#[inline]
1547-
#[target_feature(enable = "lsx")]
1548-
#[rustc_legacy_const_generics(1)]
1549-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1550-
pub fn lsx_vreplvei_w<const IMM2: u32>(a: m128i) -> m128i {
1551-
static_assert_uimm_bits!(IMM2, 2);
1552-
unsafe { transmute(__lsx_vreplvei_w(transmute(a), IMM2)) }
1553-
}
1554-
1555-
#[inline]
1556-
#[target_feature(enable = "lsx")]
1557-
#[rustc_legacy_const_generics(1)]
1558-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1559-
pub fn lsx_vreplvei_d<const IMM1: u32>(a: m128i) -> m128i {
1560-
static_assert_uimm_bits!(IMM1, 1);
1561-
unsafe { transmute(__lsx_vreplvei_d(transmute(a), IMM1)) }
1562-
}
1563-
15641520
#[inline]
15651521
#[target_feature(enable = "lsx")]
15661522
#[unstable(feature = "stdarch_loongarch", issue = "117427")]

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,30 @@ pub(crate) const unsafe fn simd_ilvl_d<T: Copy>(a: T, b: T) -> T {
101101
simd_shuffle!(b, a, [0, 2])
102102
}
103103

104+
#[inline(always)]
105+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
106+
pub(crate) const unsafe fn simd_replvei_b<const I: u32, T: Copy>(a: T) -> T {
107+
simd_shuffle!(a, a, [I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I])
108+
}
109+
110+
#[inline(always)]
111+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
112+
pub(crate) const unsafe fn simd_replvei_h<const I: u32, T: Copy>(a: T) -> T {
113+
simd_shuffle!(a, a, [I, I, I, I, I, I, I, I])
114+
}
115+
116+
#[inline(always)]
117+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
118+
pub(crate) const unsafe fn simd_replvei_w<const I: u32, T: Copy>(a: T) -> T {
119+
simd_shuffle!(a, a, [I, I, I, I])
120+
}
121+
122+
#[inline(always)]
123+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
124+
pub(crate) const unsafe fn simd_replvei_d<const I: u32, T: Copy>(a: T) -> T {
125+
simd_shuffle!(a, a, [I, I])
126+
}
127+
104128
impl_vv!("lsx", lsx_vpcnt_b, is::simd_ctpop, m128i, i8x16);
105129
impl_vv!("lsx", lsx_vpcnt_h, is::simd_ctpop, m128i, i16x8);
106130
impl_vv!("lsx", lsx_vpcnt_w, is::simd_ctpop, m128i, i32x4);
@@ -305,6 +329,10 @@ impl_vuv!("lsx", lsx_vmini_bu, cs::simd_imin, m128i, u8x16, 5);
305329
impl_vuv!("lsx", lsx_vmini_hu, cs::simd_imin, m128i, u16x8, 5);
306330
impl_vuv!("lsx", lsx_vmini_wu, cs::simd_imin, m128i, u32x4, 5);
307331
impl_vuv!("lsx", lsx_vmini_du, cs::simd_imin, m128i, u64x2, 5);
332+
impl_vuv!("lsx", lsx_vreplvei_b, simd_replvei_b, m128i, i8x16, 4, const);
333+
impl_vuv!("lsx", lsx_vreplvei_h, simd_replvei_h, m128i, i16x8, 3, const);
334+
impl_vuv!("lsx", lsx_vreplvei_w, simd_replvei_w, m128i, i32x4, 2, const);
335+
impl_vuv!("lsx", lsx_vreplvei_d, simd_replvei_d, m128i, i64x2, 1, const);
308336

309337
impl_vug!("lsx", lsx_vpickve2gr_b, is::simd_extract, m128i, i8x16, i32, 4);
310338
impl_vug!("lsx", lsx_vpickve2gr_h, is::simd_extract, m128i, i16x8, i32, 3);

crates/core_arch/src/loongarch64/simd.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,20 @@ macro_rules! impl_vuv {
258258
}
259259
}
260260
};
261+
($ft:literal, $name:ident, $op:ident, $oty:ty, $ity:ident, $ibs:expr, const) => {
262+
#[inline]
263+
#[target_feature(enable = $ft)]
264+
#[rustc_legacy_const_generics(1)]
265+
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
266+
pub fn $name<const IMM: u32>(a: $oty) -> $oty {
267+
static_assert_uimm_bits!(IMM, $ibs);
268+
unsafe {
269+
let a: $ity = transmute(a);
270+
let r: $ity = $op::<IMM, _>(a);
271+
transmute(r)
272+
}
273+
}
274+
};
261275
}
262276

263277
pub(super) use impl_vuv;

0 commit comments

Comments
 (0)