| // RUN: %clang_cc1 -triple thumbv8.1m.main-arm-none-eabi -fallow-half-arguments-and-returns -target-feature +mve.fp -verify -fsyntax-only %s |
| |
| #include <arm_mve.h> |
| |
| void test_load_offsets(uint32x4_t addr32, uint64x2_t addr64) |
| { |
| // Offsets that should be a multiple of 8 times 0,1,...,127 |
| vldrdq_gather_base_s64(addr64, 0); |
| vldrdq_gather_base_s64(addr64, 8); |
| vldrdq_gather_base_s64(addr64, 2*8); |
| vldrdq_gather_base_s64(addr64, 125*8); |
| vldrdq_gather_base_s64(addr64, 126*8); |
| vldrdq_gather_base_s64(addr64, 127*8); |
| vldrdq_gather_base_s64(addr64, -125*8); |
| vldrdq_gather_base_s64(addr64, -126*8); |
| vldrdq_gather_base_s64(addr64, -127*8); |
| vldrdq_gather_base_s64(addr64, 128*8); // expected-error {{argument value 1024 is outside the valid range [-1016, 1016]}} |
| vldrdq_gather_base_s64(addr64, -128*8); // expected-error {{argument value -1024 is outside the valid range [-1016, 1016]}} |
| vldrdq_gather_base_s64(addr64, 4); // expected-error {{argument should be a multiple of 8}} |
| vldrdq_gather_base_s64(addr64, 1); // expected-error {{argument should be a multiple of 8}} |
| |
| // Offsets that should be a multiple of 4 times 0,1,...,127 |
| vldrwq_gather_base_s32(addr32, 0); |
| vldrwq_gather_base_s32(addr32, 4); |
| vldrwq_gather_base_s32(addr32, 2*4); |
| vldrwq_gather_base_s32(addr32, 125*4); |
| vldrwq_gather_base_s32(addr32, 126*4); |
| vldrwq_gather_base_s32(addr32, 127*4); |
| vldrwq_gather_base_s32(addr32, -125*4); |
| vldrwq_gather_base_s32(addr32, -126*4); |
| vldrwq_gather_base_s32(addr32, -127*4); |
| vldrwq_gather_base_s32(addr32, 128*4); // expected-error {{argument value 512 is outside the valid range [-508, 508]}} |
| vldrwq_gather_base_s32(addr32, -128*4); // expected-error {{argument value -512 is outside the valid range [-508, 508]}} |
| vldrwq_gather_base_s32(addr32, 2); // expected-error {{argument should be a multiple of 4}} |
| vldrwq_gather_base_s32(addr32, 1); // expected-error {{argument should be a multiple of 4}} |
| |
| // Show that the polymorphic store intrinsics get the right set of |
| // error checks after overload resolution. These ones expand to the |
| // 8-byte granular versions... |
| vstrdq_scatter_base(addr64, 0, addr64); |
| vstrdq_scatter_base(addr64, 8, addr64); |
| vstrdq_scatter_base(addr64, 2*8, addr64); |
| vstrdq_scatter_base(addr64, 125*8, addr64); |
| vstrdq_scatter_base(addr64, 126*8, addr64); |
| vstrdq_scatter_base(addr64, 127*8, addr64); |
| vstrdq_scatter_base(addr64, -125*8, addr64); |
| vstrdq_scatter_base(addr64, -126*8, addr64); |
| vstrdq_scatter_base(addr64, -127*8, addr64); |
| vstrdq_scatter_base(addr64, 128*8, addr64); // expected-error {{argument value 1024 is outside the valid range [-1016, 1016]}} |
| vstrdq_scatter_base(addr64, -128*8, addr64); // expected-error {{argument value -1024 is outside the valid range [-1016, 1016]}} |
| vstrdq_scatter_base(addr64, 4, addr64); // expected-error {{argument should be a multiple of 8}} |
| vstrdq_scatter_base(addr64, 1, addr64); // expected-error {{argument should be a multiple of 8}} |
| |
| /// ... and these ones to the 4-byte. |
| vstrwq_scatter_base(addr32, 0, addr32); |
| vstrwq_scatter_base(addr32, 4, addr32); |
| vstrwq_scatter_base(addr32, 2*4, addr32); |
| vstrwq_scatter_base(addr32, 125*4, addr32); |
| vstrwq_scatter_base(addr32, 126*4, addr32); |
| vstrwq_scatter_base(addr32, 127*4, addr32); |
| vstrwq_scatter_base(addr32, -125*4, addr32); |
| vstrwq_scatter_base(addr32, -126*4, addr32); |
| vstrwq_scatter_base(addr32, -127*4, addr32); |
| vstrwq_scatter_base(addr32, 128*4, addr32); // expected-error {{argument value 512 is outside the valid range [-508, 508]}} |
| vstrwq_scatter_base(addr32, -128*4, addr32); // expected-error {{argument value -512 is outside the valid range [-508, 508]}} |
| vstrwq_scatter_base(addr32, 2, addr32); // expected-error {{argument should be a multiple of 4}} |
| vstrwq_scatter_base(addr32, 1, addr32); // expected-error {{argument should be a multiple of 4}} |
| } |
| |
| void test_lane_indices(uint8x16_t v16, uint16x8_t v8, |
| uint32x4_t v4, uint64x2_t v2) |
| { |
| vgetq_lane_u8(v16, -1); // expected-error {{argument value -1 is outside the valid range [0, 15]}} |
| vgetq_lane_u8(v16, 0); |
| vgetq_lane_u8(v16, 15); |
| vgetq_lane_u8(v16, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}} |
| |
| vgetq_lane_u16(v8, -1); // expected-error {{argument value -1 is outside the valid range [0, 7]}} |
| vgetq_lane_u16(v8, 0); |
| vgetq_lane_u16(v8, 7); |
| vgetq_lane_u16(v8, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}} |
| |
| vgetq_lane_u32(v4, -1); // expected-error {{argument value -1 is outside the valid range [0, 3]}} |
| vgetq_lane_u32(v4, 0); |
| vgetq_lane_u32(v4, 3); |
| vgetq_lane_u32(v4, 4); // expected-error {{argument value 4 is outside the valid range [0, 3]}} |
| |
| vgetq_lane_u64(v2, -1); // expected-error {{argument value -1 is outside the valid range [0, 1]}} |
| vgetq_lane_u64(v2, 0); |
| vgetq_lane_u64(v2, 1); |
| vgetq_lane_u64(v2, 2); // expected-error {{argument value 2 is outside the valid range [0, 1]}} |
| |
| vsetq_lane_u8(23, v16, -1); // expected-error {{argument value -1 is outside the valid range [0, 15]}} |
| vsetq_lane_u8(23, v16, 0); |
| vsetq_lane_u8(23, v16, 15); |
| vsetq_lane_u8(23, v16, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}} |
| |
| vsetq_lane_u16(23, v8, -1); // expected-error {{argument value -1 is outside the valid range [0, 7]}} |
| vsetq_lane_u16(23, v8, 0); |
| vsetq_lane_u16(23, v8, 7); |
| vsetq_lane_u16(23, v8, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}} |
| |
| vsetq_lane_u32(23, v4, -1); // expected-error {{argument value -1 is outside the valid range [0, 3]}} |
| vsetq_lane_u32(23, v4, 0); |
| vsetq_lane_u32(23, v4, 3); |
| vsetq_lane_u32(23, v4, 4); // expected-error {{argument value 4 is outside the valid range [0, 3]}} |
| |
| vsetq_lane_u64(23, v2, -1); // expected-error {{argument value -1 is outside the valid range [0, 1]}} |
| vsetq_lane_u64(23, v2, 0); |
| vsetq_lane_u64(23, v2, 1); |
| vsetq_lane_u64(23, v2, 2); // expected-error {{argument value 2 is outside the valid range [0, 1]}} |
| } |
| |
| void test_immediate_shifts(uint8x16_t vb, uint16x8_t vh, uint32x4_t vw) |
| { |
| vshlq_n(vb, 0); |
| vshlq_n(vb, 7); |
| vshlq_n(vh, 0); |
| vshlq_n(vh, 15); |
| vshlq_n(vw, 0); |
| vshlq_n(vw, 31); |
| |
| vshlq_n(vb, -1); // expected-error {{argument value -1 is outside the valid range [0, 7]}} |
| vshlq_n(vb, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}} |
| vshlq_n(vh, -1); // expected-error {{argument value -1 is outside the valid range [0, 15]}} |
| vshlq_n(vh, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}} |
| vshlq_n(vw, -1); // expected-error {{argument value -1 is outside the valid range [0, 31]}} |
| vshlq_n(vw, 32); // expected-error {{argument value 32 is outside the valid range [0, 31]}} |
| |
| vqshlq_n(vb, 0); |
| vqshlq_n(vb, 7); |
| vqshlq_n(vh, 0); |
| vqshlq_n(vh, 15); |
| vqshlq_n(vw, 0); |
| vqshlq_n(vw, 31); |
| |
| vqshlq_n(vb, -1); // expected-error {{argument value -1 is outside the valid range [0, 7]}} |
| vqshlq_n(vb, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}} |
| vqshlq_n(vh, -1); // expected-error {{argument value -1 is outside the valid range [0, 15]}} |
| vqshlq_n(vh, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}} |
| vqshlq_n(vw, -1); // expected-error {{argument value -1 is outside the valid range [0, 31]}} |
| vqshlq_n(vw, 32); // expected-error {{argument value 32 is outside the valid range [0, 31]}} |
| |
| vsliq(vb, vb, 0); |
| vsliq(vb, vb, 7); |
| vsliq(vh, vh, 0); |
| vsliq(vh, vh, 15); |
| vsliq(vw, vw, 0); |
| vsliq(vw, vw, 31); |
| |
| vsliq(vb, vb, -1); // expected-error {{argument value -1 is outside the valid range [0, 7]}} |
| vsliq(vb, vb, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}} |
| vsliq(vh, vh, -1); // expected-error {{argument value -1 is outside the valid range [0, 15]}} |
| vsliq(vh, vh, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}} |
| vsliq(vw, vw, -1); // expected-error {{argument value -1 is outside the valid range [0, 31]}} |
| vsliq(vw, vw, 32); // expected-error {{argument value 32 is outside the valid range [0, 31]}} |
| |
| vshllbq(vb, 1); |
| vshllbq(vb, 8); |
| vshllbq(vh, 1); |
| vshllbq(vh, 16); |
| |
| vshllbq(vb, 0); // expected-error {{argument value 0 is outside the valid range [1, 8]}} |
| vshllbq(vb, 9); // expected-error {{argument value 9 is outside the valid range [1, 8]}} |
| vshllbq(vh, 0); // expected-error {{argument value 0 is outside the valid range [1, 16]}} |
| vshllbq(vh, 17); // expected-error {{argument value 17 is outside the valid range [1, 16]}} |
| |
| vshrq(vb, 1); |
| vshrq(vb, 8); |
| vshrq(vh, 1); |
| vshrq(vh, 16); |
| vshrq(vw, 1); |
| vshrq(vw, 32); |
| |
| vshrq(vb, 0); // expected-error {{argument value 0 is outside the valid range [1, 8]}} |
| vshrq(vb, 9); // expected-error {{argument value 9 is outside the valid range [1, 8]}} |
| vshrq(vh, 0); // expected-error {{argument value 0 is outside the valid range [1, 16]}} |
| vshrq(vh, 17); // expected-error {{argument value 17 is outside the valid range [1, 16]}} |
| vshrq(vw, 0); // expected-error {{argument value 0 is outside the valid range [1, 32]}} |
| vshrq(vw, 33); // expected-error {{argument value 33 is outside the valid range [1, 32]}} |
| |
| vshrntq(vb, vh, 1); |
| vshrntq(vb, vh, 8); |
| vshrntq(vh, vw, 1); |
| vshrntq(vh, vw, 16); |
| |
| vshrntq(vb, vh, 0); // expected-error {{argument value 0 is outside the valid range [1, 8]}} |
| vshrntq(vb, vh, 9); // expected-error {{argument value 9 is outside the valid range [1, 8]}} |
| vshrntq(vh, vw, 0); // expected-error {{argument value 0 is outside the valid range [1, 16]}} |
| vshrntq(vh, vw, 17); // expected-error {{argument value 17 is outside the valid range [1, 16]}} |
| |
| vsriq(vb, vb, 1); |
| vsriq(vb, vb, 8); |
| vsriq(vh, vh, 1); |
| vsriq(vh, vh, 16); |
| vsriq(vw, vw, 1); |
| vsriq(vw, vw, 32); |
| |
| vsriq(vb, vb, 0); // expected-error {{argument value 0 is outside the valid range [1, 8]}} |
| vsriq(vb, vb, 9); // expected-error {{argument value 9 is outside the valid range [1, 8]}} |
| vsriq(vh, vh, 0); // expected-error {{argument value 0 is outside the valid range [1, 16]}} |
| vsriq(vh, vh, 17); // expected-error {{argument value 17 is outside the valid range [1, 16]}} |
| vsriq(vw, vw, 0); // expected-error {{argument value 0 is outside the valid range [1, 32]}} |
| vsriq(vw, vw, 33); // expected-error {{argument value 33 is outside the valid range [1, 32]}} |
| } |