From 45767c74d02a6ab07e0d1813ee56da09849c21ba Mon Sep 17 00:00:00 2001 From: Folkert de Vries Date: Tue, 4 Mar 2025 21:27:27 +0100 Subject: [PATCH] add `vec_scatter` --- .../crates/core_arch/src/s390x/vector.rs | 68 ++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/library/stdarch/crates/core_arch/src/s390x/vector.rs b/library/stdarch/crates/core_arch/src/s390x/vector.rs index f55c28428d59..098e018fa2e1 100644 --- a/library/stdarch/crates/core_arch/src/s390x/vector.rs +++ b/library/stdarch/crates/core_arch/src/s390x/vector.rs @@ -2606,7 +2606,7 @@ mod sealed { ) -> vector_unsigned_int { static_assert_uimm_bits!(D, 2); let offset: u32 = simd_extract(b, D); - let ptr = c.byte_offset(offset as isize); + let ptr = c.byte_add(offset as usize); let value = ptr.read(); simd_insert(a, D, value) } @@ -2621,7 +2621,7 @@ mod sealed { ) -> vector_unsigned_long_long { static_assert_uimm_bits!(D, 1); let offset: u64 = simd_extract(b, D); - let ptr = c.byte_offset(offset as isize); + let ptr = c.byte_add(offset as usize); let value = ptr.read(); simd_insert(a, D, value) } @@ -2668,6 +2668,70 @@ mod sealed { vgeg vector_double } + #[inline] + #[target_feature(enable = "vector")] + #[cfg_attr(test, assert_instr(vscef, D = 3))] + unsafe fn vscef(a: vector_unsigned_int, b: vector_unsigned_int, c: *mut u32) { + static_assert_uimm_bits!(D, 2); + let value = simd_extract(a, D); + let offset: u32 = simd_extract(b, D); + let ptr = c.byte_add(offset as usize); + ptr.write(value); + } + + #[inline] + #[target_feature(enable = "vector")] + #[cfg_attr(test, assert_instr(vsceg, D = 1))] + unsafe fn vsceg( + a: vector_unsigned_long_long, + b: vector_unsigned_long_long, + c: *mut u64, + ) { + static_assert_uimm_bits!(D, 1); + let value = simd_extract(a, D); + let offset: u64 = simd_extract(b, D); + let ptr = c.byte_add(offset as usize); + ptr.write(value); + } + + #[unstable(feature = "stdarch_s390x", issue = "135681")] + pub trait VectorScatterElement { + type Element; + type Offset; + unsafe fn vec_scatter_element(self, b: Self::Offset, c: *mut Self::Element); + } + + macro_rules! impl_vec_scatter_element { + ($($instr:ident $ty:ident)*) => { + $( + #[unstable(feature = "stdarch_s390x", issue = "135681")] + impl VectorScatterElement for $ty { + type Element = l_t_t!($ty); + type Offset = t_u!($ty); + + #[inline] + #[target_feature(enable = "vector")] + unsafe fn vec_scatter_element(self, b: Self::Offset, c: *mut Self::Element) { + $instr::(transmute(self), b, c.cast()) + } + } + )* + } + } + + impl_vec_scatter_element! { + vscef vector_signed_int + vscef vector_bool_int + vscef vector_unsigned_int + + vsceg vector_signed_long_long + vsceg vector_bool_long_long + vsceg vector_unsigned_long_long + + vscef vector_float + vsceg vector_double + } + #[unstable(feature = "stdarch_s390x", issue = "135681")] pub trait VectorSel: Sized { unsafe fn vec_sel(self, b: Self, c: Mask) -> Self;