Changes in directory llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath:
LICENSE added (r1.1) Makefile added (r1.1) basicmath.c added (r1.1) cubic.c added (r1.1) isqrt.c added (r1.1) pi.h added (r1.1) rad2deg.c added (r1.1) round.h added (r1.1) snipmath.h added (r1.1) sniptype.h added (r1.1) --- Log message: continue adding mibench --- Diffs of the changes: (+503 -0) LICENSE | 3 + Makefile | 5 ++ basicmath.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cubic.c | 64 +++++++++++++++++++++++++++++++ isqrt.c | 89 +++++++++++++++++++++++++++++++++++++++++++ pi.h | 13 ++++++ rad2deg.c | 39 +++++++++++++++++++ round.h | 55 ++++++++++++++++++++++++++ snipmath.h | 75 ++++++++++++++++++++++++++++++++++++ sniptype.h | 37 ++++++++++++++++++ 10 files changed, 503 insertions(+) Index: llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/LICENSE diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/LICENSE:1.1 *** /dev/null Tue Jan 9 18:08:15 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/LICENSE Tue Jan 9 18:08:05 2007 *************** *** 0 **** --- 1,3 ---- + From http://www.snippets.org/. + + This code is FREE with no restrictions. Index: llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/Makefile diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/Makefile:1.1 *** /dev/null Tue Jan 9 18:08:31 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/Makefile Tue Jan 9 18:08:05 2007 *************** *** 0 **** --- 1,5 ---- + LEVEL = ../../../.. + + PROG = automotive-basicmath + LDFLAGS = -lm + include $(LEVEL)/MultiSource/Makefile.multisrc Index: llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/basicmath.c diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/basicmath.c:1.1 *** /dev/null Tue Jan 9 18:08:31 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/basicmath.c Tue Jan 9 18:08:05 2007 *************** *** 0 **** --- 1,123 ---- + #include "snipmath.h" + #include <math.h> + + /* The printf's may be removed to isolate just the math calculations */ + + int main(void) + { + double a1 = 1.0, b1 = -10.5, c1 = 32.0, d1 = -30.0; + double x[3]; + double X; + int solutions; + int i; + unsigned long l = 0x3fed0169L; + struct int_sqrt q; + long n = 0; + + /* solve soem cubic functions */ + printf("********* CUBIC FUNCTIONS ***********\n"); + /* should get 3 solutions: 2, 6 & 2.5 */ + SolveCubic(a1, b1, c1, d1, &solutions, x); + printf("Solutions:"); + for(i=0;i<solutions;i++) + printf(" %f",x[i]); + printf("\n"); + + a1 = 1.0; b1 = -4.5; c1 = 17.0; d1 = -30.0; + /* should get 1 solution: 2.5 */ + SolveCubic(a1, b1, c1, d1, &solutions, x); + printf("Solutions:"); + for(i=0;i<solutions;i++) + printf(" %f",x[i]); + printf("\n"); + + a1 = 1.0; b1 = -3.5; c1 = 22.0; d1 = -31.0; + SolveCubic(a1, b1, c1, d1, &solutions, x); + printf("Solutions:"); + for(i=0;i<solutions;i++) + printf(" %f",x[i]); + printf("\n"); + + a1 = 1.0; b1 = -13.7; c1 = 1.0; d1 = -35.0; + SolveCubic(a1, b1, c1, d1, &solutions, x); + printf("Solutions:"); + for(i=0;i<solutions;i++) + printf(" %f",x[i]); + printf("\n"); + + a1 = 3.0; b1 = 12.34; c1 = 5.0; d1 = 12.0; + SolveCubic(a1, b1, c1, d1, &solutions, x); + printf("Solutions:"); + for(i=0;i<solutions;i++) + printf(" %f",x[i]); + printf("\n"); + + a1 = -8.0; b1 = -67.89; c1 = 6.0; d1 = -23.6; + SolveCubic(a1, b1, c1, d1, &solutions, x); + printf("Solutions:"); + for(i=0;i<solutions;i++) + printf(" %f",x[i]); + printf("\n"); + + a1 = 45.0; b1 = 8.67; c1 = 7.5; d1 = 34.0; + SolveCubic(a1, b1, c1, d1, &solutions, x); + printf("Solutions:"); + for(i=0;i<solutions;i++) + printf(" %f",x[i]); + printf("\n"); + + a1 = -12.0; b1 = -1.7; c1 = 5.3; d1 = 16.0; + SolveCubic(a1, b1, c1, d1, &solutions, x); + printf("Solutions:"); + for(i=0;i<solutions;i++) + printf(" %f",x[i]); + printf("\n"); + + /* Now solve some random equations */ + for(a1=1;a1<10;a1+=1) { + for(b1=10;b1>0;b1-=.25) { + for(c1=5;c1<15;c1+=0.61) { + for(d1=-1;d1>-5;d1-=.451) { + SolveCubic(a1, b1, c1, d1, &solutions, x); + printf("Solutions:"); + for(i=0;i<solutions;i++) + printf(" %f",x[i]); + printf("\n"); + } + } + } + } + + + printf("********* INTEGER SQR ROOTS ***********\n"); + /* perform some integer square roots */ + for (i = 0; i < 100000; i+=2) + { + usqrt(i, &q); + // remainder differs on some machines + // printf("sqrt(%3d) = %2d, remainder = %2d\n", + printf("sqrt(%3d) = %2d\n", + i, q.sqrt); + } + printf("\n"); + for (l = 0x3fed0169L; l < 0x3fed4169L; l++) + { + usqrt(l, &q); + //printf("\nsqrt(%lX) = %X, remainder = %X\n", l, q.sqrt, q.frac); + printf("sqrt(%lX) = %X\n", l, q.sqrt); + } + + + printf("********* ANGLE CONVERSION ***********\n"); + /* convert some rads to degrees */ + /* for (X = 0.0; X <= 360.0; X += 1.0) */ + for (X = 0.0; X <= 360.0; X += .001) + printf("%3.0f degrees = %.12f radians\n", X, deg2rad(X)); + puts(""); + /* for (X = 0.0; X <= (2 * PI + 1e-6); X += (PI / 180)) */ + for (X = 0.0; X <= (2 * PI + 1e-6); X += (PI / 5760)) + printf("%.12f radians = %3.0f degrees\n", X, rad2deg(X)); + + + return 0; + } Index: llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/cubic.c diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/cubic.c:1.1 *** /dev/null Tue Jan 9 18:08:31 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/cubic.c Tue Jan 9 18:08:05 2007 *************** *** 0 **** --- 1,64 ---- + /* +++Date last modified: 05-Jul-1997 */ + + /* + ** CUBIC.C - Solve a cubic polynomial + ** public domain by Ross Cottrell + */ + + #include <math.h> + #include <stdlib.h> + #include "snipmath.h" + + void SolveCubic(double a, + double b, + double c, + double d, + int *solutions, + double *x) + { + long double a1 = b/a, a2 = c/a, a3 = d/a; + long double Q = (a1*a1 - 3.0*a2)/9.0; + long double R = (2.0*a1*a1*a1 - 9.0*a1*a2 + 27.0*a3)/54.0; + double R2_Q3 = R*R - Q*Q*Q; + + double theta; + + if (R2_Q3 <= 0) + { + *solutions = 3; + theta = acos(R/sqrt(Q*Q*Q)); + x[0] = -2.0*sqrt(Q)*cos(theta/3.0) - a1/3.0; + x[1] = -2.0*sqrt(Q)*cos((theta+2.0*PI)/3.0) - a1/3.0; + x[2] = -2.0*sqrt(Q)*cos((theta+4.0*PI)/3.0) - a1/3.0; + } + else + { + *solutions = 1; + x[0] = pow(sqrt(R2_Q3)+fabs(R), 1/3.0); + x[0] += Q/x[0]; + x[0] *= (R < 0.0) ? 1 : -1; + x[0] -= a1/3.0; + } + } + + #ifdef TEST + + int main(void) + { + double a1 = 1.0, b1 = -10.5, c1 = 32.0, d1 = -30.0; + double a2 = 1.0, b2 = -4.5, c2 = 17.0, d2 = -30.0; + double x[3]; + int solutions; + + SolveCubic(a1, b1, c1, d1, &solutions, x); + + /* should get 3 solutions: 2, 6 & 2.5 */ + + SolveCubic(a2, b2, c2, d2, &solutions, x); + + /* should get 1 solution: 2.5 */ + + return 0; + } + + #endif /* TEST */ Index: llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/isqrt.c diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/isqrt.c:1.1 *** /dev/null Tue Jan 9 18:08:31 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/isqrt.c Tue Jan 9 18:08:05 2007 *************** *** 0 **** --- 1,89 ---- + /* +++Date last modified: 05-Jul-1997 */ + + #include <string.h> + #include "snipmath.h" + + #define BITSPERLONG 32 + + #define TOP2BITS(x) ((x & (3L << (BITSPERLONG-2))) >> (BITSPERLONG-2)) + + + /* usqrt: + ENTRY x: unsigned long + EXIT returns floor(sqrt(x) * pow(2, BITSPERLONG/2)) + + Since the square root never uses more than half the bits + of the input, we use the other half of the bits to contain + extra bits of precision after the binary point. + + EXAMPLE + suppose BITSPERLONG = 32 + then usqrt(144) = 786432 = 12 * 65536 + usqrt(32) = 370727 = 5.66 * 65536 + + NOTES + (1) change BITSPERLONG to BITSPERLONG/2 if you do not want + the answer scaled. Indeed, if you want n bits of + precision after the binary point, use BITSPERLONG/2+n. + The code assumes that BITSPERLONG is even. + (2) This is really better off being written in assembly. + The line marked below is really a "arithmetic shift left" + on the double-long value with r in the upper half + and x in the lower half. This operation is typically + expressible in only one or two assembly instructions. + (3) Unrolling this loop is probably not a bad idea. + + ALGORITHM + The calculations are the base-two analogue of the square + root algorithm we all learned in grammar school. Since we're + in base 2, there is only one nontrivial trial multiplier. + + Notice that absolutely no multiplications or divisions are performed. + This means it'll be fast on a wide range of processors. + */ + + void usqrt(unsigned long x, struct int_sqrt *q) + { + unsigned long a = 0L; /* accumulator */ + unsigned long r = 0L; /* remainder */ + unsigned long e = 0L; /* trial product */ + + int i; + + for (i = 0; i < BITSPERLONG; i++) /* NOTE 1 */ + { + r = (r << 2) + TOP2BITS(x); x <<= 2; /* NOTE 2 */ + a <<= 1; + e = (a << 1) + 1; + if (r >= e) + { + r -= e; + a++; + } + } + memcpy(q, &a, sizeof(long)); + } + + #ifdef TEST + + #include <stdio.h> + #include <stdlib.h> + + main(void) + { + int i; + unsigned long l = 0x3fed0169L; + struct int_sqrt q; + + for (i = 0; i < 101; ++i) + { + usqrt(i, &q); + printf("sqrt(%3d) = %2d, remainder = %2d\n", + i, q.sqrt, q.frac); + } + usqrt(l, &q); + printf("\nsqrt(%lX) = %X, remainder = %X\n", l, q.sqrt, q.frac); + return 0; + } + + #endif /* TEST */ Index: llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/pi.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/pi.h:1.1 *** /dev/null Tue Jan 9 18:08:31 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/pi.h Tue Jan 9 18:08:05 2007 *************** *** 0 **** --- 1,13 ---- + /* +++Date last modified: 05-Jul-1997 */ + + #ifndef PI__H + #define PI__H + + #ifndef PI + #define PI (4*atan(1)) + #endif + + #define deg2rad(d) ((d)*PI/180) + #define rad2deg(r) ((r)*180/PI) + + #endif /* PI__H */ Index: llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/rad2deg.c diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/rad2deg.c:1.1 *** /dev/null Tue Jan 9 18:08:31 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/rad2deg.c Tue Jan 9 18:08:05 2007 *************** *** 0 **** --- 1,39 ---- + /* +++Date last modified: 05-Jul-1997 */ + + /* + ** RAD2DEG.C - Functions to convert between radians and degrees + */ + + #include <math.h> + #include "snipmath.h" + + #undef rad2deg /* These are macros defined in PI.H */ + #undef deg2rad + + double rad2deg(double rad) + { + return (180.0 * rad / (PI)); + } + + double deg2rad(double deg) + { + return (PI * deg / 180.0); + } + + #ifdef TEST + + #include <stdio.h> + + main() + { + double X; + + for (X = 0.0; X <= 360.0; X += 45.0) + printf("%3.0f degrees = %.12f radians\n", X, deg2rad(X)); + puts(""); + for (X = 0.0; X <= (2 * PI + 1e-6); X += (PI / 6)) + printf("%.12f radians = %3.0f degrees\n", X, rad2deg(X)); + return 0; + } + + #endif /* TEST */ Index: llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/round.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/round.h:1.1 *** /dev/null Tue Jan 9 18:08:31 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/round.h Tue Jan 9 18:08:05 2007 *************** *** 0 **** --- 1,55 ---- + /* +++Date last modified: 05-Jul-1997 */ + + /* + ** rounding macros by Dave Knapp, Thad Smith, Jon Strayer, & Bob Stout + */ + + #ifndef ROUND__H + #define ROUND__H + + #include <math.h> + + #if defined(__cplusplus) && __cplusplus + + /* + ** Safe C++ inline versions + */ + + /* round to integer */ + + inline int iround(double x) + { + return (int)floor(x + 0.5); + } + + /* round number n to d decimal points */ + + inline double fround(double n, unsigned d) + { + return floor(n * pow(10., d) + .5) / pow(10., d); + } + + #else + + /* + ** NOTE: These C macro versions are unsafe since arguments are referenced + ** more than once. + ** + ** Avoid using these with expression arguments to be safe. + */ + + /* + ** round to integer + */ + + #define iround(x) floor((x) + 0.5) + + /* + ** round number n to d decimal points + */ + + #define fround(n,d) (floor((n)*pow(10.,(d))+.5)/pow(10.,(d))) + + #endif + + #endif /* ROUND__H */ Index: llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/snipmath.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/snipmath.h:1.1 *** /dev/null Tue Jan 9 18:08:31 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/snipmath.h Tue Jan 9 18:08:05 2007 *************** *** 0 **** --- 1,75 ---- + /* +++Date last modified: 05-Jul-1997 */ + + /* + ** SNIPMATH.H - Header file for SNIPPETS math functions and macros + */ + + #ifndef SNIPMATH__H + #define SNIPMATH__H + + #include <math.h> + #include "sniptype.h" + #include "round.h" + + /* + ** Callable library functions begin here + */ + + void SetBCDLen(int n); /* Bcdl.C */ + long BCDtoLong(char *BCDNum); /* Bcdl.C */ + void LongtoBCD(long num, char BCDNum[]); /* Bcdl.C */ + double bcd_to_double(void *buf, size_t len, /* Bcdd.C */ + int digits); + int double_to_bcd(double arg, char *buf, /* Bcdd.C */ + size_t length, size_t digits ); + DWORD ncomb1 (int n, int m); /* Combin.C */ + DWORD ncomb2 (int n, int m); /* Combin.C */ + void SolveCubic(double a, double b, double c, /* Cubic.C */ + double d, int *solutions, + double *x); + DWORD dbl2ulong(double t); /* Dbl2Long.C */ + long dbl2long(double t); /* Dbl2Long.C */ + double dround(double x); /* Dblround.C */ + + /* Use #defines for Permutations and Combinations -- Factoryl.C */ + + #define log10P(n,r) (log10factorial(n)-log10factorial((n)-(r))) + #define log10C(n,r) (log10P((n),(r))-log10factorial(r)) + + double log10factorial(double N); /* Factoryl.C */ + + double fibo(unsigned short term); /* Fibo.C */ + double frandom(int n); /* Frand.C */ + double ipow(double x, int n); /* Ipow.C */ + int ispow2(int x); /* Ispow2.C */ + long double ldfloor(long double a); /* Ldfloor.C */ + int initlogscale(long dmax, long rmax); /* Logscale.C */ + long logscale(long d); /* Logscale.C */ + + float MSBINToIEEE(float f); /* Msb2Ieee.C */ + float IEEEToMSBIN(float f); /* Msb2Ieee.C */ + int perm_index (char pit[], int size); /* Perm_Idx.C */ + int round_div(int n, int d); /* Rnd_Div.C */ + long round_ldiv(long n, long d); /* Rnd_Div.C */ + double rad2deg(double rad); /* Rad2Deg.C */ + double deg2rad(double deg); /* Rad2Deg.C */ + + #include "pi.h" + #ifndef PHI + #define PHI ((1.0+sqrt(5.0))/2.0) /* the golden number */ + #define INV_PHI (1.0/PHI) /* the golden ratio */ + #endif + + /* + ** File: ISQRT.C + */ + + struct int_sqrt { + unsigned sqrt, + frac; + }; + + void usqrt(unsigned long x, struct int_sqrt *q); + + + #endif /* SNIPMATH__H */ Index: llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/sniptype.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/sniptype.h:1.1 *** /dev/null Tue Jan 9 18:08:31 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/automotive-basicmath/sniptype.h Tue Jan 9 18:08:05 2007 *************** *** 0 **** --- 1,37 ---- + /* +++Date last modified: 05-Jul-1997 */ + + /* + ** SNIPTYPE.H - Include file for SNIPPETS data types and commonly used macros + */ + + #ifndef SNIPTYPE__H + #define SNIPTYPE__H + + #include <stdlib.h> /* For free() */ + #include <string.h> /* For NULL & strlen() */ + + typedef enum {Error_ = -1, Success_, False_ = 0, True_} Boolean_T; + + /*#if !defined(WIN32) && !defined(_WIN32) && !defined(__NT__) \ + && !defined(_WINDOWS) + #if !defined(OS2)*/ + typedef unsigned char BYTE; + typedef unsigned long DWORD; + /* #endif*/ + typedef unsigned short WORD; + /*#else + #define WIN32_LEAN_AND_MEAN + #define NOGDI + #define NOSERVICE + #undef INC_OLE1 + #undef INC_OLE2 + #include <windows.h> + #define HUGE + #endif*/ + + #define NUL '\0' + #define LAST_CHAR(s) (((char *)s)[strlen(s) - 1]) + #define TOBOOL(x) (!(!(x))) + #define FREE(p) (free(p),(p)=NULL) + + #endif /* SNIPTYPE__H */ _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits