/* Test that __builtin_prefetch does no harm.
|
/* Test that __builtin_prefetch does no harm.
|
|
|
Use addresses that are unlikely to be word-aligned. Some targets
|
Use addresses that are unlikely to be word-aligned. Some targets
|
have alignment requirements for prefetch addresses, so make sure the
|
have alignment requirements for prefetch addresses, so make sure the
|
compiler takes care of that. This fails if it aborts, anything else
|
compiler takes care of that. This fails if it aborts, anything else
|
is OK. */
|
is OK. */
|
|
|
struct S {
|
struct S {
|
short a;
|
short a;
|
short b;
|
short b;
|
char c[8];
|
char c[8];
|
} s;
|
} s;
|
|
|
char arr[100];
|
char arr[100];
|
char *ptr = arr;
|
char *ptr = arr;
|
int idx = 3;
|
int idx = 3;
|
|
|
void
|
void
|
arg_ptr (char *p)
|
arg_ptr (char *p)
|
{
|
{
|
__builtin_prefetch (p, 0, 0);
|
__builtin_prefetch (p, 0, 0);
|
}
|
}
|
|
|
void
|
void
|
arg_idx (char *p, int i)
|
arg_idx (char *p, int i)
|
{
|
{
|
__builtin_prefetch (&p[i], 0, 0);
|
__builtin_prefetch (&p[i], 0, 0);
|
}
|
}
|
|
|
void
|
void
|
glob_ptr (void)
|
glob_ptr (void)
|
{
|
{
|
__builtin_prefetch (ptr, 0, 0);
|
__builtin_prefetch (ptr, 0, 0);
|
}
|
}
|
|
|
void
|
void
|
glob_idx (void)
|
glob_idx (void)
|
{
|
{
|
__builtin_prefetch (&ptr[idx], 0, 0);
|
__builtin_prefetch (&ptr[idx], 0, 0);
|
}
|
}
|
|
|
int
|
int
|
main ()
|
main ()
|
{
|
{
|
__builtin_prefetch (&s.b, 0, 0);
|
__builtin_prefetch (&s.b, 0, 0);
|
__builtin_prefetch (&s.c[1], 0, 0);
|
__builtin_prefetch (&s.c[1], 0, 0);
|
|
|
arg_ptr (&s.c[1]);
|
arg_ptr (&s.c[1]);
|
arg_ptr (ptr+3);
|
arg_ptr (ptr+3);
|
arg_idx (ptr, 3);
|
arg_idx (ptr, 3);
|
arg_idx (ptr+1, 2);
|
arg_idx (ptr+1, 2);
|
idx = 3;
|
idx = 3;
|
glob_ptr ();
|
glob_ptr ();
|
glob_idx ();
|
glob_idx ();
|
ptr++;
|
ptr++;
|
idx = 2;
|
idx = 2;
|
glob_ptr ();
|
glob_ptr ();
|
glob_idx ();
|
glob_idx ();
|
exit (0);
|
exit (0);
|
}
|
}
|
|
|