Skip to content

Commit e355bf4

Browse files
folkertdevAmanieu
authored andcommitted
add vec_scatter
1 parent 83c6d2c commit e355bf4

File tree

1 file changed

+66
-2
lines changed

1 file changed

+66
-2
lines changed

crates/core_arch/src/s390x/vector.rs

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2606,7 +2606,7 @@ mod sealed {
26062606
) -> vector_unsigned_int {
26072607
static_assert_uimm_bits!(D, 2);
26082608
let offset: u32 = simd_extract(b, D);
2609-
let ptr = c.byte_offset(offset as isize);
2609+
let ptr = c.byte_add(offset as usize);
26102610
let value = ptr.read();
26112611
simd_insert(a, D, value)
26122612
}
@@ -2621,7 +2621,7 @@ mod sealed {
26212621
) -> vector_unsigned_long_long {
26222622
static_assert_uimm_bits!(D, 1);
26232623
let offset: u64 = simd_extract(b, D);
2624-
let ptr = c.byte_offset(offset as isize);
2624+
let ptr = c.byte_add(offset as usize);
26252625
let value = ptr.read();
26262626
simd_insert(a, D, value)
26272627
}
@@ -2668,6 +2668,70 @@ mod sealed {
26682668
vgeg vector_double
26692669
}
26702670

2671+
#[inline]
2672+
#[target_feature(enable = "vector")]
2673+
#[cfg_attr(test, assert_instr(vscef, D = 3))]
2674+
unsafe fn vscef<const D: u32>(a: vector_unsigned_int, b: vector_unsigned_int, c: *mut u32) {
2675+
static_assert_uimm_bits!(D, 2);
2676+
let value = simd_extract(a, D);
2677+
let offset: u32 = simd_extract(b, D);
2678+
let ptr = c.byte_add(offset as usize);
2679+
ptr.write(value);
2680+
}
2681+
2682+
#[inline]
2683+
#[target_feature(enable = "vector")]
2684+
#[cfg_attr(test, assert_instr(vsceg, D = 1))]
2685+
unsafe fn vsceg<const D: u32>(
2686+
a: vector_unsigned_long_long,
2687+
b: vector_unsigned_long_long,
2688+
c: *mut u64,
2689+
) {
2690+
static_assert_uimm_bits!(D, 1);
2691+
let value = simd_extract(a, D);
2692+
let offset: u64 = simd_extract(b, D);
2693+
let ptr = c.byte_add(offset as usize);
2694+
ptr.write(value);
2695+
}
2696+
2697+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
2698+
pub trait VectorScatterElement {
2699+
type Element;
2700+
type Offset;
2701+
unsafe fn vec_scatter_element<const D: u32>(self, b: Self::Offset, c: *mut Self::Element);
2702+
}
2703+
2704+
macro_rules! impl_vec_scatter_element {
2705+
($($instr:ident $ty:ident)*) => {
2706+
$(
2707+
#[unstable(feature = "stdarch_s390x", issue = "135681")]
2708+
impl VectorScatterElement for $ty {
2709+
type Element = l_t_t!($ty);
2710+
type Offset = t_u!($ty);
2711+
2712+
#[inline]
2713+
#[target_feature(enable = "vector")]
2714+
unsafe fn vec_scatter_element<const D: u32>(self, b: Self::Offset, c: *mut Self::Element) {
2715+
$instr::<D>(transmute(self), b, c.cast())
2716+
}
2717+
}
2718+
)*
2719+
}
2720+
}
2721+
2722+
impl_vec_scatter_element! {
2723+
vscef vector_signed_int
2724+
vscef vector_bool_int
2725+
vscef vector_unsigned_int
2726+
2727+
vsceg vector_signed_long_long
2728+
vsceg vector_bool_long_long
2729+
vsceg vector_unsigned_long_long
2730+
2731+
vscef vector_float
2732+
vsceg vector_double
2733+
}
2734+
26712735
#[unstable(feature = "stdarch_s390x", issue = "135681")]
26722736
pub trait VectorSel<Mask>: Sized {
26732737
unsafe fn vec_sel(self, b: Self, c: Mask) -> Self;

0 commit comments

Comments
 (0)