Skip to content

Commit 1843302

Browse files
folkertdevAmanieu
authored andcommitted
add vec_any_* and vec_all_*
1 parent 4a12559 commit 1843302

File tree

1 file changed

+219
-0
lines changed

1 file changed

+219
-0
lines changed

crates/core_arch/src/s390x/vector.rs

Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2889,6 +2889,65 @@ mod sealed {
28892889
}
28902890
}
28912891

2892+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
2893+
pub trait VectorCompare {
2894+
unsafe fn vec_all_lt(self, other: Self) -> i32;
2895+
unsafe fn vec_all_le(self, other: Self) -> i32;
2896+
unsafe fn vec_all_gt(self, other: Self) -> i32;
2897+
unsafe fn vec_all_ge(self, other: Self) -> i32;
2898+
}
2899+
2900+
// NOTE: this implementation is currently non-optimal, but it does work for floats even with
2901+
// only `vector` enabled.
2902+
//
2903+
// - https://github.com/llvm/llvm-project/issues/129434
2904+
// - https://github.com/llvm/llvm-project/issues/130424
2905+
macro_rules! impl_vec_compare {
2906+
($($ty:ident)*) => {
2907+
$(
2908+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
2909+
impl VectorCompare for $ty {
2910+
#[inline]
2911+
#[target_feature(enable = "vector")]
2912+
unsafe fn vec_all_lt(self, other: Self) -> i32 {
2913+
simd_reduce_all(simd_lt::<_, t_b!($ty)>(self, other)) as i32
2914+
}
2915+
#[inline]
2916+
#[target_feature(enable = "vector")]
2917+
unsafe fn vec_all_le(self, other: Self) -> i32 {
2918+
simd_reduce_all(simd_le::<_, t_b!($ty)>(self, other)) as i32
2919+
}
2920+
#[inline]
2921+
#[target_feature(enable = "vector")]
2922+
unsafe fn vec_all_gt(self, other: Self) -> i32 {
2923+
simd_reduce_all(simd_gt::<_, t_b!($ty)>(self, other)) as i32
2924+
}
2925+
#[inline]
2926+
#[target_feature(enable = "vector")]
2927+
unsafe fn vec_all_ge(self, other: Self) -> i32 {
2928+
simd_reduce_all(simd_ge::<_, t_b!($ty)>(self, other)) as i32
2929+
}
2930+
}
2931+
)*
2932+
}
2933+
}
2934+
2935+
impl_vec_compare! {
2936+
vector_signed_char
2937+
vector_unsigned_char
2938+
2939+
vector_signed_short
2940+
vector_unsigned_short
2941+
2942+
vector_signed_int
2943+
vector_unsigned_int
2944+
vector_float
2945+
2946+
vector_signed_long_long
2947+
vector_unsigned_long_long
2948+
vector_double
2949+
}
2950+
28922951
#[unstable(feature = "stdarch_s390x", issue = "135681")]
28932952
pub trait VectorTestMask {
28942953
type Mask;
@@ -5264,6 +5323,166 @@ pub unsafe fn vec_cmpne_or_0_idx_cc<T: sealed::VectorEqualityIdx>(
52645323
a.vec_cmpne_or_0_idx_cc(b, cc)
52655324
}
52665325

5326+
/// All Elements Equal
5327+
#[inline]
5328+
#[target_feature(enable = "vector")]
5329+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5330+
pub unsafe fn vec_all_eq<T: sealed::VectorEquality>(a: T, b: T) -> i32 {
5331+
simd_reduce_all(vec_cmpeq(a, b)) as i32 as i32
5332+
}
5333+
5334+
/// All Elements Not Equal
5335+
#[inline]
5336+
#[target_feature(enable = "vector")]
5337+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5338+
pub unsafe fn vec_all_ne<T: sealed::VectorEquality>(a: T, b: T) -> i32 {
5339+
simd_reduce_all(vec_cmpne(a, b)) as i32
5340+
}
5341+
5342+
/// Any Element Equal
5343+
#[inline]
5344+
#[target_feature(enable = "vector")]
5345+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5346+
pub unsafe fn vec_any_eq<T: sealed::VectorEquality>(a: T, b: T) -> i32 {
5347+
simd_reduce_any(vec_cmpeq(a, b)) as i32
5348+
}
5349+
5350+
/// Any Element Not Equal
5351+
#[inline]
5352+
#[target_feature(enable = "vector")]
5353+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5354+
pub unsafe fn vec_any_ne<T: sealed::VectorEquality>(a: T, b: T) -> i32 {
5355+
simd_reduce_any(vec_cmpne(a, b)) as i32
5356+
}
5357+
5358+
/// All Elements Less Than
5359+
#[inline]
5360+
#[target_feature(enable = "vector")]
5361+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5362+
pub unsafe fn vec_all_lt<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5363+
a.vec_all_lt(b)
5364+
}
5365+
5366+
/// All Elements Less Than or Equal
5367+
#[inline]
5368+
#[target_feature(enable = "vector")]
5369+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5370+
pub unsafe fn vec_all_le<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5371+
a.vec_all_le(b)
5372+
}
5373+
5374+
/// All Elements Greater Than
5375+
#[inline]
5376+
#[target_feature(enable = "vector")]
5377+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5378+
pub unsafe fn vec_all_gt<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5379+
a.vec_all_gt(b)
5380+
}
5381+
5382+
/// All Elements Greater Than or Equal
5383+
#[inline]
5384+
#[target_feature(enable = "vector")]
5385+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5386+
pub unsafe fn vec_all_ge<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5387+
a.vec_all_ge(b)
5388+
}
5389+
5390+
/// All Elements Not Less Than
5391+
#[inline]
5392+
#[target_feature(enable = "vector")]
5393+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5394+
pub unsafe fn vec_all_nlt<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5395+
vec_all_ge(a, b)
5396+
}
5397+
5398+
/// All Elements Not Less Than or Equal
5399+
#[inline]
5400+
#[target_feature(enable = "vector")]
5401+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5402+
pub unsafe fn vec_all_nle<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5403+
vec_all_gt(a, b)
5404+
}
5405+
5406+
/// All Elements Not Greater Than
5407+
#[inline]
5408+
#[target_feature(enable = "vector")]
5409+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5410+
pub unsafe fn vec_all_ngt<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5411+
vec_all_le(a, b)
5412+
}
5413+
5414+
/// All Elements Not Greater Than or Equal
5415+
#[inline]
5416+
#[target_feature(enable = "vector")]
5417+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5418+
pub unsafe fn vec_all_nge<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5419+
vec_all_lt(a, b)
5420+
}
5421+
5422+
/// Any Elements Less Than
5423+
#[inline]
5424+
#[target_feature(enable = "vector")]
5425+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5426+
pub unsafe fn vec_any_lt<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5427+
!vec_all_ge(a, b)
5428+
}
5429+
5430+
/// Any Elements Less Than or Equal
5431+
#[inline]
5432+
#[target_feature(enable = "vector")]
5433+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5434+
pub unsafe fn vec_any_le<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5435+
!vec_all_gt(a, b)
5436+
}
5437+
5438+
/// Any Elements Greater Than
5439+
#[inline]
5440+
#[target_feature(enable = "vector")]
5441+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5442+
pub unsafe fn vec_any_gt<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5443+
!vec_all_le(a, b)
5444+
}
5445+
5446+
/// Any Elements Greater Than or Equal
5447+
#[inline]
5448+
#[target_feature(enable = "vector")]
5449+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5450+
pub unsafe fn vec_any_ge<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5451+
!vec_all_lt(a, b)
5452+
}
5453+
5454+
/// Any Elements Not Less Than
5455+
#[inline]
5456+
#[target_feature(enable = "vector")]
5457+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5458+
pub unsafe fn vec_any_nlt<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5459+
vec_any_ge(a, b)
5460+
}
5461+
5462+
/// Any Elements Not Less Than or Equal
5463+
#[inline]
5464+
#[target_feature(enable = "vector")]
5465+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5466+
pub unsafe fn vec_any_nle<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5467+
vec_any_gt(a, b)
5468+
}
5469+
5470+
/// Any Elements Not Greater Than
5471+
#[inline]
5472+
#[target_feature(enable = "vector")]
5473+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5474+
pub unsafe fn vec_any_ngt<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5475+
vec_any_le(a, b)
5476+
}
5477+
5478+
/// Any Elements Not Greater Than or Equal
5479+
#[inline]
5480+
#[target_feature(enable = "vector")]
5481+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
5482+
pub unsafe fn vec_any_nge<T: sealed::VectorCompare>(a: T, b: T) -> i32 {
5483+
vec_any_lt(a, b)
5484+
}
5485+
52675486
#[cfg(test)]
52685487
mod tests {
52695488
use super::*;

0 commit comments

Comments
 (0)