Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / AArch64 / arm64-movi.ll
blob3063b500a324b4154b80e73ba6092943b24eb1c7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=aarch64-eabi | FileCheck %s
4 ;==--------------------------------------------------------------------------==
5 ; Tests for MOV-immediate implemented with ORR-immediate.
6 ;==--------------------------------------------------------------------------==
8 ; 64-bit immed with 32-bit pattern size, rotated by 0.
9 define i64 @test64_32_rot0() nounwind {
10 ; CHECK-LABEL: test64_32_rot0:
11 ; CHECK:       // %bb.0:
12 ; CHECK-NEXT:    mov x0, #30064771079
13 ; CHECK-NEXT:    ret
14   ret i64 30064771079
17 ; 64-bit immed with 32-bit pattern size, rotated by 2.
18 define i64 @test64_32_rot2() nounwind {
19 ; CHECK-LABEL: test64_32_rot2:
20 ; CHECK:       // %bb.0:
21 ; CHECK-NEXT:    mov x0, #-4611686002321260541
22 ; CHECK-NEXT:    ret
23   ret i64 13835058071388291075
26 ; 64-bit immed with 4-bit pattern size, rotated by 3.
27 define i64 @test64_4_rot3() nounwind {
28 ; CHECK-LABEL: test64_4_rot3:
29 ; CHECK:       // %bb.0:
30 ; CHECK-NEXT:    mov x0, #-1229782938247303442
31 ; CHECK-NEXT:    ret
32   ret i64 17216961135462248174
35 ; 64-bit immed with 64-bit pattern size, many bits.
36 define i64 @test64_64_manybits() nounwind {
37 ; CHECK-LABEL: test64_64_manybits:
38 ; CHECK:       // %bb.0:
39 ; CHECK-NEXT:    mov x0, #4503599627304960
40 ; CHECK-NEXT:    ret
41   ret i64 4503599627304960
44 ; 64-bit immed with 64-bit pattern size, one bit.
45 ; FIXME: Prefer movz, so it prints as "mov".
46 define i64 @test64_64_onebit() nounwind {
47 ; CHECK-LABEL: test64_64_onebit:
48 ; CHECK:       // %bb.0:
49 ; CHECK-NEXT:    orr x0, xzr, #0x4000000000
50 ; CHECK-NEXT:    ret
51   ret i64 274877906944
54 ; 32-bit immed with 32-bit pattern size, rotated by 16.
55 ; FIXME: Prefer "movz" instead (so we print as "mov").
56 define i32 @test32_32_rot16() nounwind {
57 ; CHECK-LABEL: test32_32_rot16:
58 ; CHECK:       // %bb.0:
59 ; CHECK-NEXT:    orr w0, wzr, #0xff0000
60 ; CHECK-NEXT:    ret
61   ret i32 16711680
64 ; 32-bit immed with 2-bit pattern size, rotated by 1.
65 define i32 @test32_2_rot1() nounwind {
66 ; CHECK-LABEL: test32_2_rot1:
67 ; CHECK:       // %bb.0:
68 ; CHECK-NEXT:    mov w0, #-1431655766
69 ; CHECK-NEXT:    ret
70   ret i32 2863311530
73 ;==--------------------------------------------------------------------------==
74 ; Tests for MOVZ with MOVK.
75 ;==--------------------------------------------------------------------------==
77 define i32 @movz() nounwind {
78 ; CHECK-LABEL: movz:
79 ; CHECK:       // %bb.0:
80 ; CHECK-NEXT:    mov w0, #5
81 ; CHECK-NEXT:    ret
82   ret i32 5
85 define i64 @movz_3movk() nounwind {
86 ; CHECK-LABEL: movz_3movk:
87 ; CHECK:       // %bb.0:
88 ; CHECK-NEXT:    mov x0, #22136
89 ; CHECK-NEXT:    movk x0, #43981, lsl #16
90 ; CHECK-NEXT:    movk x0, #4660, lsl #32
91 ; CHECK-NEXT:    movk x0, #5, lsl #48
92 ; CHECK-NEXT:    ret
93   ret i64 1427392313513592
96 define i64 @movz_movk_skip1() nounwind {
97 ; CHECK-LABEL: movz_movk_skip1:
98 ; CHECK:       // %bb.0:
99 ; CHECK-NEXT:    mov x0, #1126236160
100 ; CHECK-NEXT:    movk x0, #5, lsl #32
101 ; CHECK-NEXT:    ret
102   ret i64 22601072640
105 define i64 @movz_skip1_movk() nounwind {
106 ; CHECK-LABEL: movz_skip1_movk:
107 ; CHECK:       // %bb.0:
108 ; CHECK-NEXT:    mov x0, #4660
109 ; CHECK-NEXT:    movk x0, #34388, lsl #32
110 ; CHECK-NEXT:    ret
111   ret i64 147695335379508
114 ; FIXME: Prefer "mov w0, #2863311530; lsl x0, x0, #4"
115 ; or "mov x0, #-6148914691236517206; and x0, x0, #45812984480"
116 define i64 @orr_lsl_pattern() nounwind {
117 ; CHECK-LABEL: orr_lsl_pattern:
118 ; CHECK:       // %bb.0:
119 ; CHECK-NEXT:    mov x0, #43680
120 ; CHECK-NEXT:    movk x0, #43690, lsl #16
121 ; CHECK-NEXT:    movk x0, #10, lsl #32
122 ; CHECK-NEXT:    ret
123   ret i64 45812984480
126 ; FIXME: prefer "mov x0, #-16639; lsl x0, x0, #24"
127 define i64 @mvn_lsl_pattern() nounwind {
128 ; CHECK-LABEL: mvn_lsl_pattern:
129 ; CHECK:       // %bb.0:
130 ; CHECK-NEXT:    mov x0, #16777216
131 ; CHECK-NEXT:    movk x0, #65471, lsl #32
132 ; CHECK-NEXT:    movk x0, #65535, lsl #48
133 ; CHECK-NEXT:    ret
134   ret i64 -279156097024
137 ; FIXME: prefer "mov w0, #-63; movk x0, #17, lsl #32"
138 define i64 @mvn32_pattern_2() nounwind {
139 ; CHECK-LABEL: mvn32_pattern_2:
140 ; CHECK:       // %bb.0:
141 ; CHECK-NEXT:    mov x0, #65473
142 ; CHECK-NEXT:    movk x0, #65535, lsl #16
143 ; CHECK-NEXT:    movk x0, #17, lsl #32
144 ; CHECK-NEXT:    ret
145   ret i64 77309411265
148 ;==--------------------------------------------------------------------------==
149 ; Tests for MOVN with MOVK.
150 ;==--------------------------------------------------------------------------==
152 define i64 @movn() nounwind {
153 ; CHECK-LABEL: movn:
154 ; CHECK:       // %bb.0:
155 ; CHECK-NEXT:    mov x0, #-42
156 ; CHECK-NEXT:    ret
157   ret i64 -42
160 define i64 @movn_skip1_movk() nounwind {
161 ; CHECK-LABEL: movn_skip1_movk:
162 ; CHECK:       // %bb.0:
163 ; CHECK-NEXT:    mov x0, #-60876
164 ; CHECK-NEXT:    movk x0, #65494, lsl #32
165 ; CHECK-NEXT:    ret
166   ret i64 -176093720012
169 ;==--------------------------------------------------------------------------==
170 ; Tests for ORR with MOVK.
171 ;==--------------------------------------------------------------------------==
172 ; rdar://14987673
174 define i64 @orr_movk1() nounwind {
175 ; CHECK-LABEL: orr_movk1:
176 ; CHECK:       // %bb.0:
177 ; CHECK-NEXT:    mov x0, #72056494543077120
178 ; CHECK-NEXT:    movk x0, #57005, lsl #16
179 ; CHECK-NEXT:    ret
180   ret i64 72056498262245120
183 define i64 @orr_movk2() nounwind {
184 ; CHECK-LABEL: orr_movk2:
185 ; CHECK:       // %bb.0:
186 ; CHECK-NEXT:    mov x0, #72056494543077120
187 ; CHECK-NEXT:    movk x0, #57005, lsl #48
188 ; CHECK-NEXT:    ret
189   ret i64 -2400982650836746496
192 define i64 @orr_movk3() nounwind {
193 ; CHECK-LABEL: orr_movk3:
194 ; CHECK:       // %bb.0:
195 ; CHECK-NEXT:    mov x0, #72056494543077120
196 ; CHECK-NEXT:    movk x0, #57005, lsl #32
197 ; CHECK-NEXT:    ret
198   ret i64 72020953688702720
201 define i64 @orr_movk4() nounwind {
202 ; CHECK-LABEL: orr_movk4:
203 ; CHECK:       // %bb.0:
204 ; CHECK-NEXT:    mov x0, #72056494543077120
205 ; CHECK-NEXT:    movk x0, #57005
206 ; CHECK-NEXT:    ret
207   ret i64 72056494543068845
210 ; rdar://14987618
211 define i64 @orr_movk5() nounwind {
212 ; CHECK-LABEL: orr_movk5:
213 ; CHECK:       // %bb.0:
214 ; CHECK-NEXT:    mov x0, #-71777214294589696
215 ; CHECK-NEXT:    movk x0, #57005, lsl #16
216 ; CHECK-NEXT:    ret
217   ret i64 -71777214836900096
220 define i64 @orr_movk6() nounwind {
221 ; CHECK-LABEL: orr_movk6:
222 ; CHECK:       // %bb.0:
223 ; CHECK-NEXT:    mov x0, #-71777214294589696
224 ; CHECK-NEXT:    movk x0, #57005, lsl #16
225 ; CHECK-NEXT:    movk x0, #57005, lsl #48
226 ; CHECK-NEXT:    ret
227   ret i64 -2400982647117578496
230 define i64 @orr_movk7() nounwind {
231 ; CHECK-LABEL: orr_movk7:
232 ; CHECK:       // %bb.0:
233 ; CHECK-NEXT:    mov x0, #-71777214294589696
234 ; CHECK-NEXT:    movk x0, #57005, lsl #48
235 ; CHECK-NEXT:    ret
236   ret i64 -2400982646575268096
239 define i64 @orr_movk8() nounwind {
240 ; CHECK-LABEL: orr_movk8:
241 ; CHECK:       // %bb.0:
242 ; CHECK-NEXT:    mov x0, #-71777214294589696
243 ; CHECK-NEXT:    movk x0, #57005
244 ; CHECK-NEXT:    movk x0, #57005, lsl #48
245 ; CHECK-NEXT:    ret
246   ret i64 -2400982646575276371
249 ; rdar://14987715
250 define i64 @orr_movk9() nounwind {
251 ; CHECK-LABEL: orr_movk9:
252 ; CHECK:       // %bb.0:
253 ; CHECK-NEXT:    mov x0, #1152921435887370240
254 ; CHECK-NEXT:    movk x0, #65280
255 ; CHECK-NEXT:    movk x0, #57005, lsl #16
256 ; CHECK-NEXT:    ret
257   ret i64 1152921439623315200
260 define i64 @orr_movk10() nounwind {
261 ; CHECK-LABEL: orr_movk10:
262 ; CHECK:       // %bb.0:
263 ; CHECK-NEXT:    mov x0, #1152921504606846720
264 ; CHECK-NEXT:    movk x0, #57005, lsl #16
265 ; CHECK-NEXT:    ret
266   ret i64 1152921504047824640
269 define i64 @orr_movk11() nounwind {
270 ; CHECK-LABEL: orr_movk11:
271 ; CHECK:       // %bb.0:
272 ; CHECK-NEXT:    mov x0, #-65281
273 ; CHECK-NEXT:    movk x0, #57005, lsl #16
274 ; CHECK-NEXT:    movk x0, #65520, lsl #48
275 ; CHECK-NEXT:    ret
276   ret i64 -4222125209747201
279 define i64 @orr_movk12() nounwind {
280 ; CHECK-LABEL: orr_movk12:
281 ; CHECK:       // %bb.0:
282 ; CHECK-NEXT:    mov x0, #-4503599627370241
283 ; CHECK-NEXT:    movk x0, #57005, lsl #32
284 ; CHECK-NEXT:    ret
285   ret i64 -4258765016661761
288 define i64 @orr_movk13() nounwind {
289 ; CHECK-LABEL: orr_movk13:
290 ; CHECK:       // %bb.0:
291 ; CHECK-NEXT:    mov x0, #17592169267200
292 ; CHECK-NEXT:    movk x0, #57005
293 ; CHECK-NEXT:    movk x0, #57005, lsl #48
294 ; CHECK-NEXT:    ret
295   ret i64 -2401245434149282131
298 ; rdar://13944082
299 define i64 @g() nounwind {
300 ; CHECK-LABEL: g:
301 ; CHECK:       // %bb.0: // %entry
302 ; CHECK-NEXT:    mov x0, #2
303 ; CHECK-NEXT:    movk x0, #65535, lsl #48
304 ; CHECK-NEXT:    ret
305 entry:
306   ret i64 -281474976710654
309 define i64 @orr_movk14() nounwind {
310 ; CHECK-LABEL: orr_movk14:
311 ; CHECK:       // %bb.0:
312 ; CHECK-NEXT:    mov x0, #-549755813888
313 ; CHECK-NEXT:    movk x0, #2048, lsl #16
314 ; CHECK-NEXT:    ret
315   ret i64 -549621596160
318 define i64 @orr_movk15() nounwind {
319 ; CHECK-LABEL: orr_movk15:
320 ; CHECK:       // %bb.0:
321 ; CHECK-NEXT:    mov x0, #549755813887
322 ; CHECK-NEXT:    movk x0, #63487, lsl #16
323 ; CHECK-NEXT:    ret
324   ret i64 549621596159
327 ; FIXME: prefer "mov x0, #2147483646; orr x0, x0, #36028659580010496"
328 define i64 @orr_movk16() nounwind {
329 ; CHECK-LABEL: orr_movk16:
330 ; CHECK:       // %bb.0:
331 ; CHECK-NEXT:    mov x0, #36028659580010496
332 ; CHECK-NEXT:    movk x0, #65534
333 ; CHECK-NEXT:    movk x0, #32767, lsl #16
334 ; CHECK-NEXT:    ret
335   ret i64 36028661727494142
338 define i64 @orr_movk17() nounwind {
339 ; CHECK-LABEL: orr_movk17:
340 ; CHECK:       // %bb.0:
341 ; CHECK-NEXT:    mov x0, #-1099511627776
342 ; CHECK-NEXT:    movk x0, #65280, lsl #16
343 ; CHECK-NEXT:    ret
344   ret i64 -1095233437696
347 define i64 @orr_movk18() nounwind {
348 ; CHECK-LABEL: orr_movk18:
349 ; CHECK:       // %bb.0:
350 ; CHECK-NEXT:    mov x0, #137438887936
351 ; CHECK-NEXT:    movk x0, #65473
352 ; CHECK-NEXT:    ret
353   ret i64 137438953409
356 ; FIXME: prefer "mov x0, #72340172838076673; and x0, x0, #2199023255296"
357 define i64 @orr_and() nounwind {
358 ; CHECK-LABEL: orr_and:
359 ; CHECK:       // %bb.0:
360 ; CHECK-NEXT:    mov x0, #256
361 ; CHECK-NEXT:    movk x0, #257, lsl #16
362 ; CHECK-NEXT:    movk x0, #257, lsl #32
363 ; CHECK-NEXT:    ret
364   ret i64 1103823438080
367 ; FIXME: prefer "mov w0, #-1431655766; movk x0, #9, lsl #32"
368 define i64 @movn_movk() nounwind {
369 ; CHECK-LABEL: movn_movk:
370 ; CHECK:       // %bb.0:
371 ; CHECK-NEXT:    mov x0, #43690
372 ; CHECK-NEXT:    movk x0, #43690, lsl #16
373 ; CHECK-NEXT:    movk x0, #9, lsl #32
374 ; CHECK-NEXT:    ret
375   ret i64 41518017194
378 ; FIXME: prefer "mov w0, #-13690; orr x0, x0, #0x1111111111111111"
379 define i64 @movn_orr() nounwind {
380 ; CHECK-LABEL: movn_orr:
381 ; CHECK:       // %bb.0:
382 ; CHECK-NEXT:    mov x0, #-51847
383 ; CHECK-NEXT:    movk x0, #4369, lsl #32
384 ; CHECK-NEXT:    movk x0, #4369, lsl #48
385 ; CHECK-NEXT:    ret
386   ret i64 1229782942255887737
389 ; FIXME: prefer "mov w0, #-305397761; eor x0, x0, #0x3333333333333333"
390 define i64 @movn_eor() nounwind {
391 ; CHECK-LABEL: movn_eor:
392 ; CHECK:       // %bb.0:
393 ; CHECK-NEXT:    mov x0, #3689348814741910323
394 ; CHECK-NEXT:    movk x0, #52428
395 ; CHECK-NEXT:    movk x0, #8455, lsl #16
396 ; CHECK-NEXT:    ret
397   ret i64 3689348814437076172
400 ; FIXME: prefer "mov x0, #536866816; orr x0, x0, #0x3fff800000000000"
401 define i64 @orr_orr_64() nounwind {
402 ; CHECK-LABEL: orr_orr_64:
403 ; CHECK:       // %bb.0:
404 ; CHECK-NEXT:    mov x0, #4611545280939032576
405 ; CHECK-NEXT:    movk x0, #61440
406 ; CHECK-NEXT:    movk x0, #8191, lsl #16
407 ; CHECK-NEXT:    ret
408   ret i64 4611545281475899392
411 ; FIXME: prefer "mov x0, #558551907040256; orr x0, x0, #0x1000100010001000"
412 define i64 @orr_orr_32() nounwind {
413 ; CHECK-LABEL: orr_orr_32:
414 ; CHECK:       // %bb.0:
415 ; CHECK-NEXT:    mov x0, #-287953294993589248
416 ; CHECK-NEXT:    movk x0, #7169, lsl #16
417 ; CHECK-NEXT:    movk x0, #7169, lsl #48
418 ; CHECK-NEXT:    ret
419   ret i64 2018171185438784512
422 ; FIXME: prefer "mov x0, #281479271743489; orr x0, x0, #0x1000100010001000"
423 define i64 @orr_orr_16() nounwind {
424 ; CHECK-LABEL: orr_orr_16:
425 ; CHECK:       // %bb.0:
426 ; CHECK-NEXT:    mov x0, #4097
427 ; CHECK-NEXT:    movk x0, #4097, lsl #16
428 ; CHECK-NEXT:    movk x0, #4097, lsl #32
429 ; CHECK-NEXT:    movk x0, #4097, lsl #48
430 ; CHECK-NEXT:    ret
431   ret i64 1153220576333074433
434 ; FIXME: prefer "mov x0, #144680345676153346; orr x0, x0, #0x1818181818181818"
435 define i64 @orr_orr_8() nounwind {
436 ; CHECK-LABEL: orr_orr_8:
437 ; CHECK:       // %bb.0:
438 ; CHECK-NEXT:    mov x0, #6682
439 ; CHECK-NEXT:    movk x0, #6682, lsl #16
440 ; CHECK-NEXT:    movk x0, #6682, lsl #32
441 ; CHECK-NEXT:    movk x0, #6682, lsl #48
442 ; CHECK-NEXT:    ret
443   ret i64 1880844493789993498
446 ; FIXME: prefer "mov x0, #-6148914691236517206; orr x0, x0, #0x0FFFFF0000000000"
447 define i64 @orr_64_orr_8() nounwind {
448 ; CHECK-LABEL: orr_64_orr_8:
449 ; CHECK:       // %bb.0:
450 ; CHECK-NEXT:    mov x0, #-6148914691236517206
451 ; CHECK-NEXT:    movk x0, #65450, lsl #32
452 ; CHECK-NEXT:    movk x0, #45055, lsl #48
453 ; CHECK-NEXT:    ret
454   ret i64 -5764607889538110806