/* Test vld1 and vst1 maintain consistent indexing. */ /* { dg-do run } */ /* { dg-options "-O3" } */ #include extern void abort (void); #define TESTMETH(TYPE, NUM, BASETYPE, SUFFIX) \ int __attribute__ ((noinline)) \ test_vld1_vst1##SUFFIX () \ { \ TYPE vec; \ int i = 0; \ BASETYPE src[NUM]; \ BASETYPE dest[NUM]; \ for (i = 0; i < NUM; i++) \ src[i] = 2*i + 1; \ asm volatile ("":::"memory"); \ vec = vld1 ## SUFFIX (src); \ asm volatile ("":::"memory"); \ vst1 ## SUFFIX (dest, vec); \ asm volatile ("":::"memory"); \ for (i = 0; i < NUM; i++) \ if (src[i] != dest[i]) \ return 1; \ return 0; \ } #define VARIANTS(THING) \ THING (int8x8_t, 8, int8_t, _s8) \ THING (uint8x8_t, 8, uint8_t, _u8) \ THING (int16x4_t, 4, int16_t, _s16) \ THING (uint16x4_t, 4, uint16_t, _u16) \ THING (float16x4_t, 4, float16_t, _f16) \ THING (int32x2_t, 2, int32_t, _s32) \ THING (uint32x2_t, 2, uint32_t, _u32) \ THING (float32x2_t, 2, float32_t, _f32) \ THING (int8x16_t, 16, int8_t, q_s8) \ THING (uint8x16_t, 16, uint8_t, q_u8) \ THING (int16x8_t, 8, int16_t, q_s16) \ THING (uint16x8_t, 8, uint16_t, q_u16) \ THING (float16x8_t, 8, float16_t, q_f16)\ THING (int32x4_t, 4, int32_t, q_s32) \ THING (uint32x4_t, 4, uint32_t, q_u32) \ THING (float32x4_t, 4, float32_t, q_f32)\ THING (int64x2_t, 2, int64_t, q_s64) \ THING (uint64x2_t, 2, uint64_t, q_u64) \ THING (float64x2_t, 2, float64_t, q_f64) VARIANTS (TESTMETH) #define DOTEST(TYPE, NUM, BASETYPE, SUFFIX) \ if (test_vld1_vst1##SUFFIX ()) \ abort (); int main () { VARIANTS (DOTEST); return 0; }