Skip to content

Commit beeaa88

Browse files
committed
sysutils/dua-cli: make this build on aarch64eb.
This is done by avoiding attempts at using neon / SIMD in big-endian mode by patching some of the vendored crates. Neon / SIMD is known to be problematical in rust, ref. rust-lang/stdarch#1484, even though the CPU itself supports it. I've also tried reporting the memchr fixes upstream, ref. BurntSushi/memchr#162 So far not yet adopted. Zerocopy has also received a pull request: google/zerocopy#1795
1 parent 219c38d commit beeaa88

6 files changed

Lines changed: 266 additions & 1 deletion

sysutils/dua-cli/distinfo

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
$NetBSD: distinfo,v 1.37 2024/08/10 15:24:44 pin Exp $
1+
$NetBSD: distinfo,v 1.38 2024/10/02 17:49:02 he Exp $
22

33
BLAKE2s (addr2line-0.22.0.crate) = 834589b7006b3b8d1e40e66abf813d18a5e9d6fac9433c24b0b18920c435a58e
44
SHA512 (addr2line-0.22.0.crate) = b334f51bd369348b4446805b4f624ec9b4cc8eefcc53ceb57b523ff55bf018d1dfe23259daf48d1878170ad4fcb44181d4738456eb5e35ede6932ff29686268e
@@ -525,3 +525,8 @@ Size (zerocopy-0.7.35.crate) = 152645 bytes
525525
BLAKE2s (zerocopy-derive-0.7.35.crate) = b80899d1b7a843a5225638171775a0c9643052c9e96f7b88a825150d0725505e
526526
SHA512 (zerocopy-derive-0.7.35.crate) = dbe23573b62a6267d7bc8c744320b75b2fbda03b908c1d175211f7394374fe182bce58021e25485c10671d726b2007f250565dfe53134d51c89293bb607e9feb
527527
Size (zerocopy-derive-0.7.35.crate) = 37829 bytes
528+
SHA1 (patch-.._vendor_memchr-2.7.4_src_arch_aarch64_mod.rs) = ca83fcd3a2c7aff1828d18a5ca4df1e3ae3557fb
529+
SHA1 (patch-.._vendor_memchr-2.7.4_src_memchr.rs) = b964579dd7ea479e2f4be41843b5b8161dbc2eae
530+
SHA1 (patch-.._vendor_memchr-2.7.4_src_memmem_searcher.rs) = 2317e98578bf30ead561a1af1974db454e88a11c
531+
SHA1 (patch-.._vendor_memchr-2.7.4_src_vector.rs) = 8acec8d16fad3cf64fc66c97cc7717549069ee0e
532+
SHA1 (patch-.._vendor_zerocopy-0.7.35_src_lib.rs) = 908bf1ca2244c4ca1af6d7c75cbad250fac5ea9c
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
$NetBSD: patch-.._vendor_memchr-2.7.4_src_arch_aarch64_mod.rs,v 1.1 2024/10/02 17:49:02 he Exp $
2+
3+
Make this build on big-endian aarch64.
4+
5+
--- ../vendor/memchr-2.7.4/src/arch/aarch64/mod.rs.orig 2024-10-01 22:42:20.721140485 +0000
6+
+++ ../vendor/memchr-2.7.4/src/arch/aarch64/mod.rs
7+
@@ -2,6 +2,8 @@
8+
Vector algorithms for the `aarch64` target.
9+
*/
10+
11+
+#[cfg(target_endian = "little")]
12+
pub mod neon;
13+
14+
+#[cfg(target_endian = "little")]
15+
pub(crate) mod memchr;
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
$NetBSD: patch-.._vendor_memchr-2.7.4_src_memchr.rs,v 1.1 2024/10/02 17:49:02 he Exp $
2+
3+
Make this build on big-endian aarch64.
4+
5+
--- ../vendor/memchr-2.7.4/src/memchr.rs.orig 2024-10-01 22:37:24.143489357 +0000
6+
+++ ../vendor/memchr-2.7.4/src/memchr.rs
7+
@@ -518,14 +518,14 @@ unsafe fn memchr_raw(
8+
{
9+
crate::arch::wasm32::memchr::memchr_raw(needle, start, end)
10+
}
11+
- #[cfg(target_arch = "aarch64")]
12+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
13+
{
14+
crate::arch::aarch64::memchr::memchr_raw(needle, start, end)
15+
}
16+
#[cfg(not(any(
17+
target_arch = "x86_64",
18+
all(target_arch = "wasm32", target_feature = "simd128"),
19+
- target_arch = "aarch64"
20+
+ all(target_arch = "aarch64", target_endian = "little")
21+
)))]
22+
{
23+
crate::arch::all::memchr::One::new(needle).find_raw(start, end)
24+
@@ -551,14 +551,14 @@ unsafe fn memrchr_raw(
25+
{
26+
crate::arch::wasm32::memchr::memrchr_raw(needle, start, end)
27+
}
28+
- #[cfg(target_arch = "aarch64")]
29+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
30+
{
31+
crate::arch::aarch64::memchr::memrchr_raw(needle, start, end)
32+
}
33+
#[cfg(not(any(
34+
target_arch = "x86_64",
35+
all(target_arch = "wasm32", target_feature = "simd128"),
36+
- target_arch = "aarch64"
37+
+ all(target_arch = "aarch64", target_endian = "little")
38+
)))]
39+
{
40+
crate::arch::all::memchr::One::new(needle).rfind_raw(start, end)
41+
@@ -585,14 +585,14 @@ unsafe fn memchr2_raw(
42+
{
43+
crate::arch::wasm32::memchr::memchr2_raw(needle1, needle2, start, end)
44+
}
45+
- #[cfg(target_arch = "aarch64")]
46+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
47+
{
48+
crate::arch::aarch64::memchr::memchr2_raw(needle1, needle2, start, end)
49+
}
50+
#[cfg(not(any(
51+
target_arch = "x86_64",
52+
all(target_arch = "wasm32", target_feature = "simd128"),
53+
- target_arch = "aarch64"
54+
+ all(target_arch = "aarch64", target_endian = "little")
55+
)))]
56+
{
57+
crate::arch::all::memchr::Two::new(needle1, needle2)
58+
@@ -620,7 +620,7 @@ unsafe fn memrchr2_raw(
59+
{
60+
crate::arch::wasm32::memchr::memrchr2_raw(needle1, needle2, start, end)
61+
}
62+
- #[cfg(target_arch = "aarch64")]
63+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
64+
{
65+
crate::arch::aarch64::memchr::memrchr2_raw(
66+
needle1, needle2, start, end,
67+
@@ -629,7 +629,7 @@ unsafe fn memrchr2_raw(
68+
#[cfg(not(any(
69+
target_arch = "x86_64",
70+
all(target_arch = "wasm32", target_feature = "simd128"),
71+
- target_arch = "aarch64"
72+
+ all(target_arch = "aarch64", target_endian = "little")
73+
)))]
74+
{
75+
crate::arch::all::memchr::Two::new(needle1, needle2)
76+
@@ -662,7 +662,7 @@ unsafe fn memchr3_raw(
77+
needle1, needle2, needle3, start, end,
78+
)
79+
}
80+
- #[cfg(target_arch = "aarch64")]
81+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
82+
{
83+
crate::arch::aarch64::memchr::memchr3_raw(
84+
needle1, needle2, needle3, start, end,
85+
@@ -671,7 +671,7 @@ unsafe fn memchr3_raw(
86+
#[cfg(not(any(
87+
target_arch = "x86_64",
88+
all(target_arch = "wasm32", target_feature = "simd128"),
89+
- target_arch = "aarch64"
90+
+ all(target_arch = "aarch64", target_endian = "little")
91+
)))]
92+
{
93+
crate::arch::all::memchr::Three::new(needle1, needle2, needle3)
94+
@@ -704,7 +704,7 @@ unsafe fn memrchr3_raw(
95+
needle1, needle2, needle3, start, end,
96+
)
97+
}
98+
- #[cfg(target_arch = "aarch64")]
99+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
100+
{
101+
crate::arch::aarch64::memchr::memrchr3_raw(
102+
needle1, needle2, needle3, start, end,
103+
@@ -713,7 +713,7 @@ unsafe fn memrchr3_raw(
104+
#[cfg(not(any(
105+
target_arch = "x86_64",
106+
all(target_arch = "wasm32", target_feature = "simd128"),
107+
- target_arch = "aarch64"
108+
+ all(target_arch = "aarch64", target_endian = "little")
109+
)))]
110+
{
111+
crate::arch::all::memchr::Three::new(needle1, needle2, needle3)
112+
@@ -736,14 +736,14 @@ unsafe fn count_raw(needle: u8, start: *
113+
{
114+
crate::arch::wasm32::memchr::count_raw(needle, start, end)
115+
}
116+
- #[cfg(target_arch = "aarch64")]
117+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
118+
{
119+
crate::arch::aarch64::memchr::count_raw(needle, start, end)
120+
}
121+
#[cfg(not(any(
122+
target_arch = "x86_64",
123+
all(target_arch = "wasm32", target_feature = "simd128"),
124+
- target_arch = "aarch64"
125+
+ all(target_arch = "aarch64", target_endian = "little")
126+
)))]
127+
{
128+
crate::arch::all::memchr::One::new(needle).count_raw(start, end)
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
$NetBSD: patch-.._vendor_memchr-2.7.4_src_memmem_searcher.rs,v 1.1 2024/10/02 17:49:02 he Exp $
2+
3+
Make this build on big-endian aarch64.
4+
5+
--- ../vendor/memchr-2.7.4/src/memmem/searcher.rs.orig 2024-10-01 22:46:23.364125524 +0000
6+
+++ ../vendor/memchr-2.7.4/src/memmem/searcher.rs
7+
@@ -3,7 +3,7 @@ use crate::arch::all::{
8+
rabinkarp, twoway,
9+
};
10+
11+
-#[cfg(target_arch = "aarch64")]
12+
+#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
13+
use crate::arch::aarch64::neon::packedpair as neon;
14+
#[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
15+
use crate::arch::wasm32::simd128::packedpair as simd128;
16+
@@ -129,7 +129,7 @@ impl Searcher {
17+
Searcher::twoway(needle, rabinkarp, prestrat)
18+
}
19+
}
20+
- #[cfg(target_arch = "aarch64")]
21+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
22+
{
23+
if let Some(pp) = neon::Finder::with_pair(needle, pair) {
24+
if do_packed_search(needle) {
25+
@@ -152,7 +152,7 @@ impl Searcher {
26+
#[cfg(not(any(
27+
all(target_arch = "x86_64", target_feature = "sse2"),
28+
all(target_arch = "wasm32", target_feature = "simd128"),
29+
- target_arch = "aarch64"
30+
+ all(target_arch = "aarch64", target_endian = "little")
31+
)))]
32+
{
33+
if prefilter.is_none() {
34+
@@ -253,7 +253,7 @@ union SearcherKind {
35+
avx2: crate::arch::x86_64::avx2::packedpair::Finder,
36+
#[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
37+
simd128: crate::arch::wasm32::simd128::packedpair::Finder,
38+
- #[cfg(target_arch = "aarch64")]
39+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
40+
neon: crate::arch::aarch64::neon::packedpair::Finder,
41+
}
42+
43+
@@ -421,7 +421,7 @@ unsafe fn searcher_kind_simd128(
44+
/// # Safety
45+
///
46+
/// Callers must ensure that the `searcher.kind.neon` union field is set.
47+
-#[cfg(target_arch = "aarch64")]
48+
+#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
49+
unsafe fn searcher_kind_neon(
50+
searcher: &Searcher,
51+
_prestate: &mut PrefilterState,
52+
@@ -686,7 +686,7 @@ impl Prefilter {
53+
}
54+
55+
/// Return a prefilter using a aarch64 neon vector algorithm.
56+
- #[cfg(target_arch = "aarch64")]
57+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
58+
#[inline]
59+
fn neon(finder: neon::Finder, needle: &[u8]) -> Prefilter {
60+
trace!("building aarch64 neon prefilter");
61+
@@ -763,7 +763,7 @@ union PrefilterKind {
62+
avx2: crate::arch::x86_64::avx2::packedpair::Finder,
63+
#[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
64+
simd128: crate::arch::wasm32::simd128::packedpair::Finder,
65+
- #[cfg(target_arch = "aarch64")]
66+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
67+
neon: crate::arch::aarch64::neon::packedpair::Finder,
68+
}
69+
70+
@@ -852,7 +852,7 @@ unsafe fn prefilter_kind_simd128(
71+
/// # Safety
72+
///
73+
/// Callers must ensure that the `strat.kind.neon` union field is set.
74+
-#[cfg(target_arch = "aarch64")]
75+
+#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
76+
unsafe fn prefilter_kind_neon(
77+
strat: &Prefilter,
78+
haystack: &[u8],
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
$NetBSD: patch-.._vendor_memchr-2.7.4_src_vector.rs,v 1.1 2024/10/02 17:49:02 he Exp $
2+
3+
Make this build on big-endian aarch64.
4+
5+
--- ../vendor/memchr-2.7.4/src/vector.rs.orig 2024-10-01 22:43:45.510956667 +0000
6+
+++ ../vendor/memchr-2.7.4/src/vector.rs
7+
@@ -289,7 +289,7 @@ mod x86avx2 {
8+
}
9+
}
10+
11+
-#[cfg(target_arch = "aarch64")]
12+
+#[cfg(all(target_arch = "aarch64", target_endian = "little"))]
13+
mod aarch64neon {
14+
use core::arch::aarch64::*;
15+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
$NetBSD: patch-.._vendor_zerocopy-0.7.35_src_lib.rs,v 1.1 2024/10/02 17:49:02 he Exp $
2+
3+
Make this build on big-endian aarch64.
4+
5+
--- ../vendor/zerocopy-0.7.35/src/lib.rs.orig 2024-10-01 22:31:58.027833427 +0000
6+
+++ ../vendor/zerocopy-0.7.35/src/lib.rs
7+
@@ -3736,7 +3736,7 @@ mod simd {
8+
powerpc64, powerpc64, vector_bool_long, vector_double, vector_signed_long, vector_unsigned_long
9+
);
10+
simd_arch_mod!(
11+
- #[cfg(target_arch = "aarch64")]
12+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
13+
aarch64, aarch64, float32x2_t, float32x4_t, float64x1_t, float64x2_t, int8x8_t, int8x8x2_t,
14+
int8x8x3_t, int8x8x4_t, int8x16_t, int8x16x2_t, int8x16x3_t, int8x16x4_t, int16x4_t,
15+
int16x8_t, int32x2_t, int32x4_t, int64x1_t, int64x2_t, poly8x8_t, poly8x8x2_t, poly8x8x3_t,
16+
@@ -8026,7 +8026,7 @@ mod tests {
17+
vector_signed_long,
18+
vector_unsigned_long
19+
);
20+
- #[cfg(target_arch = "aarch64")]
21+
+ #[cfg(all(target_arch = "aarch64", target_endian = "little"))]
22+
#[rustfmt::skip]
23+
test_simd_arch_mod!(
24+
aarch64, float32x2_t, float32x4_t, float64x1_t, float64x2_t, int8x8_t, int8x8x2_t,

0 commit comments

Comments
 (0)