aboutsummaryrefslogtreecommitdiff
path: root/src/test/bench
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2011-03-28 08:23:33 -0700
committerPatrick Walton <[email protected]>2011-03-28 08:24:58 -0700
commit1cb3ce89dd6bd33201871e914f35aef262c287eb (patch)
tree7dc3d677046eb07ca95ab852f5b193e0c5b0933e /src/test/bench
parentrustc: Add support for calling LLVM intrinsics as native functions (diff)
downloadrust-1cb3ce89dd6bd33201871e914f35aef262c287eb.tar.xz
rust-1cb3ce89dd6bd33201871e914f35aef262c287eb.zip
shootout: Hoist out the movement too; switch square root to an LLVM intrinsic
Diffstat (limited to 'src/test/bench')
-rw-r--r--src/test/bench/shootout/nbody.rs26
1 files changed, 13 insertions, 13 deletions
diff --git a/src/test/bench/shootout/nbody.rs b/src/test/bench/shootout/nbody.rs
index 06f8998a..39c01ee7 100644
--- a/src/test/bench/shootout/nbody.rs
+++ b/src/test/bench/shootout/nbody.rs
@@ -2,6 +2,10 @@
// based on:
// http://shootout.alioth.debian.org/u32/benchmark.php?test=nbody&lang=java
+native "llvm" mod llvm {
+ fn sqrt(float n) -> float = "sqrt.f64";
+}
+
fn main() {
let vec[int] inputs = vec(
@@ -26,11 +30,6 @@ fn main() {
}
}
-// making a native call to sqrt
-native "rust" mod rustrt {
- fn squareroot(&float input, &mutable float output);
-}
-
// Body.props is a record of floats, so
// vec[Body.props] is a vector of records of floats
@@ -79,11 +78,7 @@ mod NBodySystem {
i = 0;
while (i < 5) {
-
- bodies.(i).x += dt * bodies.(i).vx;
- bodies.(i).y += dt * bodies.(i).vy;
- bodies.(i).z += dt * bodies.(i).vz;
-
+ move(bodies.(i), dt);
i += 1;
}
}
@@ -95,8 +90,7 @@ mod NBodySystem {
let float dSquared = dx * dx + dy * dy + dz * dz;
- let float distance;
- rustrt.squareroot(dSquared, distance);
+ let float distance = llvm.sqrt(dSquared);
let float mag = dt / (dSquared * distance);
bi.vx -= dx * bj.mass * mag;
@@ -108,6 +102,12 @@ mod NBodySystem {
bj.vz += dz * bi.mass * mag;
}
+ fn move(&Body.props b, float dt) {
+ b.x += dt * b.vx;
+ b.y += dt * b.vy;
+ b.z += dt * b.vz;
+ }
+
fn energy(vec[Body.props] bodies) -> float {
let float dx;
let float dy;
@@ -128,7 +128,7 @@ mod NBodySystem {
dy = bodies.(i).y - bodies.(j).y;
dz = bodies.(i).z - bodies.(j).z;
- rustrt.squareroot(dx*dx + dy*dy + dz*dz, distance);
+ distance = llvm.sqrt(dx*dx + dy*dy + dz*dz);
e -= (bodies.(i).mass * bodies.(j).mass) / distance;
j += 1;