// RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi -target-feature +mve.fp -verify -fsyntax-only %s // REQUIRES: aarch64-registered-target || arm-registered-target #include 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]}} } void test_simd_bic_orr(int16x8_t h, int32x4_t w) { h = vbicq(h, 0x0000); h = vbicq(h, 0x0001); h = vbicq(h, 0x00FF); h = vbicq(h, 0x0100); h = vbicq(h, 0x0101); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} h = vbicq(h, 0x01FF); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} h = vbicq(h, 0xFF00); w = vbicq(w, 0x00000000); w = vbicq(w, 0x00000001); w = vbicq(w, 0x000000FF); w = vbicq(w, 0x00000100); w = vbicq(w, 0x0000FF00); w = vbicq(w, 0x00010000); w = vbicq(w, 0x00FF0000); w = vbicq(w, 0x01000000); w = vbicq(w, 0xFF000000); w = vbicq(w, 0x01000001); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} w = vbicq(w, 0x01FFFFFF); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} h = vorrq(h, 0x0000); h = vorrq(h, 0x0001); h = vorrq(h, 0x00FF); h = vorrq(h, 0x0100); h = vorrq(h, 0x0101); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} h = vorrq(h, 0x01FF); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} h = vorrq(h, 0xFF00); w = vorrq(w, 0x00000000); w = vorrq(w, 0x00000001); w = vorrq(w, 0x000000FF); w = vorrq(w, 0x00000100); w = vorrq(w, 0x0000FF00); w = vorrq(w, 0x00010000); w = vorrq(w, 0x00FF0000); w = vorrq(w, 0x01000000); w = vorrq(w, 0xFF000000); w = vorrq(w, 0x01000001); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} w = vorrq(w, 0x01FFFFFF); // expected-error-re {{argument should be an 8-bit value shifted by a multiple of 8 bits{{$}}}} } void test_simd_vmvn(void) { uint16x8_t h; h = vmvnq_n_u16(0x0000); h = vmvnq_n_u16(0x0001); h = vmvnq_n_u16(0x00FF); h = vmvnq_n_u16(0x0100); h = vmvnq_n_u16(0x0101); // expected-error {{argument should be an 8-bit value shifted by a multiple of 8 bits, or in the form 0x??FF}} h = vmvnq_n_u16(0x01FF); h = vmvnq_n_u16(0xFF00); uint32x4_t w; w = vmvnq_n_u32(0x00000000); w = vmvnq_n_u32(0x00000001); w = vmvnq_n_u32(0x000000FF); w = vmvnq_n_u32(0x00000100); w = vmvnq_n_u32(0x0000FF00); w = vmvnq_n_u32(0x00010000); w = vmvnq_n_u32(0x00FF0000); w = vmvnq_n_u32(0x01000000); w = vmvnq_n_u32(0xFF000000); w = vmvnq_n_u32(0x01000001); // expected-error {{argument should be an 8-bit value shifted by a multiple of 8 bits, or in the form 0x??FF}} w = vmvnq_n_u32(0x01FFFFFF); // expected-error {{argument should be an 8-bit value shifted by a multiple of 8 bits, or in the form 0x??FF}} w = vmvnq_n_u32(0x0001FFFF); // expected-error {{argument should be an 8-bit value shifted by a multiple of 8 bits, or in the form 0x??FF}} w = vmvnq_n_u32(0x000001FF); } void test_vidup(void) { vidupq_n_u16(0x12345678, 1); vidupq_n_u16(0x12345678, 2); vidupq_n_u16(0x12345678, 4); vidupq_n_u16(0x12345678, 8); vidupq_n_u16(0x12345678, 0); // expected-error {{argument value 0 is outside the valid range [1, 8]}} vidupq_n_u16(0x12345678, 16); // expected-error {{argument value 16 is outside the valid range [1, 8]}} vidupq_n_u16(0x12345678, -1); // expected-error {{argument value -1 is outside the valid range [1, 8]}} vidupq_n_u16(0x12345678, -2); // expected-error {{argument value -2 is outside the valid range [1, 8]}} vidupq_n_u16(0x12345678, -4); // expected-error {{argument value -4 is outside the valid range [1, 8]}} vidupq_n_u16(0x12345678, -8); // expected-error {{argument value -8 is outside the valid range [1, 8]}} vidupq_n_u16(0x12345678, 3); // expected-error {{argument should be a power of 2}} vidupq_n_u16(0x12345678, 7); // expected-error {{argument should be a power of 2}} } void test_vcvtq(void) { uint16x8_t vec_u16; float16x8_t vec_f16; vcvtq_n_f16_u16(vec_u16, 0); // expected-error {{argument value 0 is outside the valid range [1, 16]}} vcvtq_n_f16_u16(vec_u16, 1); vcvtq_n_f16_u16(vec_u16, 16); vcvtq_n_f16_u16(vec_u16, 17); // expected-error {{argument value 17 is outside the valid range [1, 16]}} int32x4_t vec_s32; float32x4_t vec_f32; vcvtq_n_s32_f32(vec_s32, -1); // expected-error {{argument value -1 is outside the valid range [1, 32]}} vcvtq_n_s32_f32(vec_s32, 1); vcvtq_n_s32_f32(vec_s32, 32); vcvtq_n_s32_f32(vec_s32, 33); // expected-error {{argument value 33 is outside the valid range [1, 32]}} }