From 1cb3ce89dd6bd33201871e914f35aef262c287eb Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Mon, 28 Mar 2011 08:23:33 -0700 Subject: shootout: Hoist out the movement too; switch square root to an LLVM intrinsic --- src/test/bench/shootout/nbody.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'src/test') 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; -- cgit v1.2.3