Skip to content

Commit 0ec13ab

Browse files
committed
s390x: implement vec_mule using core::intrinsics::simd
1 parent 12125d5 commit 0ec13ab

File tree

1 file changed

+47
-38
lines changed

1 file changed

+47
-38
lines changed

crates/core_arch/src/s390x/vector.rs

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -181,14 +181,6 @@ unsafe extern "unadjusted" {
181181

182182
#[link_name = "llvm.s390.vcksm"] fn vcksm(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_unsigned_int;
183183

184-
#[link_name = "llvm.s390.vmeb"] fn vmeb(a: vector_signed_char, b: vector_signed_char) -> vector_signed_short;
185-
#[link_name = "llvm.s390.vmeh"] fn vmeh(a: vector_signed_short, b: vector_signed_short) -> vector_signed_int;
186-
#[link_name = "llvm.s390.vmef"] fn vmef(a: vector_signed_int, b: vector_signed_int) -> vector_signed_long_long;
187-
188-
#[link_name = "llvm.s390.vmleb"] fn vmleb(a: vector_unsigned_char, b: vector_unsigned_char) -> vector_unsigned_short;
189-
#[link_name = "llvm.s390.vmleh"] fn vmleh(a: vector_unsigned_short, b: vector_unsigned_short) -> vector_unsigned_int;
190-
#[link_name = "llvm.s390.vmlef"] fn vmlef(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_unsigned_long_long;
191-
192184
#[link_name = "llvm.s390.vmob"] fn vmob(a: vector_signed_char, b: vector_signed_char) -> vector_signed_short;
193185
#[link_name = "llvm.s390.vmoh"] fn vmoh(a: vector_signed_short, b: vector_signed_short) -> vector_signed_int;
194186
#[link_name = "llvm.s390.vmof"] fn vmof(a: vector_signed_int, b: vector_signed_int) -> vector_signed_long_long;
@@ -372,6 +364,19 @@ impl<const N: usize> ShuffleMask<N> {
372364
ShuffleMask(mask)
373365
}
374366

367+
const fn even() -> Self {
368+
let mut mask = [0; N];
369+
let mut i = 0;
370+
let mut index = 0;
371+
while index < N {
372+
mask[index] = i as u32;
373+
374+
i += 2;
375+
index += 1;
376+
}
377+
ShuffleMask(mask)
378+
}
379+
375380
const fn pack() -> Self {
376381
let mut mask = [0; N];
377382
let mut i = 1;
@@ -2642,40 +2647,44 @@ mod sealed {
26422647
unsafe fn vec_mule(self, b: Self) -> Result;
26432648
}
26442649

2645-
// FIXME(llvm) sadly this does not yet work https://github.com/llvm/llvm-project/issues/129705
2646-
// #[target_feature(enable = "vector")]
2647-
// #[cfg_attr(test, assert_instr(vmleh))]
2648-
// unsafe fn vec_vmleh(a: vector_unsigned_short, b: vector_unsigned_short) -> vector_unsigned_int {
2649-
// let even_a: vector_unsigned_int = simd_as(simd_shuffle::<_, _, u16x4>(
2650-
// a,
2651-
// a,
2652-
// const { ShuffleMask([0, 2, 4, 6]) },
2653-
// ));
2654-
//
2655-
// let even_b: vector_unsigned_int = simd_as(simd_shuffle::<_, _, u16x4>(
2656-
// b,
2657-
// b,
2658-
// const { ShuffleMask([0, 2, 4, 6]) },
2659-
// ));
2660-
//
2661-
// simd_mul(even_a, even_b)
2662-
// }
2650+
macro_rules! impl_vec_mule {
2651+
($instr:ident $src:ident $shuffled:ident $dst:ident $width:literal) => {
2652+
#[inline]
2653+
#[target_feature(enable = "vector")]
2654+
#[cfg_attr(test, assert_instr($instr))]
2655+
unsafe fn $instr(a: $src, b: $src) -> $dst {
2656+
let even_a: $dst = simd_as(simd_shuffle::<_, _, $shuffled>(
2657+
a,
2658+
a,
2659+
const { ShuffleMask::<$width>::even() },
2660+
));
2661+
2662+
let even_b: $dst = simd_as(simd_shuffle::<_, _, $shuffled>(
2663+
b,
2664+
b,
2665+
const { ShuffleMask::<$width>::even() },
2666+
));
2667+
2668+
simd_mul(even_a, even_b)
2669+
}
2670+
};
2671+
}
26632672

2664-
test_impl! { vec_vmeb(a: vector_signed_char, b: vector_signed_char) -> vector_signed_short [ vmeb, vmeb ] }
2665-
test_impl! { vec_vmeh(a: vector_signed_short, b: vector_signed_short) -> vector_signed_int[ vmeh, vmeh ] }
2666-
test_impl! { vec_vmef(a: vector_signed_int, b: vector_signed_int) -> vector_signed_long_long [ vmef, vmef ] }
2673+
impl_vec_mule! { vmeb vector_signed_char i8x8 vector_signed_short 8 }
2674+
impl_vec_mule! { vmeh vector_signed_short i16x4 vector_signed_int 4 }
2675+
impl_vec_mule! { vmef vector_signed_int i32x2 vector_signed_long_long 2 }
26672676

2668-
test_impl! { vec_vmleb(a: vector_unsigned_char, b: vector_unsigned_char) -> vector_unsigned_short [ vmleb, vmleb ] }
2669-
test_impl! { vec_vmleh(a: vector_unsigned_short, b: vector_unsigned_short) -> vector_unsigned_int[ vmleh, vmleh ] }
2670-
test_impl! { vec_vmlef(a: vector_unsigned_int, b: vector_unsigned_int) -> vector_unsigned_long_long [ vmlef, vmlef ] }
2677+
impl_vec_mule! { vmleb vector_unsigned_char u8x8 vector_unsigned_short 8 }
2678+
impl_vec_mule! { vmleh vector_unsigned_short u16x4 vector_unsigned_int 4 }
2679+
impl_vec_mule! { vmlef vector_unsigned_int u32x2 vector_unsigned_long_long 2 }
26712680

2672-
impl_mul!([VectorMule vec_mule] vec_vmeb (vector_signed_char, vector_signed_char) -> vector_signed_short );
2673-
impl_mul!([VectorMule vec_mule] vec_vmeh (vector_signed_short, vector_signed_short) -> vector_signed_int);
2674-
impl_mul!([VectorMule vec_mule] vec_vmef (vector_signed_int, vector_signed_int) -> vector_signed_long_long );
2681+
impl_mul!([VectorMule vec_mule] vmeb (vector_signed_char, vector_signed_char) -> vector_signed_short );
2682+
impl_mul!([VectorMule vec_mule] vmeh (vector_signed_short, vector_signed_short) -> vector_signed_int);
2683+
impl_mul!([VectorMule vec_mule] vmef (vector_signed_int, vector_signed_int) -> vector_signed_long_long );
26752684

2676-
impl_mul!([VectorMule vec_mule] vec_vmleb (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_short );
2677-
impl_mul!([VectorMule vec_mule] vec_vmleh (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_int);
2678-
impl_mul!([VectorMule vec_mule] vec_vmlef (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_long_long );
2685+
impl_mul!([VectorMule vec_mule] vmleb (vector_unsigned_char, vector_unsigned_char) -> vector_unsigned_short );
2686+
impl_mul!([VectorMule vec_mule] vmleh (vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_int);
2687+
impl_mul!([VectorMule vec_mule] vmlef (vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_long_long );
26792688

26802689
#[unstable(feature = "stdarch_s390x", issue = "135681")]
26812690
pub trait VectorMulo<Result> {

0 commit comments

Comments
 (0)