Merge pull request #2066 from folkertdev/basic-miri-roundtrip

Basic miri store/load roundtrip
This commit is contained in:
Sayantan Chakraborty
2026-04-06 22:57:43 +00:00
committed by GitHub
7 changed files with 53 additions and 112 deletions
+23 -1
View File
@@ -272,7 +272,7 @@ jobs:
intrinsic-test:
needs: [style]
name: Intrinsic Test
runs-on: ubuntu-latest
runs-on: ubuntu-latest
strategy:
matrix:
target:
@@ -332,11 +332,33 @@ jobs:
cargo run -p stdarch-gen-hexagon --release
git diff --exit-code
# Run some tests with Miri. Most stdarch functions use platform-specific intrinsics
# that Miri does not support. Also Miri is reltively slow.
#
# Below we run some tests where Miri might catch UB, for instance on intrinsics that read from
# or write to pointers.
miri:
needs: [style]
name: Run some tests with miri
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Install Rust
run: rustup update nightly && rustup default nightly && rustup component add miri
- name: Run miri tests
env:
TARGET: "aarch64-unknown-linux-gnu"
run: |
# read filters and join them with a space.
FILTERS=$(cat aarch64-miri-tests.txt | tr '\n' ' ')
cargo miri test -p core_arch --target aarch64-unknown-linux-gnu -- $FILTERS
conclusion:
needs:
- docs
- verify
- test
- miri
- intrinsic-test
- check-stdarch-gen
runs-on: ubuntu-latest
+3
View File
@@ -0,0 +1,3 @@
test_vld3q
neon::load_tests
neon::store_tests
@@ -12127,14 +12127,7 @@ pub unsafe fn vld3q_dup_u64(a: *const u64) -> uint64x2x3_t {
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
#[cfg_attr(test, assert_instr(ld3))]
pub unsafe fn vld3q_f64(a: *const f64) -> float64x2x3_t {
unsafe extern "unadjusted" {
#[cfg_attr(
any(target_arch = "aarch64", target_arch = "arm64ec"),
link_name = "llvm.aarch64.neon.ld3.v2f64.p0"
)]
fn _vld3q_f64(ptr: *const float64x2_t) -> float64x2x3_t;
}
_vld3q_f64(a as _)
crate::core_arch::macros::deinterleaving_load!(f64, 2, 3, a)
}
#[doc = "Load multiple 3-element structures to three registers"]
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld3q_s64)"]
@@ -12145,14 +12138,7 @@ pub unsafe fn vld3q_f64(a: *const f64) -> float64x2x3_t {
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
#[cfg_attr(test, assert_instr(ld3))]
pub unsafe fn vld3q_s64(a: *const i64) -> int64x2x3_t {
unsafe extern "unadjusted" {
#[cfg_attr(
any(target_arch = "aarch64", target_arch = "arm64ec"),
link_name = "llvm.aarch64.neon.ld3.v2i64.p0"
)]
fn _vld3q_s64(ptr: *const int64x2_t) -> int64x2x3_t;
}
_vld3q_s64(a as _)
crate::core_arch::macros::deinterleaving_load!(i64, 2, 3, a)
}
#[doc = "Load multiple 3-element structures to three registers"]
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld3q_lane_f64)"]
@@ -1022,8 +1022,12 @@ macro_rules! wide_store_load_roundtrip {
($elem_ty:ty, $len:expr, $vec_ty:ty, $store:expr, $load:expr) => {
let vals: [$elem_ty; $len] = crate::array::from_fn(|i| i as $elem_ty);
let a: $vec_ty = transmute(vals);
let mut tmp = [0 as $elem_ty; $len];
let mut tmp = core::mem::MaybeUninit::<[$elem_ty; $len]>::uninit();
$store(tmp.as_mut_ptr().cast(), a);
// With Miri this will check that all elements were initialized.
let tmp = tmp.assume_init();
let r: $vec_ty = $load(tmp.as_ptr().cast());
let out: [$elem_ty; $len] = transmute(r);
assert_eq!(out, vals);
@@ -67158,14 +67158,7 @@ pub unsafe fn vst3q_s32(a: *mut i32, b: int32x4x3_t) {
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
#[cfg_attr(test, assert_instr(st3))]
pub unsafe fn vst3_f32(a: *mut f32, b: float32x2x3_t) {
unsafe extern "unadjusted" {
#[cfg_attr(
any(target_arch = "aarch64", target_arch = "arm64ec"),
link_name = "llvm.aarch64.neon.st3.v2f32.p0"
)]
fn _vst3_f32(a: float32x2_t, b: float32x2_t, c: float32x2_t, ptr: *mut i8);
}
_vst3_f32(b.0, b.1, b.2, a as _)
crate::core_arch::macros::interleaving_store!(f32, 2, 3, a, b)
}
#[doc = "Store multiple 3-element structures from three registers"]
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst3q_f32)"]
@@ -67177,14 +67170,7 @@ pub unsafe fn vst3_f32(a: *mut f32, b: float32x2x3_t) {
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
#[cfg_attr(test, assert_instr(st3))]
pub unsafe fn vst3q_f32(a: *mut f32, b: float32x4x3_t) {
unsafe extern "unadjusted" {
#[cfg_attr(
any(target_arch = "aarch64", target_arch = "arm64ec"),
link_name = "llvm.aarch64.neon.st3.v4f32.p0"
)]
fn _vst3q_f32(a: float32x4_t, b: float32x4_t, c: float32x4_t, ptr: *mut i8);
}
_vst3q_f32(b.0, b.1, b.2, a as _)
crate::core_arch::macros::interleaving_store!(f32, 4, 3, a, b)
}
#[doc = "Store multiple 3-element structures from three registers"]
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst3_s8)"]
@@ -67196,14 +67182,7 @@ pub unsafe fn vst3q_f32(a: *mut f32, b: float32x4x3_t) {
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
#[cfg_attr(test, assert_instr(st3))]
pub unsafe fn vst3_s8(a: *mut i8, b: int8x8x3_t) {
unsafe extern "unadjusted" {
#[cfg_attr(
any(target_arch = "aarch64", target_arch = "arm64ec"),
link_name = "llvm.aarch64.neon.st3.v8i8.p0"
)]
fn _vst3_s8(a: int8x8_t, b: int8x8_t, c: int8x8_t, ptr: *mut i8);
}
_vst3_s8(b.0, b.1, b.2, a as _)
crate::core_arch::macros::interleaving_store!(i8, 8, 3, a, b)
}
#[doc = "Store multiple 3-element structures from three registers"]
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst3q_s8)"]
@@ -67215,14 +67194,7 @@ pub unsafe fn vst3_s8(a: *mut i8, b: int8x8x3_t) {
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
#[cfg_attr(test, assert_instr(st3))]
pub unsafe fn vst3q_s8(a: *mut i8, b: int8x16x3_t) {
unsafe extern "unadjusted" {
#[cfg_attr(
any(target_arch = "aarch64", target_arch = "arm64ec"),
link_name = "llvm.aarch64.neon.st3.v16i8.p0"
)]
fn _vst3q_s8(a: int8x16_t, b: int8x16_t, c: int8x16_t, ptr: *mut i8);
}
_vst3q_s8(b.0, b.1, b.2, a as _)
crate::core_arch::macros::interleaving_store!(i8, 16, 3, a, b)
}
#[doc = "Store multiple 3-element structures from three registers"]
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst3_s16)"]
@@ -67234,14 +67206,7 @@ pub unsafe fn vst3q_s8(a: *mut i8, b: int8x16x3_t) {
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
#[cfg_attr(test, assert_instr(st3))]
pub unsafe fn vst3_s16(a: *mut i16, b: int16x4x3_t) {
unsafe extern "unadjusted" {
#[cfg_attr(
any(target_arch = "aarch64", target_arch = "arm64ec"),
link_name = "llvm.aarch64.neon.st3.v4i16.p0"
)]
fn _vst3_s16(a: int16x4_t, b: int16x4_t, c: int16x4_t, ptr: *mut i8);
}
_vst3_s16(b.0, b.1, b.2, a as _)
crate::core_arch::macros::interleaving_store!(i16, 4, 3, a, b)
}
#[doc = "Store multiple 3-element structures from three registers"]
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst3q_s16)"]
@@ -67253,14 +67218,7 @@ pub unsafe fn vst3_s16(a: *mut i16, b: int16x4x3_t) {
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
#[cfg_attr(test, assert_instr(st3))]
pub unsafe fn vst3q_s16(a: *mut i16, b: int16x8x3_t) {
unsafe extern "unadjusted" {
#[cfg_attr(
any(target_arch = "aarch64", target_arch = "arm64ec"),
link_name = "llvm.aarch64.neon.st3.v8i16.p0"
)]
fn _vst3q_s16(a: int16x8_t, b: int16x8_t, c: int16x8_t, ptr: *mut i8);
}
_vst3q_s16(b.0, b.1, b.2, a as _)
crate::core_arch::macros::interleaving_store!(i16, 8, 3, a, b)
}
#[doc = "Store multiple 3-element structures from three registers"]
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst3_s32)"]
@@ -67272,14 +67230,7 @@ pub unsafe fn vst3q_s16(a: *mut i16, b: int16x8x3_t) {
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
#[cfg_attr(test, assert_instr(st3))]
pub unsafe fn vst3_s32(a: *mut i32, b: int32x2x3_t) {
unsafe extern "unadjusted" {
#[cfg_attr(
any(target_arch = "aarch64", target_arch = "arm64ec"),
link_name = "llvm.aarch64.neon.st3.v2i32.p0"
)]
fn _vst3_s32(a: int32x2_t, b: int32x2_t, c: int32x2_t, ptr: *mut i8);
}
_vst3_s32(b.0, b.1, b.2, a as _)
crate::core_arch::macros::interleaving_store!(i32, 2, 3, a, b)
}
#[doc = "Store multiple 3-element structures from three registers"]
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst3q_s32)"]
@@ -67291,14 +67242,7 @@ pub unsafe fn vst3_s32(a: *mut i32, b: int32x2x3_t) {
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
#[cfg_attr(test, assert_instr(st3))]
pub unsafe fn vst3q_s32(a: *mut i32, b: int32x4x3_t) {
unsafe extern "unadjusted" {
#[cfg_attr(
any(target_arch = "aarch64", target_arch = "arm64ec"),
link_name = "llvm.aarch64.neon.st3.v4i32.p0"
)]
fn _vst3q_s32(a: int32x4_t, b: int32x4_t, c: int32x4_t, ptr: *mut i8);
}
_vst3q_s32(b.0, b.1, b.2, a as _)
crate::core_arch::macros::interleaving_store!(i32, 4, 3, a, b)
}
#[doc = "Store multiple 3-element structures from three registers"]
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst3_lane_f16)"]
@@ -4031,17 +4031,10 @@ intrinsics:
unsafe: [neon]
assert_instr: [ld3]
types:
- ['*const i64', int64x2x3_t, '*const int64x2_t', i64]
- ['*const f64', float64x2x3_t, '*const float64x2_t', f64]
- ['*const i64', int64x2x3_t, i64, "2"]
- ['*const f64', float64x2x3_t, f64, "2"]
compose:
- LLVMLink:
name: 'vld3{neon_type[1].nox}'
arguments:
- 'ptr: {type[2]}'
links:
- link: 'llvm.aarch64.neon.ld3.v{neon_type[1].lane}{type[3]}.p0'
arch: aarch64,arm64ec
- FnCall: ['_vld3{neon_type[1].nox}', ['a as _']]
- FnCall: ["crate::core_arch::macros::deinterleaving_load!", [{ Type: "{type[2]}" }, "{type[3]}", "3", a], [], true]
- name: "vld3{neon_type[1].nox}"
doc: Load multiple 3-element structures to three registers
@@ -5642,27 +5642,16 @@ intrinsics:
safety:
unsafe: [neon]
types:
- [i8, int8x8x3_t, int8x8_t]
- [i16, int16x4x3_t, int16x4_t]
- [i32, int32x2x3_t, int32x2_t]
- [i8, int8x16x3_t, int8x16_t]
- [i16, int16x8x3_t, int16x8_t]
- [i32, int32x4x3_t, int32x4_t]
- [f32, float32x2x3_t, float32x2_t]
- [f32, float32x4x3_t, float32x4_t]
- [i8, int8x8x3_t, "8"]
- [i16, int16x4x3_t, "4"]
- [i32, int32x2x3_t, "2"]
- [i8, int8x16x3_t, "16"]
- [i16, int16x8x3_t, "8"]
- [i32, int32x4x3_t, "4"]
- [f32, float32x2x3_t, "2"]
- [f32, float32x4x3_t, "4"]
compose:
- LLVMLink:
name: 'vst3.{neon_type[1]}'
arguments:
- 'a: {type[2]}'
- 'b: {type[2]}'
- 'c: {type[2]}'
- 'ptr: *mut i8'
links:
- link: 'llvm.aarch64.neon.st3.v{neon_type[1].lane}{type[0]}.p0'
arch: aarch64,arm64ec
- FnCall: ['_vst3{neon_type[1].nox}', ['b.0', 'b.1', 'b.2', 'a as _']]
- FnCall: ["crate::core_arch::macros::interleaving_store!", [{ Type: "{type[0]}" }, "{type[2]}", "3", a, b], [], true]
- name: "vst3{neon_type[1].nox}"
doc: "Store multiple 3-element structures from three registers"