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
|
/* Test that __builtin_prefetch does no harm.
Prefetch data using a variety of storage classes and address
expressions. */
int glob_int_arr[100];
int *glob_ptr_int = glob_int_arr;
int glob_int = 4;
static stat_int_arr[100];
static int *stat_ptr_int = stat_int_arr;
static int stat_int;
struct S {
int a;
short b, c;
char d[8];
struct S *next;
};
struct S str;
struct S *ptr_str = &str;
/* Prefetch global variables using the address of the variable. */
void
simple_global ()
{
__builtin_prefetch (glob_int_arr, 0, 0);
__builtin_prefetch (glob_ptr_int, 0, 0);
__builtin_prefetch (&glob_int, 0, 0);
}
/* Prefetch file-level static variables using the address of the variable. */
void
simple_file ()
{
__builtin_prefetch (stat_int_arr, 0, 0);
__builtin_prefetch (stat_ptr_int, 0, 0);
__builtin_prefetch (&stat_int, 0, 0);
}
/* Prefetch local static variables using the address of the variable. */
void
simple_static_local ()
{
static int gx[100];
static int *hx = gx;
static int ix;
__builtin_prefetch (gx, 0, 0);
__builtin_prefetch (hx, 0, 0);
__builtin_prefetch (&ix, 0, 0);
}
/* Prefetch local stack variables using the address of the variable. */
void
simple_local ()
{
int gx[100];
int *hx = gx;
int ix;
__builtin_prefetch (gx, 0, 0);
__builtin_prefetch (hx, 0, 0);
__builtin_prefetch (&ix, 0, 0);
}
/* Prefetch arguments using the address of the variable. */
void
simple_arg (int g[100], int *h, int i)
{
__builtin_prefetch (g, 0, 0);
__builtin_prefetch (h, 0, 0);
__builtin_prefetch (&i, 0, 0);
}
/* Prefetch using address expressions involving global variables. */
void
expr_global (void)
{
__builtin_prefetch (&str, 0, 0);
__builtin_prefetch (ptr_str, 0, 0);
__builtin_prefetch (&str.b, 0, 0);
__builtin_prefetch (&ptr_str->b, 0, 0);
__builtin_prefetch (&str.d, 0, 0);
__builtin_prefetch (&ptr_str->d, 0, 0);
__builtin_prefetch (str.next, 0, 0);
__builtin_prefetch (ptr_str->next, 0, 0);
__builtin_prefetch (str.next->d, 0, 0);
__builtin_prefetch (ptr_str->next->d, 0, 0);
__builtin_prefetch (&glob_int_arr, 0, 0);
__builtin_prefetch (glob_ptr_int, 0, 0);
__builtin_prefetch (&glob_int_arr[2], 0, 0);
__builtin_prefetch (&glob_ptr_int[3], 0, 0);
__builtin_prefetch (glob_int_arr+3, 0, 0);
__builtin_prefetch (glob_int_arr+glob_int, 0, 0);
__builtin_prefetch (glob_ptr_int+5, 0, 0);
__builtin_prefetch (glob_ptr_int+glob_int, 0, 0);
}
/* Prefetch using address expressions involving local variables. */
void
expr_local (void)
{
int b[10];
int *pb = b;
struct S t;
struct S *pt = &t;
int j = 4;
__builtin_prefetch (&t, 0, 0);
__builtin_prefetch (pt, 0, 0);
__builtin_prefetch (&t.b, 0, 0);
__builtin_prefetch (&pt->b, 0, 0);
__builtin_prefetch (&t.d, 0, 0);
__builtin_prefetch (&pt->d, 0, 0);
__builtin_prefetch (t.next, 0, 0);
__builtin_prefetch (pt->next, 0, 0);
__builtin_prefetch (t.next->d, 0, 0);
__builtin_prefetch (pt->next->d, 0, 0);
__builtin_prefetch (&b, 0, 0);
__builtin_prefetch (pb, 0, 0);
__builtin_prefetch (&b[2], 0, 0);
__builtin_prefetch (&pb[3], 0, 0);
__builtin_prefetch (b+3, 0, 0);
__builtin_prefetch (b+j, 0, 0);
__builtin_prefetch (pb+5, 0, 0);
__builtin_prefetch (pb+j, 0, 0);
}
int
main ()
{
simple_global ();
simple_file ();
simple_static_local ();
simple_local ();
simple_arg (glob_int_arr, glob_ptr_int, glob_int);
str.next = &str;
expr_global ();
expr_local ();
exit (0);
}
|