arm_shared: avoid using transmute and unsafe fn in tests

This commit is contained in:
Eduardo Sánchez Muñoz 2026-01-01 22:48:34 +01:00
parent dab553268a
commit 68701ff93a
7 changed files with 1409 additions and 1093 deletions

View file

@ -40,7 +40,7 @@ case ${TARGET} in
export RUSTFLAGS="${RUSTFLAGS} -C llvm-args=-fast-isel=false" export RUSTFLAGS="${RUSTFLAGS} -C llvm-args=-fast-isel=false"
;; ;;
armv7-*eabihf | thumbv7-*eabihf) armv7-*eabihf | thumbv7-*eabihf)
export RUSTFLAGS="${RUSTFLAGS} -Ctarget-feature=+neon" export RUSTFLAGS="${RUSTFLAGS} -Ctarget-feature=+neon,+fp16"
;; ;;
amdgcn-*) amdgcn-*)
export RUSTFLAGS="${RUSTFLAGS} -Ctarget-cpu=gfx1200" export RUSTFLAGS="${RUSTFLAGS} -Ctarget-cpu=gfx1200"

View file

@ -13,194 +13,195 @@ use crate::core_arch::aarch64::*;
use crate::core_arch::simd::*; use crate::core_arch::simd::*;
use std::mem; use std::mem;
use stdarch_test::simd_test; use stdarch_test::simd_test;
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1_s8() { fn test_vld1_s8() {
let a: [i8; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8]; let a: [i8; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8];
let e = i8x8::new(1, 2, 3, 4, 5, 6, 7, 8); let e = i8x8::new(1, 2, 3, 4, 5, 6, 7, 8);
let r: i8x8 = transmute(vld1_s8(a[1..].as_ptr())); let r = unsafe { i8x8::from(vld1_s8(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1q_s8() { fn test_vld1q_s8() {
let a: [i8; 17] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; let a: [i8; 17] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
let e = i8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); let e = i8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
let r: i8x16 = transmute(vld1q_s8(a[1..].as_ptr())); let r = unsafe { i8x16::from(vld1q_s8(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1_s16() { fn test_vld1_s16() {
let a: [i16; 5] = [0, 1, 2, 3, 4]; let a: [i16; 5] = [0, 1, 2, 3, 4];
let e = i16x4::new(1, 2, 3, 4); let e = i16x4::new(1, 2, 3, 4);
let r: i16x4 = transmute(vld1_s16(a[1..].as_ptr())); let r = unsafe { i16x4::from(vld1_s16(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1q_s16() { fn test_vld1q_s16() {
let a: [i16; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8]; let a: [i16; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8];
let e = i16x8::new(1, 2, 3, 4, 5, 6, 7, 8); let e = i16x8::new(1, 2, 3, 4, 5, 6, 7, 8);
let r: i16x8 = transmute(vld1q_s16(a[1..].as_ptr())); let r = unsafe { i16x8::from(vld1q_s16(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1_s32() { fn test_vld1_s32() {
let a: [i32; 3] = [0, 1, 2]; let a: [i32; 3] = [0, 1, 2];
let e = i32x2::new(1, 2); let e = i32x2::new(1, 2);
let r: i32x2 = transmute(vld1_s32(a[1..].as_ptr())); let r = unsafe { i32x2::from(vld1_s32(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1q_s32() { fn test_vld1q_s32() {
let a: [i32; 5] = [0, 1, 2, 3, 4]; let a: [i32; 5] = [0, 1, 2, 3, 4];
let e = i32x4::new(1, 2, 3, 4); let e = i32x4::new(1, 2, 3, 4);
let r: i32x4 = transmute(vld1q_s32(a[1..].as_ptr())); let r = unsafe { i32x4::from(vld1q_s32(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1_s64() { fn test_vld1_s64() {
let a: [i64; 2] = [0, 1]; let a: [i64; 2] = [0, 1];
let e = i64x1::new(1); let e = i64x1::new(1);
let r: i64x1 = transmute(vld1_s64(a[1..].as_ptr())); let r = unsafe { i64x1::from(vld1_s64(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1q_s64() { fn test_vld1q_s64() {
let a: [i64; 3] = [0, 1, 2]; let a: [i64; 3] = [0, 1, 2];
let e = i64x2::new(1, 2); let e = i64x2::new(1, 2);
let r: i64x2 = transmute(vld1q_s64(a[1..].as_ptr())); let r = unsafe { i64x2::from(vld1q_s64(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1_u8() { fn test_vld1_u8() {
let a: [u8; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8]; let a: [u8; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8];
let e = u8x8::new(1, 2, 3, 4, 5, 6, 7, 8); let e = u8x8::new(1, 2, 3, 4, 5, 6, 7, 8);
let r: u8x8 = transmute(vld1_u8(a[1..].as_ptr())); let r = unsafe { u8x8::from(vld1_u8(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1q_u8() { fn test_vld1q_u8() {
let a: [u8; 17] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; let a: [u8; 17] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
let e = u8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); let e = u8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
let r: u8x16 = transmute(vld1q_u8(a[1..].as_ptr())); let r = unsafe { u8x16::from(vld1q_u8(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1_u16() { fn test_vld1_u16() {
let a: [u16; 5] = [0, 1, 2, 3, 4]; let a: [u16; 5] = [0, 1, 2, 3, 4];
let e = u16x4::new(1, 2, 3, 4); let e = u16x4::new(1, 2, 3, 4);
let r: u16x4 = transmute(vld1_u16(a[1..].as_ptr())); let r = unsafe { u16x4::from(vld1_u16(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1q_u16() { fn test_vld1q_u16() {
let a: [u16; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8]; let a: [u16; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8];
let e = u16x8::new(1, 2, 3, 4, 5, 6, 7, 8); let e = u16x8::new(1, 2, 3, 4, 5, 6, 7, 8);
let r: u16x8 = transmute(vld1q_u16(a[1..].as_ptr())); let r = unsafe { u16x8::from(vld1q_u16(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1_u32() { fn test_vld1_u32() {
let a: [u32; 3] = [0, 1, 2]; let a: [u32; 3] = [0, 1, 2];
let e = u32x2::new(1, 2); let e = u32x2::new(1, 2);
let r: u32x2 = transmute(vld1_u32(a[1..].as_ptr())); let r = unsafe { u32x2::from(vld1_u32(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1q_u32() { fn test_vld1q_u32() {
let a: [u32; 5] = [0, 1, 2, 3, 4]; let a: [u32; 5] = [0, 1, 2, 3, 4];
let e = u32x4::new(1, 2, 3, 4); let e = u32x4::new(1, 2, 3, 4);
let r: u32x4 = transmute(vld1q_u32(a[1..].as_ptr())); let r = unsafe { u32x4::from(vld1q_u32(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1_u64() { fn test_vld1_u64() {
let a: [u64; 2] = [0, 1]; let a: [u64; 2] = [0, 1];
let e = u64x1::new(1); let e = u64x1::new(1);
let r: u64x1 = transmute(vld1_u64(a[1..].as_ptr())); let r = unsafe { u64x1::from(vld1_u64(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1q_u64() { fn test_vld1q_u64() {
let a: [u64; 3] = [0, 1, 2]; let a: [u64; 3] = [0, 1, 2];
let e = u64x2::new(1, 2); let e = u64x2::new(1, 2);
let r: u64x2 = transmute(vld1q_u64(a[1..].as_ptr())); let r = unsafe { u64x2::from(vld1q_u64(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1_p8() { fn test_vld1_p8() {
let a: [p8; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8]; let a: [p8; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8];
let e = u8x8::new(1, 2, 3, 4, 5, 6, 7, 8); let e = u8x8::new(1, 2, 3, 4, 5, 6, 7, 8);
let r: u8x8 = transmute(vld1_p8(a[1..].as_ptr())); let r = unsafe { u8x8::from(vld1_p8(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1q_p8() { fn test_vld1q_p8() {
let a: [p8; 17] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; let a: [p8; 17] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
let e = u8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); let e = u8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
let r: u8x16 = transmute(vld1q_p8(a[1..].as_ptr())); let r = unsafe { u8x16::from(vld1q_p8(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1_p16() { fn test_vld1_p16() {
let a: [p16; 5] = [0, 1, 2, 3, 4]; let a: [p16; 5] = [0, 1, 2, 3, 4];
let e = u16x4::new(1, 2, 3, 4); let e = u16x4::new(1, 2, 3, 4);
let r: u16x4 = transmute(vld1_p16(a[1..].as_ptr())); let r = unsafe { u16x4::from(vld1_p16(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1q_p16() { fn test_vld1q_p16() {
let a: [p16; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8]; let a: [p16; 9] = [0, 1, 2, 3, 4, 5, 6, 7, 8];
let e = u16x8::new(1, 2, 3, 4, 5, 6, 7, 8); let e = u16x8::new(1, 2, 3, 4, 5, 6, 7, 8);
let r: u16x8 = transmute(vld1q_p16(a[1..].as_ptr())); let r = unsafe { u16x8::from(vld1q_p16(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon,aes")] #[simd_test(enable = "neon,aes")]
unsafe fn test_vld1_p64() { fn test_vld1_p64() {
let a: [p64; 2] = [0, 1]; let a: [p64; 2] = [0, 1];
let e = u64x1::new(1); let e = u64x1::new(1);
let r: u64x1 = transmute(vld1_p64(a[1..].as_ptr())); let r = unsafe { u64x1::from(vld1_p64(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon,aes")] #[simd_test(enable = "neon,aes")]
unsafe fn test_vld1q_p64() { fn test_vld1q_p64() {
let a: [p64; 3] = [0, 1, 2]; let a: [p64; 3] = [0, 1, 2];
let e = u64x2::new(1, 2); let e = u64x2::new(1, 2);
let r: u64x2 = transmute(vld1q_p64(a[1..].as_ptr())); let r = unsafe { u64x2::from(vld1q_p64(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1_f32() { fn test_vld1_f32() {
let a: [f32; 3] = [0., 1., 2.]; let a: [f32; 3] = [0., 1., 2.];
let e = f32x2::new(1., 2.); let e = f32x2::new(1., 2.);
let r: f32x2 = transmute(vld1_f32(a[1..].as_ptr())); let r = unsafe { f32x2::from(vld1_f32(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vld1q_f32() { fn test_vld1q_f32() {
let a: [f32; 5] = [0., 1., 2., 3., 4.]; let a: [f32; 5] = [0., 1., 2., 3., 4.];
let e = f32x4::new(1., 2., 3., 4.); let e = f32x4::new(1., 2., 3., 4.);
let r: f32x4 = transmute(vld1q_f32(a[1..].as_ptr())); let r = unsafe { f32x4::from(vld1q_f32(a[1..].as_ptr())) };
assert_eq!(r, e) assert_eq!(r, e)
} }

File diff suppressed because it is too large Load diff

View file

@ -14,11 +14,13 @@ use crate::core_arch::simd::*;
use stdarch_test::simd_test; use stdarch_test::simd_test;
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1_s8() { fn test_vst1_s8() {
let mut vals = [0_i8; 9]; let mut vals = [0_i8; 9];
let a = i8x8::new(1, 2, 3, 4, 5, 6, 7, 8); let a = i8x8::new(1, 2, 3, 4, 5, 6, 7, 8);
vst1_s8(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_s8(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -32,11 +34,13 @@ unsafe fn test_vst1_s8() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1q_s8() { fn test_vst1q_s8() {
let mut vals = [0_i8; 17]; let mut vals = [0_i8; 17];
let a = i8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); let a = i8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
vst1q_s8(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_s8(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -58,11 +62,13 @@ unsafe fn test_vst1q_s8() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1_s16() { fn test_vst1_s16() {
let mut vals = [0_i16; 5]; let mut vals = [0_i16; 5];
let a = i16x4::new(1, 2, 3, 4); let a = i16x4::new(1, 2, 3, 4);
vst1_s16(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_s16(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -72,11 +78,13 @@ unsafe fn test_vst1_s16() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1q_s16() { fn test_vst1q_s16() {
let mut vals = [0_i16; 9]; let mut vals = [0_i16; 9];
let a = i16x8::new(1, 2, 3, 4, 5, 6, 7, 8); let a = i16x8::new(1, 2, 3, 4, 5, 6, 7, 8);
vst1q_s16(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_s16(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -90,11 +98,13 @@ unsafe fn test_vst1q_s16() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1_s32() { fn test_vst1_s32() {
let mut vals = [0_i32; 3]; let mut vals = [0_i32; 3];
let a = i32x2::new(1, 2); let a = i32x2::new(1, 2);
vst1_s32(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_s32(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -102,11 +112,13 @@ unsafe fn test_vst1_s32() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1q_s32() { fn test_vst1q_s32() {
let mut vals = [0_i32; 5]; let mut vals = [0_i32; 5];
let a = i32x4::new(1, 2, 3, 4); let a = i32x4::new(1, 2, 3, 4);
vst1q_s32(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_s32(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -116,22 +128,26 @@ unsafe fn test_vst1q_s32() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1_s64() { fn test_vst1_s64() {
let mut vals = [0_i64; 2]; let mut vals = [0_i64; 2];
let a = i64x1::new(1); let a = i64x1::new(1);
vst1_s64(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_s64(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1q_s64() { fn test_vst1q_s64() {
let mut vals = [0_i64; 3]; let mut vals = [0_i64; 3];
let a = i64x2::new(1, 2); let a = i64x2::new(1, 2);
vst1q_s64(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_s64(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -139,11 +155,13 @@ unsafe fn test_vst1q_s64() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1_u8() { fn test_vst1_u8() {
let mut vals = [0_u8; 9]; let mut vals = [0_u8; 9];
let a = u8x8::new(1, 2, 3, 4, 5, 6, 7, 8); let a = u8x8::new(1, 2, 3, 4, 5, 6, 7, 8);
vst1_u8(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_u8(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -157,11 +175,13 @@ unsafe fn test_vst1_u8() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1q_u8() { fn test_vst1q_u8() {
let mut vals = [0_u8; 17]; let mut vals = [0_u8; 17];
let a = u8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); let a = u8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
vst1q_u8(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_u8(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -183,11 +203,13 @@ unsafe fn test_vst1q_u8() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1_u16() { fn test_vst1_u16() {
let mut vals = [0_u16; 5]; let mut vals = [0_u16; 5];
let a = u16x4::new(1, 2, 3, 4); let a = u16x4::new(1, 2, 3, 4);
vst1_u16(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_u16(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -197,11 +219,13 @@ unsafe fn test_vst1_u16() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1q_u16() { fn test_vst1q_u16() {
let mut vals = [0_u16; 9]; let mut vals = [0_u16; 9];
let a = u16x8::new(1, 2, 3, 4, 5, 6, 7, 8); let a = u16x8::new(1, 2, 3, 4, 5, 6, 7, 8);
vst1q_u16(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_u16(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -215,11 +239,13 @@ unsafe fn test_vst1q_u16() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1_u32() { fn test_vst1_u32() {
let mut vals = [0_u32; 3]; let mut vals = [0_u32; 3];
let a = u32x2::new(1, 2); let a = u32x2::new(1, 2);
vst1_u32(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_u32(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -227,11 +253,13 @@ unsafe fn test_vst1_u32() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1q_u32() { fn test_vst1q_u32() {
let mut vals = [0_u32; 5]; let mut vals = [0_u32; 5];
let a = u32x4::new(1, 2, 3, 4); let a = u32x4::new(1, 2, 3, 4);
vst1q_u32(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_u32(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -241,22 +269,26 @@ unsafe fn test_vst1q_u32() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1_u64() { fn test_vst1_u64() {
let mut vals = [0_u64; 2]; let mut vals = [0_u64; 2];
let a = u64x1::new(1); let a = u64x1::new(1);
vst1_u64(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_u64(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1q_u64() { fn test_vst1q_u64() {
let mut vals = [0_u64; 3]; let mut vals = [0_u64; 3];
let a = u64x2::new(1, 2); let a = u64x2::new(1, 2);
vst1q_u64(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_u64(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -264,11 +296,13 @@ unsafe fn test_vst1q_u64() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1_p8() { fn test_vst1_p8() {
let mut vals = [0_u8; 9]; let mut vals = [0_u8; 9];
let a = u8x8::new(1, 2, 3, 4, 5, 6, 7, 8); let a = u8x8::new(1, 2, 3, 4, 5, 6, 7, 8);
vst1_p8(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_p8(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -282,11 +316,13 @@ unsafe fn test_vst1_p8() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1q_p8() { fn test_vst1q_p8() {
let mut vals = [0_u8; 17]; let mut vals = [0_u8; 17];
let a = u8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); let a = u8x16::new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
vst1q_p8(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_p8(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -308,11 +344,13 @@ unsafe fn test_vst1q_p8() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1_p16() { fn test_vst1_p16() {
let mut vals = [0_u16; 5]; let mut vals = [0_u16; 5];
let a = u16x4::new(1, 2, 3, 4); let a = u16x4::new(1, 2, 3, 4);
vst1_p16(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_p16(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -322,11 +360,13 @@ unsafe fn test_vst1_p16() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1q_p16() { fn test_vst1q_p16() {
let mut vals = [0_u16; 9]; let mut vals = [0_u16; 9];
let a = u16x8::new(1, 2, 3, 4, 5, 6, 7, 8); let a = u16x8::new(1, 2, 3, 4, 5, 6, 7, 8);
vst1q_p16(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_p16(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -340,22 +380,26 @@ unsafe fn test_vst1q_p16() {
} }
#[simd_test(enable = "neon,aes")] #[simd_test(enable = "neon,aes")]
unsafe fn test_vst1_p64() { fn test_vst1_p64() {
let mut vals = [0_u64; 2]; let mut vals = [0_u64; 2];
let a = u64x1::new(1); let a = u64x1::new(1);
vst1_p64(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_p64(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
} }
#[simd_test(enable = "neon,aes")] #[simd_test(enable = "neon,aes")]
unsafe fn test_vst1q_p64() { fn test_vst1q_p64() {
let mut vals = [0_u64; 3]; let mut vals = [0_u64; 3];
let a = u64x2::new(1, 2); let a = u64x2::new(1, 2);
vst1q_p64(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_p64(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0); assert_eq!(vals[0], 0);
assert_eq!(vals[1], 1); assert_eq!(vals[1], 1);
@ -363,11 +407,13 @@ unsafe fn test_vst1q_p64() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1_f32() { fn test_vst1_f32() {
let mut vals = [0_f32; 3]; let mut vals = [0_f32; 3];
let a = f32x2::new(1., 2.); let a = f32x2::new(1., 2.);
vst1_f32(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1_f32(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0.); assert_eq!(vals[0], 0.);
assert_eq!(vals[1], 1.); assert_eq!(vals[1], 1.);
@ -375,11 +421,13 @@ unsafe fn test_vst1_f32() {
} }
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn test_vst1q_f32() { fn test_vst1q_f32() {
let mut vals = [0_f32; 5]; let mut vals = [0_f32; 5];
let a = f32x4::new(1., 2., 3., 4.); let a = f32x4::new(1., 2., 3., 4.);
vst1q_f32(vals[1..].as_mut_ptr(), transmute(a)); unsafe {
vst1q_f32(vals[1..].as_mut_ptr(), a.into());
}
assert_eq!(vals[0], 0.); assert_eq!(vals[0], 0.);
assert_eq!(vals[1], 1.); assert_eq!(vals[1], 1.);

View file

@ -21,19 +21,19 @@ macro_rules! test_vtbl {
) => { ) => {
#[cfg(target_endian = "little")] #[cfg(target_endian = "little")]
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn $test_name() { fn $test_name() {
// create table as array, and transmute it to // create table as array, and transmute it to
// arm's table type // arm's table type
let table: $table_t = mem::transmute([$($table_v),*]); let table: $table_t = unsafe { mem::transmute([$($table_v),*]) };
// For each control vector, perform a table lookup and // For each control vector, perform a table lookup and
// verify the result: // verify the result:
$( $(
{ {
let ctrl: $ctrl_t = mem::transmute([$($ctrl_v),*]); let ctrl: $ctrl_t = unsafe { mem::transmute([$($ctrl_v),*]) };
let result = $fn_id(table, mem::transmute(ctrl)); let result = $fn_id(table, unsafe { mem::transmute(ctrl) });
let result: $ctrl_t = mem::transmute(result); let result: $ctrl_t = unsafe { mem::transmute(result) };
let expected: $ctrl_t = mem::transmute([$($exp_v),*]); let expected: $ctrl_t = unsafe { mem::transmute([$($exp_v),*]) };
assert_eq!(result, expected); assert_eq!(result, expected);
} }
)* )*
@ -171,20 +171,19 @@ macro_rules! test_vtbx {
) => { ) => {
#[cfg(target_endian = "little")] #[cfg(target_endian = "little")]
#[simd_test(enable = "neon")] #[simd_test(enable = "neon")]
unsafe fn $test_name() { fn $test_name() {
// create table as array, and transmute it to // create table as array, and transmute it to
// arm's table type // arm's table type
let table: $table_t = mem::transmute([$($table_v),*]); let table: $table_t = unsafe { mem::transmute([$($table_v),*]) };
let ext: $ext_t = mem::transmute([$($ext_v),*]); let ext: $ext_t = unsafe { mem::transmute([$($ext_v),*]) };
// For each control vector, perform a table lookup and // For each control vector, perform a table lookup and
// verify the result: // verify the result:
$( $(
{ {
let ctrl: $ctrl_t = mem::transmute([$($ctrl_v),*]); let ctrl: $ctrl_t = unsafe { mem::transmute([$($ctrl_v),*]) };
let result = $fn_id(ext, table, mem::transmute(ctrl)); let result = $fn_id(ext, table, unsafe { mem::transmute(ctrl) });
let result: $ctrl_t = mem::transmute(result); let result: $ctrl_t = unsafe { mem::transmute(result) };
let expected: $ctrl_t = mem::transmute([$($exp_v),*]); let expected: $ctrl_t = unsafe { mem::transmute([$($exp_v),*]) };
assert_eq!(result, expected); assert_eq!(result, expected);
} }
)* )*

View file

@ -111,13 +111,13 @@ macro_rules! V_f32 {
macro_rules! to64 { macro_rules! to64 {
($t : ident) => { ($t : ident) => {
|v: $t| -> u64 { transmute(v) } |v: $t| -> u64 { unsafe { transmute(v) } }
}; };
} }
macro_rules! to128 { macro_rules! to128 {
($t : ident) => { ($t : ident) => {
|v: $t| -> u128 { transmute(v) } |v: $t| -> u128 { unsafe { transmute(v) } }
}; };
} }
@ -158,9 +158,7 @@ pub(crate) fn test<T, U, V, W, X>(
macro_rules! gen_test_fn { macro_rules! gen_test_fn {
($n: ident, $t: ident, $u: ident, $v: ident, $w: ident, $x: ident, $vals: expr, $fill1: expr, $fill2: expr, $cast: expr) => { ($n: ident, $t: ident, $u: ident, $v: ident, $w: ident, $x: ident, $vals: expr, $fill1: expr, $fill2: expr, $cast: expr) => {
pub(crate) fn $n(test_fun: fn($v, $v) -> $w, verify_fun: fn($t, $t) -> $u) { pub(crate) fn $n(test_fun: fn($v, $v) -> $w, verify_fun: fn($t, $t) -> $u) {
unsafe { test::<$t, $u, $v, $w, $x>($vals, $fill1, $fill2, $cast, test_fun, verify_fun);
test::<$t, $u, $v, $w, $x>($vals, $fill1, $fill2, $cast, test_fun, verify_fun)
};
} }
}; };
} }

View file

@ -17,6 +17,15 @@ pub fn simd_test(
item: proc_macro::TokenStream, item: proc_macro::TokenStream,
) -> proc_macro::TokenStream { ) -> proc_macro::TokenStream {
let tokens = TokenStream::from(attr).into_iter().collect::<Vec<_>>(); let tokens = TokenStream::from(attr).into_iter().collect::<Vec<_>>();
let target = env::var("TARGET").expect(
"TARGET environment variable should be set for rustc (e.g. TARGET=x86_64-apple-darwin cargo test)"
);
let target_arch = target
.split('-')
.next()
.unwrap_or_else(|| panic!("target triple contained no \"-\": {target}"));
let (target_features, target_feature_attr) = match &tokens[..] { let (target_features, target_feature_attr) = match &tokens[..] {
[] => (Vec::new(), TokenStream::new()), [] => (Vec::new(), TokenStream::new()),
[ [
@ -24,13 +33,20 @@ pub fn simd_test(
TokenTree::Punct(equals), TokenTree::Punct(equals),
TokenTree::Literal(literal), TokenTree::Literal(literal),
] if enable == "enable" && equals.as_char() == '=' => { ] if enable == "enable" && equals.as_char() == '=' => {
let enable_feature = literal.to_string(); let mut enable_feature = literal
let enable_feature = enable_feature.trim_start_matches('"').trim_end_matches('"'); .to_string()
.trim_start_matches('"')
.trim_end_matches('"')
.to_string();
let target_features: Vec<_> = enable_feature let target_features: Vec<_> = enable_feature
.replace('+', "") .replace('+', "")
.split(',') .split(',')
.map(String::from) .map(String::from)
.collect(); .collect();
// Allows using `#[simd_test(enable = "neon")]` on aarch64/armv7 shared tests.
if target_arch == "armv7" && target_features.iter().any(|feat| feat == "neon") {
enable_feature.push_str(",v7");
}
( (
target_features, target_features,
@ -46,14 +62,7 @@ pub fn simd_test(
let item_attrs = std::mem::take(&mut item.attrs); let item_attrs = std::mem::take(&mut item.attrs);
let name = &item.sig.ident; let name = &item.sig.ident;
let target = env::var("TARGET").expect( let macro_test = match target_arch {
"TARGET environment variable should be set for rustc (e.g. TARGET=x86_64-apple-darwin cargo test)"
);
let macro_test = match target
.split('-')
.next()
.unwrap_or_else(|| panic!("target triple contained no \"-\": {target}"))
{
"i686" | "x86_64" | "i586" => "is_x86_feature_detected", "i686" | "x86_64" | "i586" => "is_x86_feature_detected",
"arm" | "armv7" | "thumbv7neon" => "is_arm_feature_detected", "arm" | "armv7" | "thumbv7neon" => "is_arm_feature_detected",
"aarch64" | "arm64ec" | "aarch64_be" => "is_aarch64_feature_detected", "aarch64" | "arm64ec" | "aarch64_be" => "is_aarch64_feature_detected",
@ -85,10 +94,20 @@ pub fn simd_test(
let mut detect_missing_features = TokenStream::new(); let mut detect_missing_features = TokenStream::new();
for feature in target_features { for feature in target_features {
let q = quote_spanned! { let q = if target_arch == "armv7" && feature == "fp16" {
proc_macro2::Span::call_site() => // "fp16" cannot be checked at runtime
if !::std::arch::#macro_test!(#feature) { quote_spanned! {
missing_features.push(#feature); proc_macro2::Span::call_site() =>
if !cfg!(target_feature = #feature) {
missing_features.push(#feature);
}
}
} else {
quote_spanned! {
proc_macro2::Span::call_site() =>
if !::std::arch::#macro_test!(#feature) {
missing_features.push(#feature);
}
} }
}; };
q.to_tokens(&mut detect_missing_features); q.to_tokens(&mut detect_missing_features);