@@ -29,27 +29,68 @@ use util::ppaux::ty_to_str;
29
29
use middle:: trans:: machine:: llsize_of;
30
30
use middle:: trans:: type_:: Type ;
31
31
32
+ pub fn get_simple_intrinsic ( ccx : @CrateContext , item : & ast:: ForeignItem ) -> Option < ValueRef > {
33
+ let nm = ccx. sess . str_of ( item. ident ) ;
34
+ let name = nm. as_slice ( ) ;
35
+
36
+ match name {
37
+ "sqrtf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.sqrt.f32" ) ) ) ,
38
+ "sqrtf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.sqrt.f64" ) ) ) ,
39
+ "powif32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.powi.f32" ) ) ) ,
40
+ "powif64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.powi.f64" ) ) ) ,
41
+ "sinf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.sin.f32" ) ) ) ,
42
+ "sinf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.sin.f64" ) ) ) ,
43
+ "cosf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.cos.f32" ) ) ) ,
44
+ "cosf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.cos.f64" ) ) ) ,
45
+ "powf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.pow.f32" ) ) ) ,
46
+ "powf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.pow.f64" ) ) ) ,
47
+ "expf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.exp.f32" ) ) ) ,
48
+ "expf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.exp.f64" ) ) ) ,
49
+ "exp2f32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.exp2.f32" ) ) ) ,
50
+ "exp2f64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.exp2.f64" ) ) ) ,
51
+ "logf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.log.f32" ) ) ) ,
52
+ "logf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.log.f64" ) ) ) ,
53
+ "log10f32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.log10.f32" ) ) ) ,
54
+ "log10f64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.log10.f64" ) ) ) ,
55
+ "log2f32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.log2.f32" ) ) ) ,
56
+ "log2f64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.log2.f64" ) ) ) ,
57
+ "fmaf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.fma.f32" ) ) ) ,
58
+ "fmaf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.fma.f64" ) ) ) ,
59
+ "fabsf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.fabs.f32" ) ) ) ,
60
+ "fabsf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.fabs.f64" ) ) ) ,
61
+ "copysignf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.copysign.f32" ) ) ) ,
62
+ "copysignf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.copysign.f64" ) ) ) ,
63
+ "floorf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.floor.f32" ) ) ) ,
64
+ "floorf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.floor.f64" ) ) ) ,
65
+ "ceilf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.ceil.f32" ) ) ) ,
66
+ "ceilf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.ceil.f64" ) ) ) ,
67
+ "truncf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.trunc.f32" ) ) ) ,
68
+ "truncf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.trunc.f64" ) ) ) ,
69
+ "rintf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.rint.f32" ) ) ) ,
70
+ "rintf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.rint.f64" ) ) ) ,
71
+ "nearbyintf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.nearbyint.f32" ) ) ) ,
72
+ "nearbyintf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.nearbyint.f64" ) ) ) ,
73
+ "roundf32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.round.f32" ) ) ) ,
74
+ "roundf64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.round.f64" ) ) ) ,
75
+ "ctpop8" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.ctpop.i8" ) ) ) ,
76
+ "ctpop16" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.ctpop.i16" ) ) ) ,
77
+ "ctpop32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.ctpop.i32" ) ) ) ,
78
+ "ctpop64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.ctpop.i64" ) ) ) ,
79
+ "bswap16" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.bswap.i16" ) ) ) ,
80
+ "bswap32" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.bswap.i32" ) ) ) ,
81
+ "bswap64" => Some ( ccx. intrinsics . get_copy ( & ( "llvm.bswap.i64" ) ) ) ,
82
+ _ => None
83
+ }
84
+ }
85
+
32
86
pub fn trans_intrinsic ( ccx : @CrateContext ,
33
87
decl : ValueRef ,
34
88
item : & ast:: ForeignItem ,
35
89
path : ast_map:: Path ,
36
90
substs : @param_substs ,
37
- _attributes : & [ ast:: Attribute ] ,
38
91
ref_id : Option < ast:: NodeId > ) {
39
92
debug ! ( "trans_intrinsic(item.ident={})" , ccx. sess. str_of( item. ident) ) ;
40
93
41
- fn simple_llvm_intrinsic ( bcx : & Block , name : & ' static str , num_args : uint ) {
42
- assert ! ( num_args <= 4 ) ;
43
- let mut args = [ 0 as ValueRef , ..4 ] ;
44
- let first_real_arg = bcx. fcx . arg_pos ( 0 u) ;
45
- for i in range ( 0 u, num_args) {
46
- args[ i] = get_param ( bcx. fcx . llfn , first_real_arg + i) ;
47
- }
48
- let llfn = bcx. ccx ( ) . intrinsics . get_copy ( & name) ;
49
- let llcall = Call ( bcx, llfn, args. slice ( 0 , num_args) , [ ] ) ;
50
- Ret ( bcx, llcall) ;
51
- }
52
-
53
94
fn with_overflow_instrinsic ( bcx : & Block , name : & ' static str , t : ty:: t ) {
54
95
let first_real_arg = bcx. fcx . arg_pos ( 0 u) ;
55
96
let a = get_param ( bcx. fcx . llfn , first_real_arg) ;
@@ -431,48 +472,6 @@ pub fn trans_intrinsic(ccx: @CrateContext,
431
472
"copy_nonoverlapping_memory" => copy_intrinsic ( bcx, false , substs. tys [ 0 ] ) ,
432
473
"copy_memory" => copy_intrinsic ( bcx, true , substs. tys [ 0 ] ) ,
433
474
"set_memory" => memset_intrinsic ( bcx, substs. tys [ 0 ] ) ,
434
- "sqrtf32" => simple_llvm_intrinsic ( bcx, "llvm.sqrt.f32" , 1 ) ,
435
- "sqrtf64" => simple_llvm_intrinsic ( bcx, "llvm.sqrt.f64" , 1 ) ,
436
- "powif32" => simple_llvm_intrinsic ( bcx, "llvm.powi.f32" , 2 ) ,
437
- "powif64" => simple_llvm_intrinsic ( bcx, "llvm.powi.f64" , 2 ) ,
438
- "sinf32" => simple_llvm_intrinsic ( bcx, "llvm.sin.f32" , 1 ) ,
439
- "sinf64" => simple_llvm_intrinsic ( bcx, "llvm.sin.f64" , 1 ) ,
440
- "cosf32" => simple_llvm_intrinsic ( bcx, "llvm.cos.f32" , 1 ) ,
441
- "cosf64" => simple_llvm_intrinsic ( bcx, "llvm.cos.f64" , 1 ) ,
442
- "powf32" => simple_llvm_intrinsic ( bcx, "llvm.pow.f32" , 2 ) ,
443
- "powf64" => simple_llvm_intrinsic ( bcx, "llvm.pow.f64" , 2 ) ,
444
- "expf32" => simple_llvm_intrinsic ( bcx, "llvm.exp.f32" , 1 ) ,
445
- "expf64" => simple_llvm_intrinsic ( bcx, "llvm.exp.f64" , 1 ) ,
446
- "exp2f32" => simple_llvm_intrinsic ( bcx, "llvm.exp2.f32" , 1 ) ,
447
- "exp2f64" => simple_llvm_intrinsic ( bcx, "llvm.exp2.f64" , 1 ) ,
448
- "logf32" => simple_llvm_intrinsic ( bcx, "llvm.log.f32" , 1 ) ,
449
- "logf64" => simple_llvm_intrinsic ( bcx, "llvm.log.f64" , 1 ) ,
450
- "log10f32" => simple_llvm_intrinsic ( bcx, "llvm.log10.f32" , 1 ) ,
451
- "log10f64" => simple_llvm_intrinsic ( bcx, "llvm.log10.f64" , 1 ) ,
452
- "log2f32" => simple_llvm_intrinsic ( bcx, "llvm.log2.f32" , 1 ) ,
453
- "log2f64" => simple_llvm_intrinsic ( bcx, "llvm.log2.f64" , 1 ) ,
454
- "fmaf32" => simple_llvm_intrinsic ( bcx, "llvm.fma.f32" , 3 ) ,
455
- "fmaf64" => simple_llvm_intrinsic ( bcx, "llvm.fma.f64" , 3 ) ,
456
- "fabsf32" => simple_llvm_intrinsic ( bcx, "llvm.fabs.f32" , 1 ) ,
457
- "fabsf64" => simple_llvm_intrinsic ( bcx, "llvm.fabs.f64" , 1 ) ,
458
- "copysignf32" => simple_llvm_intrinsic ( bcx, "llvm.copysign.f32" , 2 ) ,
459
- "copysignf64" => simple_llvm_intrinsic ( bcx, "llvm.copysign.f64" , 2 ) ,
460
- "floorf32" => simple_llvm_intrinsic ( bcx, "llvm.floor.f32" , 1 ) ,
461
- "floorf64" => simple_llvm_intrinsic ( bcx, "llvm.floor.f64" , 1 ) ,
462
- "ceilf32" => simple_llvm_intrinsic ( bcx, "llvm.ceil.f32" , 1 ) ,
463
- "ceilf64" => simple_llvm_intrinsic ( bcx, "llvm.ceil.f64" , 1 ) ,
464
- "truncf32" => simple_llvm_intrinsic ( bcx, "llvm.trunc.f32" , 1 ) ,
465
- "truncf64" => simple_llvm_intrinsic ( bcx, "llvm.trunc.f64" , 1 ) ,
466
- "rintf32" => simple_llvm_intrinsic ( bcx, "llvm.rint.f32" , 1 ) ,
467
- "rintf64" => simple_llvm_intrinsic ( bcx, "llvm.rint.f64" , 1 ) ,
468
- "nearbyintf32" => simple_llvm_intrinsic ( bcx, "llvm.nearbyint.f32" , 1 ) ,
469
- "nearbyintf64" => simple_llvm_intrinsic ( bcx, "llvm.nearbyint.f64" , 1 ) ,
470
- "roundf32" => simple_llvm_intrinsic ( bcx, "llvm.round.f32" , 1 ) ,
471
- "roundf64" => simple_llvm_intrinsic ( bcx, "llvm.round.f64" , 1 ) ,
472
- "ctpop8" => simple_llvm_intrinsic ( bcx, "llvm.ctpop.i8" , 1 ) ,
473
- "ctpop16" => simple_llvm_intrinsic ( bcx, "llvm.ctpop.i16" , 1 ) ,
474
- "ctpop32" => simple_llvm_intrinsic ( bcx, "llvm.ctpop.i32" , 1 ) ,
475
- "ctpop64" => simple_llvm_intrinsic ( bcx, "llvm.ctpop.i64" , 1 ) ,
476
475
"ctlz8" => count_zeros_intrinsic ( bcx, "llvm.ctlz.i8" ) ,
477
476
"ctlz16" => count_zeros_intrinsic ( bcx, "llvm.ctlz.i16" ) ,
478
477
"ctlz32" => count_zeros_intrinsic ( bcx, "llvm.ctlz.i32" ) ,
@@ -481,9 +480,6 @@ pub fn trans_intrinsic(ccx: @CrateContext,
481
480
"cttz16" => count_zeros_intrinsic ( bcx, "llvm.cttz.i16" ) ,
482
481
"cttz32" => count_zeros_intrinsic ( bcx, "llvm.cttz.i32" ) ,
483
482
"cttz64" => count_zeros_intrinsic ( bcx, "llvm.cttz.i64" ) ,
484
- "bswap16" => simple_llvm_intrinsic ( bcx, "llvm.bswap.i16" , 1 ) ,
485
- "bswap32" => simple_llvm_intrinsic ( bcx, "llvm.bswap.i32" , 1 ) ,
486
- "bswap64" => simple_llvm_intrinsic ( bcx, "llvm.bswap.i64" , 1 ) ,
487
483
488
484
"volatile_load" => volatile_load_intrinsic ( bcx) ,
489
485
"volatile_store" => volatile_store_intrinsic ( bcx) ,
0 commit comments