aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/unsorted/xxs.c
blob: 1757f97600833e7e30bbbd96be83222c3fa6c1c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
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;
}