Viewing file: pr87532.c (1.74 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { 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; }
|