arm_shared: avoid using transmute and unsafe fn in tests
This commit is contained in:
parent
dab553268a
commit
68701ff93a
7 changed files with 1409 additions and 1093 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
@ -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.);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
)*
|
)*
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue