1 /* Test that __builtin_prefetch does no harm.
2 
3    Prefetch using all valid combinations of rw and locality values.
4    These must be compile-time constants.  */
5 
6 #define NO_TEMPORAL_LOCALITY 0
7 #define LOW_TEMPORAL_LOCALITY 1
8 #define MODERATE_TEMPORAL_LOCALITY 1
9 #define HIGH_TEMPORAL_LOCALITY 3
10 
11 #define WRITE_ACCESS 1
12 #define READ_ACCESS 0
13 
14 enum locality { none, low, moderate, high };
15 enum rw { read, write };
16 
17 int arr[10];
18 
19 void
good_const(const int * p)20 good_const (const int *p)
21 {
22   __builtin_prefetch (p, 0, 0);
23   __builtin_prefetch (p, 0, 1);
24   __builtin_prefetch (p, 0, 2);
25   __builtin_prefetch (p, READ_ACCESS, 3);
26   __builtin_prefetch (p, 1, NO_TEMPORAL_LOCALITY);
27   __builtin_prefetch (p, 1, LOW_TEMPORAL_LOCALITY);
28   __builtin_prefetch (p, 1, MODERATE_TEMPORAL_LOCALITY);
29   __builtin_prefetch (p, WRITE_ACCESS, HIGH_TEMPORAL_LOCALITY);
30 }
31 
32 void
good_enum(const int * p)33 good_enum (const int *p)
34 {
35     __builtin_prefetch (p, read, none);
36     __builtin_prefetch (p, read, low);
37     __builtin_prefetch (p, read, moderate);
38     __builtin_prefetch (p, read, high);
39     __builtin_prefetch (p, write, none);
40     __builtin_prefetch (p, write, low);
41     __builtin_prefetch (p, write, moderate);
42     __builtin_prefetch (p, write, high);
43 }
44 
45 void
good_expr(const int * p)46 good_expr (const int *p)
47 {
48   __builtin_prefetch (p, 1 - 1, 6 - (2 * 3));
49   __builtin_prefetch (p, 1 + 0, 1 + 2);
50 }
51 
52 void
good_vararg(const int * p)53 good_vararg (const int *p)
54 {
55   __builtin_prefetch (p, 0, 3);
56   __builtin_prefetch (p, 0);
57   __builtin_prefetch (p, 1);
58   __builtin_prefetch (p);
59 }
60 
61 int
main()62 main ()
63 {
64   good_const (arr);
65   good_enum (arr);
66   good_expr (arr);
67   good_vararg (arr);
68   exit (0);
69 }
70