summaryrefslogtreecommitdiff
path: root/BenchmarkFramework/app/src/main/java/art_benchmarks/stanford/Oscar.java
diff options
context:
space:
mode:
Diffstat (limited to 'BenchmarkFramework/app/src/main/java/art_benchmarks/stanford/Oscar.java')
-rw-r--r--BenchmarkFramework/app/src/main/java/art_benchmarks/stanford/Oscar.java191
1 files changed, 191 insertions, 0 deletions
diff --git a/BenchmarkFramework/app/src/main/java/art_benchmarks/stanford/Oscar.java b/BenchmarkFramework/app/src/main/java/art_benchmarks/stanford/Oscar.java
new file mode 100644
index 0000000..14309f3
--- /dev/null
+++ b/BenchmarkFramework/app/src/main/java/art_benchmarks/stanford/Oscar.java
@@ -0,0 +1,191 @@
+/* Copied from https://llvm.org/svn/llvm-project/test-suite/tags/RELEASE_14/SingleSource/Benchmarks
+ * License: LLVM Release License. See Notice file
+ */
+
+package art_benchmarks.stanford;
+
+public class Oscar {
+
+ private static final int fftsize = 256;
+ private static final int fftsize2 = 129;
+
+ class Complex {
+ float rp;
+ float ip;
+ }
+
+ private Complex[] z = new Complex [fftsize + 1];
+ private Complex[] w = new Complex [fftsize + 1];
+ private Complex[] e = new Complex [fftsize2 + 1];
+ private float zr;
+ private float zi;
+ private float[] h = new float[26];
+
+ private long seed; /* converted to long for 16 bit WR*/
+
+ public Oscar() {
+ for (int i = 0; i < z.length; i++) z[i] = new Complex();
+ for (int i = 0; i < e.length; i++) e[i] = new Complex();
+ for (int i = 0; i < w.length; i++) w[i] = new Complex();
+ }
+
+// CHECKSTYLE.OFF: .*
+float Cos (float x) {
+/* computes cos of x (x in radians) by an expansion */
+int i, factor;
+float result, power;
+
+ result = 1.0f;
+ factor = 1;
+ power = x;
+ for ( i = 2; i <= 10; i++ ) {
+ factor = factor * i; power = power*x;
+ if ( (i & 1) == 0 ) {
+ if ( (i & 3) == 0 ) result = result + power/factor;
+ else result = result - power/factor;
+ }
+ }
+ return (result);
+}
+
+int Min0( int arg1, int arg2) {
+ if ( arg1 < arg2 ) return (arg1);
+ else return (arg2);
+}
+
+int Uniform11(int iy) {
+ return (4855 * iy + 1731) & 8191;
+} /* uniform */
+
+void Exptab(int n, Complex e[]) { /* exptab */
+ float theta, divisor;
+ int i, j, k, l, m;
+
+ theta = 3.1415926536f;
+ divisor = 4.0f;
+ for ( i=1; i <= 25; i++ ) {
+ h[i] = 1/(2*Cos( theta/divisor ));
+ divisor = divisor + divisor;
+ }
+
+ m = n / 2 ;
+ l = m / 2 ;
+ j = 1 ;
+ e[1].rp = 1.0f;
+ e[1].ip = 0.0f;
+ e[l+1].rp = 0.0f;
+ e[l+1].ip = 1.0f;
+ e[m+1].rp = -1.0f;
+ e[m+1].ip = 0.0f;
+
+ do {
+ i = l / 2 ;
+ k = i ;
+
+ do {
+ e[k+1].rp = h[j]*(e[k+i+1].rp+e[k-i+1].rp) ;
+ e[k+1].ip = h[j]*(e[k+i+1].ip+e[k-i+1].ip) ;
+ k = k+l ;
+ } while ( k <= m );
+
+ j = Min0( j+1, 25);
+ l = i ;
+ } while ( l > 1 );
+
+} /* exptab */
+
+void Fft( int n, Complex z[], Complex w[], Complex e[], float sqrinv) {
+ int i, j, k, l, m, index;
+ m = n / 2 ;
+ l = 1 ;
+
+ do {
+ k = 0 ;
+ j = l ;
+ i = 1 ;
+
+ do {
+
+ do {
+ w[i+k].rp = z[i].rp+z[m+i].rp ;
+ w[i+k].ip = z[i].ip+z[m+i].ip ;
+ w[i+j].rp = e[k+1].rp*(z[i].rp-z[i+m].rp)
+ -e[k+1].ip*(z[i].ip-z[i+m].ip) ;
+ w[i+j].ip = e[k+1].rp*(z[i].ip-z[i+m].ip)
+ +e[k+1].ip*(z[i].rp-z[i+m].rp) ;
+ i = i+1 ;
+ } while ( i <= j );
+
+ k = j ;
+ j = k+l ;
+ } while ( j <= m );
+
+ /*z = w ;*/ index = 1;
+ do {
+ z[index].rp = w[index].rp;
+ z[index].ip = w[index].ip;
+ index = index+1;
+ } while ( index <= n );
+ l = l+l ;
+ } while ( l <= m );
+
+ for ( i = 1; i <= n; i++ ){
+ z[i].rp = sqrinv*z[i].rp ;
+ z[i].ip = -sqrinv*z[i].ip;
+ }
+
+}
+
+void Oscar() { /* oscar */
+ int i;
+ Exptab(fftsize,e) ;
+ seed = 5767 ;
+ for ( i = 1; i <= fftsize; i++ ) {
+ seed = Uniform11( (int)seed ); /* typecast seed for 16 bit WR*/
+ zr = seed / 8192.0f;
+ seed = Uniform11( (int)seed ); /* typecast seed for 16 bit WR*/
+ zi = seed / 8192.0f;
+ z[i].rp = 20.0f*zr - 10.0f;
+ z[i].ip = 20.0f*zi - 10.0f;
+ }
+ for ( i = 1; i <= 20; i++ ) {
+ Fft(fftsize,z,w,e,0.0625f) ;
+ }
+} /* oscar */
+ // CHECKSTYLE.ON: .*
+
+ public void timeOscar(int iters) {
+ for (int i = 0; i < iters; i++) {
+ Oscar();
+ }
+ }
+
+ public static boolean verify_Oscar() {
+ Oscar obj = new Oscar();
+ obj.timeOscar(1);
+ // We know for a fact that z[256] = {-9.150383 -0.920413}
+ // So its rp must be between -9.150f and -9.151f, otherwise it is an error.
+ boolean error = obj.z[256].rp < -9.151f || -9.150f < obj.z[256].rp;
+ // And its ip must be between -.920f and -921f, otherwise it is also an error.
+ error = error || (obj.z[256].ip < -.921f || -.920f < obj.z[256].ip);
+ // verify() returns 0 when there is no error.
+ return !error;
+ }
+
+ public static void main(String[] args) {
+ int rc = 0;
+ Oscar obj = new Oscar();
+
+ long before = System.currentTimeMillis();
+ obj.timeOscar(600);
+ long after = System.currentTimeMillis();
+
+ System.out.println("art_benchmarks/stanford/Oscar: " + (after - before));
+
+ if (!verify_Oscar()) {
+ rc++;
+ }
+
+ System.exit(rc);
+ }
+}