1# RUN: llc -O0 -mtriple=aarch64-apple-ios -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=IOS
2# RUN: llc -O0 -mtriple=aarch64-linux-gnu -relocation-model=pic -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=LINUX-PIC
3
4--- |
5  target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
6
7  define void @frame_index() {
8    %ptr0 = alloca i64
9    ret void
10  }
11
12  define i8* @ptr_mask(i8* %in) { ret i8* undef }
13
14  @var_local = global i8 0
15  define i8* @global_local() { ret i8* undef }
16
17  @var_got = external global i8
18  define i8* @global_got() { ret i8* undef }
19
20  define void @icmp() { ret void }
21  define void @fcmp() { ret void }
22
23  define void @phi() { ret void }
24
25  define void @select() { ret void }
26...
27
28---
29# CHECK-LABEL: name: frame_index
30name:            frame_index
31legalized:       true
32regBankSelected: true
33
34# CHECK:      registers:
35# CHECK-NEXT:  - { id: 0, class: gpr64sp, preferred-register: '' }
36registers:
37  - { id: 0, class: gpr }
38
39stack:
40  - { id: 0, name: ptr0, offset: 0, size: 8, alignment: 8 }
41
42# CHECK:  body:
43# CHECK: %0:gpr64sp = ADDXri %stack.0.ptr0, 0, 0
44body:             |
45  bb.0:
46    %0(p0) = G_FRAME_INDEX %stack.0.ptr0
47    $x0 = COPY %0(p0)
48...
49
50---
51
52---
53# CHECK-LABEL: name: ptr_mask
54name:            ptr_mask
55legalized:       true
56regBankSelected: true
57
58# CHECK:  body:
59# CHECK: %2:gpr64sp = ANDXri %0, 8060
60body:             |
61  bb.0:
62      liveins: $x0
63    %0:gpr(p0) = COPY $x0
64    %const:gpr(s64) = G_CONSTANT i64 -8
65    %1:gpr(p0) = G_PTRMASK %0, %const
66    $x0 = COPY %1(p0)
67...
68
69---
70# Global defined in the same linkage unit so no GOT is needed
71# CHECK-LABEL: name: global_local
72name:            global_local
73legalized:       true
74regBankSelected: true
75registers:
76  - { id: 0, class: gpr }
77
78# CHECK:  body:
79# IOS: %0:gpr64 = MOVaddr target-flags(aarch64-page) @var_local, target-flags(aarch64-pageoff, aarch64-nc) @var_local
80# LINUX-PIC: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_local
81body:             |
82  bb.0:
83    %0(p0) = G_GLOBAL_VALUE @var_local
84    $x0 = COPY %0(p0)
85...
86
87---
88# CHECK-LABEL: name: global_got
89name:            global_got
90legalized:       true
91regBankSelected: true
92registers:
93  - { id: 0, class: gpr }
94
95# CHECK:  body:
96# IOS: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_got
97# LINUX-PIC: %0:gpr64 = LOADgot target-flags(aarch64-got) @var_got
98body:             |
99  bb.0:
100    %0(p0) = G_GLOBAL_VALUE @var_got
101    $x0 = COPY %0(p0)
102...
103
104---
105# CHECK-LABEL: name: icmp
106name:            icmp
107legalized:       true
108regBankSelected: true
109
110# CHECK:      registers:
111# CHECK-NEXT:  - { id: 0, class: gpr32, preferred-register: '' }
112# CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
113# CHECK-NEXT:  - { id: 2, class: gpr64, preferred-register: '' }
114# CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
115# CHECK-NEXT:  - { id: 4, class: gpr64, preferred-register: '' }
116# CHECK-NEXT:  - { id: 5, class: gpr32, preferred-register: '' }
117registers:
118  - { id: 0, class: gpr }
119  - { id: 1, class: gpr }
120  - { id: 2, class: gpr }
121  - { id: 3, class: gpr }
122  - { id: 4, class: gpr }
123  - { id: 5, class: gpr }
124  - { id: 6, class: gpr }
125  - { id: 7, class: gpr }
126  - { id: 8, class: gpr }
127  - { id: 9, class: gpr }
128  - { id: 10, class: gpr }
129  - { id: 11, class: gpr }
130
131# CHECK:  body:
132# CHECK:    SUBSWrr %0, %0, implicit-def $nzcv
133# CHECK:    %1:gpr32 = CSINCWr $wzr, $wzr, 1, implicit $nzcv
134
135# CHECK:    SUBSXrr %2, %2, implicit-def $nzcv
136# CHECK:    %3:gpr32 = CSINCWr $wzr, $wzr, 3, implicit $nzcv
137
138# CHECK:    SUBSXrr %4, %4, implicit-def $nzcv
139# CHECK:    %5:gpr32 = CSINCWr $wzr, $wzr, 0, implicit $nzcv
140
141body:             |
142  bb.0:
143    liveins: $w0, $x0
144
145    %0(s32) = COPY $w0
146    %1(s32) = G_ICMP intpred(eq), %0, %0
147    %6(s1) = G_TRUNC %1(s32)
148    %9(s32) = G_ANYEXT %6
149    $w0 = COPY %9(s32)
150
151    %2(s64) = COPY $x0
152    %3(s32) = G_ICMP intpred(uge), %2, %2
153    %7(s1) = G_TRUNC %3(s32)
154    %10(s32) = G_ANYEXT %7
155    $w0 = COPY %10(s32)
156
157    %4(p0) = COPY $x0
158    %5(s32) = G_ICMP intpred(ne), %4, %4
159    %8(s1) = G_TRUNC %5(s32)
160    %11(s32) = G_ANYEXT %8
161    $w0 = COPY %11(s32)
162...
163
164---
165# CHECK-LABEL: name: fcmp
166name:            fcmp
167legalized:       true
168regBankSelected: true
169
170# CHECK:      registers:
171# CHECK-NEXT:  - { id: 0, class: fpr32, preferred-register: '' }
172# CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
173# CHECK-NEXT:  - { id: 2, class: fpr64, preferred-register: '' }
174# CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
175# CHECK-NEXT:  - { id: 4, class: gpr32, preferred-register: '' }
176# CHECK-NEXT:  - { id: 5, class: gpr32, preferred-register: '' }
177registers:
178  - { id: 0, class: fpr }
179  - { id: 1, class: gpr }
180  - { id: 2, class: fpr }
181  - { id: 3, class: gpr }
182  - { id: 4, class: gpr }
183  - { id: 5, class: gpr }
184  - { id: 6, class: gpr }
185  - { id: 7, class: gpr }
186
187# CHECK:  body:
188# CHECK:    FCMPSrr %0, %0, implicit-def $nzcv
189# CHECK:    [[TST_MI:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 5, implicit $nzcv
190# CHECK:    [[TST_GT:%[0-9]+]]:gpr32 = CSINCWr $wzr, $wzr, 13, implicit $nzcv
191# CHECK:    %1:gpr32 = ORRWrr [[TST_MI]], [[TST_GT]]
192
193# CHECK:    FCMPDrr %2, %2, implicit-def $nzcv
194# CHECK:    %3:gpr32 = CSINCWr $wzr, $wzr, 4, implicit $nzcv
195
196body:             |
197  bb.0:
198    liveins: $w0, $x0
199
200    %0(s32) = COPY $s0
201    %1(s32) = G_FCMP floatpred(one), %0, %0
202    %4(s1) = G_TRUNC %1(s32)
203    %6(s32) = G_ANYEXT %4
204    $w0 = COPY %6(s32)
205
206    %2(s64) = COPY $d0
207    %3(s32) = G_FCMP floatpred(uge), %2, %2
208    %5(s1) = G_TRUNC %3(s32)
209    %7(s32) = G_ANYEXT %5
210    $w0 = COPY %7(s32)
211
212...
213
214---
215# CHECK-LABEL: name: phi
216name:            phi
217legalized:       true
218regBankSelected: true
219tracksRegLiveness: true
220
221# CHECK:      registers:
222# CHECK-NEXT:  - { id: 0, class: fpr32, preferred-register: '' }
223# CHECK-NEXT:  - { id: 1, class: gpr, preferred-register: '' }
224# CHECK-NEXT:  - { id: 2, class: fpr32, preferred-register: '' }
225# CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
226registers:
227  - { id: 0, class: fpr }
228  - { id: 1, class: gpr }
229  - { id: 2, class: fpr }
230
231# CHECK:  body:
232# CHECK:    bb.1:
233# CHECK:      %2:fpr32 = PHI %0, %bb.0, %2, %bb.1
234
235body:             |
236  bb.0:
237    liveins: $s0, $w0
238    successors: %bb.1
239    %0(s32) = COPY $s0
240    %3:gpr(s32) = COPY $w0
241    %1(s1) = G_TRUNC %3
242
243  bb.1:
244    successors: %bb.1, %bb.2
245    %2(s32) = PHI %0, %bb.0, %2, %bb.1
246    G_BRCOND %1, %bb.1
247
248  bb.2:
249    $s0 = COPY %2
250    RET_ReallyLR implicit $s0
251...
252
253---
254# CHECK-LABEL: name: select
255name:            select
256legalized:       true
257regBankSelected: true
258tracksRegLiveness: true
259
260# CHECK:      registers:
261# CHECK-NEXT:  - { id: 0, class: gpr32, preferred-register: '' }
262# CHECK-NEXT:  - { id: 1, class: gpr32, preferred-register: '' }
263# CHECK-NEXT:  - { id: 2, class: gpr32, preferred-register: '' }
264# CHECK-NEXT:  - { id: 3, class: gpr32, preferred-register: '' }
265# CHECK-NEXT:  - { id: 4, class: gpr64, preferred-register: '' }
266# CHECK-NEXT:  - { id: 5, class: gpr64, preferred-register: '' }
267# CHECK-NEXT:  - { id: 6, class: gpr64, preferred-register: '' }
268# CHECK-NEXT:  - { id: 7, class: gpr64, preferred-register: '' }
269# CHECK-NEXT:  - { id: 8, class: gpr64, preferred-register: '' }
270# CHECK-NEXT:  - { id: 9, class: gpr64, preferred-register: '' }
271registers:
272  - { id: 0, class: gpr }
273  - { id: 1, class: gpr }
274  - { id: 2, class: gpr }
275  - { id: 3, class: gpr }
276  - { id: 4, class: gpr }
277  - { id: 5, class: gpr }
278  - { id: 6, class: gpr }
279  - { id: 7, class: gpr }
280  - { id: 8, class: gpr }
281  - { id: 9, class: gpr }
282
283# CHECK:  body:
284# CHECK:      ANDSWri %10, 0, implicit-def $nzcv
285# CHECK:      %3:gpr32 = CSELWr %1, %2, 1, implicit $nzcv
286# CHECK:      ANDSWri %10, 0, implicit-def $nzcv
287# CHECK:      %6:gpr64 = CSELXr %4, %5, 1, implicit $nzcv
288# CHECK:      ANDSWri %10, 0, implicit-def $nzcv
289# CHECK:      %9:gpr64 = CSELXr %7, %8, 1, implicit $nzcv
290body:             |
291  bb.0:
292    liveins: $w0, $w1, $w2
293    %10:gpr(s32) = COPY $w0
294    %0(s1) = G_TRUNC %10
295
296    %1(s32) = COPY $w1
297    %2(s32) = COPY $w2
298    %3(s32) = G_SELECT %0, %1, %2
299    $w0 = COPY %3(s32)
300
301    %4(s64) = COPY $x0
302    %5(s64) = COPY $x1
303    %6(s64) = G_SELECT %0, %4, %5
304    $x0 = COPY %6(s64)
305
306    %7(p0) = COPY $x0
307    %8(p0) = COPY $x1
308    %9(p0) = G_SELECT %0, %7, %8
309    $x0 = COPY %9(p0)
310...
311