@@ -185,6 +185,7 @@ fn generate_rust_program(notices: &str, intrinsic: &Intrinsic, target: &str) ->
185
185
format ! (
186
186
r#"{notices}#![feature(simd_ffi)]
187
187
#![feature(link_llvm_intrinsics)]
188
+ #![feature(f16)]
188
189
#![cfg_attr(target_arch = "arm", feature(stdarch_arm_neon_intrinsics))]
189
190
#![cfg_attr(target_arch = "arm", feature(stdarch_aarch32_crc32))]
190
191
#![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) ->
193
194
#![cfg_attr(any(target_arch = "aarch64", target_arch = "arm64ec"), feature(stdarch_neon_sha3))]
194
195
#![cfg_attr(any(target_arch = "aarch64", target_arch = "arm64ec"), feature(stdarch_neon_sm4))]
195
196
#![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))]
196
198
#![allow(non_upper_case_globals)]
197
199
use core_arch::arch::{target_arch}::*;
198
200
@@ -227,9 +229,9 @@ fn compile_c(
227
229
) -> bool {
228
230
let flags = std:: env:: var ( "CPPFLAGS" ) . unwrap_or ( "" . into ( ) ) ;
229
231
let arch_flags = if target. contains ( "v7" ) {
230
- "-march=armv8.6-a+crypto+crc+dotprod"
232
+ "-march=armv8.6-a+crypto+crc+dotprod+fp16 "
231
233
} else {
232
- "-march=armv8.6-a+crypto+sha3+crc+dotprod"
234
+ "-march=armv8.6-a+crypto+sha3+crc+dotprod+fp16 "
233
235
} ;
234
236
235
237
let intrinsic_name = & intrinsic. name ;
@@ -324,7 +326,12 @@ fn build_c(
324
326
let c_filename = format ! ( r#"c_programs/{}.cpp"# , i. name) ;
325
327
let mut file = File :: create ( & c_filename) . unwrap ( ) ;
326
328
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
+ ) ;
328
335
file. write_all ( c_code. into_bytes ( ) . as_slice ( ) ) . unwrap ( ) ;
329
336
match compiler {
330
337
None => true ,
@@ -512,13 +519,7 @@ fn main() {
512
519
// Not sure how we would compare intrinsic that returns void.
513
520
. filter ( |i| i. results . kind ( ) != TypeKind :: Void )
514
521
. filter ( |i| i. results . kind ( ) != TypeKind :: BFloat )
515
- . filter ( |i| !( i. results . kind ( ) == TypeKind :: Float && i. results . inner_size ( ) == 16 ) )
516
522
. 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
- } )
522
523
// Skip pointers for now, we would probably need to look at the return
523
524
// type to work out how many elements we need to point to.
524
525
. filter ( |i| !i. arguments . iter ( ) . any ( |a| a. is_ptr ( ) ) )
0 commit comments