1/* Test that __builtin_prefetch does no harm.
2
3   Prefetch data using a variety of storage classes and address
4   expressions.  */
5
6int glob_int_arr[100];
7int *glob_ptr_int = glob_int_arr;
8int glob_int = 4;
9
10static stat_int_arr[100];
11static int *stat_ptr_int = stat_int_arr;
12static int stat_int;
13
14struct S {
15  int a;
16  short b, c;
17  char d[8];
18  struct S *next;
19};
20
21struct S str;
22struct S *ptr_str = &str;
23
24/* Prefetch global variables using the address of the variable.  */
25
26void
27simple_global ()
28{
29  __builtin_prefetch (glob_int_arr, 0, 0);
30  __builtin_prefetch (glob_ptr_int, 0, 0);
31  __builtin_prefetch (&glob_int, 0, 0);
32}
33
34/* Prefetch file-level static variables using the address of the variable.  */
35
36void
37simple_file ()
38{
39  __builtin_prefetch (stat_int_arr, 0, 0);
40  __builtin_prefetch (stat_ptr_int, 0, 0);
41  __builtin_prefetch (&stat_int, 0, 0);
42}
43
44/* Prefetch local static variables using the address of the variable.  */
45
46void
47simple_static_local ()
48{
49  static int gx[100];
50  static int *hx = gx;
51  static int ix;
52  __builtin_prefetch (gx, 0, 0);
53  __builtin_prefetch (hx, 0, 0);
54  __builtin_prefetch (&ix, 0, 0);
55}
56
57/* Prefetch local stack variables using the address of the variable.  */
58
59void
60simple_local ()
61{
62  int gx[100];
63  int *hx = gx;
64  int ix;
65  __builtin_prefetch (gx, 0, 0);
66  __builtin_prefetch (hx, 0, 0);
67  __builtin_prefetch (&ix, 0, 0);
68}
69
70/* Prefetch arguments using the address of the variable.  */
71
72void
73simple_arg (int g[100], int *h, int i)
74{
75  __builtin_prefetch (g, 0, 0);
76  __builtin_prefetch (h, 0, 0);
77  __builtin_prefetch (&i, 0, 0);
78}
79
80/* Prefetch using address expressions involving global variables.  */
81
82void
83expr_global (void)
84{
85  __builtin_prefetch (&str, 0, 0);
86  __builtin_prefetch (ptr_str, 0, 0);
87  __builtin_prefetch (&str.b, 0, 0);
88  __builtin_prefetch (&ptr_str->b, 0, 0);
89  __builtin_prefetch (&str.d, 0, 0);
90  __builtin_prefetch (&ptr_str->d, 0, 0);
91  __builtin_prefetch (str.next, 0, 0);
92  __builtin_prefetch (ptr_str->next, 0, 0);
93  __builtin_prefetch (str.next->d, 0, 0);
94  __builtin_prefetch (ptr_str->next->d, 0, 0);
95
96  __builtin_prefetch (&glob_int_arr, 0, 0);
97  __builtin_prefetch (glob_ptr_int, 0, 0);
98  __builtin_prefetch (&glob_int_arr[2], 0, 0);
99  __builtin_prefetch (&glob_ptr_int[3], 0, 0);
100  __builtin_prefetch (glob_int_arr+3, 0, 0);
101  __builtin_prefetch (glob_int_arr+glob_int, 0, 0);
102  __builtin_prefetch (glob_ptr_int+5, 0, 0);
103  __builtin_prefetch (glob_ptr_int+glob_int, 0, 0);
104}
105
106/* Prefetch using address expressions involving local variables.  */
107
108void
109expr_local (void)
110{
111  int b[10];
112  int *pb = b;
113  struct S t;
114  struct S *pt = &t;
115  int j = 4;
116
117  __builtin_prefetch (&t, 0, 0);
118  __builtin_prefetch (pt, 0, 0);
119  __builtin_prefetch (&t.b, 0, 0);
120  __builtin_prefetch (&pt->b, 0, 0);
121  __builtin_prefetch (&t.d, 0, 0);
122  __builtin_prefetch (&pt->d, 0, 0);
123  __builtin_prefetch (t.next, 0, 0);
124  __builtin_prefetch (pt->next, 0, 0);
125  __builtin_prefetch (t.next->d, 0, 0);
126  __builtin_prefetch (pt->next->d, 0, 0);
127
128  __builtin_prefetch (&b, 0, 0);
129  __builtin_prefetch (pb, 0, 0);
130  __builtin_prefetch (&b[2], 0, 0);
131  __builtin_prefetch (&pb[3], 0, 0);
132  __builtin_prefetch (b+3, 0, 0);
133  __builtin_prefetch (b+j, 0, 0);
134  __builtin_prefetch (pb+5, 0, 0);
135  __builtin_prefetch (pb+j, 0, 0);
136}
137
138int
139main ()
140{
141  simple_global ();
142  simple_file ();
143  simple_static_local ();
144  simple_local ();
145  simple_arg (glob_int_arr, glob_ptr_int, glob_int);
146
147  str.next = &str;
148  expr_global ();
149  expr_local ();
150
151  exit (0);
152}
153