ARM64: initial backend import
[oota-llvm.git] / test / CodeGen / ARM64 / movi.ll
1 ; RUN: llc < %s -march=arm64 | FileCheck %s
2
3 ;==--------------------------------------------------------------------------==
4 ; Tests for MOV-immediate implemented with ORR-immediate.
5 ;==--------------------------------------------------------------------------==
6
7 ; 64-bit immed with 32-bit pattern size, rotated by 0.
8 define i64 @test64_32_rot0() nounwind {
9 ; CHECK: test64_32_rot0
10 ; CHECK: orr x0, xzr, #0x700000007
11   ret i64 30064771079
12 }
13
14 ; 64-bit immed with 32-bit pattern size, rotated by 2.
15 define i64 @test64_32_rot2() nounwind {
16 ; CHECK: test64_32_rot2
17 ; CHECK: orr x0, xzr, #0xc0000003c0000003
18   ret i64 13835058071388291075
19 }
20
21 ; 64-bit immed with 4-bit pattern size, rotated by 3.
22 define i64 @test64_4_rot3() nounwind {
23 ; CHECK: test64_4_rot3
24 ; CHECK: orr  x0, xzr, #0xeeeeeeeeeeeeeeee
25   ret i64 17216961135462248174
26 }
27
28 ; 32-bit immed with 32-bit pattern size, rotated by 16.
29 define i32 @test32_32_rot16() nounwind {
30 ; CHECK: test32_32_rot16
31 ; CHECK: orr w0, wzr, #0xff0000
32   ret i32 16711680
33 }
34
35 ; 32-bit immed with 2-bit pattern size, rotated by 1.
36 define i32 @test32_2_rot1() nounwind {
37 ; CHECK: test32_2_rot1
38 ; CHECK: orr w0, wzr, #0xaaaaaaaa
39   ret i32 2863311530
40 }
41
42 ;==--------------------------------------------------------------------------==
43 ; Tests for MOVZ with MOVK.
44 ;==--------------------------------------------------------------------------==
45
46 define i32 @movz() nounwind {
47 ; CHECK: movz
48 ; CHECK: movz w0, #5
49   ret i32 5
50 }
51
52 define i64 @movz_3movk() nounwind {
53 ; CHECK: movz_3movk
54 ; CHECK:      movz x0, #5, lsl #48
55 ; CHECK-NEXT: movk x0, #4660, lsl #32
56 ; CHECK-NEXT: movk x0, #43981, lsl #16
57 ; CHECK-NEXT: movk x0, #22136
58   ret i64 1427392313513592
59 }
60
61 define i64 @movz_movk_skip1() nounwind {
62 ; CHECK: movz_movk_skip1
63 ; CHECK:      movz x0, #5, lsl #32
64 ; CHECK-NEXT: movk x0, #17185, lsl #16
65   ret i64 22601072640
66 }
67
68 define i64 @movz_skip1_movk() nounwind {
69 ; CHECK: movz_skip1_movk
70 ; CHECK:      movz x0, #34388, lsl #32
71 ; CHECK-NEXT: movk x0, #4660
72   ret i64 147695335379508
73 }
74
75 ;==--------------------------------------------------------------------------==
76 ; Tests for MOVN with MOVK.
77 ;==--------------------------------------------------------------------------==
78
79 define i64 @movn() nounwind {
80 ; CHECK: movn
81 ; CHECK: movn x0, #41
82   ret i64 -42
83 }
84
85 define i64 @movn_skip1_movk() nounwind {
86 ; CHECK: movn_skip1_movk
87 ; CHECK:      movn x0, #41, lsl #32
88 ; CHECK-NEXT: movk x0, #4660
89   ret i64 -176093720012
90 }
91
92 ;==--------------------------------------------------------------------------==
93 ; Tests for ORR with MOVK.
94 ;==--------------------------------------------------------------------------==
95 ; rdar://14987673
96
97 define i64 @orr_movk1() nounwind {
98 ; CHECK: orr_movk1
99 ; CHECK: orr x0, xzr, #0xffff0000ffff0
100 ; CHECK: movk x0, #57005, lsl #16
101   ret i64 72056498262245120
102 }
103
104 define i64 @orr_movk2() nounwind {
105 ; CHECK: orr_movk2
106 ; CHECK: orr x0, xzr, #0xffff0000ffff0
107 ; CHECK: movk x0, #57005, lsl #48
108   ret i64 -2400982650836746496
109 }
110
111 define i64 @orr_movk3() nounwind {
112 ; CHECK: orr_movk3
113 ; CHECK: orr x0, xzr, #0xffff0000ffff0
114 ; CHECK: movk x0, #57005, lsl #32
115   ret i64 72020953688702720
116 }
117
118 define i64 @orr_movk4() nounwind {
119 ; CHECK: orr_movk4
120 ; CHECK: orr x0, xzr, #0xffff0000ffff0
121 ; CHECK: movk x0, #57005
122   ret i64 72056494543068845
123 }
124
125 ; rdar://14987618
126 define i64 @orr_movk5() nounwind {
127 ; CHECK: orr_movk5
128 ; CHECK: orr x0, xzr, #0xff00ff00ff00ff00
129 ; CHECK: movk x0, #57005, lsl #16
130   ret i64 -71777214836900096
131 }
132
133 define i64 @orr_movk6() nounwind {
134 ; CHECK: orr_movk6
135 ; CHECK: orr x0, xzr, #0xff00ff00ff00ff00
136 ; CHECK: movk x0, #57005, lsl #16
137 ; CHECK: movk x0, #57005, lsl #48
138   ret i64 -2400982647117578496
139 }
140
141 define i64 @orr_movk7() nounwind {
142 ; CHECK: orr_movk7
143 ; CHECK: orr x0, xzr, #0xff00ff00ff00ff00
144 ; CHECK: movk x0, #57005, lsl #48
145   ret i64 -2400982646575268096
146 }
147
148 define i64 @orr_movk8() nounwind {
149 ; CHECK: orr_movk8
150 ; CHECK: orr x0, xzr, #0xff00ff00ff00ff00
151 ; CHECK: movk x0, #57005
152 ; CHECK: movk x0, #57005, lsl #48
153   ret i64 -2400982646575276371
154 }
155
156 ; rdar://14987715
157 define i64 @orr_movk9() nounwind {
158 ; CHECK: orr_movk9
159 ; CHECK: orr x0, xzr, #0xffffff000000000
160 ; CHECK: movk x0, #65280
161 ; CHECK: movk x0, #57005, lsl #16
162   ret i64 1152921439623315200
163 }
164
165 define i64 @orr_movk10() nounwind {
166 ; CHECK: orr_movk10
167 ; CHECK: orr x0, xzr, #0xfffffffffffff00
168 ; CHECK: movk x0, #57005, lsl #16
169   ret i64 1152921504047824640
170 }
171
172 define i64 @orr_movk11() nounwind {
173 ; CHECK: orr_movk11
174 ; CHECK: orr x0, xzr, #0xfff00000000000ff
175 ; CHECK: movk x0, #57005, lsl #16
176 ; CHECK: movk x0, #65535, lsl #32
177   ret i64 -4222125209747201
178 }
179
180 define i64 @orr_movk12() nounwind {
181 ; CHECK: orr_movk12
182 ; CHECK: orr x0, xzr, #0xfff00000000000ff
183 ; CHECK: movk x0, #57005, lsl #32
184   ret i64 -4258765016661761
185 }
186
187 define i64 @orr_movk13() nounwind {
188 ; CHECK: orr_movk13
189 ; CHECK: orr x0, xzr, #0xfffff000000
190 ; CHECK: movk x0, #57005
191 ; CHECK: movk x0, #57005, lsl #48
192   ret i64 -2401245434149282131
193 }
194
195 ; rdar://13944082
196 define i64 @g() nounwind {
197 ; CHECK: g
198 ; CHECK: movz x0, #65535, lsl #48
199 ; CHECK: movk x0, #2
200 entry:
201   ret i64 -281474976710654
202 }