Skip to content

Commit 005b5e1

Browse files
JamesbarfordAmanieu
authored andcommitted
Generator supports creating neon instructions from YAML
1 parent 5b8049f commit 005b5e1

File tree

14 files changed

+77149
-60096
lines changed

14 files changed

+77149
-60096
lines changed

Diff for: Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ members = [
88
"crates/std_detect",
99
"crates/stdarch-gen-arm",
1010
"crates/stdarch-gen-loongarch",
11-
"crates/stdarch-gen",
1211
"crates/stdarch-gen2",
1312
"crates/intrinsic-test",
1413
"examples/"

Diff for: crates/core_arch/src/aarch64/neon/generated.rs

+15,891-22,221
Large diffs are not rendered by default.

Diff for: crates/core_arch/src/arm_shared/neon/generated.rs

+40,729-37,779
Large diffs are not rendered by default.

Diff for: crates/core_arch/src/arm_shared/neon/mod.rs

+218
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,142 @@ use crate::{core_arch::simd::*, hint::unreachable_unchecked, intrinsics::simd::*
1111
#[cfg(test)]
1212
use stdarch_test::assert_instr;
1313

14+
#[cfg_attr(
15+
not(target_arch = "arm"),
16+
stable(feature = "neon_intrinsics", since = "1.59.0")
17+
)]
18+
#[cfg_attr(
19+
target_arch = "arm",
20+
unstable(feature = "stdarch_arm_neon_intrinsics", issue = "111800")
21+
)]
22+
pub trait AsUnsigned {
23+
#[cfg_attr(
24+
not(target_arch = "arm"),
25+
stable(feature = "neon_intrinsics", since = "1.59.0")
26+
)]
27+
#[cfg_attr(
28+
target_arch = "arm",
29+
unstable(feature = "stdarch_arm_neon_intrinsics", issue = "111800")
30+
)]
31+
type Unsigned: ?Sized;
32+
33+
#[cfg_attr(
34+
not(target_arch = "arm"),
35+
stable(feature = "neon_intrinsics", since = "1.59.0")
36+
)]
37+
#[cfg_attr(
38+
target_arch = "arm",
39+
unstable(feature = "stdarch_arm_neon_intrinsics", issue = "111800")
40+
)]
41+
unsafe fn as_unsigned(self) -> Self::Unsigned;
42+
}
43+
44+
#[cfg_attr(
45+
not(target_arch = "arm"),
46+
stable(feature = "neon_intrinsics", since = "1.59.0")
47+
)]
48+
#[cfg_attr(
49+
target_arch = "arm",
50+
unstable(feature = "stdarch_arm_neon_intrinsics", issue = "111800")
51+
)]
52+
pub trait AsSigned {
53+
#[cfg_attr(
54+
not(target_arch = "arm"),
55+
stable(feature = "neon_intrinsics", since = "1.59.0")
56+
)]
57+
#[cfg_attr(
58+
target_arch = "arm",
59+
unstable(feature = "stdarch_arm_neon_intrinsics", issue = "111800")
60+
)]
61+
type Signed: ?Sized;
62+
63+
#[cfg_attr(
64+
not(target_arch = "arm"),
65+
stable(feature = "neon_intrinsics", since = "1.59.0")
66+
)]
67+
#[cfg_attr(
68+
target_arch = "arm",
69+
unstable(feature = "stdarch_arm_neon_intrinsics", issue = "111800")
70+
)]
71+
unsafe fn as_signed(self) -> Self::Signed;
72+
}
73+
74+
macro_rules! impl_sign_conversions {
75+
($(($signed:ty, $unsigned:ty))*) => ($(
76+
#[cfg_attr(
77+
not(target_arch = "arm"),
78+
stable(feature = "neon_intrinsics", since = "1.59.0")
79+
)]
80+
#[cfg_attr(
81+
target_arch = "arm",
82+
unstable(feature = "stdarch_arm_neon_intrinsics", issue = "111800")
83+
)]
84+
impl AsUnsigned for $signed {
85+
type Unsigned = $unsigned;
86+
87+
#[inline]
88+
unsafe fn as_unsigned(self) -> $unsigned {
89+
crate::mem::transmute(self)
90+
}
91+
}
92+
93+
#[cfg_attr(
94+
not(target_arch = "arm"),
95+
stable(feature = "neon_intrinsics", since = "1.59.0")
96+
)]
97+
#[cfg_attr(
98+
target_arch = "arm",
99+
unstable(feature = "stdarch_arm_neon_intrinsics", issue = "111800")
100+
)]
101+
impl AsSigned for $unsigned {
102+
type Signed = $signed;
103+
104+
#[inline]
105+
unsafe fn as_signed(self) -> $signed {
106+
crate::mem::transmute(self)
107+
}
108+
}
109+
)*)
110+
}
111+
112+
macro_rules! impl_sign_conversions_neon {
113+
($(($signed:ty, $unsigned:ty))*) => ($(
114+
#[cfg_attr(
115+
not(target_arch = "arm"),
116+
stable(feature = "neon_intrinsics", since = "1.59.0")
117+
)]
118+
#[cfg_attr(
119+
target_arch = "arm",
120+
unstable(feature = "stdarch_arm_neon_intrinsics", issue = "111800")
121+
)]
122+
impl AsUnsigned for $signed {
123+
type Unsigned = $unsigned;
124+
125+
#[inline]
126+
unsafe fn as_unsigned(self) -> $unsigned {
127+
crate::mem::transmute(self)
128+
}
129+
}
130+
131+
#[cfg_attr(
132+
not(target_arch = "arm"),
133+
stable(feature = "neon_intrinsics", since = "1.59.0")
134+
)]
135+
#[cfg_attr(
136+
target_arch = "arm",
137+
unstable(feature = "stdarch_arm_neon_intrinsics", issue = "111800")
138+
)]
139+
impl AsSigned for $unsigned {
140+
type Signed = $signed;
141+
142+
#[inline]
143+
unsafe fn as_signed(self) -> $signed {
144+
crate::mem::transmute(self)
145+
}
146+
}
147+
)*)
148+
}
149+
14150
pub(crate) type p8 = u8;
15151
pub(crate) type p16 = u16;
16152
pub(crate) type p64 = u64;
@@ -1033,6 +1169,88 @@ pub struct poly64x2x4_t(
10331169
pub poly64x2_t,
10341170
);
10351171

1172+
impl_sign_conversions! {
1173+
(i8, u8)
1174+
(i16, u16)
1175+
(i32, u32)
1176+
(i64, u64)
1177+
(*const i8, *const u8)
1178+
(*const i16, *const u16)
1179+
(*const i32, *const u32)
1180+
(*const i64, *const u64)
1181+
(*mut i8, *mut u8)
1182+
(*mut i16, *mut u16)
1183+
(*mut i32, *mut u32)
1184+
(*mut i64, *mut u64)
1185+
(int16x4_t, uint16x4_t)
1186+
(int16x8_t, uint16x8_t)
1187+
(int32x2_t, uint32x2_t)
1188+
(int32x4_t, uint32x4_t)
1189+
(int64x1_t, uint64x1_t)
1190+
(int64x2_t, uint64x2_t)
1191+
(int8x16_t, uint8x16_t)
1192+
(int8x8_t, uint8x8_t)
1193+
(uint16x4_t, int16x4_t)
1194+
(uint16x8_t, int16x8_t)
1195+
(uint32x2_t, int32x2_t)
1196+
(uint32x4_t, int32x4_t)
1197+
(uint64x1_t, int64x1_t)
1198+
(uint64x2_t, int64x2_t)
1199+
(uint8x16_t, int8x16_t)
1200+
(uint8x8_t, int8x8_t)
1201+
}
1202+
1203+
impl_sign_conversions_neon! {
1204+
(int16x4x2_t, uint16x4x2_t)
1205+
(int16x4x3_t, uint16x4x3_t)
1206+
(int16x4x4_t, uint16x4x4_t)
1207+
(int16x8x2_t, uint16x8x2_t)
1208+
(int16x8x3_t, uint16x8x3_t)
1209+
(int16x8x4_t, uint16x8x4_t)
1210+
(int32x2x2_t, uint32x2x2_t)
1211+
(int32x2x3_t, uint32x2x3_t)
1212+
(int32x2x4_t, uint32x2x4_t)
1213+
(int32x4x2_t, uint32x4x2_t)
1214+
(int32x4x3_t, uint32x4x3_t)
1215+
(int32x4x4_t, uint32x4x4_t)
1216+
(int64x1x2_t, uint64x1x2_t)
1217+
(int64x1x3_t, uint64x1x3_t)
1218+
(int64x1x4_t, uint64x1x4_t)
1219+
(int64x2x2_t, uint64x2x2_t)
1220+
(int64x2x3_t, uint64x2x3_t)
1221+
(int64x2x4_t, uint64x2x4_t)
1222+
(int8x16x2_t, uint8x16x2_t)
1223+
(int8x16x3_t, uint8x16x3_t)
1224+
(int8x16x4_t, uint8x16x4_t)
1225+
(int8x8x2_t, uint8x8x2_t)
1226+
(int8x8x3_t, uint8x8x3_t)
1227+
(int8x8x4_t, uint8x8x4_t)
1228+
(uint16x4x2_t, int16x4x2_t)
1229+
(uint16x4x3_t, int16x4x3_t)
1230+
(uint16x4x4_t, int16x4x4_t)
1231+
(uint16x8x2_t, int16x8x2_t)
1232+
(uint16x8x3_t, int16x8x3_t)
1233+
(uint16x8x4_t, int16x8x4_t)
1234+
(uint32x2x2_t, int32x2x2_t)
1235+
(uint32x2x3_t, int32x2x3_t)
1236+
(uint32x2x4_t, int32x2x4_t)
1237+
(uint32x4x2_t, int32x4x2_t)
1238+
(uint32x4x3_t, int32x4x3_t)
1239+
(uint32x4x4_t, int32x4x4_t)
1240+
(uint64x1x2_t, int64x1x2_t)
1241+
(uint64x1x3_t, int64x1x3_t)
1242+
(uint64x1x4_t, int64x1x4_t)
1243+
(uint64x2x2_t, int64x2x2_t)
1244+
(uint64x2x3_t, int64x2x3_t)
1245+
(uint64x2x4_t, int64x2x4_t)
1246+
(uint8x16x2_t, int8x16x2_t)
1247+
(uint8x16x3_t, int8x16x3_t)
1248+
(uint8x16x4_t, int8x16x4_t)
1249+
(uint8x8x2_t, int8x8x2_t)
1250+
(uint8x8x3_t, int8x8x3_t)
1251+
(uint8x8x4_t, int8x8x4_t)
1252+
}
1253+
10361254
#[allow(improper_ctypes)]
10371255
extern "unadjusted" {
10381256
// absolute value (64-bit)

0 commit comments

Comments
 (0)