1/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */ 2/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */ 3/* { dg-require-effective-target powerpc_altivec_ok } */ 4/* { dg-options "-maltivec" } */ 5/* Test the vec_extract VMX intrinsics. */ 6#include <altivec.h> 7 8extern void abort (void); 9 10vector int a = {0, 1, 2, 3}; 11vector short b = {0, 1, 2, 3, 4, 5, 6, 7}; 12 13int f(vector int a, int b) 14{ 15 return vec_extract (a, b); 16} 17 18int f0 (vector int a) 19{ 20 return vec_extract (a, 0); 21} 22int f1 (vector int a) 23{ 24 return vec_extract (a, 1); 25} 26int f2 (vector int a) 27{ 28 return vec_extract (a, 2); 29} 30int f3 (vector int a) 31{ 32 return vec_extract (a, 3); 33} 34int f4 (vector int a) 35{ 36 return vec_extract (a, 4); 37} 38 39int g(vector short a, int b) 40{ 41 return vec_extract (a, b); 42} 43 44int g0 (vector short a) 45{ 46 return vec_extract (a, 0); 47} 48int g1 (vector short a) 49{ 50 return vec_extract (a, 1); 51} 52int g2 (vector short a) 53{ 54 return vec_extract (a, 2); 55} 56int g3 (vector short a) 57{ 58 return vec_extract (a, 3); 59} 60 61int g4 (vector short a) 62{ 63 return vec_extract (a, 4); 64} 65int g5 (vector short a) 66{ 67 return vec_extract (a, 5); 68} 69int g6 (vector short a) 70{ 71 return vec_extract (a, 6); 72} 73int g7 (vector short a) 74{ 75 return vec_extract (a, 7); 76} 77int g8 (vector short a) 78{ 79 return vec_extract (a, 8); 80} 81int main1(void) __attribute__((noinline)); 82int main1(void) 83{ 84 int i; 85 /* Check vec_extract with a non constant element numbering */ 86 for(i=0;i<10;i++) 87 { 88 if (f(a, i) != (i&0x3)) 89 abort (); 90 } 91 92 /* Check vec_extract with a constant element numbering */ 93 if (f0(a) != 0) 94 abort (); 95 if (f1(a) != 1) 96 abort (); 97 if (f2(a) != 2) 98 abort (); 99 if (f3(a) != 3) 100 abort (); 101 /* Check that vec_extract works with a constant element higher than 102 the number of elements. */ 103 if (f4(a) != 0) 104 abort (); 105 106 /* Check vec_extract with a non constant element numbering */ 107 for(i=0;i<10;i++) 108 { 109 if (g(b, i) != (i&0x7)) 110 abort (); 111 } 112 113 /* Check vec_extract with a constant element numbering */ 114 if (g0(b) != 0) 115 abort (); 116 if (g1(b) != 1) 117 abort (); 118 if (g2(b) != 2) 119 abort (); 120 if (g3(b) != 3) 121 abort (); 122 if (g4(b) != 4) 123 abort (); 124 if (g5(b) != 5) 125 abort (); 126 if (g6(b) != 6) 127 abort (); 128 if (g7(b) != 7) 129 abort (); 130 /* Check that vec_extract works with a constant element higher than 131 the number of elements. */ 132 if (g8(b) != 0) 133 abort (); 134 135 return 0; 136} 137 138int main(void) 139{ 140 return main1 (); 141} 142