1 /* { dg-do compile { target powerpc*-*-* } } */
2 /* { dg-require-effective-target powerpc_p8vector_ok } */
3 /* { dg-options "-mpower8-vector -mvsx" } */
4 
5 #include <altivec.h>
6 
7 #ifdef DEBUG
8 #include <stdio.h>
9 #endif
10 
11 void abort (void);
12 
13 /* Endian considerations: The "high" half of a vector with n elements is the
14    first n/2 elements of the vector. For little endian, these elements are in
15    the rightmost half of the vector. For big endian, these elements are in the
16    leftmost half of the vector.  */
17 
main()18 int main ()
19 {
20   int i;
21   vector bool int vec_bi_arg;
22   vector bool long long vec_bll_result, vec_bll_expected;
23 
24   vector signed int vec_si_arg;
25   vector signed long long int vec_slli_result, vec_slli_expected;
26   vector float vec_float_arg;
27   vector double vec_double_result, vec_double_expected;
28 
29   union conv {
30 	  double d;
31 	  unsigned long long l;
32   } conv_exp, conv_val;
33 
34   /* Use of 'double' and ‘long long’ in AltiVec types requires -mvsx */
35   /* __builtin_altivec_vupkhsw and __builtin_altivec_vupklsw
36      requires the -mpower8-vector option */
37 
38   vec_bi_arg = (vector bool int){ 0, 1, 1, 0 };
39 
40   vec_bll_expected = (vector bool long long){ 0, 1 };
41 
42   vec_bll_result = vec_unpackh (vec_bi_arg);
43 
44   for (i = 0; i < 2; i++) {
45     if (vec_bll_expected[i] != vec_bll_result[i])
46 #if DEBUG
47        printf("ERROR: vec_unpackh, vec_bll_expected[%d] = %d does not match vec_bll_result[%d] = %d\n",
48 	      i, vec_bll_expected[i], i, vec_bll_result[i]);
49 #else
50        abort();
51 #endif
52   }
53 
54   vec_bll_expected = (vector bool long long){ 1, 0 };
55 
56   vec_bll_result = vec_unpackl (vec_bi_arg);
57 
58   for (i = 0; i < 2; i++) {
59     if (vec_bll_expected[i] != vec_bll_result[i])
60 #if DEBUG
61        printf("ERROR: vec_unpackl, vec_bll_expected[%d] = %d does not match vec_bll_result[%d] = %d\n",
62 	      i, vec_bll_expected[i], i, vec_bll_result[i]);
63 #else
64        abort();
65 #endif
66   }
67 
68 
69   vec_si_arg = (vector signed int){ 0, 101, 202, 303 };
70 
71   vec_slli_expected = (vector signed long long int){ 0, 101 };
72 
73   vec_slli_result = vec_unpackh (vec_si_arg);
74 
75   for (i = 0; i < 2; i++) {
76     if (vec_slli_expected[i] != vec_slli_result[i])
77 #if DEBUG
78        printf("ERROR: vec_unpackh, vec_slli_expected[%d] = %d does not match vec_slli_result[%d] = %d\n",
79 	      i, vec_slli_expected[i], i, vec_slli_result[i]);
80 #else
81        abort();
82 #endif
83   }
84 
85   vec_slli_result = vec_unpackl (vec_si_arg);
86   vec_slli_expected = (vector signed long long int){ 202, 303 };
87 
88   for (i = 0; i < 2; i++) {
89     if (vec_slli_expected[i] != vec_slli_result[i])
90 #if DEBUG
91        printf("ERROR: vec_unpackl, vec_slli_expected[%d] = %d does not match vec_slli_result[%d] = %d\n",
92 	      i, vec_slli_expected[i], i, vec_slli_result[i]);
93 #else
94        abort();
95 #endif
96   }
97 
98   vec_float_arg = (vector float){ 0.0, 1.5, 2.5, 3.5 };
99 
100   vec_double_expected = (vector double){ 0.0, 1.5 };
101 
102   vec_double_result = vec_unpackh (vec_float_arg);
103 
104   for (i = 0; i < 2; i++) {
105     if (vec_double_expected[i] != vec_double_result[i])
106       {
107 #if DEBUG
108 	 printf("ERROR: vec_unpackh(), vec_double_expected[%d] = %f does not match vec_double_result[%d] = %f\n",
109 		i, vec_double_expected[i], i, vec_double_result[i]);
110 	 conv_val.d = vec_double_result[i];
111 	 conv_exp.d = vec_double_expected[i];
112 	 printf("     vec_unpackh(), vec_double_expected[%d] = 0x%llx does not match vec_double_result[%d] = 0x%llx\n",
113 		i, conv_exp.l, i,conv_val.l);
114 #else
115 	 abort();
116 #endif
117     }
118   }
119 
120   vec_double_expected = (vector double){ 2.5, 3.5 };
121 
122   vec_double_result = vec_unpackl (vec_float_arg);
123 
124   for (i = 0; i < 2; i++) {
125     if (vec_double_expected[i] != vec_double_result[i])
126       {
127 #if DEBUG
128          printf("ERROR: vec_unpackl() vec_double_expected[%d] = %f does not match vec_double_result[%d] = %f\n",
129 		i, vec_double_expected[i], i, vec_double_result[i]);
130 	 conv_val.d = vec_double_result[i];
131 	 conv_exp.d = vec_double_expected[i];
132 	 printf("     vec_unpackh(), vec_double_expected[%d] = 0x%llx does not match vec_double_result[%d] = 0x%llx\n",
133 		i, conv_exp.l, i,conv_val.l);
134 #else
135          abort();
136 #endif
137       }
138   }
139 
140   return 0;
141 }
142