From 45334326127285e9442ae1c3e9f4ba9c428ec3c6 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Mon, 21 Oct 2013 02:21:39 -0400 Subject: [PATCH] expose new floating point intrinsics copysign, ring, nearbyint, round --- src/librustc/middle/trans/base.rs | 10 +++++ src/librustc/middle/trans/intrinsic.rs | 8 ++++ src/librustc/middle/typeck/check/mod.rs | 54 ++++++++++++++----------- src/libstd/unstable/intrinsics.rs | 20 +++++++++ 4 files changed, 69 insertions(+), 23 deletions(-) diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index c6cc3092c11..f6a70a373c6 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -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()); diff --git a/src/librustc/middle/trans/intrinsic.rs b/src/librustc/middle/trans/intrinsic.rs index 1b9ed862875..a37ec29973a 100644 --- a/src/librustc/middle/trans/intrinsic.rs +++ b/src/librustc/middle/trans/intrinsic.rs @@ -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), diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index 2c60c34c8a7..fce24e15bdc 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -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()], diff --git a/src/libstd/unstable/intrinsics.rs b/src/libstd/unstable/intrinsics.rs index 3a3c6e6538c..8959d591c37 100644 --- a/src/libstd/unstable/intrinsics.rs +++ b/src/libstd/unstable/intrinsics.rs @@ -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;