Skip to content

Commit cf10e91

Browse files
folkertdevAmanieu
authored andcommitted
implement VectorAdd for s390x
1 parent 6aa8f49 commit cf10e91

File tree

5 files changed

+518
-9
lines changed

5 files changed

+518
-9
lines changed

Diff for: ci/run.sh

-4
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,6 @@ case ${TARGET} in
124124
export RUSTFLAGS="${RUSTFLAGS} -C target-feature=+msa"
125125
cargo_test "${PROFILE}"
126126
;;
127-
s390x*)
128-
export RUSTFLAGS="${RUSTFLAGS} -C target-feature=+vector"
129-
cargo_test "${PROFILE}"
130-
;;
131127
powerpc64*)
132128
# We don't build the ppc 32-bit targets with these - these targets
133129
# are mostly unsupported for now.

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ pub mod arch {
284284
/// See the [module documentation](../index.html) for more details.
285285
#[cfg(any(target_arch = "s390x", doc))]
286286
#[doc(cfg(target_arch = "s390x"))]
287-
#[unstable(feature = "stdarch_s390x", issue = "1")]
287+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
288288
pub mod s390x {
289289
pub use crate::core_arch::s390x::*;
290290
}

Diff for: crates/core_arch/src/s390x/macros.rs

+354
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,354 @@
1+
#![allow(unused_macros)] // FIXME remove when more tests are added
2+
#![allow(unused_imports)] // FIXME remove when more tests are added
3+
4+
macro_rules! test_impl {
5+
($fun:ident ($($v:ident : $ty:ty),*) -> $r:ty [$call:ident, $instr:ident]) => {
6+
#[inline]
7+
#[target_feature(enable = "vector")]
8+
#[cfg_attr(test, assert_instr($instr))]
9+
pub unsafe fn $fun ($($v : $ty),*) -> $r {
10+
$call ($($v),*)
11+
}
12+
};
13+
}
14+
15+
#[allow(unknown_lints, unused_macro_rules)]
16+
macro_rules! impl_vec_trait {
17+
([$Trait:ident $m:ident] $fun:ident ($a:ty)) => {
18+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
19+
impl $Trait for $a {
20+
#[inline]
21+
#[target_feature(enable = "vector")]
22+
unsafe fn $m(self) -> Self {
23+
$fun(transmute(self))
24+
}
25+
}
26+
};
27+
([$Trait:ident $m:ident] $fun:ident ($a:ty) -> $r:ty) => {
28+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
29+
impl $Trait for $a {
30+
type Result = $r;
31+
#[inline]
32+
#[target_feature(enable = "vector")]
33+
unsafe fn $m(self) -> Self::Result {
34+
$fun(transmute(self))
35+
}
36+
}
37+
};
38+
([$Trait:ident $m:ident]+ $fun:ident ($a:ty) -> $r:ty) => {
39+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
40+
impl $Trait for $a {
41+
type Result = $r;
42+
#[inline]
43+
#[target_feature(enable = "vector")]
44+
unsafe fn $m(self) -> Self::Result {
45+
transmute($fun(transmute(self)))
46+
}
47+
}
48+
};
49+
([$Trait:ident $m:ident] 1 ($ub:ident, $sb:ident, $uh:ident, $sh:ident, $uw:ident, $sw:ident, $sf: ident)) => {
50+
impl_vec_trait!{ [$Trait $m] $ub (vector_unsigned_char) -> vector_unsigned_char }
51+
impl_vec_trait!{ [$Trait $m] $sb (vector_signed_char) -> vector_signed_char }
52+
impl_vec_trait!{ [$Trait $m] $uh (vector_unsigned_short) -> vector_unsigned_short }
53+
impl_vec_trait!{ [$Trait $m] $sh (vector_signed_short) -> vector_signed_short }
54+
impl_vec_trait!{ [$Trait $m] $uw (vector_unsigned_int) -> vector_unsigned_int }
55+
impl_vec_trait!{ [$Trait $m] $sw (vector_signed_int) -> vector_signed_int }
56+
impl_vec_trait!{ [$Trait $m] $uw (vector_unsigned_long_long) -> vector_unsigned_long_long }
57+
impl_vec_trait!{ [$Trait $m] $sw (vector_signed_long_long) -> vector_signed_long_long }
58+
impl_vec_trait!{ [$Trait $m] $sf (vector_float) -> vector_float }
59+
impl_vec_trait!{ [$Trait $m] $sf (vector_double) -> vector_double }
60+
};
61+
([$Trait:ident $m:ident] $fun:ident ($a:ty, $b:ty) -> $r:ty) => {
62+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
63+
impl $Trait<$b> for $a {
64+
type Result = $r;
65+
#[inline]
66+
#[target_feature(enable = "vector")]
67+
unsafe fn $m(self, b: $b) -> Self::Result {
68+
$fun(transmute(self), transmute(b))
69+
}
70+
}
71+
};
72+
([$Trait:ident $m:ident]+ $fun:ident ($a:ty, $b:ty) -> $r:ty) => {
73+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
74+
impl $Trait<$b> for $a {
75+
type Result = $r;
76+
#[inline]
77+
#[target_feature(enable = "vector")]
78+
unsafe fn $m(self, b: $b) -> Self::Result {
79+
transmute($fun(transmute(self), transmute(b)))
80+
}
81+
}
82+
};
83+
([$Trait:ident $m:ident] $fun:ident ($a:ty, ~$b:ty) -> $r:ty) => {
84+
impl_vec_trait!{ [$Trait $m] $fun ($a, $a) -> $r }
85+
impl_vec_trait!{ [$Trait $m] $fun ($a, $b) -> $r }
86+
impl_vec_trait!{ [$Trait $m] $fun ($b, $a) -> $r }
87+
};
88+
([$Trait:ident $m:ident] ~($ub:ident, $sb:ident, $uh:ident, $sh:ident, $uw:ident, $sw:ident)) => {
89+
impl_vec_trait!{ [$Trait $m] $ub (vector_unsigned_char, ~vector_bool_char) -> vector_unsigned_char }
90+
impl_vec_trait!{ [$Trait $m] $sb (vector_signed_char, ~vector_bool_char) -> vector_signed_char }
91+
impl_vec_trait!{ [$Trait $m] $uh (vector_unsigned_short, ~vector_bool_short) -> vector_unsigned_short }
92+
impl_vec_trait!{ [$Trait $m] $sh (vector_signed_short, ~vector_bool_short) -> vector_signed_short }
93+
impl_vec_trait!{ [$Trait $m] $uw (vector_unsigned_int, ~vector_bool_int) -> vector_unsigned_int }
94+
impl_vec_trait!{ [$Trait $m] $sw (vector_signed_int, ~vector_bool_int) -> vector_signed_int }
95+
};
96+
([$Trait:ident $m:ident] ~($fn:ident)) => {
97+
impl_vec_trait!{ [$Trait $m] ~($fn, $fn, $fn, $fn, $fn, $fn) }
98+
};
99+
([$Trait:ident $m:ident] 2 ($ub:ident, $sb:ident, $uh:ident, $sh:ident, $uw:ident, $sw:ident)) => {
100+
impl_vec_trait!{ [$Trait $m] $ub (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_char }
101+
impl_vec_trait!{ [$Trait $m] $sb (vector_signed_char, vector_signed_char) -> vector_signed_char }
102+
impl_vec_trait!{ [$Trait $m] $uh (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_short }
103+
impl_vec_trait!{ [$Trait $m] $sh (vector_signed_short, vector_signed_short) -> vector_signed_short }
104+
impl_vec_trait!{ [$Trait $m] $uw (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_int }
105+
impl_vec_trait!{ [$Trait $m] $sw (vector_signed_int, vector_signed_int) -> vector_signed_int }
106+
};
107+
([$Trait:ident $m:ident] 2 ($fn:ident)) => {
108+
impl_vec_trait!{ [$Trait $m] ($fn, $fn, $fn, $fn, $fn, $fn) }
109+
};
110+
([$Trait:ident $m:ident]+ 2b ($b:ident, $h:ident, $w:ident)) => {
111+
impl_vec_trait!{ [$Trait $m]+ $b (vector_bool_char, vector_bool_char) -> vector_bool_char }
112+
impl_vec_trait!{ [$Trait $m]+ $b (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_char }
113+
impl_vec_trait!{ [$Trait $m]+ $b (vector_signed_char, vector_signed_char) -> vector_signed_char }
114+
impl_vec_trait!{ [$Trait $m]+ $h (vector_bool_short, vector_bool_short) -> vector_bool_short }
115+
impl_vec_trait!{ [$Trait $m]+ $h (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_short }
116+
impl_vec_trait!{ [$Trait $m]+ $h (vector_signed_short, vector_signed_short) -> vector_signed_short }
117+
impl_vec_trait!{ [$Trait $m]+ $w (vector_bool_int, vector_bool_int) -> vector_bool_int }
118+
impl_vec_trait!{ [$Trait $m]+ $w (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_int }
119+
impl_vec_trait!{ [$Trait $m]+ $w (vector_signed_int, vector_signed_int) -> vector_signed_int }
120+
};
121+
([$Trait:ident $m:ident]+ 2b ($fn:ident)) => {
122+
impl_vec_trait!{ [$Trait $m]+ 2b ($fn, $fn, $fn) }
123+
};
124+
}
125+
126+
macro_rules! s_t_l {
127+
(i64x2) => {
128+
vector_signed_long_long
129+
};
130+
(i32x4) => {
131+
vector_signed_int
132+
};
133+
(i16x8) => {
134+
vector_signed_short
135+
};
136+
(i8x16) => {
137+
vector_signed_char
138+
};
139+
140+
(u64x2) => {
141+
vector_unsigned_long_long
142+
};
143+
(u32x4) => {
144+
vector_unsigned_int
145+
};
146+
(u16x8) => {
147+
vector_unsigned_short
148+
};
149+
(u8x16) => {
150+
vector_unsigned_char
151+
};
152+
153+
(f32x4) => {
154+
vector_float
155+
};
156+
(f64x2) => {
157+
vector_double
158+
};
159+
}
160+
161+
macro_rules! t_t_l {
162+
(i64) => {
163+
vector_signed_long_long
164+
};
165+
(i32) => {
166+
vector_signed_int
167+
};
168+
(i16) => {
169+
vector_signed_short
170+
};
171+
(i8) => {
172+
vector_signed_char
173+
};
174+
175+
(u64) => {
176+
vector_unsigned_long_long
177+
};
178+
(u32) => {
179+
vector_unsigned_int
180+
};
181+
(u16) => {
182+
vector_unsigned_short
183+
};
184+
(u8) => {
185+
vector_unsigned_char
186+
};
187+
188+
(f32) => {
189+
vector_float
190+
};
191+
(f64) => {
192+
vector_double
193+
};
194+
}
195+
196+
macro_rules! t_t_s {
197+
(i64) => {
198+
i64x2
199+
};
200+
(i32) => {
201+
i32x4
202+
};
203+
(i16) => {
204+
i16x8
205+
};
206+
(i8) => {
207+
i8x16
208+
};
209+
210+
(u64) => {
211+
u64x2
212+
};
213+
(u32) => {
214+
u32x4
215+
};
216+
(u16) => {
217+
u16x8
218+
};
219+
(u8) => {
220+
u8x16
221+
};
222+
223+
(f32) => {
224+
f32x4
225+
};
226+
(f64) => {
227+
f64x2
228+
};
229+
}
230+
231+
macro_rules! t_u {
232+
(vector_bool_char) => {
233+
vector_unsigned_char
234+
};
235+
(vector_bool_short) => {
236+
vector_unsigned_short
237+
};
238+
(vector_bool_int) => {
239+
vector_unsigned_int
240+
};
241+
(vector_unsigned_char) => {
242+
vector_unsigned_char
243+
};
244+
(vector_unsigned_short) => {
245+
vector_unsigned_short
246+
};
247+
(vector_unsigned_int) => {
248+
vector_unsigned_int
249+
};
250+
(vector_unsigned_long_long) => {
251+
vector_unsigned_long_long
252+
};
253+
(vector_signed_char) => {
254+
vector_unsigned_char
255+
};
256+
(vector_signed_short) => {
257+
vector_unsigned_short
258+
};
259+
(vector_signed_int) => {
260+
vector_unsigned_int
261+
};
262+
(vector_signed_long_long) => {
263+
vector_signed_long_long
264+
};
265+
(vector_float) => {
266+
vector_unsigned_int
267+
};
268+
(vector_double) => {
269+
vector_unsigned_long_long
270+
};
271+
}
272+
273+
macro_rules! t_b {
274+
(vector_bool_char) => {
275+
vector_bool_char
276+
};
277+
(vector_bool_short) => {
278+
vector_bool_short
279+
};
280+
(vector_bool_int) => {
281+
vector_bool_int
282+
};
283+
(vector_signed_char) => {
284+
vector_bool_char
285+
};
286+
(vector_signed_short) => {
287+
vector_bool_short
288+
};
289+
(vector_signed_int) => {
290+
vector_bool_int
291+
};
292+
(vector_signed_long_long) => {
293+
vector_bool_long_long
294+
};
295+
(vector_unsigned_char) => {
296+
vector_bool_char
297+
};
298+
(vector_unsigned_short) => {
299+
vector_bool_short
300+
};
301+
(vector_unsigned_int) => {
302+
vector_bool_int
303+
};
304+
(vector_unsigned_long_long) => {
305+
vector_bool_long_long
306+
};
307+
(vector_float) => {
308+
vector_bool_int
309+
};
310+
(vector_double) => {
311+
vector_bool_long_long
312+
};
313+
}
314+
315+
macro_rules! impl_from {
316+
($s: ident) => {
317+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
318+
impl From<$s> for s_t_l!($s) {
319+
fn from (v: $s) -> Self {
320+
unsafe {
321+
transmute(v)
322+
}
323+
}
324+
}
325+
};
326+
($($s: ident),*) => {
327+
$(
328+
impl_from! { $s }
329+
)*
330+
};
331+
}
332+
333+
macro_rules! impl_neg {
334+
($s: ident : $zero: expr) => {
335+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
336+
impl crate::ops::Neg for s_t_l!($s) {
337+
type Output = s_t_l!($s);
338+
fn neg(self) -> Self::Output {
339+
let zero = $s::splat($zero);
340+
unsafe { transmute(simd_sub(zero, transmute(self))) }
341+
}
342+
}
343+
};
344+
}
345+
346+
pub(crate) use impl_from;
347+
pub(crate) use impl_neg;
348+
pub(crate) use impl_vec_trait;
349+
pub(crate) use s_t_l;
350+
pub(crate) use t_b;
351+
pub(crate) use t_t_l;
352+
pub(crate) use t_t_s;
353+
pub(crate) use t_u;
354+
pub(crate) use test_impl;

Diff for: crates/core_arch/src/s390x/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
//! `SystemZ` intrinsics
1+
//! `s390x` intrinsics
2+
3+
pub(crate) mod macros;
24

35
mod vector;
46
#[unstable(feature = "stdarch_s390x", issue = "130869")]

0 commit comments

Comments
 (0)