Skip to content

Commit d940579

Browse files
authored
Merge pull request #2123 from heiher/vilv-h-l
loongarch: Use `intrinsics::simd` for vilv{h,l}
2 parents 2d98408 + 2e6b3aa commit d940579

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.xvilvh.b"]
159-
fn __lasx_xvilvh_b(a: __v32i8, b: __v32i8) -> __v32i8;
160-
#[link_name = "llvm.loongarch.lasx.xvilvh.h"]
161-
fn __lasx_xvilvh_h(a: __v16i16, b: __v16i16) -> __v16i16;
162-
#[link_name = "llvm.loongarch.lasx.xvilvh.w"]
163-
fn __lasx_xvilvh_w(a: __v8i32, b: __v8i32) -> __v8i32;
164-
#[link_name = "llvm.loongarch.lasx.xvilvh.d"]
165-
fn __lasx_xvilvh_d(a: __v4i64, b: __v4i64) -> __v4i64;
166-
#[link_name = "llvm.loongarch.lasx.xvilvl.b"]
167-
fn __lasx_xvilvl_b(a: __v32i8, b: __v32i8) -> __v32i8;
168-
#[link_name = "llvm.loongarch.lasx.xvilvl.h"]
169-
fn __lasx_xvilvl_h(a: __v16i16, b: __v16i16) -> __v16i16;
170-
#[link_name = "llvm.loongarch.lasx.xvilvl.w"]
171-
fn __lasx_xvilvl_w(a: __v8i32, b: __v8i32) -> __v8i32;
172-
#[link_name = "llvm.loongarch.lasx.xvilvl.d"]
173-
fn __lasx_xvilvl_d(a: __v4i64, b: __v4i64) -> __v4i64;
174158
#[link_name = "llvm.loongarch.lasx.xvpackev.b"]
175159
fn __lasx_xvpackev_b(a: __v32i8, b: __v32i8) -> __v32i8;
176160
#[link_name = "llvm.loongarch.lasx.xvpackev.h"]
@@ -1637,62 +1621,6 @@ pub fn lasx_xvrepl128vei_d<const IMM1: u32>(a: m256i) -> m256i {
16371621
unsafe { transmute(__lasx_xvrepl128vei_d(transmute(a), IMM1)) }
16381622
}
16391623

1640-
#[inline]
1641-
#[target_feature(enable = "lasx")]
1642-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1643-
pub fn lasx_xvilvh_b(a: m256i, b: m256i) -> m256i {
1644-
unsafe { transmute(__lasx_xvilvh_b(transmute(a), transmute(b))) }
1645-
}
1646-
1647-
#[inline]
1648-
#[target_feature(enable = "lasx")]
1649-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1650-
pub fn lasx_xvilvh_h(a: m256i, b: m256i) -> m256i {
1651-
unsafe { transmute(__lasx_xvilvh_h(transmute(a), transmute(b))) }
1652-
}
1653-
1654-
#[inline]
1655-
#[target_feature(enable = "lasx")]
1656-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1657-
pub fn lasx_xvilvh_w(a: m256i, b: m256i) -> m256i {
1658-
unsafe { transmute(__lasx_xvilvh_w(transmute(a), transmute(b))) }
1659-
}
1660-
1661-
#[inline]
1662-
#[target_feature(enable = "lasx")]
1663-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1664-
pub fn lasx_xvilvh_d(a: m256i, b: m256i) -> m256i {
1665-
unsafe { transmute(__lasx_xvilvh_d(transmute(a), transmute(b))) }
1666-
}
1667-
1668-
#[inline]
1669-
#[target_feature(enable = "lasx")]
1670-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1671-
pub fn lasx_xvilvl_b(a: m256i, b: m256i) -> m256i {
1672-
unsafe { transmute(__lasx_xvilvl_b(transmute(a), transmute(b))) }
1673-
}
1674-
1675-
#[inline]
1676-
#[target_feature(enable = "lasx")]
1677-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1678-
pub fn lasx_xvilvl_h(a: m256i, b: m256i) -> m256i {
1679-
unsafe { transmute(__lasx_xvilvl_h(transmute(a), transmute(b))) }
1680-
}
1681-
1682-
#[inline]
1683-
#[target_feature(enable = "lasx")]
1684-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1685-
pub fn lasx_xvilvl_w(a: m256i, b: m256i) -> m256i {
1686-
unsafe { transmute(__lasx_xvilvl_w(transmute(a), transmute(b))) }
1687-
}
1688-
1689-
#[inline]
1690-
#[target_feature(enable = "lasx")]
1691-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1692-
pub fn lasx_xvilvl_d(a: m256i, b: m256i) -> m256i {
1693-
unsafe { transmute(__lasx_xvilvl_d(transmute(a), transmute(b))) }
1694-
}
1695-
16961624
#[inline]
16971625
#[target_feature(enable = "lasx")]
16981626
#[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
@@ -67,6 +67,68 @@ const unsafe fn simd_pickod_h<T: Copy>(a: T, b: T) -> T {
6767
simd_shuffle!(b, a, [1, 3, 5, 7, 17, 19, 21, 23, 9, 11, 13, 15, 25, 27, 29, 31])
6868
}
6969

70+
#[inline(always)]
71+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
72+
pub(crate) const unsafe fn simd_ilvh_b<T: Copy>(a: T, b: T) -> T {
73+
simd_shuffle!(
74+
b,
75+
a,
76+
[
77+
8, 40, 9, 41, 10, 42, 11, 43, 12, 44, 13, 45, 14, 46, 15, 47,
78+
24, 56, 25, 57, 26, 58, 27, 59, 28, 60, 29, 61, 30, 62, 31, 63
79+
]
80+
)
81+
}
82+
83+
#[inline(always)]
84+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
85+
pub(crate) const unsafe fn simd_ilvh_h<T: Copy>(a: T, b: T) -> T {
86+
simd_shuffle!(b, a, [4, 20, 5, 21, 6, 22, 7, 23, 12, 28, 13, 29, 14, 30, 15, 31])
87+
}
88+
89+
#[inline(always)]
90+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
91+
pub(crate) const unsafe fn simd_ilvh_w<T: Copy>(a: T, b: T) -> T {
92+
simd_shuffle!(b, a, [2, 10, 3, 11, 6, 14, 7, 15])
93+
}
94+
95+
#[inline(always)]
96+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
97+
pub(crate) const unsafe fn simd_ilvh_d<T: Copy>(a: T, b: T) -> T {
98+
simd_shuffle!(b, a, [1, 5, 3, 7])
99+
}
100+
101+
#[inline(always)]
102+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
103+
pub(crate) const unsafe fn simd_ilvl_b<T: Copy>(a: T, b: T) -> T {
104+
simd_shuffle!(
105+
b,
106+
a,
107+
[
108+
0, 32, 1, 33, 2, 34, 3, 35, 4, 36, 5, 37, 6, 38, 7, 39,
109+
16, 48, 17, 49, 18, 50, 19, 51, 20, 52, 21, 53, 22, 54, 23, 55
110+
]
111+
)
112+
}
113+
114+
#[inline(always)]
115+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
116+
pub(crate) const unsafe fn simd_ilvl_h<T: Copy>(a: T, b: T) -> T {
117+
simd_shuffle!(b, a, [0, 16, 1, 17, 2, 18, 3, 19, 8, 24, 9, 25, 10, 26, 11, 27])
118+
}
119+
120+
#[inline(always)]
121+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
122+
pub(crate) const unsafe fn simd_ilvl_w<T: Copy>(a: T, b: T) -> T {
123+
simd_shuffle!(b, a, [0, 8, 1, 9, 4, 12, 5, 13])
124+
}
125+
126+
#[inline(always)]
127+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
128+
pub(crate) const unsafe fn simd_ilvl_d<T: Copy>(a: T, b: T) -> T {
129+
simd_shuffle!(b, a, [0, 4, 2, 6])
130+
}
131+
70132
impl_vv!("lasx", lasx_xvpcnt_b, is::simd_ctpop, m256i, i8x32);
71133
impl_vv!("lasx", lasx_xvpcnt_h, is::simd_ctpop, m256i, i16x16);
72134
impl_vv!("lasx", lasx_xvpcnt_w, is::simd_ctpop, m256i, i32x8);
@@ -230,6 +292,14 @@ impl_vvv!("lasx", lasx_xvpickod_b, simd_pickod_b, m256i, i8x32);
230292
impl_vvv!("lasx", lasx_xvpickod_h, simd_pickod_h, m256i, i16x16);
231293
impl_vvv!("lasx", lasx_xvpickod_w, simd_pickod_w, m256i, i32x8);
232294
impl_vvv!("lasx", lasx_xvpickod_d, simd_pickod_d, m256i, i64x4);
295+
impl_vvv!("lasx", lasx_xvilvh_b, simd_ilvh_b, m256i, i8x32);
296+
impl_vvv!("lasx", lasx_xvilvh_h, simd_ilvh_h, m256i, i16x16);
297+
impl_vvv!("lasx", lasx_xvilvh_w, simd_ilvh_w, m256i, i32x8);
298+
impl_vvv!("lasx", lasx_xvilvh_d, simd_ilvh_d, m256i, i64x4);
299+
impl_vvv!("lasx", lasx_xvilvl_b, simd_ilvl_b, m256i, i8x32);
300+
impl_vvv!("lasx", lasx_xvilvl_h, simd_ilvl_h, m256i, i16x16);
301+
impl_vvv!("lasx", lasx_xvilvl_w, simd_ilvl_w, m256i, i32x8);
302+
impl_vvv!("lasx", lasx_xvilvl_d, simd_ilvl_d, m256i, i64x4);
233303

234304
impl_vuv!("lasx", lasx_xvslli_b, is::simd_shl, m256i, i8x32);
235305
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.vilvh.b"]
167-
fn __lsx_vilvh_b(a: __v16i8, b: __v16i8) -> __v16i8;
168-
#[link_name = "llvm.loongarch.lsx.vilvh.h"]
169-
fn __lsx_vilvh_h(a: __v8i16, b: __v8i16) -> __v8i16;
170-
#[link_name = "llvm.loongarch.lsx.vilvh.w"]
171-
fn __lsx_vilvh_w(a: __v4i32, b: __v4i32) -> __v4i32;
172-
#[link_name = "llvm.loongarch.lsx.vilvh.d"]
173-
fn __lsx_vilvh_d(a: __v2i64, b: __v2i64) -> __v2i64;
174-
#[link_name = "llvm.loongarch.lsx.vilvl.b"]
175-
fn __lsx_vilvl_b(a: __v16i8, b: __v16i8) -> __v16i8;
176-
#[link_name = "llvm.loongarch.lsx.vilvl.h"]
177-
fn __lsx_vilvl_h(a: __v8i16, b: __v8i16) -> __v8i16;
178-
#[link_name = "llvm.loongarch.lsx.vilvl.w"]
179-
fn __lsx_vilvl_w(a: __v4i32, b: __v4i32) -> __v4i32;
180-
#[link_name = "llvm.loongarch.lsx.vilvl.d"]
181-
fn __lsx_vilvl_d(a: __v2i64, b: __v2i64) -> __v2i64;
182166
#[link_name = "llvm.loongarch.lsx.vpackev.b"]
183167
fn __lsx_vpackev_b(a: __v16i8, b: __v16i8) -> __v16i8;
184168
#[link_name = "llvm.loongarch.lsx.vpackev.h"]
@@ -1577,62 +1561,6 @@ pub fn lsx_vreplvei_d<const IMM1: u32>(a: m128i) -> m128i {
15771561
unsafe { transmute(__lsx_vreplvei_d(transmute(a), IMM1)) }
15781562
}
15791563

1580-
#[inline]
1581-
#[target_feature(enable = "lsx")]
1582-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1583-
pub fn lsx_vilvh_b(a: m128i, b: m128i) -> m128i {
1584-
unsafe { transmute(__lsx_vilvh_b(transmute(a), transmute(b))) }
1585-
}
1586-
1587-
#[inline]
1588-
#[target_feature(enable = "lsx")]
1589-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1590-
pub fn lsx_vilvh_h(a: m128i, b: m128i) -> m128i {
1591-
unsafe { transmute(__lsx_vilvh_h(transmute(a), transmute(b))) }
1592-
}
1593-
1594-
#[inline]
1595-
#[target_feature(enable = "lsx")]
1596-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1597-
pub fn lsx_vilvh_w(a: m128i, b: m128i) -> m128i {
1598-
unsafe { transmute(__lsx_vilvh_w(transmute(a), transmute(b))) }
1599-
}
1600-
1601-
#[inline]
1602-
#[target_feature(enable = "lsx")]
1603-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1604-
pub fn lsx_vilvh_d(a: m128i, b: m128i) -> m128i {
1605-
unsafe { transmute(__lsx_vilvh_d(transmute(a), transmute(b))) }
1606-
}
1607-
1608-
#[inline]
1609-
#[target_feature(enable = "lsx")]
1610-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1611-
pub fn lsx_vilvl_b(a: m128i, b: m128i) -> m128i {
1612-
unsafe { transmute(__lsx_vilvl_b(transmute(a), transmute(b))) }
1613-
}
1614-
1615-
#[inline]
1616-
#[target_feature(enable = "lsx")]
1617-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1618-
pub fn lsx_vilvl_h(a: m128i, b: m128i) -> m128i {
1619-
unsafe { transmute(__lsx_vilvl_h(transmute(a), transmute(b))) }
1620-
}
1621-
1622-
#[inline]
1623-
#[target_feature(enable = "lsx")]
1624-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1625-
pub fn lsx_vilvl_w(a: m128i, b: m128i) -> m128i {
1626-
unsafe { transmute(__lsx_vilvl_w(transmute(a), transmute(b))) }
1627-
}
1628-
1629-
#[inline]
1630-
#[target_feature(enable = "lsx")]
1631-
#[unstable(feature = "stdarch_loongarch", issue = "117427")]
1632-
pub fn lsx_vilvl_d(a: m128i, b: m128i) -> m128i {
1633-
unsafe { transmute(__lsx_vilvl_d(transmute(a), transmute(b))) }
1634-
}
1635-
16361564
#[inline]
16371565
#[target_feature(enable = "lsx")]
16381566
#[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
@@ -53,6 +53,54 @@ const unsafe fn simd_pickod_d<T: Copy>(a: T, b: T) -> T {
5353
simd_shuffle!(b, a, [1, 3])
5454
}
5555

56+
#[inline(always)]
57+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
58+
pub(crate) const unsafe fn simd_ilvh_b<T: Copy>(a: T, b: T) -> T {
59+
simd_shuffle!(b, a, [8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31])
60+
}
61+
62+
#[inline(always)]
63+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
64+
pub(crate) const unsafe fn simd_ilvh_h<T: Copy>(a: T, b: T) -> T {
65+
simd_shuffle!(b, a, [4, 12, 5, 13, 6, 14, 7, 15])
66+
}
67+
68+
#[inline(always)]
69+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
70+
pub(crate) const unsafe fn simd_ilvh_w<T: Copy>(a: T, b: T) -> T {
71+
simd_shuffle!(b, a, [2, 6, 3, 7])
72+
}
73+
74+
#[inline(always)]
75+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
76+
pub(crate) const unsafe fn simd_ilvh_d<T: Copy>(a: T, b: T) -> T {
77+
simd_shuffle!(b, a, [1, 3])
78+
}
79+
80+
#[inline(always)]
81+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
82+
pub(crate) const unsafe fn simd_ilvl_b<T: Copy>(a: T, b: T) -> T {
83+
simd_shuffle!(b, a, [0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23])
84+
}
85+
86+
#[inline(always)]
87+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
88+
pub(crate) const unsafe fn simd_ilvl_h<T: Copy>(a: T, b: T) -> T {
89+
simd_shuffle!(b, a, [0, 8, 1, 9, 2, 10, 3, 11])
90+
}
91+
92+
#[inline(always)]
93+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
94+
pub(crate) const unsafe fn simd_ilvl_w<T: Copy>(a: T, b: T) -> T {
95+
simd_shuffle!(b, a, [0, 4, 1, 5])
96+
}
97+
98+
#[inline(always)]
99+
#[rustc_const_unstable(feature = "stdarch_const_helpers", issue = "none")]
100+
pub(crate) const unsafe fn simd_ilvl_d<T: Copy>(a: T, b: T) -> T {
101+
simd_shuffle!(b, a, [0, 2])
102+
}
103+
56104
impl_vv!("lsx", lsx_vpcnt_b, is::simd_ctpop, m128i, i8x16);
57105
impl_vv!("lsx", lsx_vpcnt_h, is::simd_ctpop, m128i, i16x8);
58106
impl_vv!("lsx", lsx_vpcnt_w, is::simd_ctpop, m128i, i32x4);
@@ -216,6 +264,14 @@ impl_vvv!("lsx", lsx_vpickod_b, simd_pickod_b, m128i, i8x16);
216264
impl_vvv!("lsx", lsx_vpickod_h, simd_pickod_h, m128i, i16x8);
217265
impl_vvv!("lsx", lsx_vpickod_w, simd_pickod_w, m128i, i32x4);
218266
impl_vvv!("lsx", lsx_vpickod_d, simd_pickod_d, m128i, i64x2);
267+
impl_vvv!("lsx", lsx_vilvh_b, simd_ilvh_b, m128i, i8x16);
268+
impl_vvv!("lsx", lsx_vilvh_h, simd_ilvh_h, m128i, i16x8);
269+
impl_vvv!("lsx", lsx_vilvh_w, simd_ilvh_w, m128i, i32x4);
270+
impl_vvv!("lsx", lsx_vilvh_d, simd_ilvh_d, m128i, i64x2);
271+
impl_vvv!("lsx", lsx_vilvl_b, simd_ilvl_b, m128i, i8x16);
272+
impl_vvv!("lsx", lsx_vilvl_h, simd_ilvl_h, m128i, i16x8);
273+
impl_vvv!("lsx", lsx_vilvl_w, simd_ilvl_w, m128i, i32x4);
274+
impl_vvv!("lsx", lsx_vilvl_d, simd_ilvl_d, m128i, i64x2);
219275

220276
impl_vuv!("lsx", lsx_vslli_b, is::simd_shl, m128i, i8x16);
221277
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
@@ -1468,41 +1468,49 @@ asm-fmts = xd, xj, xk
14681468
data-types = V4DI, V4DI, V4DI
14691469

14701470
/// lasx_xvilvh_b
1471+
impl = portable
14711472
name = lasx_xvilvh_b
14721473
asm-fmts = xd, xj, xk
14731474
data-types = V32QI, V32QI, V32QI
14741475

14751476
/// lasx_xvilvh_h
1477+
impl = portable
14761478
name = lasx_xvilvh_h
14771479
asm-fmts = xd, xj, xk
14781480
data-types = V16HI, V16HI, V16HI
14791481

14801482
/// lasx_xvilvh_w
1483+
impl = portable
14811484
name = lasx_xvilvh_w
14821485
asm-fmts = xd, xj, xk
14831486
data-types = V8SI, V8SI, V8SI
14841487

14851488
/// lasx_xvilvh_d
1489+
impl = portable
14861490
name = lasx_xvilvh_d
14871491
asm-fmts = xd, xj, xk
14881492
data-types = V4DI, V4DI, V4DI
14891493

14901494
/// lasx_xvilvl_b
1495+
impl = portable
14911496
name = lasx_xvilvl_b
14921497
asm-fmts = xd, xj, xk
14931498
data-types = V32QI, V32QI, V32QI
14941499

14951500
/// lasx_xvilvl_h
1501+
impl = portable
14961502
name = lasx_xvilvl_h
14971503
asm-fmts = xd, xj, xk
14981504
data-types = V16HI, V16HI, V16HI
14991505

15001506
/// lasx_xvilvl_w
1507+
impl = portable
15011508
name = lasx_xvilvl_w
15021509
asm-fmts = xd, xj, xk
15031510
data-types = V8SI, V8SI, V8SI
15041511

15051512
/// lasx_xvilvl_d
1513+
impl = portable
15061514
name = lasx_xvilvl_d
15071515
asm-fmts = xd, xj, xk
15081516
data-types = V4DI, V4DI, V4DI

0 commit comments

Comments
 (0)