Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
1dd1ccc
intrinsic-test: remove `concatln!`
davidtwco May 20, 2026
b89077b
intrinsic-test: specializations as iterator
davidtwco May 20, 2026
ad492c9
intrinsic-test: shorten various type names
davidtwco Jun 2, 2026
90f4c15
intrinsic-test: impl `get_load_function` for SVE
davidtwco Jun 1, 2026
8162055
intrinsic-test: skip unimplemented SVE intrinsics
davidtwco Jun 1, 2026
6ac8095
intrinsic-test: use `arm_sve.h` and target feats
davidtwco Jun 1, 2026
067a7aa
intrinsic-test: `bool` test values
davidtwco Jun 1, 2026
4f98769
intrinsic-test: values for enum-typed constraints
davidtwco Jun 1, 2026
9f84831
intrinsic-test: simplify type printing
davidtwco Jun 1, 2026
793a083
intrinsic-test: no test values for `svbool_t`
davidtwco Jun 1, 2026
38e5756
intrinsic-test: introduce `get_comparison_function`
davidtwco Jun 1, 2026
72abb1d
intrinsic-test: intrisic generic over arch not type
davidtwco Jun 2, 2026
c1aaac9
intrinsic-test: introduce `get_predicate_function`
davidtwco Jun 1, 2026
9901dfe
intrinsic-test: sve comparison and predicates
davidtwco Jun 1, 2026
cff3e84
intrinsic-test: rename `get_*_function` fns
davidtwco Jun 4, 2026
b63e949
intrinsic-test: arg generic over arch not type
davidtwco Jun 9, 2026
8d809e5
intrinsic-test: test values for `svbool_t`
davidtwco Jun 4, 2026
a1588df
intrinsic-test: remove unnecessary newlines
davidtwco Jun 9, 2026
6395077
arm-intrinsics: `svget{2,3,4}`
davidtwco Jun 1, 2026
938c047
arm-intrinsics: `svset{2,3,4}`
davidtwco Jun 1, 2026
9461c18
intrinsic-test: stop skipping SVE intrinsics
davidtwco Jun 1, 2026
b18c910
intrinsic-test: simplify architecture constants
davidtwco Jun 11, 2026
26b58e6
intrinsic-test: enable non-baseline target features
davidtwco Jun 11, 2026
dbfab63
intrinsic-test: skip SVE intrinsics on big endian
davidtwco Jun 11, 2026
3b5fb00
intrinsic-test: SVE float comparison
davidtwco Jun 11, 2026
3fb4413
intrinsic-test: do not test `svundef*`
davidtwco Jun 15, 2026
6e63db8
intrinsic-test: fwd args in `intrinsic-test.sh`
davidtwco Jun 15, 2026
badf92c
core_arch: redefine `svrev_b{16,32,64}`
davidtwco Jun 15, 2026
195ccbe
core_arch: redefine `sv{zip,uzp}_b{16,32,64}`
davidtwco Jun 15, 2026
38c08c3
intrinsic-test: skip `sveorv*` (llvm-project#203921)
davidtwco Jun 15, 2026
0a396d6
intrinsic-test: skip `svld*_gather_*`
davidtwco Jun 15, 2026
7bbab4c
intrinsic-test: `__ARM_FEATURE_SVE` ifdef
davidtwco Jun 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 22 additions & 11 deletions ci/intrinsic-test.sh
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
#!/usr/bin/env sh

set -ex

if [ $# -lt 2 ]; then
>&2 echo "Usage: $0 <TARGET> <CC>"
>&2 echo "Usage: $0 <TARGET> <CC> <..args for \`cargo test\`..>"
exit 1
fi

case ${2} in
set -ex

# Pop both arguments and leave "$@" as containing args to be forwarded to `cargo test`
TARGET="$1"
shift
CC_KIND="$1"
shift

case ${CC_KIND} in
clang)
export CC="${CLANG_PATH}"
CC_ARG_STYLE=clang
Expand Down Expand Up @@ -35,49 +41,54 @@ echo "PROFILE=${PROFILE}"

INTRINSIC_TEST="--manifest-path=crates/intrinsic-test/Cargo.toml"

case ${1} in
case ${TARGET} in
aarch64_be*)
export CFLAGS="-I${AARCH64_BE_TOOLCHAIN}/aarch64_be-none-linux-gnu/libc/usr/include --sysroot={AARCH64_BE_TOOLCHAIN}/aarch64_be-none-linux-gnu/libc -Wno-nonportable-vector-initialization"
ARCH=aarch64_be
RUNTIME_RUSTFLAGS=
;;

aarch64*)
export CFLAGS="-I/usr/aarch64-linux-gnu/include/"
ARCH=aarch64
RUNTIME_RUSTFLAGS=-Ctarget-feature=+sve,+sve2
;;

armv7*)
export CFLAGS="-I/usr/arm-linux-gnueabihf/include/"
ARCH=arm
RUNTIME_RUSTFLAGS=
;;

x86_64*)
export CFLAGS="-I/usr/include/x86_64-linux-gnu/"
ARCH=x86
RUNTIME_RUSTFLAGS=
;;
*)
;;

esac

case "${1}" in
case "${TARGET}" in
x86_64-unknown-linux-gnu*)
env -u CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUNNER \
cargo run "${INTRINSIC_TEST}" --release \
--bin intrinsic-test -- intrinsics_data/x86-intel.xml \
--skip "crates/intrinsic-test/missing_${ARCH}_common.txt" \
--skip "crates/intrinsic-test/missing_${ARCH}_${2}.txt" \
--target "${1}" \
--skip "crates/intrinsic-test/missing_${ARCH}_${CC_KIND}.txt" \
--target "${TARGET}" \
--cc-arg-style "${CC_ARG_STYLE}"
;;
*)
cargo run "${INTRINSIC_TEST}" --release \
--bin intrinsic-test -- intrinsics_data/arm_intrinsics.json \
--skip "crates/intrinsic-test/missing_${ARCH}_common.txt" \
--skip "crates/intrinsic-test/missing_${ARCH}_${2}.txt" \
--target "${1}" \
--skip "crates/intrinsic-test/missing_${ARCH}_${CC_KIND}.txt" \
--target "${TARGET}" \
--cc-arg-style "${CC_ARG_STYLE}"
;;
esac

cargo test --manifest-path=rust_programs/Cargo.toml --target "${1}" --profile "${PROFILE}" --tests
RUSTFLAGS="${RUNTIME_RUSTFLAGS}" cargo test --manifest-path=rust_programs/Cargo.toml \
--target "${TARGET}" --profile "${PROFILE}" --tests "$@"
220 changes: 110 additions & 110 deletions crates/core_arch/src/aarch64/sve/generated.rs

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions crates/core_arch/src/aarch64/sve/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ pub(super) trait SveInto<T>: Sized {
unsafe fn sve_into(self) -> T;
}

impl<T> SveInto<T> for T {
#[inline]
#[target_feature(enable = "sve")]
unsafe fn sve_into(self) -> T {
self
}
}

macro_rules! impl_sve_type {
($(($v:vis, $elem_type:ty, $name:ident, $elt:literal))*) => ($(
#[doc = concat!("Scalable vector of type ", stringify!($elem_type))]
Expand Down
25 changes: 0 additions & 25 deletions crates/intrinsic-test/src/arm/config.rs

This file was deleted.

6 changes: 3 additions & 3 deletions crates/intrinsic-test/src/arm/intrinsic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ use crate::common::intrinsic_helpers::IntrinsicType;
use std::ops::{Deref, DerefMut};

#[derive(Debug, Clone, PartialEq)]
pub struct ArmIntrinsicType(pub IntrinsicType);
pub struct ArmType(pub IntrinsicType);

impl Deref for ArmIntrinsicType {
impl Deref for ArmType {
type Target = IntrinsicType;

fn deref(&self) -> &Self::Target {
&self.0
}
}

impl DerefMut for ArmIntrinsicType {
impl DerefMut for ArmType {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
Expand Down
28 changes: 12 additions & 16 deletions crates/intrinsic-test/src/arm/json_parser.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use super::intrinsic::ArmIntrinsicType;
use super::intrinsic::ArmType;
use crate::arm::Arm;
use crate::arm::types::parse_intrinsic_type;
use crate::common::argument::{Argument, ArgumentList};
use crate::common::constraint::Constraint;
Expand Down Expand Up @@ -57,32 +58,24 @@ struct JsonIntrinsic {
_instructions: Option<Vec<Vec<String>>>,
}

pub fn get_neon_intrinsics(
filename: &Path,
) -> Result<Vec<Intrinsic<ArmIntrinsicType>>, Box<dyn std::error::Error>> {
pub fn get_intrinsics(filename: &Path) -> Result<Vec<Intrinsic<Arm>>, Box<dyn std::error::Error>> {
let file = std::fs::File::open(filename)?;
let reader = std::io::BufReader::new(file);
let json: Vec<JsonIntrinsic> = serde_json::from_reader(reader).expect("Couldn't parse JSON");

let parsed = json
.into_iter()
.filter_map(|intr| {
if intr.simd_isa == "Neon" {
Some(json_to_intrinsic(intr).expect("Couldn't parse JSON"))
} else {
None
}
})
.map(|intr| json_to_intrinsic(intr).expect("Couldn't parse JSON"))
.collect();
Ok(parsed)
}

fn json_to_intrinsic(
mut intr: JsonIntrinsic,
) -> Result<Intrinsic<ArmIntrinsicType>, Box<dyn std::error::Error>> {
) -> Result<Intrinsic<Arm>, Box<dyn std::error::Error>> {
let name = intr.name.replace(['[', ']'], "");

let result_ty = ArmIntrinsicType(parse_intrinsic_type(&intr.return_type.value)?);
let result_ty = ArmType(parse_intrinsic_type(&intr.return_type.value)?);

let args = intr
.arguments
Expand Down Expand Up @@ -120,11 +113,13 @@ fn json_to_intrinsic(
}
});

let mut arg = Argument::<ArmIntrinsicType>::new(
let is_predicate = arg_name == "pg";
let mut arg = Argument::<Arm>::new(
i,
String::from(arg_name),
ArmIntrinsicType(arg_ty),
ArmType(arg_ty),
constraint,
is_predicate,
);

// The JSON doesn't list immediates as const
Expand All @@ -138,13 +133,14 @@ fn json_to_intrinsic(
})
.collect();

let arguments = ArgumentList::<ArmIntrinsicType> { args };
let arguments = ArgumentList::<Arm> { args };

Ok(Intrinsic {
name,
arguments,
results: result_ty,
arch_tags: intr.architectures,
extension: intr.simd_isa,
})
}

Expand Down
Loading
Loading