Skip to content

Commit 353d276

Browse files
authored
Merge pull request #2118 from heiher/vpick-ev-od
loongarch: Use `intrinsics::simd` for vpick{ev,od}
2 parents f71ac10 + 19c324f commit 353d276

7 files changed

Lines changed: 158 additions & 144 deletions

File tree

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

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -155,22 +155,6 @@ unsafe extern "unadjusted" {
155155
fn __lasx_xvrepl128vei_w(a: __v8i32, b: u32) -> __v8i32;
156156
#[link_name = "llvm.loongarch.lasx.xvrepl128vei.d"]
157157
fn __lasx_xvrepl128vei_d(a: __v4i64, b: u32) -> __v4i64;
158-
#[link_name = "llvm.loongarch.lasx.xvpickev.b"]
159-
fn __lasx_xvpickev_b(a: __v32i8, b: __v32i8) -> __v32i8;
160-
#[link_name = "llvm.loongarch.lasx.xvpickev.h"]
161-
fn __lasx_xvpickev_h(a: __v16i16, b: __v16i16) -> __v16i16;
162-
#[link_name = "llvm.loongarch.lasx.xvpickev.w"]
163-
fn __lasx_xvpickev_w(a: __v8i32, b: __v8i32) -> __v8i32;
164-
#[link_name = "llvm.loongarch.lasx.xvpickev.d"]
165-
fn __lasx_xvpickev_d(a: __v4i64, b: __v4i64) -> __v4i64;
166-
#[link_name = "llvm.loongarch.lasx.xvpickod.b"]
167-
fn __lasx_xvpickod_b(a: __v32i8, b: __v32i8) -> __v32i8;
168-
#[link_name = "llvm.loongarch.lasx.xvpickod.h"]
169-
fn __lasx_xvpickod_h(a: __v16i16, b: __v16i16) -> __v16i16;
170-
#[link_name = "llvm.loongarch.lasx.xvpickod.w"]
171-
fn __lasx_xvpickod_w(a: __v8i32, b: __v8i32) -> __v8i32;
172-
#[link_name = "llvm.loongarch.lasx.xvpickod.d"]
173-
fn __lasx_xvpickod_d(a: __v4i64, b: __v4i64) -> __v4i64;
174158
#[link_name = "llvm.loongarch.lasx.xvilvh.b"]
175159
fn __lasx_xvilvh_b(a: __v32i8, b: __v32i8) -> __v32i8;
176160
#[link_name = "llvm.loongarch.lasx.xvilvh.h"]
@@ -1653,62 +1637,6 @@ pub fn lasx_xvrepl128vei_d<const IMM1: u32>(a: m256i) -> m256i {
16531637
unsafe { transmute(__lasx_xvrepl128vei_d(transmute(a), IMM1)) }
16541638
}
16551639

1656-
#[inline]
1657-
#[target_feature(enable = "lasx")]
1658-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1659-
pub fn lasx_xvpickev_b(a: m256i, b: m256i) -> m256i {
1660-
unsafe { transmute(__lasx_xvpickev_b(transmute(a), transmute(b))) }
1661-
}
1662-
1663-
#[inline]
1664-
#[target_feature(enable = "lasx")]
1665-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1666-
pub fn lasx_xvpickev_h(a: m256i, b: m256i) -> m256i {
1667-
unsafe { transmute(__lasx_xvpickev_h(transmute(a), transmute(b))) }
1668-
}
1669-
1670-
#[inline]
1671-
#[target_feature(enable = "lasx")]
1672-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1673-
pub fn lasx_xvpickev_w(a: m256i, b: m256i) -> m256i {
1674-
unsafe { transmute(__lasx_xvpickev_w(transmute(a), transmute(b))) }
1675-
}
1676-
1677-
#[inline]
1678-
#[target_feature(enable = "lasx")]
1679-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1680-
pub fn lasx_xvpickev_d(a: m256i, b: m256i) -> m256i {
1681-
unsafe { transmute(__lasx_xvpickev_d(transmute(a), transmute(b))) }
1682-
}
1683-
1684-
#[inline]
1685-
#[target_feature(enable = "lasx")]
1686-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1687-
pub fn lasx_xvpickod_b(a: m256i, b: m256i) -> m256i {
1688-
unsafe { transmute(__lasx_xvpickod_b(transmute(a), transmute(b))) }
1689-
}
1690-
1691-
#[inline]
1692-
#[target_feature(enable = "lasx")]
1693-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1694-
pub fn lasx_xvpickod_h(a: m256i, b: m256i) -> m256i {
1695-
unsafe { transmute(__lasx_xvpickod_h(transmute(a), transmute(b))) }
1696-
}
1697-
1698-
#[inline]
1699-
#[target_feature(enable = "lasx")]
1700-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1701-
pub fn lasx_xvpickod_w(a: m256i, b: m256i) -> m256i {
1702-
unsafe { transmute(__lasx_xvpickod_w(transmute(a), transmute(b))) }
1703-
}
1704-
1705-
#[inline]
1706-
#[target_feature(enable = "lasx")]
1707-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1708-
pub fn lasx_xvpickod_d(a: m256i, b: m256i) -> m256i {
1709-
unsafe { transmute(__lasx_xvpickod_d(transmute(a), transmute(b))) }
1710-
}
1711-
17121640
#[inline]
17131641
#[target_feature(enable = "lasx")]
17141642
#[unstable(feature = "stdarch_loongarch", issue = "117427")]

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

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,68 @@ use crate::core_arch::simd::{self as cs, *};
55
use crate::intrinsics::simd as is;
66
use crate::mem::transmute;
77

8+
#[inline(always)]
9+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
10+
const unsafe fn simd_pickev_b<T: Copy>(a: T, b: T) -> T {
11+
simd_shuffle!(
12+
b,
13+
a,
14+
[
15+
0, 2, 4, 6, 8, 10, 12, 14, 32, 34, 36, 38, 40, 42, 44, 46,
16+
16, 18, 20, 22, 24, 26, 28, 30, 48, 50, 52, 54, 56, 58, 60, 62
17+
]
18+
)
19+
}
20+
21+
#[inline(always)]
22+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
23+
const unsafe fn simd_pickev_d<T: Copy>(a: T, b: T) -> T {
24+
simd_shuffle!(b, a, [0, 4, 2, 6])
25+
}
26+
27+
#[inline(always)]
28+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
29+
const unsafe fn simd_pickev_w<T: Copy>(a: T, b: T) -> T {
30+
simd_shuffle!(b, a, [0, 2, 8, 10, 4, 6, 12, 14])
31+
}
32+
33+
#[inline(always)]
34+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
35+
const unsafe fn simd_pickev_h<T: Copy>(a: T, b: T) -> T {
36+
simd_shuffle!(b, a, [0, 2, 4, 6, 16, 18, 20, 22, 8, 10, 12, 14, 24, 26, 28, 30])
37+
}
38+
39+
#[inline(always)]
40+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
41+
const unsafe fn simd_pickod_b<T: Copy>(a: T, b: T) -> T {
42+
simd_shuffle!(
43+
b,
44+
a,
45+
[
46+
1, 3, 5, 7, 9, 11, 13, 15, 33, 35, 37, 39, 41, 43, 45, 47,
47+
17, 19, 21, 23, 25, 27, 29, 31, 49, 51, 53, 55, 57, 59, 61, 63
48+
]
49+
)
50+
}
51+
52+
#[inline(always)]
53+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
54+
const unsafe fn simd_pickod_d<T: Copy>(a: T, b: T) -> T {
55+
simd_shuffle!(b, a, [1, 5, 3, 7])
56+
}
57+
58+
#[inline(always)]
59+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
60+
const unsafe fn simd_pickod_w<T: Copy>(a: T, b: T) -> T {
61+
simd_shuffle!(b, a, [1, 3, 9, 11, 5, 7, 13, 15])
62+
}
63+
64+
#[inline(always)]
65+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
66+
const unsafe fn simd_pickod_h<T: Copy>(a: T, b: T) -> T {
67+
simd_shuffle!(b, a, [1, 3, 5, 7, 17, 19, 21, 23, 9, 11, 13, 15, 25, 27, 29, 31])
68+
}
69+
870
impl_vv!("lasx", lasx_xvpcnt_b, is::simd_ctpop, m256i, i8x32);
971
impl_vv!("lasx", lasx_xvpcnt_h, is::simd_ctpop, m256i, i16x16);
1072
impl_vv!("lasx", lasx_xvpcnt_w, is::simd_ctpop, m256i, i32x8);
@@ -160,6 +222,14 @@ impl_vvv!("lasx", lasx_xvabsd_bu, ls::simd_absd, m256i, u8x32);
160222
impl_vvv!("lasx", lasx_xvabsd_hu, ls::simd_absd, m256i, u16x16);
161223
impl_vvv!("lasx", lasx_xvabsd_wu, ls::simd_absd, m256i, u32x8);
162224
impl_vvv!("lasx", lasx_xvabsd_du, ls::simd_absd, m256i, u64x4);
225+
impl_vvv!("lasx", lasx_xvpickev_b, simd_pickev_b, m256i, i8x32);
226+
impl_vvv!("lasx", lasx_xvpickev_h, simd_pickev_h, m256i, i16x16);
227+
impl_vvv!("lasx", lasx_xvpickev_w, simd_pickev_w, m256i, i32x8);
228+
impl_vvv!("lasx", lasx_xvpickev_d, simd_pickev_d, m256i, i64x4);
229+
impl_vvv!("lasx", lasx_xvpickod_b, simd_pickod_b, m256i, i8x32);
230+
impl_vvv!("lasx", lasx_xvpickod_h, simd_pickod_h, m256i, i16x16);
231+
impl_vvv!("lasx", lasx_xvpickod_w, simd_pickod_w, m256i, i32x8);
232+
impl_vvv!("lasx", lasx_xvpickod_d, simd_pickod_d, m256i, i64x4);
163233

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

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

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -163,22 +163,6 @@ unsafe extern "unadjusted" {
163163
fn __lsx_vreplvei_w(a: __v4i32, b: u32) -> __v4i32;
164164
#[link_name = "llvm.loongarch.lsx.vreplvei.d"]
165165
fn __lsx_vreplvei_d(a: __v2i64, b: u32) -> __v2i64;
166-
#[link_name = "llvm.loongarch.lsx.vpickev.b"]
167-
fn __lsx_vpickev_b(a: __v16i8, b: __v16i8) -> __v16i8;
168-
#[link_name = "llvm.loongarch.lsx.vpickev.h"]
169-
fn __lsx_vpickev_h(a: __v8i16, b: __v8i16) -> __v8i16;
170-
#[link_name = "llvm.loongarch.lsx.vpickev.w"]
171-
fn __lsx_vpickev_w(a: __v4i32, b: __v4i32) -> __v4i32;
172-
#[link_name = "llvm.loongarch.lsx.vpickev.d"]
173-
fn __lsx_vpickev_d(a: __v2i64, b: __v2i64) -> __v2i64;
174-
#[link_name = "llvm.loongarch.lsx.vpickod.b"]
175-
fn __lsx_vpickod_b(a: __v16i8, b: __v16i8) -> __v16i8;
176-
#[link_name = "llvm.loongarch.lsx.vpickod.h"]
177-
fn __lsx_vpickod_h(a: __v8i16, b: __v8i16) -> __v8i16;
178-
#[link_name = "llvm.loongarch.lsx.vpickod.w"]
179-
fn __lsx_vpickod_w(a: __v4i32, b: __v4i32) -> __v4i32;
180-
#[link_name = "llvm.loongarch.lsx.vpickod.d"]
181-
fn __lsx_vpickod_d(a: __v2i64, b: __v2i64) -> __v2i64;
182166
#[link_name = "llvm.loongarch.lsx.vilvh.b"]
183167
fn __lsx_vilvh_b(a: __v16i8, b: __v16i8) -> __v16i8;
184168
#[link_name = "llvm.loongarch.lsx.vilvh.h"]
@@ -1593,62 +1577,6 @@ pub fn lsx_vreplvei_d<const IMM1: u32>(a: m128i) -> m128i {
15931577
unsafe { transmute(__lsx_vreplvei_d(transmute(a), IMM1)) }
15941578
}
15951579

1596-
#[inline]
1597-
#[target_feature(enable = "lsx")]
1598-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1599-
pub fn lsx_vpickev_b(a: m128i, b: m128i) -> m128i {
1600-
unsafe { transmute(__lsx_vpickev_b(transmute(a), transmute(b))) }
1601-
}
1602-
1603-
#[inline]
1604-
#[target_feature(enable = "lsx")]
1605-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1606-
pub fn lsx_vpickev_h(a: m128i, b: m128i) -> m128i {
1607-
unsafe { transmute(__lsx_vpickev_h(transmute(a), transmute(b))) }
1608-
}
1609-
1610-
#[inline]
1611-
#[target_feature(enable = "lsx")]
1612-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1613-
pub fn lsx_vpickev_w(a: m128i, b: m128i) -> m128i {
1614-
unsafe { transmute(__lsx_vpickev_w(transmute(a), transmute(b))) }
1615-
}
1616-
1617-
#[inline]
1618-
#[target_feature(enable = "lsx")]
1619-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1620-
pub fn lsx_vpickev_d(a: m128i, b: m128i) -> m128i {
1621-
unsafe { transmute(__lsx_vpickev_d(transmute(a), transmute(b))) }
1622-
}
1623-
1624-
#[inline]
1625-
#[target_feature(enable = "lsx")]
1626-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1627-
pub fn lsx_vpickod_b(a: m128i, b: m128i) -> m128i {
1628-
unsafe { transmute(__lsx_vpickod_b(transmute(a), transmute(b))) }
1629-
}
1630-
1631-
#[inline]
1632-
#[target_feature(enable = "lsx")]
1633-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1634-
pub fn lsx_vpickod_h(a: m128i, b: m128i) -> m128i {
1635-
unsafe { transmute(__lsx_vpickod_h(transmute(a), transmute(b))) }
1636-
}
1637-
1638-
#[inline]
1639-
#[target_feature(enable = "lsx")]
1640-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1641-
pub fn lsx_vpickod_w(a: m128i, b: m128i) -> m128i {
1642-
unsafe { transmute(__lsx_vpickod_w(transmute(a), transmute(b))) }
1643-
}
1644-
1645-
#[inline]
1646-
#[target_feature(enable = "lsx")]
1647-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1648-
pub fn lsx_vpickod_d(a: m128i, b: m128i) -> m128i {
1649-
unsafe { transmute(__lsx_vpickod_d(transmute(a), transmute(b))) }
1650-
}
1651-
16521580
#[inline]
16531581
#[target_feature(enable = "lsx")]
16541582
#[unstable(feature = "stdarch_loongarch", issue = "117427")]

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,54 @@ use crate::core_arch::simd::{self as cs, *};
55
use crate::intrinsics::simd as is;
66
use crate::mem::transmute;
77

8+
#[inline(always)]
9+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
10+
const unsafe fn simd_pickev_b<T: Copy>(a: T, b: T) -> T {
11+
simd_shuffle!(b, a, [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30])
12+
}
13+
14+
#[inline(always)]
15+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
16+
const unsafe fn simd_pickev_h<T: Copy>(a: T, b: T) -> T {
17+
simd_shuffle!(b, a, [0, 2, 4, 6, 8, 10, 12, 14])
18+
}
19+
20+
#[inline(always)]
21+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
22+
const unsafe fn simd_pickev_w<T: Copy>(a: T, b: T) -> T {
23+
simd_shuffle!(b, a, [0, 2, 4, 6])
24+
}
25+
26+
#[inline(always)]
27+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
28+
const unsafe fn simd_pickev_d<T: Copy>(a: T, b: T) -> T {
29+
simd_shuffle!(b, a, [0, 2])
30+
}
31+
32+
#[inline(always)]
33+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
34+
const unsafe fn simd_pickod_b<T: Copy>(a: T, b: T) -> T {
35+
simd_shuffle!(b, a, [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31])
36+
}
37+
38+
#[inline(always)]
39+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
40+
const unsafe fn simd_pickod_h<T: Copy>(a: T, b: T) -> T {
41+
simd_shuffle!(b, a, [1, 3, 5, 7, 9, 11, 13, 15])
42+
}
43+
44+
#[inline(always)]
45+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
46+
const unsafe fn simd_pickod_w<T: Copy>(a: T, b: T) -> T {
47+
simd_shuffle!(b, a, [1, 3, 5, 7])
48+
}
49+
50+
#[inline(always)]
51+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
52+
const unsafe fn simd_pickod_d<T: Copy>(a: T, b: T) -> T {
53+
simd_shuffle!(b, a, [1, 3])
54+
}
55+
856
impl_vv!("lsx", lsx_vpcnt_b, is::simd_ctpop, m128i, i8x16);
957
impl_vv!("lsx", lsx_vpcnt_h, is::simd_ctpop, m128i, i16x8);
1058
impl_vv!("lsx", lsx_vpcnt_w, is::simd_ctpop, m128i, i32x4);
@@ -160,6 +208,14 @@ impl_vvv!("lsx", lsx_vabsd_bu, ls::simd_absd, m128i, u8x16);
160208
impl_vvv!("lsx", lsx_vabsd_hu, ls::simd_absd, m128i, u16x8);
161209
impl_vvv!("lsx", lsx_vabsd_wu, ls::simd_absd, m128i, u32x4);
162210
impl_vvv!("lsx", lsx_vabsd_du, ls::simd_absd, m128i, u64x2);
211+
impl_vvv!("lsx", lsx_vpickev_b, simd_pickev_b, m128i, i8x16);
212+
impl_vvv!("lsx", lsx_vpickev_h, simd_pickev_h, m128i, i16x8);
213+
impl_vvv!("lsx", lsx_vpickev_w, simd_pickev_w, m128i, i32x4);
214+
impl_vvv!("lsx", lsx_vpickev_d, simd_pickev_d, m128i, i64x2);
215+
impl_vvv!("lsx", lsx_vpickod_b, simd_pickod_b, m128i, i8x16);
216+
impl_vvv!("lsx", lsx_vpickod_h, simd_pickod_h, m128i, i16x8);
217+
impl_vvv!("lsx", lsx_vpickod_w, simd_pickod_w, m128i, i32x4);
218+
impl_vvv!("lsx", lsx_vpickod_d, simd_pickod_d, m128i, i64x2);
163219

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

crates/stdarch-gen-loongarch/lasx.spec

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,41 +1420,49 @@ asm-fmts = xd, xj, ui1
14201420
data-types = V4DI, V4DI, UQI
14211421

14221422
/// lasx_xvpickev_b
1423+
impl = portable
14231424
name = lasx_xvpickev_b
14241425
asm-fmts = xd, xj, xk
14251426
data-types = V32QI, V32QI, V32QI
14261427

14271428
/// lasx_xvpickev_h
1429+
impl = portable
14281430
name = lasx_xvpickev_h
14291431
asm-fmts = xd, xj, xk
14301432
data-types = V16HI, V16HI, V16HI
14311433

14321434
/// lasx_xvpickev_w
1435+
impl = portable
14331436
name = lasx_xvpickev_w
14341437
asm-fmts = xd, xj, xk
14351438
data-types = V8SI, V8SI, V8SI
14361439

14371440
/// lasx_xvpickev_d
1441+
impl = portable
14381442
name = lasx_xvpickev_d
14391443
asm-fmts = xd, xj, xk
14401444
data-types = V4DI, V4DI, V4DI
14411445

14421446
/// lasx_xvpickod_b
1447+
impl = portable
14431448
name = lasx_xvpickod_b
14441449
asm-fmts = xd, xj, xk
14451450
data-types = V32QI, V32QI, V32QI
14461451

14471452
/// lasx_xvpickod_h
1453+
impl = portable
14481454
name = lasx_xvpickod_h
14491455
asm-fmts = xd, xj, xk
14501456
data-types = V16HI, V16HI, V16HI
14511457

14521458
/// lasx_xvpickod_w
1459+
impl = portable
14531460
name = lasx_xvpickod_w
14541461
asm-fmts = xd, xj, xk
14551462
data-types = V8SI, V8SI, V8SI
14561463

14571464
/// lasx_xvpickod_d
1465+
impl = portable
14581466
name = lasx_xvpickod_d
14591467
asm-fmts = xd, xj, xk
14601468
data-types = V4DI, V4DI, V4DI

0 commit comments

Comments
 (0)