1 ; RUN: opt -S -verify < %s | FileCheck %s
2 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
3 target triple = "aarch64--linux-gnu"
5 ;; Check supported instructions are accepted without dropping 'vscale'.
6 ;; Same order as the LangRef
8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13 define <vscale x 2 x double> @fneg(<vscale x 2 x double> %val) {
15 ; CHECK: %r = fneg <vscale x 2 x double> %val
16 ; CHECK-NEXT: ret <vscale x 2 x double> %r
17 %r = fneg <vscale x 2 x double> %val
18 ret <vscale x 2 x double> %r
21 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
23 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
25 define <vscale x 8 x i16> @add(<vscale x 8 x i16> %a, <vscale x 8 x i16> %b) {
27 ; CHECK: %r = add <vscale x 8 x i16> %a, %b
28 ; CHECK-NEXT: ret <vscale x 8 x i16> %r
29 %r = add <vscale x 8 x i16> %a, %b
30 ret <vscale x 8 x i16> %r
33 define <vscale x 4 x float> @fadd(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
35 ; CHECK: %r = fadd <vscale x 4 x float> %a, %b
36 ; CHECK-NEXT: ret <vscale x 4 x float> %r
37 %r = fadd <vscale x 4 x float> %a, %b
38 ret <vscale x 4 x float> %r
41 define <vscale x 4 x i32> @sub(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
43 ; CHECK: %r = sub <vscale x 4 x i32> %a, %b
44 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
45 %r = sub <vscale x 4 x i32> %a, %b
46 ret <vscale x 4 x i32> %r
49 define <vscale x 4 x float> @fsub(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
51 ; CHECK: %r = fsub <vscale x 4 x float> %a, %b
52 ; CHECK-NEXT: ret <vscale x 4 x float> %r
53 %r = fsub <vscale x 4 x float> %a, %b
54 ret <vscale x 4 x float> %r
57 define <vscale x 4 x i32> @mul(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
59 ; CHECK: %r = mul <vscale x 4 x i32> %a, %b
60 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
61 %r = mul <vscale x 4 x i32> %a, %b
62 ret <vscale x 4 x i32> %r
65 define <vscale x 4 x float> @fmul(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
67 ; CHECK: %r = fmul <vscale x 4 x float> %a, %b
68 ; CHECK-NEXT: ret <vscale x 4 x float> %r
69 %r = fmul <vscale x 4 x float> %a, %b
70 ret <vscale x 4 x float> %r
73 define <vscale x 4 x i32> @udiv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
75 ; CHECK: %r = udiv <vscale x 4 x i32> %a, %b
76 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
77 %r = udiv <vscale x 4 x i32> %a, %b
78 ret <vscale x 4 x i32> %r
81 define <vscale x 4 x i32> @sdiv(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
83 ; CHECK: %r = sdiv <vscale x 4 x i32> %a, %b
84 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
85 %r = sdiv <vscale x 4 x i32> %a, %b
86 ret <vscale x 4 x i32> %r
89 define <vscale x 4 x float> @fdiv(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
91 ; CHECK: %r = fdiv <vscale x 4 x float> %a, %b
92 ; CHECK-NEXT: ret <vscale x 4 x float> %r
93 %r = fdiv <vscale x 4 x float> %a, %b
94 ret <vscale x 4 x float> %r
97 define <vscale x 4 x i32> @urem(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
99 ; CHECK: %r = urem <vscale x 4 x i32> %a, %b
100 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
101 %r = urem <vscale x 4 x i32> %a, %b
102 ret <vscale x 4 x i32> %r
105 define <vscale x 4 x i32> @srem(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
107 ; CHECK: %r = srem <vscale x 4 x i32> %a, %b
108 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
109 %r = srem <vscale x 4 x i32> %a, %b
110 ret <vscale x 4 x i32> %r
113 define <vscale x 4 x float> @frem(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
115 ; CHECK: %r = frem <vscale x 4 x float> %a, %b
116 ; CHECK-NEXT: ret <vscale x 4 x float> %r
117 %r = frem <vscale x 4 x float> %a, %b
118 ret <vscale x 4 x float> %r
121 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
122 ;; Bitwise Binary Operations
123 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
125 define <vscale x 4 x i32> @shl(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
127 ; CHECK: %r = shl <vscale x 4 x i32> %a, %b
128 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
129 %r = shl <vscale x 4 x i32> %a, %b
130 ret <vscale x 4 x i32> %r
133 define <vscale x 4 x i32> @lshr(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
135 ; CHECK: %r = lshr <vscale x 4 x i32> %a, %b
136 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
137 %r = lshr <vscale x 4 x i32> %a, %b
138 ret <vscale x 4 x i32> %r
141 define <vscale x 4 x i32> @ashr(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
143 ; CHECK: %r = ashr <vscale x 4 x i32> %a, %b
144 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
145 %r = ashr <vscale x 4 x i32> %a, %b
146 ret <vscale x 4 x i32> %r
149 define <vscale x 4 x i32> @and(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
151 ; CHECK: %r = and <vscale x 4 x i32> %a, %b
152 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
153 %r = and <vscale x 4 x i32> %a, %b
154 ret <vscale x 4 x i32> %r
157 define <vscale x 4 x i32> @or(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
159 ; CHECK: %r = or <vscale x 4 x i32> %a, %b
160 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
161 %r = or <vscale x 4 x i32> %a, %b
162 ret <vscale x 4 x i32> %r
165 define <vscale x 4 x i32> @xor(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
167 ; CHECK: %r = xor <vscale x 4 x i32> %a, %b
168 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
169 %r = xor <vscale x 4 x i32> %a, %b
170 ret <vscale x 4 x i32> %r
173 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
175 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
177 define i64 @extractelement(<vscale x 2 x i64> %val) {
178 ; CHECK-LABEL: @extractelement
179 ; CHECK: %r = extractelement <vscale x 2 x i64> %val, i32 0
180 ; CHECK-NEXT: ret i64 %r
181 %r = extractelement <vscale x 2 x i64> %val, i32 0
185 define <vscale x 16 x i8> @insertelement(<vscale x 16 x i8> %vec, i8 %ins) {
186 ; CHECK-LABEL: @insertelement
187 ; CHECK: %r = insertelement <vscale x 16 x i8> %vec, i8 %ins, i32 0
188 ; CHECK-NEXT: ret <vscale x 16 x i8> %r
189 %r = insertelement <vscale x 16 x i8> %vec, i8 %ins, i32 0
190 ret <vscale x 16 x i8> %r
193 define <vscale x 8 x half> @shufflevector(half %val) {
194 ; CHECK-LABEL: @shufflevector
195 ; CHECK: %insvec = insertelement <vscale x 8 x half> undef, half %val, i32 0
196 ; CHECK-NEXT: %r = shufflevector <vscale x 8 x half> %insvec, <vscale x 8 x half> undef, <vscale x 8 x i32> zeroinitializer
197 ; CHECK-NEXT: ret <vscale x 8 x half> %r
198 %insvec = insertelement <vscale x 8 x half> undef, half %val, i32 0
199 %r = shufflevector <vscale x 8 x half> %insvec, <vscale x 8 x half> undef, <vscale x 8 x i32> zeroinitializer
200 ret <vscale x 8 x half> %r
203 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
204 ;; Memory Access and Addressing Operations
205 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
207 define void @alloca() {
208 ; CHECK-LABEL: @alloca
209 ; CHECK: %vec = alloca <vscale x 4 x i32>
210 ; CHECK-NEXT: ret void
211 %vec = alloca <vscale x 4 x i32>
215 define <vscale x 2 x double> @load(<vscale x 2 x double>* %ptr) {
217 ; CHECK: %r = load <vscale x 2 x double>, <vscale x 2 x double>* %ptr
218 ; CHECK-NEXT: ret <vscale x 2 x double> %r
219 %r = load <vscale x 2 x double>, <vscale x 2 x double>* %ptr
220 ret <vscale x 2 x double> %r
223 define void @store(<vscale x 4 x i32> %data, <vscale x 4 x i32>* %ptr) {
224 ; CHECK-LABEL: @store
225 ; CHECK: store <vscale x 4 x i32> %data, <vscale x 4 x i32>* %ptr
226 ; CHECK-NEXT: ret void
227 store <vscale x 4 x i32> %data, <vscale x 4 x i32>* %ptr
231 define <vscale x 4 x float>* @getelementptr(<vscale x 4 x float>* %base) {
232 ; CHECK-LABEL: @getelementptr
233 ; CHECK: %r = getelementptr <vscale x 4 x float>, <vscale x 4 x float>* %base, i64 0
234 ; CHECK-NEXT: ret <vscale x 4 x float>* %r
235 %r = getelementptr <vscale x 4 x float>, <vscale x 4 x float>* %base, i64 0
236 ret <vscale x 4 x float>* %r
239 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
240 ;; Conversion Operations
241 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
243 define <vscale x 4 x i32> @truncto(<vscale x 4 x i64> %val) {
244 ; CHECK-LABEL: @truncto
245 ; CHECK: %r = trunc <vscale x 4 x i64> %val to <vscale x 4 x i32>
246 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
247 %r = trunc <vscale x 4 x i64> %val to <vscale x 4 x i32>
248 ret <vscale x 4 x i32> %r
251 define <vscale x 2 x i64> @zextto(<vscale x 2 x i16> %val) {
252 ; CHECK-LABEL: @zextto
253 ; CHECK: %r = zext <vscale x 2 x i16> %val to <vscale x 2 x i64>
254 ; CHECK-NEXT: ret <vscale x 2 x i64> %r
255 %r = zext <vscale x 2 x i16> %val to <vscale x 2 x i64>
256 ret <vscale x 2 x i64> %r
259 define <vscale x 4 x i32> @sextto(<vscale x 4 x i8> %val) {
260 ; CHECK-LABEL: @sextto
261 ; CHECK: %r = sext <vscale x 4 x i8> %val to <vscale x 4 x i32>
262 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
263 %r = sext <vscale x 4 x i8> %val to <vscale x 4 x i32>
264 ret <vscale x 4 x i32> %r
267 define <vscale x 4 x half> @fptruncto(<vscale x 4 x float> %val) {
268 ; CHECK-LABEL: @fptruncto
269 ; CHECK: %r = fptrunc <vscale x 4 x float> %val to <vscale x 4 x half>
270 ; CHECK-NEXT: ret <vscale x 4 x half> %r
271 %r = fptrunc <vscale x 4 x float> %val to <vscale x 4 x half>
272 ret <vscale x 4 x half> %r
275 define <vscale x 2 x double> @fpextto(<vscale x 2 x half> %val) {
276 ; CHECK-LABEL: @fpextto
277 ; CHECK: %r = fpext <vscale x 2 x half> %val to <vscale x 2 x double>
278 ; CHECK-NEXT: ret <vscale x 2 x double> %r
279 %r = fpext <vscale x 2 x half> %val to <vscale x 2 x double>
280 ret <vscale x 2 x double> %r
283 define <vscale x 4 x i32> @fptouito(<vscale x 4 x float> %val) {
284 ; CHECK-LABEL: @fptoui
285 ; CHECK: %r = fptoui <vscale x 4 x float> %val to <vscale x 4 x i32>
286 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
287 %r = fptoui <vscale x 4 x float> %val to <vscale x 4 x i32>
288 ret <vscale x 4 x i32> %r
291 define <vscale x 4 x i32> @fptosito(<vscale x 4 x float> %val) {
292 ; CHECK-LABEL: @fptosi
293 ; CHECK: %r = fptosi <vscale x 4 x float> %val to <vscale x 4 x i32>
294 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
295 %r = fptosi <vscale x 4 x float> %val to <vscale x 4 x i32>
296 ret <vscale x 4 x i32> %r
299 define <vscale x 4 x float> @uitofpto(<vscale x 4 x i32> %val) {
300 ; CHECK-LABEL: @uitofp
301 ; CHECK: %r = uitofp <vscale x 4 x i32> %val to <vscale x 4 x float>
302 ; CHECK-NEXT: ret <vscale x 4 x float> %r
303 %r = uitofp <vscale x 4 x i32> %val to <vscale x 4 x float>
304 ret <vscale x 4 x float> %r
307 define <vscale x 4 x float> @sitofpto(<vscale x 4 x i32> %val) {
308 ; CHECK-LABEL: @sitofp
309 ; CHECK: %r = sitofp <vscale x 4 x i32> %val to <vscale x 4 x float>
310 ; CHECK-NEXT: ret <vscale x 4 x float> %r
311 %r = sitofp <vscale x 4 x i32> %val to <vscale x 4 x float>
312 ret <vscale x 4 x float> %r
315 define <vscale x 2 x i64> @ptrtointto(<vscale x 2 x i32*> %val) {
316 ; CHECK-LABEL: @ptrtointto
317 ; CHECK: %r = ptrtoint <vscale x 2 x i32*> %val to <vscale x 2 x i64>
318 ; CHECK-NEXT: ret <vscale x 2 x i64> %r
319 %r = ptrtoint <vscale x 2 x i32*> %val to <vscale x 2 x i64>
320 ret <vscale x 2 x i64> %r
323 define <vscale x 2 x i32*> @inttoptrto(<vscale x 2 x i64> %val) {
324 ; CHECK-LABEL: @inttoptrto
325 ; CHECK: %r = inttoptr <vscale x 2 x i64> %val to <vscale x 2 x i32*>
326 ; CHECK-NEXT: ret <vscale x 2 x i32*> %r
327 %r = inttoptr <vscale x 2 x i64> %val to <vscale x 2 x i32*>
328 ret <vscale x 2 x i32*> %r
331 define <vscale x 2 x i64> @bitcastto(<vscale x 2 x double> %a) {
332 ; CHECK-LABEL: @bitcast
333 ; CHECK: %r = bitcast <vscale x 2 x double> %a to <vscale x 2 x i64>
334 ; CHECK-NEXT: ret <vscale x 2 x i64> %r
335 %r = bitcast <vscale x 2 x double> %a to <vscale x 2 x i64>
336 ret <vscale x 2 x i64> %r
339 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
341 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
343 define <vscale x 4 x i1> @icmp(<vscale x 4 x i32> %a, <vscale x 4 x i32> %b) {
345 ; CHECK: %r = icmp eq <vscale x 4 x i32> %a, %b
346 ; CHECK-NEXT: ret <vscale x 4 x i1> %r
347 %r = icmp eq <vscale x 4 x i32> %a, %b
348 ret <vscale x 4 x i1> %r
351 define <vscale x 4 x i1> @fcmp(<vscale x 4 x float> %a, <vscale x 4 x float> %b) {
353 ; CHECK: %r = fcmp une <vscale x 4 x float> %a, %b
354 ; CHECK-NEXT: ret <vscale x 4 x i1> %r
355 %r = fcmp une <vscale x 4 x float> %a, %b
356 ret <vscale x 4 x i1> %r
359 define <vscale x 16 x i8> @phi(<vscale x 16 x i8> %a, i32 %val) {
361 ; CHECK: %r = phi <vscale x 16 x i8> [ %a, %entry ], [ %added, %iszero ]
362 ; CHECK-NEXT: ret <vscale x 16 x i8> %r
364 %cmp = icmp eq i32 %val, 0
365 br i1 %cmp, label %iszero, label %end
368 %ins = insertelement <vscale x 16 x i8> undef, i8 1, i32 0
369 %splatone = shufflevector <vscale x 16 x i8> %ins, <vscale x 16 x i8> undef, <vscale x 16 x i32> zeroinitializer
370 %added = add <vscale x 16 x i8> %a, %splatone
374 %r = phi <vscale x 16 x i8> [ %a, %entry ], [ %added, %iszero ]
375 ret <vscale x 16 x i8> %r
378 define <vscale x 8 x half> @select(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x i1> %sval) {
379 ; CHECK-LABEL: @select
380 ; CHECK: %r = select <vscale x 8 x i1> %sval, <vscale x 8 x half> %a, <vscale x 8 x half> %b
381 ; CHECK-NEXT: ret <vscale x 8 x half> %r
382 %r = select <vscale x 8 x i1> %sval, <vscale x 8 x half> %a, <vscale x 8 x half> %b
383 ret <vscale x 8 x half> %r
386 declare <vscale x 4 x i32> @callee(<vscale x 4 x i32>)
387 define <vscale x 4 x i32> @call(<vscale x 4 x i32> %val) {
389 ; CHECK: %r = call <vscale x 4 x i32> @callee(<vscale x 4 x i32> %val)
390 ; CHECK-NEXT: ret <vscale x 4 x i32> %r
391 %r = call <vscale x 4 x i32> @callee(<vscale x 4 x i32> %val)
392 ret <vscale x 4 x i32> %r