1 /* { dg-do run { target { *-*-linux* && { lp64 && p9vector_hw } } } } */
2 /* { dg-require-effective-target powerpc_p9vector_ok } */
3 /* { dg-options "-O2 -mdejagnu-cpu=power9 -save-temps" } */
4
5 /* These builtins were not defined until ISA 3.1 but only require ISA 3.0
6 support. */
7
8 /* { dg-final { scan-assembler-times {\mvextsb2w\M} 1 } } */
9 /* { dg-final { scan-assembler-times {\mvextsb2d\M} 1 } } */
10 /* { dg-final { scan-assembler-times {\mvextsh2w\M} 1 } } */
11 /* { dg-final { scan-assembler-times {\mvextsh2d\M} 1 } } */
12 /* { dg-final { scan-assembler-times {\mvextsw2d\M} 1 } } */
13
14 #include <altivec.h>
15
16 #define DEBUG 0
17
18 #if DEBUG
19 #include <stdio.h>
20 #include <stdlib.h>
21 #endif
22
23 void abort (void);
24
25 int main ()
26 {
27 int i;
28
29 vector signed char vec_arg_qi, vec_result_qi;
30 vector signed short int vec_arg_hi, vec_result_hi, vec_expected_hi;
31 vector signed int vec_arg_wi, vec_result_wi, vec_expected_wi;
32 vector signed long long vec_result_di, vec_expected_di;
33
34 /* test sign extend byte to word */
35 vec_arg_qi = (vector signed char) {1, 2, 3, 4, 5, 6, 7, 8,
36 -1, -2, -3, -4, -5, -6, -7, -8};
37
38 #ifdef __BIG_ENDIAN__
39 vec_expected_wi = (vector signed int) {4, 8, -4, -8};
40 #else
41 vec_expected_wi = (vector signed int) {1, 5, -1, -5};
42 #endif
43
44 vec_result_wi = vec_signexti (vec_arg_qi);
45
46 for (i = 0; i < 4; i++)
47 if (vec_result_wi[i] != vec_expected_wi[i]) {
48 #if DEBUG
49 printf("ERROR: vec_signexti(char, int): ");
50 printf("vec_result_wi[%d] != vec_expected_wi[%d]\n",
51 i, i);
52 printf("vec_result_wi[%d] = %d\n", i, vec_result_wi[i]);
53 printf("vec_expected_wi[%d] = %d\n", i, vec_expected_wi[i]);
54 #else
55 abort();
56 #endif
57 }
58
59 /* test sign extend byte to double */
60 vec_arg_qi = (vector signed char){1, 2, 3, 4, 5, 6, 7, 8,
61 -1, -2, -3, -4, -5, -6, -7, -8};
62
63 #ifdef __BIG_ENDIAN__
64 vec_expected_di = (vector signed long long int){8, -8};
65 #else
66 vec_expected_di = (vector signed long long int){1, -1};
67 #endif
68
69 vec_result_di = vec_signextll(vec_arg_qi);
70
71 for (i = 0; i < 2; i++)
72 if (vec_result_di[i] != vec_expected_di[i]) {
73 #if DEBUG
74 printf("ERROR: vec_signextll(byte, long long int): ");
75 printf("vec_result_di[%d] != vec_expected_di[%d]\n", i, i);
76 printf("vec_result_di[%d] = %lld\n", i, vec_result_di[i]);
77 printf("vec_expected_di[%d] = %lld\n", i, vec_expected_di[i]);
78 #else
79 abort();
80 #endif
81 }
82
83 /* test sign extend short to word */
84 vec_arg_hi = (vector signed short int){1, 2, 3, 4, -1, -2, -3, -4};
85
86 #ifdef __BIG_ENDIAN__
87 vec_expected_wi = (vector signed int){2, 4, -2, -4};
88 #else
89 vec_expected_wi = (vector signed int){1, 3, -1, -3};
90 #endif
91
92 vec_result_wi = vec_signexti(vec_arg_hi);
93
94 for (i = 0; i < 4; i++)
95 if (vec_result_wi[i] != vec_expected_wi[i]) {
96 #if DEBUG
97 printf("ERROR: vec_signexti(short, int): ");
98 printf("vec_result_wi[%d] != vec_expected_wi[%d]\n", i, i);
99 printf("vec_result_wi[%d] = %d\n", i, vec_result_wi[i]);
100 printf("vec_expected_wi[%d] = %d\n", i, vec_expected_wi[i]);
101 #else
102 abort();
103 #endif
104 }
105
106 /* test sign extend short to double word */
107 vec_arg_hi = (vector signed short int ){1, 3, 5, 7, -1, -3, -5, -7};
108
109 #ifdef __BIG_ENDIAN__
110 vec_expected_di = (vector signed long long int){7, -7};
111 #else
112 vec_expected_di = (vector signed long long int){1, -1};
113 #endif
114
115 vec_result_di = vec_signextll(vec_arg_hi);
116
117 for (i = 0; i < 2; i++)
118 if (vec_result_di[i] != vec_expected_di[i]) {
119 #if DEBUG
120 printf("ERROR: vec_signextll(short, double): ");
121 printf("vec_result_di[%d] != vec_expected_di[%d]\n", i, i);
122 printf("vec_result_di[%d] = %lld\n", i, vec_result_di[i]);
123 printf("vec_expected_di[%d] = %lld\n", i, vec_expected_di[i]);
124 #else
125 abort();
126 #endif
127 }
128
129 /* test sign extend word to double word */
130 vec_arg_wi = (vector signed int ){1, 3, -1, -3};
131
132 #ifdef __BIG_ENDIAN__
133 vec_expected_di = (vector signed long long int){3, -3};
134 #else
135 vec_expected_di = (vector signed long long int){1, -1};
136 #endif
137
138 vec_result_di = vec_signextll(vec_arg_wi);
139
140 for (i = 0; i < 2; i++)
141 if (vec_result_di[i] != vec_expected_di[i]) {
142 #if DEBUG
143 printf("ERROR: vec_signextll(word, double): ");
144 printf("vec_result_di[%d] != vec_expected_di[%d]\n", i, i);
145 printf("vec_result_di[%d] = %lld\n", i, vec_result_di[i]);
146 printf("vec_expected_di[%d] = %lld\n", i, vec_expected_di[i]);
147 #else
148 abort();
149 #endif
150 }
151
152 return 0;
153 }