Update ChangeLog and version files for release
[official-gcc.git] / gcc / testsuite / c-c++-common / torture / vector-shift.c
blobf690b7c3d6e6824dc8d695ee546554aacacfc1b4
1 /* { dg-do run } */
3 #define vector __attribute__((vector_size(sizeof(int)*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};
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};
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);
27 int main(void)
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);
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);
48 return 0;