On Wed, 24 May 2023, Richard Biener via Gcc-patches wrote:
> I’d have to check the ISAs what they actually do here - it of course depends > on RTL semantics as well but as you say those are not strictly defined here > either. Plus, we can add the following executable test to the testsuite: #include <stdint.h> #define CHECK(TYPE, WIDTH, OP, COUNT, INVERT) \ { \ typedef TYPE vec __attribute__((vector_size(WIDTH))); \ \ static volatile vec zero; \ vec tmp = (zero-2) OP (COUNT); \ vec ref = INVERT zero; \ if (__builtin_memcmp(&tmp, &ref, sizeof tmp)) \ __builtin_abort(); \ } int main(void) { CHECK( uint8_t, 16, <<, 8, ) CHECK( uint8_t, 16, <<, 31, ) CHECK( uint8_t, 16, >>, 8, ) CHECK( uint8_t, 16, >>, 31, ) CHECK( int8_t, 16, <<, 8, ) CHECK( int8_t, 16, <<, 31, ) CHECK( int8_t, 16, >>, 8, ~) CHECK( int8_t, 16, >>, 31, ~) CHECK(uint16_t, 16, <<, 16, ) CHECK(uint16_t, 16, <<, 31, ) CHECK(uint16_t, 16, >>, 16, ) CHECK(uint16_t, 16, >>, 31, ) CHECK( int16_t, 16, <<, 16, ) CHECK( int16_t, 16, <<, 31, ) CHECK( int16_t, 16, >>, 16, ~) CHECK( int16_t, 16, >>, 31, ~) // Per-lane-variable shifts: CHECK( uint8_t, 16, <<, zero+8, ) CHECK( uint8_t, 16, <<, zero+31, ) CHECK( uint8_t, 16, >>, zero+8, ) CHECK( uint8_t, 16, >>, zero+31, ) CHECK( int8_t, 16, <<, zero+8, ) CHECK( int8_t, 16, <<, zero+31, ) CHECK( int8_t, 16, >>, zero+8, ~) CHECK( int8_t, 16, >>, zero+31, ~) CHECK(uint16_t, 16, <<, zero+16, ) CHECK(uint16_t, 16, <<, zero+31, ) CHECK(uint16_t, 16, >>, zero+16, ) CHECK(uint16_t, 16, >>, zero+31, ) CHECK( int16_t, 16, <<, zero+16, ) CHECK( int16_t, 16, <<, zero+31, ) CHECK( int16_t, 16, >>, zero+16, ~) CHECK( int16_t, 16, >>, zero+31, ~) // Repeat for WIDTH=32 and WIDTH=64 } Alexander