/* { dg-do run } */ #define vector __attribute__((vector_size(sizeof(int)*4) )) static vector int allones = {1, 1, 1, 1}; static vector int allzeros = {0, 0, 0, 0}; static vector int numbers = {0, 1, 2, 3}; static vector int numbersleftshiftallones = {0, 2, 4, 6}; static vector int numbersrightshiftallones = {0, 0, 1, 1}; static vector unsigned int uallones = {1, 1, 1, 1}; static vector unsigned int uallzeros = {0, 0, 0, 0}; static vector unsigned int unumbers = {0, 1, 2, 3}; static vector unsigned int unumbersleftshiftallones = {0, 2, 4, 6}; static vector unsigned int unumbersrightshiftallones = {0, 0, 1, 1}; #define TEST(result, expected) \ do { \ __typeof__(result) result1 = result; \ if(sizeof (result1) != sizeof (expected)) \ __builtin_abort (); \ if (__builtin_memcmp (&result1, &expected, sizeof(result1)) != 0) \ __builtin_abort (); \ }while (0); int main(void) { vector int result; TEST ((numbers << allzeros), numbers); TEST ((numbers >> allzeros), numbers); TEST((numbers << allones), numbersleftshiftallones); TEST((numbers >> allones), numbersrightshiftallones); /* Test left shift followed by a right shift, numbers should be back as numbers are all small numbers and no lose of precision happens. */ TEST((numbers << allones) >> allones, numbers); TEST ((unumbers << uallzeros), unumbers); TEST ((unumbers >> uallzeros), unumbers); TEST((unumbers << uallones), unumbersleftshiftallones); TEST((unumbers >> uallones), unumbersrightshiftallones); /* Test left shift followed by a right shift, numbers should be back as numbers are all small numbers and no lose of precision happens. */ TEST((unumbers << uallones) >> uallones, unumbers); return 0; }