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