@@ -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)]
197199use 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 ( ) ) )
0 commit comments