Skip to content

Commit f326508

Browse files
authored
Merge pull request exercism#2160 from davidtwco/intrinsic-test-sve
intrinsic-test: sve support
2 parents a8fabf0 + 3316f81 commit f326508

17 files changed

Lines changed: 605 additions & 227 deletions

File tree

library/stdarch/ci/docker/aarch64-unknown-linux-gnu/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ ENV CLANG_PATH="/llvm/bin/clang"
1919
ENV GCC_PATH=aarch64-linux-gnu-gcc
2020

2121
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
22-
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER="qemu-aarch64 -cpu max -L /usr/aarch64-linux-gnu" \
22+
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUNNER="qemu-aarch64 -cpu max,sve512=on -L /usr/aarch64-linux-gnu" \
2323
OBJDUMP=aarch64-linux-gnu-objdump

library/stdarch/ci/intrinsic-test.sh

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,25 @@ case ${TARGET} in
4545
aarch64_be*)
4646
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"
4747
ARCH=aarch64_be
48+
RUNTIME_RUSTFLAGS=
4849
;;
4950

5051
aarch64*)
5152
export CFLAGS="-I/usr/aarch64-linux-gnu/include/"
5253
ARCH=aarch64
54+
RUNTIME_RUSTFLAGS=-Ctarget-feature=+sve,+sve2
5355
;;
5456

5557
armv7*)
5658
export CFLAGS="-I/usr/arm-linux-gnueabihf/include/"
5759
ARCH=arm
60+
RUNTIME_RUSTFLAGS=
5861
;;
5962

6063
x86_64*)
6164
export CFLAGS="-I/usr/include/x86_64-linux-gnu/"
6265
ARCH=x86
66+
RUNTIME_RUSTFLAGS=
6367
;;
6468
*)
6569
;;
@@ -86,5 +90,5 @@ case "${TARGET}" in
8690
;;
8791
esac
8892

89-
cargo test --manifest-path=rust_programs/Cargo.toml --target "${TARGET}" --profile "${PROFILE}" \
90-
--tests "$@"
93+
RUSTFLAGS="${RUNTIME_RUSTFLAGS}" cargo test --manifest-path=rust_programs/Cargo.toml \
94+
--target "${TARGET}" --profile "${PROFILE}" --tests --no-fail-fast "$@"

library/stdarch/crates/core_arch/src/aarch64/sve/generated.rs

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -42211,30 +42211,17 @@ pub fn svtmad_f64<const IMM3: i32>(op1: svfloat64_t, op2: svfloat64_t) -> svfloa
4221142211
unsafe { _svtmad_f64(op1, op2, IMM3) }
4221242212
}
4221342213
#[doc = "Interleave even elements from two inputs"]
42214-
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn1_b8)"]
42215-
#[inline]
42216-
#[target_feature(enable = "sve")]
42217-
#[unstable(feature = "stdarch_aarch64_sve", issue = "145052")]
42218-
#[cfg_attr(test, assert_instr(trn1))]
42219-
pub fn svtrn1_b8(op1: svbool_t, op2: svbool_t) -> svbool_t {
42220-
unsafe extern "unadjusted" {
42221-
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn1.nxv16i1")]
42222-
fn _svtrn1_b8(op1: svbool_t, op2: svbool_t) -> svbool_t;
42223-
}
42224-
unsafe { _svtrn1_b8(op1, op2) }
42225-
}
42226-
#[doc = "Interleave even elements from two inputs"]
4222742214
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn1_b16)"]
4222842215
#[inline]
4222942216
#[target_feature(enable = "sve")]
4223042217
#[unstable(feature = "stdarch_aarch64_sve", issue = "145052")]
4223142218
#[cfg_attr(test, assert_instr(trn1))]
4223242219
pub fn svtrn1_b16(op1: svbool_t, op2: svbool_t) -> svbool_t {
4223342220
unsafe extern "unadjusted" {
42234-
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn1.nxv8i1")]
42235-
fn _svtrn1_b16(op1: svbool8_t, op2: svbool8_t) -> svbool8_t;
42221+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn1.b16")]
42222+
fn _svtrn1_b16(op1: svbool_t, op2: svbool_t) -> svbool_t;
4223642223
}
42237-
unsafe { _svtrn1_b16(op1.sve_into(), op2.sve_into()).sve_into() }
42224+
unsafe { _svtrn1_b16(op1.sve_into(), op2.sve_into()) }
4223842225
}
4223942226
#[doc = "Interleave even elements from two inputs"]
4224042227
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn1_b32)"]
@@ -42244,10 +42231,10 @@ pub fn svtrn1_b16(op1: svbool_t, op2: svbool_t) -> svbool_t {
4224442231
#[cfg_attr(test, assert_instr(trn1))]
4224542232
pub fn svtrn1_b32(op1: svbool_t, op2: svbool_t) -> svbool_t {
4224642233
unsafe extern "unadjusted" {
42247-
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn1.nxv4i1")]
42248-
fn _svtrn1_b32(op1: svbool4_t, op2: svbool4_t) -> svbool4_t;
42234+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn1.b32")]
42235+
fn _svtrn1_b32(op1: svbool_t, op2: svbool_t) -> svbool_t;
4224942236
}
42250-
unsafe { _svtrn1_b32(op1.sve_into(), op2.sve_into()).sve_into() }
42237+
unsafe { _svtrn1_b32(op1.sve_into(), op2.sve_into()) }
4225142238
}
4225242239
#[doc = "Interleave even elements from two inputs"]
4225342240
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn1_b64)"]
@@ -42257,10 +42244,10 @@ pub fn svtrn1_b32(op1: svbool_t, op2: svbool_t) -> svbool_t {
4225742244
#[cfg_attr(test, assert_instr(trn1))]
4225842245
pub fn svtrn1_b64(op1: svbool_t, op2: svbool_t) -> svbool_t {
4225942246
unsafe extern "unadjusted" {
42260-
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn1.nxv2i1")]
42261-
fn _svtrn1_b64(op1: svbool2_t, op2: svbool2_t) -> svbool2_t;
42247+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn1.b64")]
42248+
fn _svtrn1_b64(op1: svbool_t, op2: svbool_t) -> svbool_t;
4226242249
}
42263-
unsafe { _svtrn1_b64(op1.sve_into(), op2.sve_into()).sve_into() }
42250+
unsafe { _svtrn1_b64(op1.sve_into(), op2.sve_into()) }
4226442251
}
4226542252
#[doc = "Interleave even elements from two inputs"]
4226642253
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn1[_f32])"]
@@ -42376,6 +42363,19 @@ pub fn svtrn1_u32(op1: svuint32_t, op2: svuint32_t) -> svuint32_t {
4237642363
pub fn svtrn1_u64(op1: svuint64_t, op2: svuint64_t) -> svuint64_t {
4237742364
unsafe { svtrn1_s64(op1.as_signed(), op2.as_signed()).as_unsigned() }
4237842365
}
42366+
#[doc = "Interleave even elements from two inputs"]
42367+
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn1[_b8])"]
42368+
#[inline]
42369+
#[target_feature(enable = "sve")]
42370+
#[unstable(feature = "stdarch_aarch64_sve", issue = "145052")]
42371+
#[cfg_attr(test, assert_instr(trn1))]
42372+
pub fn svtrn1_b8(op1: svbool_t, op2: svbool_t) -> svbool_t {
42373+
unsafe extern "unadjusted" {
42374+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn1.nxv16i1")]
42375+
fn _svtrn1_b8(op1: svbool_t, op2: svbool_t) -> svbool_t;
42376+
}
42377+
unsafe { _svtrn1_b8(op1, op2) }
42378+
}
4237942379
#[doc = "Interleave even quadwords from two inputs"]
4238042380
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn1q[_f32])"]
4238142381
#[inline]
@@ -42491,30 +42491,17 @@ pub fn svtrn1q_u64(op1: svuint64_t, op2: svuint64_t) -> svuint64_t {
4249142491
unsafe { svtrn1q_s64(op1.as_signed(), op2.as_signed()).as_unsigned() }
4249242492
}
4249342493
#[doc = "Interleave odd elements from two inputs"]
42494-
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn2_b8)"]
42495-
#[inline]
42496-
#[target_feature(enable = "sve")]
42497-
#[unstable(feature = "stdarch_aarch64_sve", issue = "145052")]
42498-
#[cfg_attr(test, assert_instr(trn2))]
42499-
pub fn svtrn2_b8(op1: svbool_t, op2: svbool_t) -> svbool_t {
42500-
unsafe extern "unadjusted" {
42501-
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn2.nxv16i1")]
42502-
fn _svtrn2_b8(op1: svbool_t, op2: svbool_t) -> svbool_t;
42503-
}
42504-
unsafe { _svtrn2_b8(op1, op2) }
42505-
}
42506-
#[doc = "Interleave odd elements from two inputs"]
4250742494
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn2_b16)"]
4250842495
#[inline]
4250942496
#[target_feature(enable = "sve")]
4251042497
#[unstable(feature = "stdarch_aarch64_sve", issue = "145052")]
4251142498
#[cfg_attr(test, assert_instr(trn2))]
4251242499
pub fn svtrn2_b16(op1: svbool_t, op2: svbool_t) -> svbool_t {
4251342500
unsafe extern "unadjusted" {
42514-
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn2.nxv8i1")]
42515-
fn _svtrn2_b16(op1: svbool8_t, op2: svbool8_t) -> svbool8_t;
42501+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn2.b16")]
42502+
fn _svtrn2_b16(op1: svbool_t, op2: svbool_t) -> svbool_t;
4251642503
}
42517-
unsafe { _svtrn2_b16(op1.sve_into(), op2.sve_into()).sve_into() }
42504+
unsafe { _svtrn2_b16(op1.sve_into(), op2.sve_into()) }
4251842505
}
4251942506
#[doc = "Interleave odd elements from two inputs"]
4252042507
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn2_b32)"]
@@ -42524,10 +42511,10 @@ pub fn svtrn2_b16(op1: svbool_t, op2: svbool_t) -> svbool_t {
4252442511
#[cfg_attr(test, assert_instr(trn2))]
4252542512
pub fn svtrn2_b32(op1: svbool_t, op2: svbool_t) -> svbool_t {
4252642513
unsafe extern "unadjusted" {
42527-
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn2.nxv4i1")]
42528-
fn _svtrn2_b32(op1: svbool4_t, op2: svbool4_t) -> svbool4_t;
42514+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn2.b32")]
42515+
fn _svtrn2_b32(op1: svbool_t, op2: svbool_t) -> svbool_t;
4252942516
}
42530-
unsafe { _svtrn2_b32(op1.sve_into(), op2.sve_into()).sve_into() }
42517+
unsafe { _svtrn2_b32(op1.sve_into(), op2.sve_into()) }
4253142518
}
4253242519
#[doc = "Interleave odd elements from two inputs"]
4253342520
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn2_b64)"]
@@ -42537,10 +42524,10 @@ pub fn svtrn2_b32(op1: svbool_t, op2: svbool_t) -> svbool_t {
4253742524
#[cfg_attr(test, assert_instr(trn2))]
4253842525
pub fn svtrn2_b64(op1: svbool_t, op2: svbool_t) -> svbool_t {
4253942526
unsafe extern "unadjusted" {
42540-
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn2.nxv2i1")]
42541-
fn _svtrn2_b64(op1: svbool2_t, op2: svbool2_t) -> svbool2_t;
42527+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn2.b64")]
42528+
fn _svtrn2_b64(op1: svbool_t, op2: svbool_t) -> svbool_t;
4254242529
}
42543-
unsafe { _svtrn2_b64(op1.sve_into(), op2.sve_into()).sve_into() }
42530+
unsafe { _svtrn2_b64(op1.sve_into(), op2.sve_into()) }
4254442531
}
4254542532
#[doc = "Interleave odd elements from two inputs"]
4254642533
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn2[_f32])"]
@@ -42656,6 +42643,19 @@ pub fn svtrn2_u32(op1: svuint32_t, op2: svuint32_t) -> svuint32_t {
4265642643
pub fn svtrn2_u64(op1: svuint64_t, op2: svuint64_t) -> svuint64_t {
4265742644
unsafe { svtrn2_s64(op1.as_signed(), op2.as_signed()).as_unsigned() }
4265842645
}
42646+
#[doc = "Interleave odd elements from two inputs"]
42647+
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn2[_b8])"]
42648+
#[inline]
42649+
#[target_feature(enable = "sve")]
42650+
#[unstable(feature = "stdarch_aarch64_sve", issue = "145052")]
42651+
#[cfg_attr(test, assert_instr(trn2))]
42652+
pub fn svtrn2_b8(op1: svbool_t, op2: svbool_t) -> svbool_t {
42653+
unsafe extern "unadjusted" {
42654+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.sve.trn2.nxv16i1")]
42655+
fn _svtrn2_b8(op1: svbool_t, op2: svbool_t) -> svbool_t;
42656+
}
42657+
unsafe { _svtrn2_b8(op1, op2) }
42658+
}
4265942659
#[doc = "Interleave odd quadwords from two inputs"]
4266042660
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/svtrn2q[_f32])"]
4266142661
#[inline]

library/stdarch/crates/intrinsic-test/src/arm/json_parser.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,14 @@ struct JsonIntrinsic {
5858
_instructions: Option<Vec<Vec<String>>>,
5959
}
6060

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

6866
let parsed = json
6967
.into_iter()
70-
.filter_map(|intr| {
71-
if intr.simd_isa == "Neon" {
72-
Some(json_to_intrinsic(intr).expect("Couldn't parse JSON"))
73-
} else {
74-
None
75-
}
76-
})
68+
.map(|intr| json_to_intrinsic(intr).expect("Couldn't parse JSON"))
7769
.collect();
7870
Ok(parsed)
7971
}
@@ -121,8 +113,14 @@ fn json_to_intrinsic(
121113
}
122114
});
123115

124-
let mut arg =
125-
Argument::<Arm>::new(i, String::from(arg_name), ArmType(arg_ty), constraint);
116+
let is_predicate = arg_name == "pg";
117+
let mut arg = Argument::<Arm>::new(
118+
i,
119+
String::from(arg_name),
120+
ArmType(arg_ty),
121+
constraint,
122+
is_predicate,
123+
);
126124

127125
// The JSON doesn't list immediates as const
128126
let IntrinsicType {

0 commit comments

Comments
 (0)