2
2
// based on:
3
3
// http://shootout.alioth.debian.org/u32/benchmark.php?test=nbody&lang=java
4
4
5
+ native "llvm" mod llvm {
6
+ fn sqrt( float n) -> float = "sqrt.f64" ;
7
+ }
8
+
5
9
fn main ( ) {
6
10
7
11
let vec[ int] inputs = vec (
@@ -26,11 +30,6 @@ fn main() {
26
30
}
27
31
}
28
32
29
- // making a native call to sqrt
30
- native "rust" mod rustrt {
31
- fn squareroot ( & float input, & mutable float output) ;
32
- }
33
-
34
33
// Body.props is a record of floats, so
35
34
// vec[Body.props] is a vector of records of floats
36
35
@@ -79,11 +78,7 @@ mod NBodySystem {
79
78
80
79
i = 0 ;
81
80
while ( i < 5 ) {
82
-
83
- bodies. ( i) . x += dt * bodies. ( i) . vx ;
84
- bodies. ( i) . y += dt * bodies. ( i) . vy ;
85
- bodies. ( i) . z += dt * bodies. ( i) . vz ;
86
-
81
+ move ( bodies. ( i) , dt) ;
87
82
i += 1 ;
88
83
}
89
84
}
@@ -95,8 +90,7 @@ mod NBodySystem {
95
90
96
91
let float dSquared = dx * dx + dy * dy + dz * dz;
97
92
98
- let float distance;
99
- rustrt. squareroot ( dSquared, distance) ;
93
+ let float distance = llvm. sqrt ( dSquared) ;
100
94
let float mag = dt / ( dSquared * distance) ;
101
95
102
96
bi. vx -= dx * bj. mass * mag;
@@ -108,6 +102,12 @@ mod NBodySystem {
108
102
bj. vz += dz * bi. mass * mag;
109
103
}
110
104
105
+ fn move ( & Body . props b , float dt) {
106
+ b. x += dt * b. vx ;
107
+ b. y += dt * b. vy ;
108
+ b. z += dt * b. vz ;
109
+ }
110
+
111
111
fn energy ( vec[ Body . props] bodies ) -> float {
112
112
let float dx;
113
113
let float dy;
@@ -128,7 +128,7 @@ mod NBodySystem {
128
128
dy = bodies. ( i) . y - bodies. ( j) . y ;
129
129
dz = bodies. ( i) . z - bodies. ( j) . z ;
130
130
131
- rustrt . squareroot ( dx* dx + dy* dy + dz* dz, distance ) ;
131
+ distance = llvm . sqrt ( dx* dx + dy* dy + dz* dz) ;
132
132
e -= ( bodies. ( i ) . mass * bodies. ( j) . mass ) / distance;
133
133
134
134
j += 1 ;
0 commit comments