Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
91850e9
Avoid `unsafe fn` in aarch64, powerpc and s390x tests
eduardosm Jan 28, 2026
e164dca
Don't expect specific instructions for _mm256_set_pd/_mm_set_ps
nikic Jan 29, 2026
293b61e
Ignore non-yml files in generator
nikic Jan 29, 2026
f5d594a
Change lanes vcopy_lane tests to avoid zip2
nikic Jan 29, 2026
b500dd3
Adjust expected output for vrfin
nikic Jan 29, 2026
20da410
Merge pull request #2007 from nikic/ci-test
folkertdev Jan 29, 2026
9eaf7fa
Merge pull request #2006 from eduardosm/unsafe-tests
folkertdev Jan 29, 2026
9ea3034
powerpc: implement `vnmsubfp` using `intrinsics::simd`
folkertdev Jan 31, 2026
ebc618a
wasm: use `intrinsics::simd` for the narrow functions
folkertdev Jan 31, 2026
5b8b7f5
Merge pull request #2011 from folkertdev/wasm-narrow-llvm-22
Amanieu Jan 31, 2026
c1196d4
Merge pull request #2010 from folkertdev/powerpc-vnmsub-llvm-22
Amanieu Jan 31, 2026
e40ae4f
x86: use `intrinsics::simd` for `hadds`/`hsubs`
folkertdev Jan 31, 2026
4a1094c
Merge pull request #2012 from folkertdev/llvm-22-hadds-hsubs
sayantn Feb 1, 2026
24a2833
test the `vld1*` functions
folkertdev Jan 30, 2026
a208e6c
maybe fix aarch64be unsigned vector tuple loads
folkertdev Jan 30, 2026
0306275
use macro for wide store/load roundtrip tests
folkertdev Feb 1, 2026
794810f
use more capable macro for wide store/load roundtrip tests
folkertdev Feb 1, 2026
141a867
Revert "Use LLVM intrinsics for `madd` intrinsics"
folkertdev Feb 1, 2026
f5540ad
add test for multiply by one pattern
folkertdev Feb 1, 2026
0ec83f4
Merge pull request #2014 from folkertdev/llvm-22-madd
sayantn Feb 2, 2026
821f139
Revert "Revert "Use LLVM intrinsics for `madd` intrinsics""
folkertdev Feb 2, 2026
f4ce247
Merge pull request #2009 from folkertdev/aarch64-vld1-tests
folkertdev Feb 2, 2026
54641ef
add `vpmaddwd` tests back in
folkertdev Feb 2, 2026
8c404a7
Prepare for merging from rust-lang/rust
invalid-email-address Feb 5, 2026
32b93d1
Merge ref 'db3e99bbab28' from rust-lang/rust
invalid-email-address Feb 5, 2026
b4e2a84
Merge pull request #2021 from rust-lang/rustc-pull
folkertdev Feb 5, 2026
cfcf20f
Merge pull request #2018 from rust-lang/revert-2014-llvm-22-madd
folkertdev Feb 5, 2026
edeb02f
disable s390x vector intrinsics if softfloat is enabled
fneddy Feb 5, 2026
3cf999f
Merge pull request #2022 from fneddy/s390x_softfloat_abi
folkertdev Feb 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 39 additions & 39 deletions library/stdarch/crates/core_arch/src/aarch64/neon/generated.rs

Large diffs are not rendered by default.

420 changes: 291 additions & 129 deletions library/stdarch/crates/core_arch/src/aarch64/neon/mod.rs

Large diffs are not rendered by default.

1,352 changes: 100 additions & 1,252 deletions library/stdarch/crates/core_arch/src/arm_shared/neon/generated.rs

Large diffs are not rendered by default.

540 changes: 300 additions & 240 deletions library/stdarch/crates/core_arch/src/powerpc/altivec.rs

Large diffs are not rendered by default.

36 changes: 27 additions & 9 deletions library/stdarch/crates/core_arch/src/powerpc/vsx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#![allow(non_camel_case_types)]

use crate::core_arch::powerpc::*;
use crate::core_arch::simd::*;

#[cfg(test)]
use stdarch_test::assert_instr;
Expand All @@ -34,6 +35,22 @@ types! {
// pub struct vector_unsigned___int128 = i128x1;
}

#[unstable(feature = "stdarch_powerpc", issue = "111145")]
impl From<m64x2> for vector_bool_long {
#[inline]
fn from(value: m64x2) -> Self {
unsafe { transmute(value) }
}
}

#[unstable(feature = "stdarch_powerpc", issue = "111145")]
impl From<vector_bool_long> for m64x2 {
#[inline]
fn from(value: vector_bool_long) -> Self {
unsafe { transmute(value) }
}
}

#[allow(improper_ctypes)]
unsafe extern "C" {
#[link_name = "llvm.ppc.altivec.vperm"]
Expand All @@ -46,7 +63,6 @@ unsafe extern "C" {

mod sealed {
use super::*;
use crate::core_arch::simd::*;

#[unstable(feature = "stdarch_powerpc", issue = "111145")]
pub trait VectorPermDI {
Expand Down Expand Up @@ -221,14 +237,16 @@ mod tests {
macro_rules! test_vec_xxpermdi {
{$name:ident, $shorttype:ident, $longtype:ident, [$($a:expr),+], [$($b:expr),+], [$($c:expr),+], [$($d:expr),+]} => {
#[simd_test(enable = "vsx")]
unsafe fn $name() {
let a: $longtype = transmute($shorttype::new($($a),+, $($b),+));
let b = transmute($shorttype::new($($c),+, $($d),+));

assert_eq!($shorttype::new($($a),+, $($c),+), transmute(vec_xxpermdi::<_, 0>(a, b)));
assert_eq!($shorttype::new($($b),+, $($c),+), transmute(vec_xxpermdi::<_, 1>(a, b)));
assert_eq!($shorttype::new($($a),+, $($d),+), transmute(vec_xxpermdi::<_, 2>(a, b)));
assert_eq!($shorttype::new($($b),+, $($d),+), transmute(vec_xxpermdi::<_, 3>(a, b)));
fn $name() {
let a = $longtype::from($shorttype::new($($a),+, $($b),+));
let b = $longtype::from($shorttype::new($($c),+, $($d),+));

unsafe {
assert_eq!($shorttype::new($($a),+, $($c),+), $shorttype::from(vec_xxpermdi::<_, 0>(a, b)));
assert_eq!($shorttype::new($($b),+, $($c),+), $shorttype::from(vec_xxpermdi::<_, 1>(a, b)));
assert_eq!($shorttype::new($($a),+, $($d),+), $shorttype::from(vec_xxpermdi::<_, 2>(a, b)));
assert_eq!($shorttype::new($($b),+, $($d),+), $shorttype::from(vec_xxpermdi::<_, 3>(a, b)));
}
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions library/stdarch/crates/core_arch/src/s390x/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
pub(crate) mod macros;

/// the float and vector registers overlap therefore we cannot use any vector
/// extensions if softfloat is enabled.
#[cfg(not(target_abi = "softfloat"))]
mod vector;
#[cfg(not(target_abi = "softfloat"))]
#[unstable(feature = "stdarch_s390x", issue = "130869")]
pub use self::vector::*;
135 changes: 80 additions & 55 deletions library/stdarch/crates/core_arch/src/s390x/vector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,54 @@ types! {
pub struct vector_double(2 x f64);
}

#[unstable(feature = "stdarch_s390x", issue = "135681")]
impl From<m8x16> for vector_bool_char {
#[inline]
fn from(value: m8x16) -> Self {
unsafe { transmute(value) }
}
}

#[unstable(feature = "stdarch_s390x", issue = "135681")]
impl From<vector_bool_char> for m8x16 {
#[inline]
fn from(value: vector_bool_char) -> Self {
unsafe { transmute(value) }
}
}

#[unstable(feature = "stdarch_s390x", issue = "135681")]
impl From<m16x8> for vector_bool_short {
#[inline]
fn from(value: m16x8) -> Self {
unsafe { transmute(value) }
}
}

#[unstable(feature = "stdarch_s390x", issue = "135681")]
impl From<vector_bool_short> for m16x8 {
#[inline]
fn from(value: vector_bool_short) -> Self {
unsafe { transmute(value) }
}
}

#[unstable(feature = "stdarch_s390x", issue = "135681")]
impl From<m32x4> for vector_bool_int {
#[inline]
fn from(value: m32x4) -> Self {
unsafe { transmute(value) }
}
}

#[unstable(feature = "stdarch_s390x", issue = "135681")]
impl From<vector_bool_int> for m32x4 {
#[inline]
fn from(value: vector_bool_int) -> Self {
unsafe { transmute(value) }
}
}

#[repr(C, packed)]
struct PackedTuple<T, U> {
x: T,
Expand Down Expand Up @@ -6051,27 +6099,16 @@ mod tests {
}

macro_rules! test_vec_1 {
{ $name: ident, $fn:ident, f32x4, [$($a:expr),+], ~[$($d:expr),+] } => {
#[simd_test(enable = "vector")]
unsafe fn $name() {
let a: vector_float = transmute(f32x4::new($($a),+));

let d: vector_float = transmute(f32x4::new($($d),+));
let r = transmute(vec_cmple(vec_abs(vec_sub($fn(a), d)), vec_splats(f32::EPSILON)));
let e = m32x4::new(true, true, true, true);
assert_eq!(e, r);
}
};
{ $name: ident, $fn:ident, $ty: ident, [$($a:expr),+], [$($d:expr),+] } => {
test_vec_1! { $name, $fn, $ty -> $ty, [$($a),+], [$($d),+] }
};
{ $name: ident, $fn:ident, $ty: ident -> $ty_out: ident, [$($a:expr),+], [$($d:expr),+] } => {
#[simd_test(enable = "vector")]
unsafe fn $name() {
let a: s_t_l!($ty) = transmute($ty::new($($a),+));
fn $name() {
let a: s_t_l!($ty) = $ty::new($($a),+).into();

let d = $ty_out::new($($d),+);
let r : $ty_out = transmute($fn(a));
let r = $ty_out::from(unsafe { $fn(a) });
assert_eq!(d, r);
}
}
Expand All @@ -6086,35 +6123,23 @@ mod tests {
};
{ $name: ident, $fn:ident, $ty1: ident, $ty2: ident -> $ty_out: ident, [$($a:expr),+], [$($b:expr),+], [$($d:expr),+] } => {
#[simd_test(enable = "vector")]
unsafe fn $name() {
let a: s_t_l!($ty1) = transmute($ty1::new($($a),+));
let b: s_t_l!($ty2) = transmute($ty2::new($($b),+));
fn $name() {
let a: s_t_l!($ty1) = $ty1::new($($a),+).into();
let b: s_t_l!($ty2) = $ty2::new($($b),+).into();

let d = $ty_out::new($($d),+);
let r : $ty_out = transmute($fn(a, b));
let r = $ty_out::from(unsafe { $fn(a, b) });
assert_eq!(d, r);
}
};
{ $name: ident, $fn:ident, $ty: ident -> $ty_out: ident, [$($a:expr),+], [$($b:expr),+], $d:expr } => {
#[simd_test(enable = "vector")]
unsafe fn $name() {
let a: s_t_l!($ty) = transmute($ty::new($($a),+));
let b: s_t_l!($ty) = transmute($ty::new($($b),+));

let r : $ty_out = transmute($fn(a, b));
assert_eq!($d, r);
}
}
}

#[simd_test(enable = "vector")]
unsafe fn vec_add_i32x4_i32x4() {
let x = i32x4::new(1, 2, 3, 4);
let y = i32x4::new(4, 3, 2, 1);
let x: vector_signed_int = transmute(x);
let y: vector_signed_int = transmute(y);
let z = vec_add(x, y);
assert_eq!(i32x4::splat(5), transmute(z));
fn vec_add_i32x4_i32x4() {
let x = vector_signed_int::from(i32x4::new(1, 2, 3, 4));
let y = vector_signed_int::from(i32x4::new(4, 3, 2, 1));
let z = unsafe { vec_add(x, y) };
assert_eq!(i32x4::splat(5), i32x4::from(z));
}

macro_rules! test_vec_sub {
Expand Down Expand Up @@ -6232,11 +6257,11 @@ mod tests {
macro_rules! test_vec_abs {
{ $name: ident, $ty: ident, $a: expr, $d: expr } => {
#[simd_test(enable = "vector")]
unsafe fn $name() {
let a: s_t_l!($ty) = vec_splats($a);
let a: s_t_l!($ty) = vec_abs(a);
fn $name() {
let a: s_t_l!($ty) = unsafe { vec_splats($a) };
let a: s_t_l!($ty) = unsafe { vec_abs(a) };
let d = $ty::splat($d);
assert_eq!(d, transmute(a));
assert_eq!(d, $ty::from(a));
}
}
}
Expand Down Expand Up @@ -6386,7 +6411,7 @@ mod tests {
[0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 16],
[4, 2, 1, 8] }

test_vec_2! { test_vec_sral_pos, vec_sral, u32x4, u8x16 -> i32x4,
test_vec_2! { test_vec_sral_pos, vec_sral, u32x4, u8x16 -> u32x4,
[0b1000, 0b1000, 0b1000, 0b1000],
[0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 16],
[4, 2, 1, 8] }
Expand Down Expand Up @@ -6423,13 +6448,13 @@ mod tests {
$shorttype:ident, $longtype:ident,
[$($a:expr),+], [$($b:expr),+], [$($c:expr),+], [$($d:expr),+]} => {
#[simd_test(enable = "vector")]
unsafe fn $name() {
let a: $longtype = transmute($shorttype::new($($a),+));
let b: $longtype = transmute($shorttype::new($($b),+));
let c: vector_unsigned_char = transmute(u8x16::new($($c),+));
fn $name() {
let a = $longtype::from($shorttype::new($($a),+));
let b = $longtype::from($shorttype::new($($b),+));
let c = vector_unsigned_char::from(u8x16::new($($c),+));
let d = $shorttype::new($($d),+);

let r: $shorttype = transmute(vec_perm(a, b, c));
let r = $shorttype::from(unsafe { vec_perm(a, b, c) });
assert_eq!(d, r);
}
}
Expand Down Expand Up @@ -6512,46 +6537,46 @@ mod tests {
[core::f32::consts::PI, 1.0, 25.0, 2.0],
[core::f32::consts::PI.sqrt(), 1.0, 5.0, core::f32::consts::SQRT_2] }

test_vec_2! { test_vec_find_any_eq, vec_find_any_eq, i32x4, i32x4 -> u32x4,
test_vec_2! { test_vec_find_any_eq, vec_find_any_eq, i32x4, i32x4 -> i32x4,
[1, -2, 3, -4],
[-5, 3, -7, 8],
[0, 0, 0xFFFFFFFF, 0]
[0, 0, !0, 0]
}

test_vec_2! { test_vec_find_any_ne, vec_find_any_ne, i32x4, i32x4 -> u32x4,
test_vec_2! { test_vec_find_any_ne, vec_find_any_ne, i32x4, i32x4 -> i32x4,
[1, -2, 3, -4],
[-5, 3, -7, 8],
[0xFFFFFFFF, 0xFFFFFFFF, 0, 0xFFFFFFFF]
[!0, !0, 0, !0]
}

test_vec_2! { test_vec_find_any_eq_idx_1, vec_find_any_eq_idx, i32x4, i32x4 -> u32x4,
test_vec_2! { test_vec_find_any_eq_idx_1, vec_find_any_eq_idx, i32x4, i32x4 -> i32x4,
[1, 2, 3, 4],
[5, 3, 7, 8],
[0, 8, 0, 0]
}
test_vec_2! { test_vec_find_any_eq_idx_2, vec_find_any_eq_idx, i32x4, i32x4 -> u32x4,
test_vec_2! { test_vec_find_any_eq_idx_2, vec_find_any_eq_idx, i32x4, i32x4 -> i32x4,
[1, 2, 3, 4],
[5, 6, 7, 8],
[0, 16, 0, 0]
}

test_vec_2! { test_vec_find_any_ne_idx_1, vec_find_any_ne_idx, i32x4, i32x4 -> u32x4,
test_vec_2! { test_vec_find_any_ne_idx_1, vec_find_any_ne_idx, i32x4, i32x4 -> i32x4,
[1, 2, 3, 4],
[1, 5, 3, 4],
[0, 4, 0, 0]
}
test_vec_2! { test_vec_find_any_ne_idx_2, vec_find_any_ne_idx, i32x4, i32x4 -> u32x4,
test_vec_2! { test_vec_find_any_ne_idx_2, vec_find_any_ne_idx, i32x4, i32x4 -> i32x4,
[1, 2, 3, 4],
[1, 2, 3, 4],
[0, 16, 0, 0]
}

test_vec_2! { test_vec_find_any_eq_or_0_idx_1, vec_find_any_eq_or_0_idx, i32x4, i32x4 -> u32x4,
test_vec_2! { test_vec_find_any_eq_or_0_idx_1, vec_find_any_eq_or_0_idx, i32x4, i32x4 -> i32x4,
[1, 2, 0, 4],
[5, 6, 7, 8],
[0, 8, 0, 0]
}
test_vec_2! { test_vec_find_any_ne_or_0_idx_1, vec_find_any_ne_or_0_idx, i32x4, i32x4 -> u32x4,
test_vec_2! { test_vec_find_any_ne_or_0_idx_1, vec_find_any_ne_or_0_idx, i32x4, i32x4 -> i32x4,
[1, 2, 0, 4],
[1, 2, 3, 4],
[0, 8, 0, 0]
Expand Down
Loading
Loading