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"
;;
armv7-*eabihf | thumbv7-*eabihf)
export RUSTFLAGS="${RUSTFLAGS} -Ctarget-feature=+neon"
export RUSTFLAGS="${RUSTFLAGS} -Ctarget-feature=+neon,+fp16"
;;
amdgcn-*)
export RUSTFLAGS="${RUSTFLAGS} -Ctarget-cpu=gfx1200"

View file

@ -13,194 +13,195 @@ use crate::core_arch::aarch64::*;
use crate::core_arch::simd::*;
use std::mem;
use stdarch_test::simd_test;
#[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 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)
}
#[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 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1_s16() {
fn test_vld1_s16() {
let a: [i16; 5] = [0, 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)
}
#[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 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1_s32() {
fn test_vld1_s32() {
let a: [i32; 3] = [0, 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1q_s32() {
fn test_vld1q_s32() {
let a: [i32; 5] = [0, 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1_s64() {
fn test_vld1_s64() {
let a: [i64; 2] = [0, 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1q_s64() {
fn test_vld1q_s64() {
let a: [i64; 3] = [0, 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)
}
#[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 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)
}
#[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 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1_u16() {
fn test_vld1_u16() {
let a: [u16; 5] = [0, 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)
}
#[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 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1_u32() {
fn test_vld1_u32() {
let a: [u32; 3] = [0, 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1q_u32() {
fn test_vld1q_u32() {
let a: [u32; 5] = [0, 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1_u64() {
fn test_vld1_u64() {
let a: [u64; 2] = [0, 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1q_u64() {
fn test_vld1q_u64() {
let a: [u64; 3] = [0, 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)
}
#[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 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)
}
#[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 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1_p16() {
fn test_vld1_p16() {
let a: [p16; 5] = [0, 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)
}
#[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 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)
}
#[simd_test(enable = "neon,aes")]
unsafe fn test_vld1_p64() {
fn test_vld1_p64() {
let a: [p64; 2] = [0, 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)
}
#[simd_test(enable = "neon,aes")]
unsafe fn test_vld1q_p64() {
fn test_vld1q_p64() {
let a: [p64; 3] = [0, 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1_f32() {
fn test_vld1_f32() {
let a: [f32; 3] = [0., 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)
}
#[simd_test(enable = "neon")]
unsafe fn test_vld1q_f32() {
fn test_vld1q_f32() {
let a: [f32; 5] = [0., 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)
}

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;
#[simd_test(enable = "neon")]
unsafe fn test_vst1_s8() {
fn test_vst1_s8() {
let mut vals = [0_i8; 9];
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[1], 1);
@ -32,11 +34,13 @@ unsafe fn test_vst1_s8() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1q_s8() {
fn test_vst1q_s8() {
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);
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[1], 1);
@ -58,11 +62,13 @@ unsafe fn test_vst1q_s8() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1_s16() {
fn test_vst1_s16() {
let mut vals = [0_i16; 5];
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[1], 1);
@ -72,11 +78,13 @@ unsafe fn test_vst1_s16() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1q_s16() {
fn test_vst1q_s16() {
let mut vals = [0_i16; 9];
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[1], 1);
@ -90,11 +98,13 @@ unsafe fn test_vst1q_s16() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1_s32() {
fn test_vst1_s32() {
let mut vals = [0_i32; 3];
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[1], 1);
@ -102,11 +112,13 @@ unsafe fn test_vst1_s32() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1q_s32() {
fn test_vst1q_s32() {
let mut vals = [0_i32; 5];
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[1], 1);
@ -116,22 +128,26 @@ unsafe fn test_vst1q_s32() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1_s64() {
fn test_vst1_s64() {
let mut vals = [0_i64; 2];
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[1], 1);
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1q_s64() {
fn test_vst1q_s64() {
let mut vals = [0_i64; 3];
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[1], 1);
@ -139,11 +155,13 @@ unsafe fn test_vst1q_s64() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1_u8() {
fn test_vst1_u8() {
let mut vals = [0_u8; 9];
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[1], 1);
@ -157,11 +175,13 @@ unsafe fn test_vst1_u8() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1q_u8() {
fn test_vst1q_u8() {
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);
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[1], 1);
@ -183,11 +203,13 @@ unsafe fn test_vst1q_u8() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1_u16() {
fn test_vst1_u16() {
let mut vals = [0_u16; 5];
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[1], 1);
@ -197,11 +219,13 @@ unsafe fn test_vst1_u16() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1q_u16() {
fn test_vst1q_u16() {
let mut vals = [0_u16; 9];
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[1], 1);
@ -215,11 +239,13 @@ unsafe fn test_vst1q_u16() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1_u32() {
fn test_vst1_u32() {
let mut vals = [0_u32; 3];
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[1], 1);
@ -227,11 +253,13 @@ unsafe fn test_vst1_u32() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1q_u32() {
fn test_vst1q_u32() {
let mut vals = [0_u32; 5];
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[1], 1);
@ -241,22 +269,26 @@ unsafe fn test_vst1q_u32() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1_u64() {
fn test_vst1_u64() {
let mut vals = [0_u64; 2];
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[1], 1);
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1q_u64() {
fn test_vst1q_u64() {
let mut vals = [0_u64; 3];
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[1], 1);
@ -264,11 +296,13 @@ unsafe fn test_vst1q_u64() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1_p8() {
fn test_vst1_p8() {
let mut vals = [0_u8; 9];
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[1], 1);
@ -282,11 +316,13 @@ unsafe fn test_vst1_p8() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1q_p8() {
fn test_vst1q_p8() {
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);
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[1], 1);
@ -308,11 +344,13 @@ unsafe fn test_vst1q_p8() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1_p16() {
fn test_vst1_p16() {
let mut vals = [0_u16; 5];
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[1], 1);
@ -322,11 +360,13 @@ unsafe fn test_vst1_p16() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1q_p16() {
fn test_vst1q_p16() {
let mut vals = [0_u16; 9];
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[1], 1);
@ -340,22 +380,26 @@ unsafe fn test_vst1q_p16() {
}
#[simd_test(enable = "neon,aes")]
unsafe fn test_vst1_p64() {
fn test_vst1_p64() {
let mut vals = [0_u64; 2];
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[1], 1);
}
#[simd_test(enable = "neon,aes")]
unsafe fn test_vst1q_p64() {
fn test_vst1q_p64() {
let mut vals = [0_u64; 3];
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[1], 1);
@ -363,11 +407,13 @@ unsafe fn test_vst1q_p64() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1_f32() {
fn test_vst1_f32() {
let mut vals = [0_f32; 3];
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[1], 1.);
@ -375,11 +421,13 @@ unsafe fn test_vst1_f32() {
}
#[simd_test(enable = "neon")]
unsafe fn test_vst1q_f32() {
fn test_vst1q_f32() {
let mut vals = [0_f32; 5];
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[1], 1.);

View file

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

View file

@ -111,13 +111,13 @@ macro_rules! V_f32 {
macro_rules! to64 {
($t : ident) => {
|v: $t| -> u64 { transmute(v) }
|v: $t| -> u64 { unsafe { transmute(v) } }
};
}
macro_rules! to128 {
($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 {
($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) {
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,
) -> proc_macro::TokenStream {
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[..] {
[] => (Vec::new(), TokenStream::new()),
[
@ -24,13 +33,20 @@ pub fn simd_test(
TokenTree::Punct(equals),
TokenTree::Literal(literal),
] if enable == "enable" && equals.as_char() == '=' => {
let enable_feature = literal.to_string();
let enable_feature = enable_feature.trim_start_matches('"').trim_end_matches('"');
let mut enable_feature = literal
.to_string()
.trim_start_matches('"')
.trim_end_matches('"')
.to_string();
let target_features: Vec<_> = enable_feature
.replace('+', "")
.split(',')
.map(String::from)
.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,
@ -46,14 +62,7 @@ pub fn simd_test(
let item_attrs = std::mem::take(&mut item.attrs);
let name = &item.sig.ident;
let target = env::var("TARGET").expect(
"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}"))
{
let macro_test = match target_arch {
"i686" | "x86_64" | "i586" => "is_x86_feature_detected",
"arm" | "armv7" | "thumbv7neon" => "is_arm_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();
for feature in target_features {
let q = quote_spanned! {
proc_macro2::Span::call_site() =>
if !::std::arch::#macro_test!(#feature) {
missing_features.push(#feature);
let q = if target_arch == "armv7" && feature == "fp16" {
// "fp16" cannot be checked at runtime
quote_spanned! {
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);