11use itertools:: Itertools ;
22
3- use crate :: common:: constraint:: Constraint ;
43use crate :: common:: intrinsic:: Intrinsic ;
54
65use super :: intrinsic_helpers:: IntrinsicTypeDefinition ;
76
8- fn generate_c_wrapper < ' a , T : IntrinsicTypeDefinition + ' a > (
9- w : & mut impl std:: io:: Write ,
10- intrinsic : & Intrinsic < T > ,
11- constraints : & mut ( impl Iterator < Item = & ' a Constraint > + Clone ) ,
12- imm_values : & mut Vec < i64 > ,
13- ) -> std:: io:: Result < ( ) > {
14- if let Some ( current) = constraints. next ( ) {
15- for i in current. iter ( ) {
16- imm_values. push ( i) ;
17- generate_c_wrapper ( w, intrinsic, & mut constraints. clone ( ) , imm_values) ?;
18- imm_values. pop ( ) ;
19- }
20- } else {
21- writeln ! (
22- w,
23- "
24- {return_ty} {name}_wrapper{imm_arglist}({arglist}) {{
25- return {name}({params});
26- }}" ,
27- return_ty = intrinsic. results. c_type( ) ,
28- name = intrinsic. name,
29- imm_arglist = imm_values
30- . iter( )
31- . format_with( "" , |i, fmt| fmt( & format_args!( "_{i}" ) ) ) ,
32- arglist = intrinsic. arguments. as_non_imm_arglist_c( ) ,
33- params = intrinsic. arguments. as_call_params_c( & imm_values)
34- ) ?;
35- }
36- Ok ( ( ) )
37- }
38-
39- fn create_c_wrapper < T : IntrinsicTypeDefinition > (
40- w : & mut impl std:: io:: Write ,
41- intrinsic : & Intrinsic < T > ,
42- ) -> std:: io:: Result < ( ) > {
43- generate_c_wrapper (
44- w,
45- intrinsic,
46- & mut intrinsic
47- . arguments
48- . iter ( )
49- . filter_map ( |arg| arg. constraint . as_ref ( ) ) ,
50- & mut Vec :: new ( ) ,
51- )
52- }
53-
547pub fn write_wrapper_c < T : IntrinsicTypeDefinition > (
558 w : & mut impl std:: io:: Write ,
569 notice : & str ,
@@ -59,12 +12,30 @@ pub fn write_wrapper_c<T: IntrinsicTypeDefinition>(
5912) -> std:: io:: Result < ( ) > {
6013 write ! ( w, "{notice}" ) ?;
6114
15+ writeln ! ( w, "#include <stdint.h>" ) ?;
16+ writeln ! ( w, "#include <stddef.h>" ) ?;
17+
6218 for header in platform_headers {
6319 writeln ! ( w, "#include <{header}>" ) ?;
6420 }
6521
6622 for intrinsic in intrinsics {
67- create_c_wrapper ( w, intrinsic) ?;
23+ intrinsic. iter_specializations ( |imm_values| {
24+ writeln ! (
25+ w,
26+ "
27+ {return_ty} {name}_wrapper{imm_arglist}({arglist}) {{
28+ return {name}({params});
29+ }}" ,
30+ return_ty = intrinsic. results. c_type( ) ,
31+ name = intrinsic. name,
32+ imm_arglist = imm_values
33+ . iter( )
34+ . format_with( "" , |i, fmt| fmt( & format_args!( "_{i}" ) ) ) ,
35+ arglist = intrinsic. arguments. as_non_imm_arglist_c( ) ,
36+ params = intrinsic. arguments. as_call_params_c( & imm_values)
37+ )
38+ } ) ?;
6839 }
6940
7041 Ok ( ( ) )
0 commit comments