• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
8define i64 @test64_32_rot0() nounwind {
9; CHECK-LABEL: test64_32_rot0:
10; CHECK: mov x0, #30064771079
11  ret i64 30064771079
12}
13
14; 64-bit immed with 32-bit pattern size, rotated by 2.
15define i64 @test64_32_rot2() nounwind {
16; CHECK-LABEL: test64_32_rot2:
17; CHECK: mov x0, #-4611686002321260541
18  ret i64 13835058071388291075
19}
20
21; 64-bit immed with 4-bit pattern size, rotated by 3.
22define i64 @test64_4_rot3() nounwind {
23; CHECK-LABEL: test64_4_rot3:
24; CHECK: mov  x0, #-1229782938247303442
25  ret i64 17216961135462248174
26}
27
28; 32-bit immed with 32-bit pattern size, rotated by 16.
29define i32 @test32_32_rot16() nounwind {
30; CHECK-LABEL: 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.
36define i32 @test32_2_rot1() nounwind {
37; CHECK-LABEL: test32_2_rot1:
38; CHECK: mov w0, #-1431655766
39  ret i32 2863311530
40}
41
42;==--------------------------------------------------------------------------==
43; Tests for MOVZ with MOVK.
44;==--------------------------------------------------------------------------==
45
46define i32 @movz() nounwind {
47; CHECK-LABEL: movz:
48; CHECK: mov w0, #5
49  ret i32 5
50}
51
52define i64 @movz_3movk() nounwind {
53; CHECK-LABEL: movz_3movk:
54; CHECK:      mov x0, #1407374883553280
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
61define i64 @movz_movk_skip1() nounwind {
62; CHECK-LABEL: movz_movk_skip1:
63; CHECK:      mov x0, #21474836480
64; CHECK-NEXT: movk x0, #17185, lsl #16
65  ret i64 22601072640
66}
67
68define i64 @movz_skip1_movk() nounwind {
69; CHECK-LABEL: movz_skip1_movk:
70; CHECK:      mov x0, #147695335374848
71; CHECK-NEXT: movk x0, #4660
72  ret i64 147695335379508
73}
74
75;==--------------------------------------------------------------------------==
76; Tests for MOVN with MOVK.
77;==--------------------------------------------------------------------------==
78
79define i64 @movn() nounwind {
80; CHECK-LABEL: movn:
81; CHECK: mov x0, #-42
82  ret i64 -42
83}
84
85define i64 @movn_skip1_movk() nounwind {
86; CHECK-LABEL: movn_skip1_movk:
87; CHECK:      mov x0, #-176093659137
88; CHECK-NEXT: movk x0, #4660
89  ret i64 -176093720012
90}
91
92;==--------------------------------------------------------------------------==
93; Tests for ORR with MOVK.
94;==--------------------------------------------------------------------------==
95; rdar://14987673
96
97define i64 @orr_movk1() nounwind {
98; CHECK-LABEL: orr_movk1:
99; CHECK: mov x0, #72056494543077120
100; CHECK: movk x0, #57005, lsl #16
101  ret i64 72056498262245120
102}
103
104define i64 @orr_movk2() nounwind {
105; CHECK-LABEL: orr_movk2:
106; CHECK: mov x0, #72056494543077120
107; CHECK: movk x0, #57005, lsl #48
108  ret i64 -2400982650836746496
109}
110
111define i64 @orr_movk3() nounwind {
112; CHECK-LABEL: orr_movk3:
113; CHECK: mov x0, #72056494543077120
114; CHECK: movk x0, #57005, lsl #32
115  ret i64 72020953688702720
116}
117
118define i64 @orr_movk4() nounwind {
119; CHECK-LABEL: orr_movk4:
120; CHECK: mov x0, #72056494543077120
121; CHECK: movk x0, #57005
122  ret i64 72056494543068845
123}
124
125; rdar://14987618
126define i64 @orr_movk5() nounwind {
127; CHECK-LABEL: orr_movk5:
128; CHECK: mov x0, #-71777214294589696
129; CHECK: movk x0, #57005, lsl #16
130  ret i64 -71777214836900096
131}
132
133define i64 @orr_movk6() nounwind {
134; CHECK-LABEL: orr_movk6:
135; CHECK: mov x0, #-71777214294589696
136; CHECK: movk x0, #57005, lsl #16
137; CHECK: movk x0, #57005, lsl #48
138  ret i64 -2400982647117578496
139}
140
141define i64 @orr_movk7() nounwind {
142; CHECK-LABEL: orr_movk7:
143; CHECK: mov x0, #-71777214294589696
144; CHECK: movk x0, #57005, lsl #48
145  ret i64 -2400982646575268096
146}
147
148define i64 @orr_movk8() nounwind {
149; CHECK-LABEL: orr_movk8:
150; CHECK: mov x0, #-71777214294589696
151; CHECK: movk x0, #57005
152; CHECK: movk x0, #57005, lsl #48
153  ret i64 -2400982646575276371
154}
155
156; rdar://14987715
157define i64 @orr_movk9() nounwind {
158; CHECK-LABEL: orr_movk9:
159; CHECK: mov x0, #1152921435887370240
160; CHECK: movk x0, #65280
161; CHECK: movk x0, #57005, lsl #16
162  ret i64 1152921439623315200
163}
164
165define i64 @orr_movk10() nounwind {
166; CHECK-LABEL: orr_movk10:
167; CHECK: mov x0, #1152921504606846720
168; CHECK: movk x0, #57005, lsl #16
169  ret i64 1152921504047824640
170}
171
172define i64 @orr_movk11() nounwind {
173; CHECK-LABEL: orr_movk11:
174; CHECK: mov x0, #-4503599627370241
175; CHECK: movk x0, #57005, lsl #16
176; CHECK: movk x0, #65535, lsl #32
177  ret i64 -4222125209747201
178}
179
180define i64 @orr_movk12() nounwind {
181; CHECK-LABEL: orr_movk12:
182; CHECK: mov x0, #-4503599627370241
183; CHECK: movk x0, #57005, lsl #32
184  ret i64 -4258765016661761
185}
186
187define i64 @orr_movk13() nounwind {
188; CHECK-LABEL: orr_movk13:
189; CHECK: mov x0, #17592169267200
190; CHECK: movk x0, #57005
191; CHECK: movk x0, #57005, lsl #48
192  ret i64 -2401245434149282131
193}
194
195; rdar://13944082
196define i64 @g() nounwind {
197; CHECK-LABEL: g:
198; CHECK: mov x0, #-281474976710656
199; CHECK: movk x0, #2
200entry:
201  ret i64 -281474976710654
202}
203