Clang Project

clang_source_code/test/Sema/aarch64-neon-ranges.c
1// RUN: %clang_cc1 -triple aarch64-linux-gnu -target-feature +neon -ffreestanding -fsyntax-only -verify %s
2// RUN: %clang_cc1 -triple arm64-linux-gnu -target-feature +neon -ffreestanding -fsyntax-only -verify %s
3
4#include <arm_neon.h>
5
6void test_vext_8bit(int8x8_t small, int8x16_t big) {
7  vext_s8(small, small, 7);
8  vext_u8(small, small, 7);
9  vext_p8(small, small, 7);
10  vextq_s8(big, big, 15);
11  vextq_u8(big, big, 15);
12  vextq_p8(big, big, 15);
13
14  vext_s8(small, small, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
15  vext_u8(small, small, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
16  vext_p8(small, small, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
17  vextq_s8(big, big, 16); // expected-error-re {{argument value {{.*}} is outside the valid range}}
18  vextq_u8(big, big, 16); // expected-error-re {{argument value {{.*}} is outside the valid range}}
19  vextq_p8(big, big, 16); // expected-error-re {{argument value {{.*}} is outside the valid range}}
20}
21
22void test_mul_lane_f64(float64x1_t small, float64x2_t big, float64x2_t rhs) {
23  vmul_lane_f64(small, small, 0);
24  vmul_laneq_f64(small, big, 1);
25  vmulq_lane_f64(big, small, 0);
26  vmulq_laneq_f64(big, big, 1);
27  vfma_lane_f64(small, small, small, 0);
28  vfma_laneq_f64(small, small, big, 1);
29  vfmaq_lane_f64(big, big, small, 0);
30  vfmaq_laneq_f64(big, big, big, 1);
31
32  vmul_lane_f64(small, small, 1); // expected-error-re {{argument value {{.*}} is outside the valid range}}
33  vmul_laneq_f64(small, big, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
34  vfma_lane_f64(small, small, small, 1); // expected-error-re {{argument value {{.*}} is outside the valid range}}
35  vfma_laneq_f64(small, small, big, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
36  vfmaq_laneq_f64(big, big, big, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
37}
38
39void test_ld1st1(int8x8_t small, int8x16_t big, void *addr) {
40  vld1_lane_s8(addr, small, 7);
41  vld1_lane_s16(addr, small, 3);
42  vld1_lane_s32(addr, small, 1);
43  vld1_lane_s64(addr, small, 0);
44
45  vld1q_lane_s8(addr, big, 15);
46  vld1q_lane_s16(addr, big, 7);
47  vld1q_lane_s32(addr, big, 3);
48  vld1q_lane_s64(addr, big, 1);
49
50  vld1_lane_s8(addr, small, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
51  vld1_lane_s16(addr, small, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
52  vld1_lane_s32(addr, small, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
53  vld1_lane_s64(addr, small, 1); // expected-error-re {{argument value {{.*}} is outside the valid range}}
54
55  vld1q_lane_s8(addr, big, 16); // expected-error-re {{argument value {{.*}} is outside the valid range}}
56  vld1q_lane_s16(addr, big, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
57  vld1q_lane_s32(addr, big, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
58  vld1q_lane_s64(addr, big, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
59
60  vst1_lane_s8(addr, small, 7);
61  vst1_lane_s16(addr, small, 3);
62  vst1_lane_s32(addr, small, 1);
63  vst1_lane_s64(addr, small, 0);
64
65  vst1q_lane_s8(addr, big, 15);
66  vst1q_lane_s16(addr, big, 7);
67  vst1q_lane_s32(addr, big, 3);
68  vst1q_lane_s64(addr, big, 1);
69
70  vst1_lane_s8(addr, small, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
71  vst1_lane_s16(addr, small, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
72  vst1_lane_s32(addr, small, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
73  vst1_lane_s64(addr, small, 1); // expected-error-re {{argument value {{.*}} is outside the valid range}}
74
75  vst1q_lane_s8(addr, big, 16); // expected-error-re {{argument value {{.*}} is outside the valid range}}
76  vst1q_lane_s16(addr, big, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
77  vst1q_lane_s32(addr, big, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
78  vst1q_lane_s64(addr, big, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
79}
80
81void test_ld2st2(int8x8x2_t small8, int8x16x2_t big8,
82                 int16x4x2_t small16, int16x8x2_t big16,
83                 int32x2x2_t small32, int32x4x2_t big32,
84                 int64x1x2_t small64, int64x2x2_t big64,
85                 void *addr) {
86  vld2_lane_s8(addr, small8, 7);
87  vld2_lane_s16(addr, small16, 3);
88  vld2_lane_s32(addr, small32, 1);
89  vld2_lane_s64(addr, small64, 0);
90
91  vld2q_lane_s8(addr, big8, 15);
92  vld2q_lane_s16(addr, big16, 7);
93  vld2q_lane_s32(addr, big32, 3);
94  vld2q_lane_s64(addr, big64, 1);
95
96  vld2_lane_s8(addr, small8, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
97  vld2_lane_s16(addr, small16, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
98  vld2_lane_s32(addr, small32, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
99  vld2_lane_s64(addr, small64, 1); // expected-error-re {{argument value {{.*}} is outside the valid range}}
100
101  vld2q_lane_s8(addr, big8, 16); // expected-error-re {{argument value {{.*}} is outside the valid range}}
102  vld2q_lane_s16(addr, big16, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
103  vld2q_lane_s32(addr, big32, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
104  vld2q_lane_s64(addr, big64, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
105
106  vst2_lane_s8(addr, small8, 7);
107  vst2_lane_s16(addr, small16, 3);
108  vst2_lane_s32(addr, small32, 1);
109  vst2_lane_s64(addr, small64, 0);
110
111  vst2q_lane_s8(addr, big8, 15);
112  vst2q_lane_s16(addr, big16, 7);
113  vst2q_lane_s32(addr, big32, 3);
114  vst2q_lane_s64(addr, big64, 1);
115
116  vst2_lane_s8(addr, small8, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
117  vst2_lane_s16(addr, small16, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
118  vst2_lane_s32(addr, small32, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
119  vst2_lane_s64(addr, small64, 1); // expected-error-re {{argument value {{.*}} is outside the valid range}}
120
121  vst2q_lane_s8(addr, big8, 16); // expected-error-re {{argument value {{.*}} is outside the valid range}}
122  vst2q_lane_s16(addr, big16, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
123  vst2q_lane_s32(addr, big32, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
124  vst2q_lane_s64(addr, big64, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
125}
126
127void test_ld3st3(int8x8x3_t small8, int8x16x3_t big8,
128                 int16x4x3_t small16, int16x8x3_t big16,
129                 int32x2x3_t small32, int32x4x3_t big32,
130                 int64x1x3_t small64, int64x2x3_t big64,
131                 void *addr) {
132  vld3_lane_s8(addr, small8, 7);
133  vld3_lane_s16(addr, small16, 3);
134  vld3_lane_s32(addr, small32, 1);
135  vld3_lane_s64(addr, small64, 0);
136
137  vld3q_lane_s8(addr, big8, 15);
138  vld3q_lane_s16(addr, big16, 7);
139  vld3q_lane_s32(addr, big32, 3);
140  vld3q_lane_s64(addr, big64, 1);
141
142  vld3_lane_s8(addr, small8, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
143  vld3_lane_s16(addr, small16, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
144  vld3_lane_s32(addr, small32, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
145  vld3_lane_s64(addr, small64, 1); // expected-error-re {{argument value {{.*}} is outside the valid range}}
146
147  vld3q_lane_s8(addr, big8, 16); // expected-error-re {{argument value {{.*}} is outside the valid range}}
148  vld3q_lane_s16(addr, big16, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
149  vld3q_lane_s32(addr, big32, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
150  vld3q_lane_s64(addr, big64, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
151
152  vst3_lane_s8(addr, small8, 7);
153  vst3_lane_s16(addr, small16, 3);
154  vst3_lane_s32(addr, small32, 1);
155  vst3_lane_s64(addr, small64, 0);
156
157  vst3q_lane_s8(addr, big8, 15);
158  vst3q_lane_s16(addr, big16, 7);
159  vst3q_lane_s32(addr, big32, 3);
160  vst3q_lane_s64(addr, big64, 1);
161
162  vst3_lane_s8(addr, small8, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
163  vst3_lane_s16(addr, small16, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
164  vst3_lane_s32(addr, small32, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
165  vst3_lane_s64(addr, small64, 1); // expected-error-re {{argument value {{.*}} is outside the valid range}}
166
167  vst3q_lane_s8(addr, big8, 16); // expected-error-re {{argument value {{.*}} is outside the valid range}}
168  vst3q_lane_s16(addr, big16, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
169  vst3q_lane_s32(addr, big32, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
170  vst3q_lane_s64(addr, big64, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
171}
172
173void test_ld4st4(int8x8x4_t small8, int8x16x4_t big8,
174                 int16x4x4_t small16, int16x8x4_t big16,
175                 int32x2x4_t small32, int32x4x4_t big32,
176                 int64x1x4_t small64, int64x2x4_t big64,
177                 void *addr) {
178  vld4_lane_s8(addr, small8, 7);
179  vld4_lane_s16(addr, small16, 3);
180  vld4_lane_s32(addr, small32, 1);
181  vld4_lane_s64(addr, small64, 0);
182
183  vld4q_lane_s8(addr, big8, 15);
184  vld4q_lane_s16(addr, big16, 7);
185  vld4q_lane_s32(addr, big32, 3);
186  vld4q_lane_s64(addr, big64, 1);
187
188  vld4_lane_s8(addr, small8, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
189  vld4_lane_s16(addr, small16, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
190  vld4_lane_s32(addr, small32, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
191  vld4_lane_s64(addr, small64, 1); // expected-error-re {{argument value {{.*}} is outside the valid range}}
192
193  vld4q_lane_s8(addr, big8, 16); // expected-error-re {{argument value {{.*}} is outside the valid range}}
194  vld4q_lane_s16(addr, big16, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
195  vld4q_lane_s32(addr, big32, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
196  vld4q_lane_s64(addr, big64, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
197
198  vst4_lane_s8(addr, small8, 7);
199  vst4_lane_s16(addr, small16, 3);
200  vst4_lane_s32(addr, small32, 1);
201  vst4_lane_s64(addr, small64, 0);
202
203  vst4q_lane_s8(addr, big8, 15);
204  vst4q_lane_s16(addr, big16, 7);
205  vst4q_lane_s32(addr, big32, 3);
206  vst4q_lane_s64(addr, big64, 1);
207
208  vst4_lane_s8(addr, small8, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
209  vst4_lane_s16(addr, small16, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
210  vst4_lane_s32(addr, small32, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
211  vst4_lane_s64(addr, small64, 1); // expected-error-re {{argument value {{.*}} is outside the valid range}}
212
213  vst4q_lane_s8(addr, big8, 16); // expected-error-re {{argument value {{.*}} is outside the valid range}}
214  vst4q_lane_s16(addr, big16, 8); // expected-error-re {{argument value {{.*}} is outside the valid range}}
215  vst4q_lane_s32(addr, big32, 4); // expected-error-re {{argument value {{.*}} is outside the valid range}}
216  vst4q_lane_s64(addr, big64, 2); // expected-error-re {{argument value {{.*}} is outside the valid range}}
217}
218
219