diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-06-26 16:47:03 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-06-26 16:47:03 +0000 |
commit | b3a6901e66f55b35aa9e01bcb24134e6a65ea004 (patch) | |
tree | 4d57d73575ea3f7e30bf430920d6e96fa2a369c1 /test/timing | |
parent | 8cbe163cba77c772621f89ddb33793ac170b1fa2 (diff) | |
download | compiler-rt-b3a6901e66f55b35aa9e01bcb24134e6a65ea004.tar.gz |
Initial import of compiler-rt.
-
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@74292 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/timing')
-rw-r--r-- | test/timing/ashldi3.c | 49 | ||||
-rw-r--r-- | test/timing/ashrdi3.c | 49 | ||||
-rw-r--r-- | test/timing/divdi3.c | 52 | ||||
-rw-r--r-- | test/timing/floatdidf.c | 47 | ||||
-rw-r--r-- | test/timing/floatdisf.c | 47 | ||||
-rw-r--r-- | test/timing/floatdixf.c | 47 | ||||
-rw-r--r-- | test/timing/floatundidf.c | 44 | ||||
-rw-r--r-- | test/timing/floatundisf.c | 47 | ||||
-rw-r--r-- | test/timing/floatundixf.c | 47 | ||||
-rw-r--r-- | test/timing/lshrdi3.c | 49 | ||||
-rw-r--r-- | test/timing/moddi3.c | 52 | ||||
-rw-r--r-- | test/timing/muldi3.c | 52 | ||||
-rw-r--r-- | test/timing/negdi2.c | 50 | ||||
-rwxr-xr-x | test/timing/time | 40 | ||||
-rw-r--r-- | test/timing/timing.h | 28 | ||||
-rw-r--r-- | test/timing/udivdi3.c | 52 | ||||
-rw-r--r-- | test/timing/umoddi3.c | 52 |
17 files changed, 804 insertions, 0 deletions
diff --git a/test/timing/ashldi3.c b/test/timing/ashldi3.c new file mode 100644 index 000000000..0d7378d41 --- /dev/null +++ b/test/timing/ashldi3.c @@ -0,0 +1,49 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE int +#define INPUT_SIZE 512 +#define FUNCTION_NAME __ashldi3 + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +int64_t FUNCTION_NAME(int64_t input, INPUT_TYPE count); + +int main(int argc, char *argv[]) { + INPUT_TYPE input[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) + input[i] = rand() & 0x3f; + + int64_t fixedInput = INT64_C(0x1234567890ABCDEF); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(fixedInput, input[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/ashrdi3.c b/test/timing/ashrdi3.c new file mode 100644 index 000000000..84e11f7fe --- /dev/null +++ b/test/timing/ashrdi3.c @@ -0,0 +1,49 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE int +#define INPUT_SIZE 512 +#define FUNCTION_NAME __ashrdi3 + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +int64_t FUNCTION_NAME(int64_t input, INPUT_TYPE count); + +int main(int argc, char *argv[]) { + INPUT_TYPE input[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) + input[i] = rand() & 0x3f; + + int64_t fixedInput = INT64_C(0x1234567890ABCDEF); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(fixedInput, input[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/divdi3.c b/test/timing/divdi3.c new file mode 100644 index 000000000..37937aab6 --- /dev/null +++ b/test/timing/divdi3.c @@ -0,0 +1,52 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE int64_t +#define INPUT_SIZE 256 +#define FUNCTION_NAME __divdi3 + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +INPUT_TYPE FUNCTION_NAME(INPUT_TYPE input1, INPUT_TYPE input2); + +int main(int argc, char *argv[]) { + INPUT_TYPE input1[INPUT_SIZE]; + INPUT_TYPE input2[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) { + input1[i] = (((int64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63); + input2[i] = ((((int64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63)) + 1LL; + } + + int64_t fixedInput = INT64_C(0x1234567890ABCDEF); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(input1[i], input2[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/floatdidf.c b/test/timing/floatdidf.c new file mode 100644 index 000000000..2c970d4df --- /dev/null +++ b/test/timing/floatdidf.c @@ -0,0 +1,47 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE int64_t +#define INPUT_SIZE 512 +#define FUNCTION_NAME __floatdidf + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +double FUNCTION_NAME(INPUT_TYPE x); + +int main(int argc, char *argv[]) { + INPUT_TYPE input[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) + input[i] = (((uint64_t)rand() << 32) | (uint64_t)rand()) >> (rand() & 63); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(input[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/floatdisf.c b/test/timing/floatdisf.c new file mode 100644 index 000000000..801ab0aa2 --- /dev/null +++ b/test/timing/floatdisf.c @@ -0,0 +1,47 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE int64_t +#define INPUT_SIZE 512 +#define FUNCTION_NAME __floatdisf + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +float FUNCTION_NAME(INPUT_TYPE x); + +int main(int argc, char *argv[]) { + INPUT_TYPE input[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) + input[i] = (((uint64_t)rand() << 32) | (uint64_t)rand()) >> (rand() & 63); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(input[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/floatdixf.c b/test/timing/floatdixf.c new file mode 100644 index 000000000..b646e3c1b --- /dev/null +++ b/test/timing/floatdixf.c @@ -0,0 +1,47 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE int64_t +#define INPUT_SIZE 512 +#define FUNCTION_NAME __floatdixf + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +long double FUNCTION_NAME(INPUT_TYPE x); + +int main(int argc, char *argv[]) { + INPUT_TYPE input[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) + input[i] = (((uint64_t)rand() << 32) | (uint64_t)rand()) >> (rand() & 63); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(input[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/floatundidf.c b/test/timing/floatundidf.c new file mode 100644 index 000000000..25c02bd2e --- /dev/null +++ b/test/timing/floatundidf.c @@ -0,0 +1,44 @@ +#include "timing.h" +#include <stdio.h> + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +double __floatundidf(uint64_t x); + +int main(int argc, char *argv[]) { +#define INPUT_SIZE 512 + uint64_t input[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) + input[i] = (((uint64_t)rand() << 32) | (uint64_t)rand()) >> (rand() & 63); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + __floatundidf(input[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/floatundisf.c b/test/timing/floatundisf.c new file mode 100644 index 000000000..ec8f3beb9 --- /dev/null +++ b/test/timing/floatundisf.c @@ -0,0 +1,47 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE uint64_t +#define INPUT_SIZE 512 +#define FUNCTION_NAME __floatundisf + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +float FUNCTION_NAME(INPUT_TYPE x); + +int main(int argc, char *argv[]) { + INPUT_TYPE input[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) + input[i] = (((uint64_t)rand() << 32) | (uint64_t)rand()) >> (rand() & 63); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(input[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/floatundixf.c b/test/timing/floatundixf.c new file mode 100644 index 000000000..46733eb26 --- /dev/null +++ b/test/timing/floatundixf.c @@ -0,0 +1,47 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE uint64_t +#define INPUT_SIZE 512 +#define FUNCTION_NAME __floatundixf + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +long double FUNCTION_NAME(INPUT_TYPE x); + +int main(int argc, char *argv[]) { + INPUT_TYPE input[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) + input[i] = (((uint64_t)rand() << 32) | (uint64_t)rand()) >> (rand() & 63); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(input[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/lshrdi3.c b/test/timing/lshrdi3.c new file mode 100644 index 000000000..b474cf3e0 --- /dev/null +++ b/test/timing/lshrdi3.c @@ -0,0 +1,49 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE int +#define INPUT_SIZE 512 +#define FUNCTION_NAME __lshrdi3 + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +int64_t FUNCTION_NAME(int64_t input, INPUT_TYPE count); + +int main(int argc, char *argv[]) { + INPUT_TYPE input[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) + input[i] = rand() & 0x3f; + + int64_t fixedInput = INT64_C(0x1234567890ABCDEF); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(fixedInput, input[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/moddi3.c b/test/timing/moddi3.c new file mode 100644 index 000000000..83e2441dc --- /dev/null +++ b/test/timing/moddi3.c @@ -0,0 +1,52 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE int64_t +#define INPUT_SIZE 256 +#define FUNCTION_NAME __moddi3 + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +INPUT_TYPE FUNCTION_NAME(INPUT_TYPE input1, INPUT_TYPE input2); + +int main(int argc, char *argv[]) { + INPUT_TYPE input1[INPUT_SIZE]; + INPUT_TYPE input2[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) { + input1[i] = (((int64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63); + input2[i] = ((((int64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63)) + 1LL; + } + + int64_t fixedInput = INT64_C(0x1234567890ABCDEF); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(input1[i], input2[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/muldi3.c b/test/timing/muldi3.c new file mode 100644 index 000000000..3ba3af245 --- /dev/null +++ b/test/timing/muldi3.c @@ -0,0 +1,52 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE int64_t +#define INPUT_SIZE 256 +#define FUNCTION_NAME __muldi3 + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +INPUT_TYPE FUNCTION_NAME(INPUT_TYPE input1, INPUT_TYPE input2); + +int main(int argc, char *argv[]) { + INPUT_TYPE input1[INPUT_SIZE]; + INPUT_TYPE input2[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) { + input1[i] = (((int64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63); + input2[i] = (((int64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63); + } + + int64_t fixedInput = INT64_C(0x1234567890ABCDEF); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(input1[i], input2[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/negdi2.c b/test/timing/negdi2.c new file mode 100644 index 000000000..2668eb1e8 --- /dev/null +++ b/test/timing/negdi2.c @@ -0,0 +1,50 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE int64_t +#define INPUT_SIZE 256 +#define FUNCTION_NAME __negdi2 + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +INPUT_TYPE FUNCTION_NAME(INPUT_TYPE input); + +int main(int argc, char *argv[]) { + INPUT_TYPE input[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) { + input[i] = (((int64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63); + } + + int64_t fixedInput = INT64_C(0x1234567890ABCDEF); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(input[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/time b/test/timing/time new file mode 100755 index 000000000..af14e5e6a --- /dev/null +++ b/test/timing/time @@ -0,0 +1,40 @@ +#!/bin/sh + +function test () { + arch=$1 + file=$2 + name=$3 + ldflags=$4 + + if gcc -arch $arch -Os $file $ldflags -DLIBNAME=$name + then + if ./a.out + then + rm ./a.out + else + echo "fail" + fi + else + echo "$FILE failed to compile" + fi +} + +INSTALLED=/usr/local/lib/system/libcompiler_rt.a + +for ARCH in i386 x86_64; do + for FILE in $(ls *.c); do + + echo "Timing $FILE for $ARCH" + + test $ARCH $FILE libgcc "" + test $ARCH $FILE untuned ../../Release/libcompiler_rt.Generic.a + test $ARCH $FILE tuned ../../Release/libcompiler_rt.Optimized.a + if [ -f "$INSTALLED" ]; then + test $ARCH $FILE installed $INSTALLED + fi + + echo " " + + done +done +exit diff --git a/test/timing/timing.h b/test/timing/timing.h new file mode 100644 index 000000000..bb6c41eb2 --- /dev/null +++ b/test/timing/timing.h @@ -0,0 +1,28 @@ +#include <mach/mach_time.h> +#include <stdint.h> +#include <stdlib.h> + +double intervalInCycles( uint64_t startTime, uint64_t endTime ) +{ + uint64_t rawTime = endTime - startTime; + static double conversion = 0.0; + + if( 0.0 == conversion ) + { + mach_timebase_info_data_t info; + kern_return_t err = mach_timebase_info( &info ); + if( 0 != err ) + return 0; + + uint64_t freq = 0; + size_t freqSize = sizeof( freq ); + int err2 = sysctlbyname( "hw.cpufrequency", &freq, &freqSize, NULL, 0L ); + if( 0 != err2 ) + return 0; + + conversion = (double) freq * (1e-9 * (double) info.numer / (double) info.denom); + } + + return (double) rawTime * conversion; +} + diff --git a/test/timing/udivdi3.c b/test/timing/udivdi3.c new file mode 100644 index 000000000..9c6a7e8cc --- /dev/null +++ b/test/timing/udivdi3.c @@ -0,0 +1,52 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE uint64_t +#define INPUT_SIZE 256 +#define FUNCTION_NAME __udivdi3 + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +INPUT_TYPE FUNCTION_NAME(INPUT_TYPE input1, INPUT_TYPE input2); + +int main(int argc, char *argv[]) { + INPUT_TYPE input1[INPUT_SIZE]; + INPUT_TYPE input2[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) { + input1[i] = (((uint64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63); + input2[i] = ((((uint64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63)) + 1LL; + } + + int64_t fixedInput = INT64_C(0x1234567890ABCDEF); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(input1[i], input2[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} diff --git a/test/timing/umoddi3.c b/test/timing/umoddi3.c new file mode 100644 index 000000000..a81c46e52 --- /dev/null +++ b/test/timing/umoddi3.c @@ -0,0 +1,52 @@ +#include "timing.h" +#include <stdio.h> + +#define INPUT_TYPE uint64_t +#define INPUT_SIZE 256 +#define FUNCTION_NAME __umoddi3 + +#ifndef LIBNAME +#define LIBNAME UNKNOWN +#endif + +#define LIBSTRING LIBSTRINGX(LIBNAME) +#define LIBSTRINGX(a) LIBSTRINGXX(a) +#define LIBSTRINGXX(a) #a + +INPUT_TYPE FUNCTION_NAME(INPUT_TYPE input1, INPUT_TYPE input2); + +int main(int argc, char *argv[]) { + INPUT_TYPE input1[INPUT_SIZE]; + INPUT_TYPE input2[INPUT_SIZE]; + int i, j; + + srand(42); + + // Initialize the input array with data of various sizes. + for (i=0; i<INPUT_SIZE; ++i) { + input1[i] = (((uint64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63); + input2[i] = ((((uint64_t)rand() << 36) | (uint64_t)rand()) >> (rand() & 63)) + 1LL; + } + + int64_t fixedInput = INT64_C(0x1234567890ABCDEF); + + double bestTime = __builtin_inf(); + void *dummyp; + for (j=0; j<1024; ++j) { + + uint64_t startTime = mach_absolute_time(); + for (i=0; i<INPUT_SIZE; ++i) + FUNCTION_NAME(input1[i], input2[i]); + uint64_t endTime = mach_absolute_time(); + + double thisTime = intervalInCycles(startTime, endTime); + bestTime = __builtin_fmin(thisTime, bestTime); + + // Move the stack alignment between trials to eliminate (mostly) aliasing effects + dummyp = alloca(1); + } + + printf("%16s: %f cycles.\n", LIBSTRING, bestTime / (double) INPUT_SIZE); + + return 0; +} |