1 /* { dg-do run } */
2 
3 #define vector __attribute__((vector_size(sizeof(int)*4) ))
4 
5 static vector int allones = {1, 1, 1, 1};
6 static vector int allzeros = {0, 0, 0, 0};
7 static vector int numbers = {0, 1, 2, 3};
8 static vector int numbersleftshiftallones = {0, 2, 4, 6};
9 static vector int numbersrightshiftallones = {0, 0, 1, 1};
10 
11 
12 static vector unsigned int uallones = {1, 1, 1, 1};
13 static vector unsigned int uallzeros = {0, 0, 0, 0};
14 static vector unsigned int unumbers = {0, 1, 2, 3};
15 static vector unsigned int unumbersleftshiftallones = {0, 2, 4, 6};
16 static vector unsigned int unumbersrightshiftallones = {0, 0, 1, 1};
17 
18 #define TEST(result, expected) \
19 do { \
20   __typeof__(result) result1 = result; \
21   if(sizeof (result1) != sizeof (expected)) \
22     __builtin_abort (); \
23   if (__builtin_memcmp (&result1, &expected, sizeof(result1)) != 0) \
24     __builtin_abort (); \
25 }while (0);
26 
main(void)27 int main(void)
28 {
29   vector int result;
30   TEST ((numbers << allzeros), numbers);
31   TEST ((numbers >> allzeros), numbers);
32   TEST((numbers << allones), numbersleftshiftallones);
33   TEST((numbers >> allones), numbersrightshiftallones);
34   /* Test left shift followed by a right shift, numbers should be back as
35      numbers are all small numbers and no lose of precision happens.   */
36   TEST((numbers << allones) >> allones, numbers);
37 
38 
39 
40   TEST ((unumbers << uallzeros), unumbers);
41   TEST ((unumbers >> uallzeros), unumbers);
42   TEST((unumbers << uallones), unumbersleftshiftallones);
43   TEST((unumbers >> uallones), unumbersrightshiftallones);
44   /* Test left shift followed by a right shift, numbers should be back as
45      numbers are all small numbers and no lose of precision happens.   */
46   TEST((unumbers << uallones) >> uallones, unumbers);
47 
48   return 0;
49 }
50