aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/unsorted/xxs.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.c-torture/unsorted/xxs.c')
-rw-r--r--gcc/testsuite/gcc.c-torture/unsorted/xxs.c202
1 files changed, 202 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/unsorted/xxs.c b/gcc/testsuite/gcc.c-torture/unsorted/xxs.c
new file mode 100644
index 00000000000..1757f976008
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/unsorted/xxs.c
@@ -0,0 +1,202 @@
+void *malloc ();
+struct timeval {
+ long tv_sec;
+ long tv_usec;
+};
+struct timezone {
+ int tz_minuteswest;
+ int tz_dsttime;
+};
+struct itimerval {
+ struct timeval it_interval;
+ struct timeval it_value;
+};
+typedef int sigset_t;
+typedef unsigned int speed_t;
+typedef unsigned long tcflag_t;
+typedef unsigned char cc_t;
+typedef int pid_t;
+typedef unsigned short mode_t;
+typedef short nlink_t;
+typedef long clock_t;
+typedef long time_t;
+typedef int size_t;
+typedef int ptrdiff_t;
+typedef unsigned short wchar_t;
+struct tm {
+ int tm_sec;
+ int tm_min;
+ int tm_hour;
+ int tm_mday;
+ int tm_mon;
+ int tm_year;
+ int tm_wday;
+ int tm_yday;
+ int tm_isdst;
+ char *tm_zone;
+ long tm_gmtoff;
+};
+extern struct tm *gmtime(), *localtime();
+extern char *asctime(), *ctime();
+extern void tzset(), tzsetwall();
+extern int dysize();
+extern time_t timelocal(), timegm();
+struct rusage {
+ struct timeval ru_utime;
+ struct timeval ru_stime;
+ long ru_maxrss;
+ long ru_ixrss;
+ long ru_idrss;
+ long ru_isrss;
+ long ru_minflt;
+ long ru_majflt;
+ long ru_nswap;
+ long ru_inblock;
+ long ru_oublock;
+ long ru_msgsnd;
+ long ru_msgrcv;
+ long ru_nsignals;
+ long ru_nvcsw;
+ long ru_nivcsw;
+};
+struct rlimit {
+ int rlim_cur;
+ int rlim_max;
+};
+unsigned long
+cputime ()
+{
+ struct rusage rus;
+ getrusage (0, &rus);
+ return (((rus.ru_utime.tv_sec + rus.ru_stime.tv_sec) * 1000000) +
+ rus.ru_utime.tv_usec + rus.ru_stime.tv_usec) / 1000;
+}
+int
+do_assoc_test (mem, start, cc)
+ register char *mem;
+ register int start;
+ register int cc;
+{
+ register int j;
+ register int ind = start;
+ register int x;
+ for (j = 0x100000; --j >= 0; )
+ {
+ int x = ((volatile char *) mem)[ind];
+ ind -= cc;
+ if (ind < 0)
+ ind = start;
+ }
+ return x;
+}
+int
+determine_assoc (size)
+{
+ register char *mem = malloc (size * (1 << 5 ));
+ int cc = size;
+ int lbsets;
+ int times[5 + 1];
+ for (lbsets = 0; lbsets <= 5; lbsets++)
+ {
+ int t = cputime ();
+ do_assoc_test (mem, (cc << lbsets) - cc, cc);
+ t = cputime () - t;
+ times[lbsets] = t;
+ printf ("sets = %2u: %u ms\n", 1 << lbsets, t);
+ }
+ free (mem);
+ {
+ int max = 1000 * times[1] / times[0];
+ int maxindex = 0;
+ int min = 1000 * times[1] / times[0];
+ int minindex = 0;
+ for (lbsets = 1; lbsets < 4; lbsets++)
+ {
+ int x = 1000 * times[lbsets + 1] / times[lbsets];
+ if (x > max)
+ {
+ max = x;
+ maxindex = lbsets;
+ }
+ if (x < min)
+ {
+ min = x;
+ minindex = lbsets;
+ }
+ }
+ if (min * 100 > max * 75)
+ return 0;
+ return 1 << maxindex;
+ }
+}
+do_size_test(mem, size, reps)
+ register int *mem;
+ register int size;
+ register int reps;
+{
+ register int j, i, x;
+ mem += size;
+ for (j = reps; --j >= 0;)
+ for (i = -size; i < 0; i++)
+ x = ((volatile int *) mem)[i];
+}
+int
+determine_size()
+{
+ register int *mem = malloc (1 << 20 );
+ int lbsize;
+ int times[20 ];
+ for (lbsize = 12; lbsize < 20; lbsize++)
+ {
+ int t = cputime ();
+ do_size_test (mem, (1 << lbsize) / sizeof (int) - 64,
+ 0x1000000 >> lbsize);
+ t = cputime () - t;
+ times[lbsize] = t;
+ printf ("size = %2u: %u ms\n", 1 << lbsize, t);
+ }
+ free (mem);
+ {
+ int max = 1000 * times[12 + 1] / times[12 ];
+ int maxindex = 0;
+ int min = 1000 * times[12 + 1] / times[12 ];
+ int minindex = 0;
+ for (lbsize = 12; lbsize < 20 - 1; lbsize++)
+ {
+ int x = 1000 * times[lbsize + 1] / times[lbsize];
+ if (x > max)
+ {
+ max = x;
+ maxindex = lbsize;
+ }
+ if (x < min)
+ {
+ min = x;
+ minindex = lbsize;
+ }
+ }
+ if (min * 100 > max * 75)
+ return 0;
+ return 1 << maxindex;
+ }
+}
+int
+main()
+{
+ int size, assoc;
+ size = determine_size();
+ if (size)
+ printf ("I guess this cache is %d bytes.\n", size);
+ else
+ printf ("I can't determine the size from this run.\n");
+ if (size == 0)
+ size = 65536;
+ assoc = determine_assoc(size);
+ if (assoc > 1)
+ printf ("I guess this cache is %d-way set associative.\n", assoc);
+ else if (assoc == 1)
+ printf ("I guess this cache is direct mapped.\n");
+ else
+ printf ("I can't determine the associativity from this run.\n");
+ return 0;
+}