about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-10-21 08:56:28 -0700
committerbors <bors@rust-lang.org>2013-10-21 08:56:28 -0700
commitebb9b461914347950592f9a2d4e53e324f2f1238 (patch)
treef4f06e7e9b31dc7c3a212e58587d2af329a78954
parent6e6981c3eb92ab87342ae9ccb3ead879fb7cbdb0 (diff)
parent45334326127285e9442ae1c3e9f4ba9c428ec3c6 (diff)
downloadrust-ebb9b461914347950592f9a2d4e53e324f2f1238.tar.gz
rust-ebb9b461914347950592f9a2d4e53e324f2f1238.zip
auto merge of #9986 : thestinger/rust/float, r=cmr
copysign, ring, nearbyint, round
-rw-r--r--src/librustc/middle/trans/base.rs10
-rw-r--r--src/librustc/middle/trans/intrinsic.rs8
-rw-r--r--src/librustc/middle/typeck/check/mod.rs54
-rw-r--r--src/libstd/unstable/intrinsics.rs20
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;