Rollup merge of #92425 - calebzulawski:simd-cast, r=workingjubilee
Improve SIMD casts * Allows `simd_cast` intrinsic to take `usize` and `isize` * Adds `simd_as` intrinsic, which is the same as `simd_cast` except for saturating float-to-int conversions (matching the behavior of `as`). cc `@workingjubilee`
This commit is contained in:
commit
7889f96103
8 changed files with 314 additions and 177 deletions
48
src/test/ui/simd/intrinsic/generic-as.rs
Normal file
48
src/test/ui/simd/intrinsic/generic-as.rs
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
// run-pass
|
||||
|
||||
#![feature(repr_simd, platform_intrinsics)]
|
||||
|
||||
extern "platform-intrinsic" {
|
||||
fn simd_as<T, U>(x: T) -> U;
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
#[repr(simd)]
|
||||
struct V<T>([T; 2]);
|
||||
|
||||
fn main() {
|
||||
unsafe {
|
||||
let u = V::<u32>([u32::MIN, u32::MAX]);
|
||||
let i: V<i16> = simd_as(u);
|
||||
assert_eq!(i.0[0], u.0[0] as i16);
|
||||
assert_eq!(i.0[1], u.0[1] as i16);
|
||||
}
|
||||
|
||||
unsafe {
|
||||
let f = V::<f32>([f32::MIN, f32::MAX]);
|
||||
let i: V<i16> = simd_as(f);
|
||||
assert_eq!(i.0[0], f.0[0] as i16);
|
||||
assert_eq!(i.0[1], f.0[1] as i16);
|
||||
}
|
||||
|
||||
unsafe {
|
||||
let f = V::<f32>([f32::MIN, f32::MAX]);
|
||||
let u: V<u8> = simd_as(f);
|
||||
assert_eq!(u.0[0], f.0[0] as u8);
|
||||
assert_eq!(u.0[1], f.0[1] as u8);
|
||||
}
|
||||
|
||||
unsafe {
|
||||
let f = V::<f64>([f64::MIN, f64::MAX]);
|
||||
let i: V<isize> = simd_as(f);
|
||||
assert_eq!(i.0[0], f.0[0] as isize);
|
||||
assert_eq!(i.0[1], f.0[1] as isize);
|
||||
}
|
||||
|
||||
unsafe {
|
||||
let f = V::<f64>([f64::MIN, f64::MAX]);
|
||||
let u: V<usize> = simd_as(f);
|
||||
assert_eq!(u.0[0], f.0[0] as usize);
|
||||
assert_eq!(u.0[1], f.0[1] as usize);
|
||||
}
|
||||
}
|
||||
21
src/test/ui/simd/intrinsic/generic-cast-pointer-width.rs
Normal file
21
src/test/ui/simd/intrinsic/generic-cast-pointer-width.rs
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
// run-pass
|
||||
#![feature(repr_simd, platform_intrinsics)]
|
||||
|
||||
extern "platform-intrinsic" {
|
||||
fn simd_cast<T, U>(x: T) -> U;
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
#[repr(simd)]
|
||||
struct V<T>([T; 4]);
|
||||
|
||||
fn main() {
|
||||
let u = V::<usize>([0, 1, 2, 3]);
|
||||
let uu32: V<u32> = unsafe { simd_cast(u) };
|
||||
let ui64: V<i64> = unsafe { simd_cast(u) };
|
||||
|
||||
for (u, (uu32, ui64)) in u.0.iter().zip(uu32.0.iter().zip(ui64.0.iter())) {
|
||||
assert_eq!(*u as u32, *uu32);
|
||||
assert_eq!(*u as i64, *ui64);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue