@@ -29,68 +29,27 @@ 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
-
86
32
pub fn trans_intrinsic ( ccx : @CrateContext ,
87
33
decl : ValueRef ,
88
34
item : & ast:: ForeignItem ,
89
35
path : ast_map:: Path ,
90
36
substs : @param_substs ,
37
+ _attributes : & [ ast:: Attribute ] ,
91
38
ref_id : Option < ast:: NodeId > ) {
92
39
debug ! ( "trans_intrinsic(item.ident={})" , ccx. sess. str_of( item. ident) ) ;
93
40
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
+
94
53
fn with_overflow_instrinsic ( bcx : & Block , name : & ' static str , t : ty:: t ) {
95
54
let first_real_arg = bcx. fcx . arg_pos ( 0 u) ;
96
55
let a = get_param ( bcx. fcx . llfn , first_real_arg) ;
@@ -472,6 +431,48 @@ pub fn trans_intrinsic(ccx: @CrateContext,
472
431
"copy_nonoverlapping_memory" => copy_intrinsic ( bcx, false , substs. tys [ 0 ] ) ,
473
432
"copy_memory" => copy_intrinsic ( bcx, true , substs. tys [ 0 ] ) ,
474
433
"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 ) ,
475
476
"ctlz8" => count_zeros_intrinsic ( bcx, "llvm.ctlz.i8" ) ,
476
477
"ctlz16" => count_zeros_intrinsic ( bcx, "llvm.ctlz.i16" ) ,
477
478
"ctlz32" => count_zeros_intrinsic ( bcx, "llvm.ctlz.i32" ) ,
@@ -480,6 +481,9 @@ pub fn trans_intrinsic(ccx: @CrateContext,
480
481
"cttz16" => count_zeros_intrinsic ( bcx, "llvm.cttz.i16" ) ,
481
482
"cttz32" => count_zeros_intrinsic ( bcx, "llvm.cttz.i32" ) ,
482
483
"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 ) ,
483
487
484
488
"volatile_load" => volatile_load_intrinsic ( bcx) ,
485
489
"volatile_store" => volatile_store_intrinsic ( bcx) ,
0 commit comments