blob: 4b07f07258f3256d0e688461049d137e43c7d9b5 [file] [log] [blame]
/* { dg-do run } */
/* { dg-require-effective-target vmx_hw } */
/* { dg-options "-maltivec" } */
/* This test should run the same on any target that supports altivec/dfp
instructions. Intentionally not specifying cpu in order to test
all code generation paths. */
#include <stdlib.h>
#include <stddef.h>
#include <altivec.h>
#include <stdio.h>
static void
check (unsigned char, unsigned char) __attribute__((__noinline__));
static __attribute__((altivec(vector__))) unsigned char
deoptimize (__attribute__((altivec(vector__))) unsigned char)
__attribute__((__noinline__));
static __attribute__((altivec(vector__))) unsigned char
deoptimize (__attribute__((altivec(vector__))) unsigned char a)
{
__asm__ (" # %x0" : "+v" (a));
return a;
}
// Toggle this attribute inline/noinline to see pass/fail.
// fails with the noinline attribute applied.
__attribute__ ((__noinline__))
unsigned char
get_auto_n (__attribute__((altivec(vector__))) unsigned char a, size_t n)
{
return (unsigned char) __builtin_vec_extract (a, n);
}
void
do_auto (__attribute__((altivec(vector__))) unsigned char a)
{
size_t i;
for (i = 1; i < 3 ; i++)
{
do
{
printf ("get_auto_n (a, %d) produces 0x0%x\n",
i, (int) get_auto_n (a, i));
if ((int) get_auto_n (a,i) > 250) abort();
} while (0);
}
}
int
main (void)
{
size_t i;
__attribute__((altivec(vector__))) unsigned char x =
{ 3, 2, 3, 8, 5, 6, 7, 8, 240, 241, 242, 243, 244, 245, 246, 247 };
__attribute__((altivec(vector__))) unsigned char a;
printf (" first elements of x are: %d %d %d %d %d\n",
x[0], x[1], x[2], x[3], x[4]);
a = deoptimize (x);
printf (" after deoptimization, first elements of a are: %d %d %d %d %d\n",
a[0], a[1], a[2], a[3], a[4]);
do_auto (a);
return 0;
}