Skip to content

Commit cd98ae4

Browse files
mrkajetanpAmanieu
authored andcommitted
intrinsic-test: Support testing f16 intrinsics
1 parent e302c34 commit cd98ae4

File tree

4 files changed

+18
-11
lines changed

4 files changed

+18
-11
lines changed

Diff for: crates/intrinsic-test/missing_aarch64.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,7 @@ vrnd64zq_f64
2323
vrnd32x_f64
2424
vrnd32z_f64
2525
vrnd64x_f64
26-
vrnd64z_f64
26+
vrnd64z_f64
27+
28+
# Broken in Clang
29+
vcvth_s16_f16

Diff for: crates/intrinsic-test/src/intrinsic.rs

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ impl Intrinsic {
6262
format!(
6363
"{promote}cast<{cast}>(__return_value)",
6464
cast = match self.results.kind() {
65+
TypeKind::Float if self.results.inner_size() == 16 => "float16_t".to_string(),
6566
TypeKind::Float if self.results.inner_size() == 32 => "float".to_string(),
6667
TypeKind::Float if self.results.inner_size() == 64 => "double".to_string(),
6768
TypeKind::Int => format!("int{}_t", self.results.inner_size()),

Diff for: crates/intrinsic-test/src/main.rs

+10-9
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ fn generate_rust_program(notices: &str, intrinsic: &Intrinsic, target: &str) ->
185185
format!(
186186
r#"{notices}#![feature(simd_ffi)]
187187
#![feature(link_llvm_intrinsics)]
188+
#![feature(f16)]
188189
#![cfg_attr(target_arch = "arm", feature(stdarch_arm_neon_intrinsics))]
189190
#![cfg_attr(target_arch = "arm", feature(stdarch_aarch32_crc32))]
190191
#![cfg_attr(any(target_arch = "aarch64", target_arch = "arm64ec"), feature(stdarch_neon_fcma))]
@@ -193,6 +194,7 @@ fn generate_rust_program(notices: &str, intrinsic: &Intrinsic, target: &str) ->
193194
#![cfg_attr(any(target_arch = "aarch64", target_arch = "arm64ec"), feature(stdarch_neon_sha3))]
194195
#![cfg_attr(any(target_arch = "aarch64", target_arch = "arm64ec"), feature(stdarch_neon_sm4))]
195196
#![cfg_attr(any(target_arch = "aarch64", target_arch = "arm64ec"), feature(stdarch_neon_ftts))]
197+
#![cfg_attr(any(target_arch = "aarch64", target_arch = "arm64ec"), feature(stdarch_neon_f16))]
196198
#![allow(non_upper_case_globals)]
197199
use core_arch::arch::{target_arch}::*;
198200
@@ -227,9 +229,9 @@ fn compile_c(
227229
) -> bool {
228230
let flags = std::env::var("CPPFLAGS").unwrap_or("".into());
229231
let arch_flags = if target.contains("v7") {
230-
"-march=armv8.6-a+crypto+crc+dotprod"
232+
"-march=armv8.6-a+crypto+crc+dotprod+fp16"
231233
} else {
232-
"-march=armv8.6-a+crypto+sha3+crc+dotprod"
234+
"-march=armv8.6-a+crypto+sha3+crc+dotprod+fp16"
233235
};
234236

235237
let intrinsic_name = &intrinsic.name;
@@ -324,7 +326,12 @@ fn build_c(
324326
let c_filename = format!(r#"c_programs/{}.cpp"#, i.name);
325327
let mut file = File::create(&c_filename).unwrap();
326328

327-
let c_code = generate_c_program(notices, &["arm_neon.h", "arm_acle.h"], i, target);
329+
let c_code = generate_c_program(
330+
notices,
331+
&["arm_neon.h", "arm_acle.h", "arm_fp16.h"],
332+
i,
333+
target,
334+
);
328335
file.write_all(c_code.into_bytes().as_slice()).unwrap();
329336
match compiler {
330337
None => true,
@@ -512,13 +519,7 @@ fn main() {
512519
// Not sure how we would compare intrinsic that returns void.
513520
.filter(|i| i.results.kind() != TypeKind::Void)
514521
.filter(|i| i.results.kind() != TypeKind::BFloat)
515-
.filter(|i| !(i.results.kind() == TypeKind::Float && i.results.inner_size() == 16))
516522
.filter(|i| !i.arguments.iter().any(|a| a.ty.kind() == TypeKind::BFloat))
517-
.filter(|i| {
518-
!i.arguments
519-
.iter()
520-
.any(|a| a.ty.kind() == TypeKind::Float && a.ty.inner_size() == 16)
521-
})
522523
// Skip pointers for now, we would probably need to look at the return
523524
// type to work out how many elements we need to point to.
524525
.filter(|i| !i.arguments.iter().any(|a| a.is_ptr()))

Diff for: crates/intrinsic-test/src/types.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -348,14 +348,16 @@ impl IntrinsicType {
348348
}
349349
IntrinsicType::Type {
350350
kind: TypeKind::Float,
351-
bit_len: Some(bit_len @ (32 | 64)),
351+
bit_len: Some(bit_len @ (16 | 32 | 64)),
352352
simd_len,
353353
vec_len,
354354
..
355355
} => {
356356
let (prefix, cast_prefix, cast_suffix, suffix) = match (language, bit_len) {
357+
(&Language::Rust, 16) => ("[", "f16::from_bits(", ")", "]"),
357358
(&Language::Rust, 32) => ("[", "f32::from_bits(", ")", "]"),
358359
(&Language::Rust, 64) => ("[", "f64::from_bits(", ")", "]"),
360+
(&Language::C, 16) => ("{", "cast<float16_t, uint16_t>(", ")", "}"),
359361
(&Language::C, 32) => ("{", "cast<float, uint32_t>(", ")", "}"),
360362
(&Language::C, 64) => ("{", "cast<double, uint64_t>(", ")", "}"),
361363
_ => unreachable!(),

0 commit comments

Comments
 (0)