expose new floating point intrinsics
copysign, ring, nearbyint, round
This commit is contained in:
parent
cd59a7c464
commit
4533432612
4 changed files with 69 additions and 23 deletions
|
@ -2797,6 +2797,9 @@ pub fn declare_intrinsics(llmod: ModuleRef) -> HashMap<&'static str, ValueRef> {
|
|||
|
||||
ifn!(intrinsics, "llvm.fabs.f32", [Type::f32()], Type::f32());
|
||||
ifn!(intrinsics, "llvm.fabs.f64", [Type::f64()], Type::f64());
|
||||
ifn!(intrinsics, "llvm.copysign.f32", [Type::f32()], Type::f32());
|
||||
ifn!(intrinsics, "llvm.copysign.f64", [Type::f64()], Type::f64());
|
||||
|
||||
ifn!(intrinsics, "llvm.floor.f32",[Type::f32()], Type::f32());
|
||||
ifn!(intrinsics, "llvm.floor.f64",[Type::f64()], Type::f64());
|
||||
ifn!(intrinsics, "llvm.ceil.f32", [Type::f32()], Type::f32());
|
||||
|
@ -2804,6 +2807,13 @@ pub fn declare_intrinsics(llmod: ModuleRef) -> HashMap<&'static str, ValueRef> {
|
|||
ifn!(intrinsics, "llvm.trunc.f32",[Type::f32()], Type::f32());
|
||||
ifn!(intrinsics, "llvm.trunc.f64",[Type::f64()], Type::f64());
|
||||
|
||||
ifn!(intrinsics, "llvm.rint.f32",[Type::f64()], Type::f64());
|
||||
ifn!(intrinsics, "llvm.rint.f64",[Type::f64()], Type::f64());
|
||||
ifn!(intrinsics, "llvm.nearbyint.f32",[Type::f64()], Type::f64());
|
||||
ifn!(intrinsics, "llvm.nearbyint.f64",[Type::f64()], Type::f64());
|
||||
ifn!(intrinsics, "llvm.round.f32",[Type::f64()], Type::f64());
|
||||
ifn!(intrinsics, "llvm.round.f64",[Type::f64()], Type::f64());
|
||||
|
||||
ifn!(intrinsics, "llvm.ctpop.i8", [Type::i8()], Type::i8());
|
||||
ifn!(intrinsics, "llvm.ctpop.i16",[Type::i16()], Type::i16());
|
||||
ifn!(intrinsics, "llvm.ctpop.i32",[Type::i32()], Type::i32());
|
||||
|
|
|
@ -460,12 +460,20 @@ pub fn trans_intrinsic(ccx: @mut CrateContext,
|
|||
"fmaf64" => simple_llvm_intrinsic(bcx, "llvm.fma.f64", 3),
|
||||
"fabsf32" => simple_llvm_intrinsic(bcx, "llvm.fabs.f32", 1),
|
||||
"fabsf64" => simple_llvm_intrinsic(bcx, "llvm.fabs.f64", 1),
|
||||
"copysignf32" => simple_llvm_intrinsic(bcx, "llvm.copysign.f32", 1),
|
||||
"copysignf64" => simple_llvm_intrinsic(bcx, "llvm.copysign.f64", 1),
|
||||
"floorf32" => simple_llvm_intrinsic(bcx, "llvm.floor.f32", 1),
|
||||
"floorf64" => simple_llvm_intrinsic(bcx, "llvm.floor.f64", 1),
|
||||
"ceilf32" => simple_llvm_intrinsic(bcx, "llvm.ceil.f32", 1),
|
||||
"ceilf64" => simple_llvm_intrinsic(bcx, "llvm.ceil.f64", 1),
|
||||
"truncf32" => simple_llvm_intrinsic(bcx, "llvm.trunc.f32", 1),
|
||||
"truncf64" => simple_llvm_intrinsic(bcx, "llvm.trunc.f64", 1),
|
||||
"rintf64" => simple_llvm_intrinsic(bcx, "llvm.rint.f64", 1),
|
||||
"rintf32" => simple_llvm_intrinsic(bcx, "llvm.rint.f32", 1),
|
||||
"nearbyintf32" => simple_llvm_intrinsic(bcx, "llvm.nearbyint.f64", 1),
|
||||
"nearbyintf64" => simple_llvm_intrinsic(bcx, "llvm.nearbyint.f32", 1),
|
||||
"roundf32" => simple_llvm_intrinsic(bcx, "llvm.round.f64", 1),
|
||||
"roundf64" => simple_llvm_intrinsic(bcx, "llvm.round.f32", 1),
|
||||
"ctpop8" => simple_llvm_intrinsic(bcx, "llvm.ctpop.i8", 1),
|
||||
"ctpop16" => simple_llvm_intrinsic(bcx, "llvm.ctpop.i16", 1),
|
||||
"ctpop32" => simple_llvm_intrinsic(bcx, "llvm.ctpop.i32", 1),
|
||||
|
|
|
@ -3807,29 +3807,37 @@ pub fn check_intrinsic_type(ccx: @mut CrateCtxt, it: @ast::foreign_item) {
|
|||
~[ ty::mk_f64(), ty::mk_f64(), ty::mk_f64() ],
|
||||
ty::mk_f64())
|
||||
}
|
||||
"fabsf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"fabsf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"floorf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"floorf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"ceilf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"ceilf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"truncf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"truncf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"ctpop8" => (0, ~[ ty::mk_i8() ], ty::mk_i8()),
|
||||
"ctpop16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()),
|
||||
"ctpop32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()),
|
||||
"ctpop64" => (0, ~[ ty::mk_i64() ], ty::mk_i64()),
|
||||
"ctlz8" => (0, ~[ ty::mk_i8() ], ty::mk_i8()),
|
||||
"ctlz16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()),
|
||||
"ctlz32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()),
|
||||
"ctlz64" => (0, ~[ ty::mk_i64() ], ty::mk_i64()),
|
||||
"cttz8" => (0, ~[ ty::mk_i8() ], ty::mk_i8()),
|
||||
"cttz16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()),
|
||||
"cttz32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()),
|
||||
"cttz64" => (0, ~[ ty::mk_i64() ], ty::mk_i64()),
|
||||
"bswap16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()),
|
||||
"bswap32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()),
|
||||
"bswap64" => (0, ~[ ty::mk_i64() ], ty::mk_i64()),
|
||||
"fabsf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"fabsf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"copysignf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"copysignf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"floorf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"floorf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"ceilf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"ceilf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"truncf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"truncf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"rintf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"rintf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"nearbyintf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"nearbyintf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"roundf32" => (0, ~[ ty::mk_f32() ], ty::mk_f32()),
|
||||
"roundf64" => (0, ~[ ty::mk_f64() ], ty::mk_f64()),
|
||||
"ctpop8" => (0, ~[ ty::mk_i8() ], ty::mk_i8()),
|
||||
"ctpop16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()),
|
||||
"ctpop32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()),
|
||||
"ctpop64" => (0, ~[ ty::mk_i64() ], ty::mk_i64()),
|
||||
"ctlz8" => (0, ~[ ty::mk_i8() ], ty::mk_i8()),
|
||||
"ctlz16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()),
|
||||
"ctlz32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()),
|
||||
"ctlz64" => (0, ~[ ty::mk_i64() ], ty::mk_i64()),
|
||||
"cttz8" => (0, ~[ ty::mk_i8() ], ty::mk_i8()),
|
||||
"cttz16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()),
|
||||
"cttz32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()),
|
||||
"cttz64" => (0, ~[ ty::mk_i64() ], ty::mk_i64()),
|
||||
"bswap16" => (0, ~[ ty::mk_i16() ], ty::mk_i16()),
|
||||
"bswap32" => (0, ~[ ty::mk_i32() ], ty::mk_i32()),
|
||||
"bswap64" => (0, ~[ ty::mk_i64() ], ty::mk_i64()),
|
||||
|
||||
"i8_add_with_overflow" | "i8_sub_with_overflow" | "i8_mul_with_overflow" =>
|
||||
(0, ~[ty::mk_i8(), ty::mk_i8()],
|
||||
|
|
|
@ -413,6 +413,11 @@ extern "rust-intrinsic" {
|
|||
pub fn fabsf32(x: f32) -> f32;
|
||||
pub fn fabsf64(x: f64) -> f64;
|
||||
|
||||
#[cfg(not(stage0))]
|
||||
pub fn copysignf32(x: f32) -> f32;
|
||||
#[cfg(not(stage0))]
|
||||
pub fn copysignf64(x: f64) -> f64;
|
||||
|
||||
pub fn floorf32(x: f32) -> f32;
|
||||
pub fn floorf64(x: f64) -> f64;
|
||||
|
||||
|
@ -422,6 +427,21 @@ extern "rust-intrinsic" {
|
|||
pub fn truncf32(x: f32) -> f32;
|
||||
pub fn truncf64(x: f64) -> f64;
|
||||
|
||||
#[cfg(not(stage0))]
|
||||
pub fn rintf32(x: f32) -> f32;
|
||||
#[cfg(not(stage0))]
|
||||
pub fn rintf64(x: f64) -> f64;
|
||||
|
||||
#[cfg(not(stage0))]
|
||||
pub fn nearbyintf32(x: f32) -> f32;
|
||||
#[cfg(not(stage0))]
|
||||
pub fn nearbyintf64(x: f64) -> f64;
|
||||
|
||||
#[cfg(not(stage0))]
|
||||
pub fn roundf32(x: f32) -> f32;
|
||||
#[cfg(not(stage0))]
|
||||
pub fn roundf64(x: f64) -> f64;
|
||||
|
||||
pub fn ctpop8(x: i8) -> i8;
|
||||
pub fn ctpop16(x: i16) -> i16;
|
||||
pub fn ctpop32(x: i32) -> i32;
|
||||
|
|
Loading…
Add table
Reference in a new issue