1+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
12; RUN: llc -O0 -frame-pointer=all -mtriple=powerpc-unknown-linux-gnu -mcpu=g5 < %s | FileCheck %s -check-prefix=PPC32
23; RUN: llc -O0 -mtriple=powerpc64-unknown-linux-gnu -mcpu=g5 < %s | FileCheck %s -check-prefix=PPC64
34; RUN: llc -O0 -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s -check-prefix=PPC64-ELFv2
45
56declare void @foo ()
67
78define i32 @test_cr2 () nounwind uwtable {
9+ ; PPC32-LABEL: test_cr2:
10+ ; PPC32: # %bb.0: # %entry
11+ ; PPC32-NEXT: mflr 0
12+ ; PPC32-NEXT: stwu 1, -32(1)
13+ ; PPC32-NEXT: stw 31, 28(1)
14+ ; PPC32-NEXT: stw 0, 36(1)
15+ ; PPC32-NEXT: .cfi_def_cfa_offset 32
16+ ; PPC32-NEXT: .cfi_offset r31, -4
17+ ; PPC32-NEXT: .cfi_offset lr, 4
18+ ; PPC32-NEXT: mr 31, 1
19+ ; PPC32-NEXT: .cfi_def_cfa_register r31
20+ ; PPC32-NEXT: mfcr 12
21+ ; PPC32-NEXT: stw 12, 24(31)
22+ ; PPC32-NEXT: li 3, 1
23+ ; PPC32-NEXT: li 4, 2
24+ ; PPC32-NEXT: li 5, 3
25+ ; PPC32-NEXT: li 6, 0
26+ ; PPC32-NEXT: #APP
27+ ; PPC32-EMPTY:
28+ ; PPC32-NEXT: mtcr 6
29+ ; PPC32-NEXT: cmpw 2, 4, 3
30+ ; PPC32-NEXT: mfcr 3
31+ ; PPC32-NEXT: #NO_APP
32+ ; PPC32-NEXT: stw 3, 20(31)
33+ ; PPC32-NEXT: bl foo
34+ ; PPC32-NEXT: lwz 3, 20(31)
35+ ; PPC32-NEXT: lwz 12, 24(31)
36+ ; PPC32-NEXT: mtocrf 32, 12
37+ ; PPC32-NEXT: lwz 0, 36(1)
38+ ; PPC32-NEXT: lwz 31, 28(1)
39+ ; PPC32-NEXT: addi 1, 1, 32
40+ ; PPC32-NEXT: mtlr 0
41+ ; PPC32-NEXT: blr
42+ ;
43+ ; PPC64-LABEL: test_cr2:
44+ ; PPC64: # %bb.0: # %entry
45+ ; PPC64-NEXT: mflr 0
46+ ; PPC64-NEXT: mfcr 12
47+ ; PPC64-NEXT: stw 12, 8(1)
48+ ; PPC64-NEXT: stdu 1, -128(1)
49+ ; PPC64-NEXT: std 0, 144(1)
50+ ; PPC64-NEXT: .cfi_def_cfa_offset 128
51+ ; PPC64-NEXT: .cfi_offset lr, 16
52+ ; PPC64-NEXT: .cfi_offset cr2, 8
53+ ; PPC64-NEXT: li 3, 1
54+ ; PPC64-NEXT: li 4, 2
55+ ; PPC64-NEXT: li 5, 3
56+ ; PPC64-NEXT: li 6, 0
57+ ; PPC64-NEXT: #APP
58+ ; PPC64-EMPTY:
59+ ; PPC64-NEXT: mtcr 6
60+ ; PPC64-NEXT: cmpw 2, 4, 3
61+ ; PPC64-NEXT: mfcr 3
62+ ; PPC64-NEXT: #NO_APP
63+ ; PPC64-NEXT: stw 3, 124(1)
64+ ; PPC64-NEXT: bl foo
65+ ; PPC64-NEXT: nop
66+ ; PPC64-NEXT: lwz 3, 124(1)
67+ ; PPC64-NEXT: addi 1, 1, 128
68+ ; PPC64-NEXT: ld 0, 16(1)
69+ ; PPC64-NEXT: lwz 12, 8(1)
70+ ; PPC64-NEXT: mtocrf 32, 12
71+ ; PPC64-NEXT: mtlr 0
72+ ; PPC64-NEXT: blr
73+ ;
74+ ; PPC64-ELFv2-LABEL: test_cr2:
75+ ; PPC64-ELFv2: # %bb.0: # %entry
76+ ; PPC64-ELFv2-NEXT: mflr 0
77+ ; PPC64-ELFv2-NEXT: mfocrf 12, 32
78+ ; PPC64-ELFv2-NEXT: stw 12, 8(1)
79+ ; PPC64-ELFv2-NEXT: stdu 1, -112(1)
80+ ; PPC64-ELFv2-NEXT: std 0, 128(1)
81+ ; PPC64-ELFv2-NEXT: .cfi_def_cfa_offset 112
82+ ; PPC64-ELFv2-NEXT: .cfi_offset lr, 16
83+ ; PPC64-ELFv2-NEXT: .cfi_offset cr2, 8
84+ ; PPC64-ELFv2-NEXT: li 3, 1
85+ ; PPC64-ELFv2-NEXT: li 4, 2
86+ ; PPC64-ELFv2-NEXT: li 5, 3
87+ ; PPC64-ELFv2-NEXT: li 6, 0
88+ ; PPC64-ELFv2-NEXT: #APP
89+ ; PPC64-ELFv2-EMPTY:
90+ ; PPC64-ELFv2-NEXT: mtcr 6
91+ ; PPC64-ELFv2-NEXT: cmpw 2, 4, 3
92+ ; PPC64-ELFv2-NEXT: mfcr 3
93+ ; PPC64-ELFv2-NEXT: #NO_APP
94+ ; PPC64-ELFv2-NEXT: stw 3, 108(1)
95+ ; PPC64-ELFv2-NEXT: bl foo
96+ ; PPC64-ELFv2-NEXT: nop
97+ ; PPC64-ELFv2-NEXT: lwz 3, 108(1)
98+ ; PPC64-ELFv2-NEXT: addi 1, 1, 112
99+ ; PPC64-ELFv2-NEXT: ld 0, 16(1)
100+ ; PPC64-ELFv2-NEXT: lwz 12, 8(1)
101+ ; PPC64-ELFv2-NEXT: mtocrf 32, 12
102+ ; PPC64-ELFv2-NEXT: mtlr 0
103+ ; PPC64-ELFv2-NEXT: blr
8104entry:
9105 %ret = alloca i32 , align 4
10106 %0 = call i32 asm sideeffect "\0A\09 mtcr $4\0A\09 cmpw 2,$2,$1\0A\09 mfcr $0" , "=r,r,r,r,r,~{cr2}" (i32 1 , i32 2 , i32 3 , i32 0 ) nounwind
@@ -14,27 +110,104 @@ entry:
14110 ret i32 %1
15111}
16112
17- ; PPC32-LABEL: test_cr2:
18- ; PPC32: stwu 1, -32(1)
19- ; PPC32: stw 31, 28(1)
20- ; PPC32: mfcr 12
21- ; PPC32-NEXT: stw 12, 24(31)
22- ; PPC32: lwz 12, 24(31)
23- ; PPC32-NEXT: mtocrf 32, 12
24-
25- ; PPC64: .cfi_startproc
26- ; PPC64: mfcr 12
27- ; PPC64: stw 12, 8(1)
28- ; PPC64: stdu 1, -[[AMT:[0-9]+]](1)
29- ; PPC64: .cfi_def_cfa_offset 128
30- ; PPC64: .cfi_offset lr, 16
31- ; PPC64: .cfi_offset cr2, 8
32- ; PPC64: addi 1, 1, [[AMT]]
33- ; PPC64: lwz 12, 8(1)
34- ; PPC64: mtocrf 32, 12
35- ; PPC64: .cfi_endproc
36-
37113define i32 @test_cr234 () nounwind {
114+ ; PPC32-LABEL: test_cr234:
115+ ; PPC32: # %bb.0: # %entry
116+ ; PPC32-NEXT: mflr 0
117+ ; PPC32-NEXT: stwu 1, -32(1)
118+ ; PPC32-NEXT: stw 31, 28(1)
119+ ; PPC32-NEXT: stw 0, 36(1)
120+ ; PPC32-NEXT: mr 31, 1
121+ ; PPC32-NEXT: mfcr 12
122+ ; PPC32-NEXT: stw 12, 24(31)
123+ ; PPC32-NEXT: li 3, 1
124+ ; PPC32-NEXT: li 4, 2
125+ ; PPC32-NEXT: li 5, 3
126+ ; PPC32-NEXT: li 6, 0
127+ ; PPC32-NEXT: #APP
128+ ; PPC32-EMPTY:
129+ ; PPC32-NEXT: mtcr 6
130+ ; PPC32-NEXT: cmpw 2, 4, 3
131+ ; PPC32-NEXT: cmpw 3, 4, 4
132+ ; PPC32-NEXT: cmpw 4, 4, 5
133+ ; PPC32-NEXT: mfcr 3
134+ ; PPC32-NEXT: #NO_APP
135+ ; PPC32-NEXT: stw 3, 20(31)
136+ ; PPC32-NEXT: bl foo
137+ ; PPC32-NEXT: lwz 3, 20(31)
138+ ; PPC32-NEXT: lwz 12, 24(31)
139+ ; PPC32-NEXT: mtocrf 32, 12
140+ ; PPC32-NEXT: mtocrf 16, 12
141+ ; PPC32-NEXT: mtocrf 8, 12
142+ ; PPC32-NEXT: lwz 0, 36(1)
143+ ; PPC32-NEXT: lwz 31, 28(1)
144+ ; PPC32-NEXT: addi 1, 1, 32
145+ ; PPC32-NEXT: mtlr 0
146+ ; PPC32-NEXT: blr
147+ ;
148+ ; PPC64-LABEL: test_cr234:
149+ ; PPC64: # %bb.0: # %entry
150+ ; PPC64-NEXT: mflr 0
151+ ; PPC64-NEXT: mfcr 12
152+ ; PPC64-NEXT: stw 12, 8(1)
153+ ; PPC64-NEXT: stdu 1, -128(1)
154+ ; PPC64-NEXT: std 0, 144(1)
155+ ; PPC64-NEXT: li 3, 1
156+ ; PPC64-NEXT: li 4, 2
157+ ; PPC64-NEXT: li 5, 3
158+ ; PPC64-NEXT: li 6, 0
159+ ; PPC64-NEXT: #APP
160+ ; PPC64-EMPTY:
161+ ; PPC64-NEXT: mtcr 6
162+ ; PPC64-NEXT: cmpw 2, 4, 3
163+ ; PPC64-NEXT: cmpw 3, 4, 4
164+ ; PPC64-NEXT: cmpw 4, 4, 5
165+ ; PPC64-NEXT: mfcr 3
166+ ; PPC64-NEXT: #NO_APP
167+ ; PPC64-NEXT: stw 3, 124(1)
168+ ; PPC64-NEXT: bl foo
169+ ; PPC64-NEXT: nop
170+ ; PPC64-NEXT: lwz 3, 124(1)
171+ ; PPC64-NEXT: addi 1, 1, 128
172+ ; PPC64-NEXT: ld 0, 16(1)
173+ ; PPC64-NEXT: lwz 12, 8(1)
174+ ; PPC64-NEXT: mtocrf 32, 12
175+ ; PPC64-NEXT: mtocrf 16, 12
176+ ; PPC64-NEXT: mtocrf 8, 12
177+ ; PPC64-NEXT: mtlr 0
178+ ; PPC64-NEXT: blr
179+ ;
180+ ; PPC64-ELFv2-LABEL: test_cr234:
181+ ; PPC64-ELFv2: # %bb.0: # %entry
182+ ; PPC64-ELFv2-NEXT: mflr 0
183+ ; PPC64-ELFv2-NEXT: mfcr 12
184+ ; PPC64-ELFv2-NEXT: stw 12, 8(1)
185+ ; PPC64-ELFv2-NEXT: stdu 1, -112(1)
186+ ; PPC64-ELFv2-NEXT: std 0, 128(1)
187+ ; PPC64-ELFv2-NEXT: li 3, 1
188+ ; PPC64-ELFv2-NEXT: li 4, 2
189+ ; PPC64-ELFv2-NEXT: li 5, 3
190+ ; PPC64-ELFv2-NEXT: li 6, 0
191+ ; PPC64-ELFv2-NEXT: #APP
192+ ; PPC64-ELFv2-EMPTY:
193+ ; PPC64-ELFv2-NEXT: mtcr 6
194+ ; PPC64-ELFv2-NEXT: cmpw 2, 4, 3
195+ ; PPC64-ELFv2-NEXT: cmpw 3, 4, 4
196+ ; PPC64-ELFv2-NEXT: cmpw 4, 4, 5
197+ ; PPC64-ELFv2-NEXT: mfcr 3
198+ ; PPC64-ELFv2-NEXT: #NO_APP
199+ ; PPC64-ELFv2-NEXT: stw 3, 108(1)
200+ ; PPC64-ELFv2-NEXT: bl foo
201+ ; PPC64-ELFv2-NEXT: nop
202+ ; PPC64-ELFv2-NEXT: lwz 3, 108(1)
203+ ; PPC64-ELFv2-NEXT: addi 1, 1, 112
204+ ; PPC64-ELFv2-NEXT: ld 0, 16(1)
205+ ; PPC64-ELFv2-NEXT: lwz 12, 8(1)
206+ ; PPC64-ELFv2-NEXT: mtocrf 32, 12
207+ ; PPC64-ELFv2-NEXT: mtocrf 16, 12
208+ ; PPC64-ELFv2-NEXT: mtocrf 8, 12
209+ ; PPC64-ELFv2-NEXT: mtlr 0
210+ ; PPC64-ELFv2-NEXT: blr
38211entry:
39212 %ret = alloca i32 , align 4
40213 %0 = call i32 asm sideeffect "\0A\09 mtcr $4\0A\09 cmpw 2,$2,$1\0A\09 cmpw 3,$2,$2\0A\09 cmpw 4,$2,$3\0A\09 mfcr $0" , "=r,r,r,r,r,~{cr2},~{cr3},~{cr4}" (i32 1 , i32 2 , i32 3 , i32 0 ) nounwind
@@ -44,41 +217,102 @@ entry:
44217 ret i32 %1
45218}
46219
47- ; PPC32-LABEL: test_cr234:
48- ; PPC32: stwu 1, -32(1)
49- ; PPC32: stw 31, 28(1)
50- ; PPC32: mfcr 12
51- ; PPC32-NEXT: stw 12, 24(31)
52- ; PPC32: lwz 12, 24(31)
53- ; PPC32-NEXT: mtocrf 32, 12
54- ; PPC32-NEXT: mtocrf 16, 12
55- ; PPC32-NEXT: mtocrf 8, 12
56-
57- ; PPC64: mfcr 12
58- ; PPC64: stw 12, 8(1)
59- ; PPC64: stdu 1, -[[AMT:[0-9]+]](1)
60- ; PPC64: addi 1, 1, [[AMT]]
61- ; PPC64: lwz 12, 8(1)
62- ; PPC64: mtocrf 32, 12
63- ; PPC64: mtocrf 16, 12
64- ; PPC64: mtocrf 8, 12
65-
66220; Generate mfocrf in prologue when we need to save 1 nonvolatile CR field
67221define void @cloberOneNvCrField () {
222+ ; PPC32-LABEL: cloberOneNvCrField:
223+ ; PPC32: # %bb.0: # %entry
224+ ; PPC32-NEXT: stwu 1, -32(1)
225+ ; PPC32-NEXT: stw 31, 28(1)
226+ ; PPC32-NEXT: .cfi_def_cfa_offset 32
227+ ; PPC32-NEXT: .cfi_offset r31, -4
228+ ; PPC32-NEXT: mr 31, 1
229+ ; PPC32-NEXT: .cfi_def_cfa_register r31
230+ ; PPC32-NEXT: mfcr 12
231+ ; PPC32-NEXT: stw 12, 24(31)
232+ ; PPC32-NEXT: #APP
233+ ; PPC32-NEXT: # clobbers
234+ ; PPC32-NEXT: #NO_APP
235+ ; PPC32-NEXT: lwz 12, 24(31)
236+ ; PPC32-NEXT: mtocrf 32, 12
237+ ; PPC32-NEXT: lwz 31, 28(1)
238+ ; PPC32-NEXT: addi 1, 1, 32
239+ ; PPC32-NEXT: blr
240+ ;
241+ ; PPC64-LABEL: cloberOneNvCrField:
242+ ; PPC64: # %bb.0: # %entry
243+ ; PPC64-NEXT: mfcr 12
244+ ; PPC64-NEXT: stw 12, 8(1)
245+ ; PPC64-NEXT: #APP
246+ ; PPC64-NEXT: # clobbers
247+ ; PPC64-NEXT: #NO_APP
248+ ; PPC64-NEXT: lwz 12, 8(1)
249+ ; PPC64-NEXT: mtocrf 32, 12
250+ ; PPC64-NEXT: blr
251+ ;
252+ ; PPC64-ELFv2-LABEL: cloberOneNvCrField:
253+ ; PPC64-ELFv2: # %bb.0: # %entry
254+ ; PPC64-ELFv2-NEXT: mfocrf 12, 32
255+ ; PPC64-ELFv2-NEXT: stw 12, 8(1)
256+ ; PPC64-ELFv2-NEXT: #APP
257+ ; PPC64-ELFv2-NEXT: # clobbers
258+ ; PPC64-ELFv2-NEXT: #NO_APP
259+ ; PPC64-ELFv2-NEXT: lwz 12, 8(1)
260+ ; PPC64-ELFv2-NEXT: mtocrf 32, 12
261+ ; PPC64-ELFv2-NEXT: blr
68262entry:
69263 tail call void asm sideeffect "# clobbers" , "~{cr2}" ()
70264 ret void
71-
72- ; PPC64-ELFv2-LABEL: @cloberOneNvCrField
73- ; PPC64-ELFv2: mfocrf [[REG1:[0-9]+]], 32
74265}
75266
76267; Generate mfcr in prologue when we need to save all nonvolatile CR field
77268define void @cloberAllNvCrField () {
269+ ; PPC32-LABEL: cloberAllNvCrField:
270+ ; PPC32: # %bb.0: # %entry
271+ ; PPC32-NEXT: stwu 1, -32(1)
272+ ; PPC32-NEXT: stw 31, 28(1)
273+ ; PPC32-NEXT: .cfi_def_cfa_offset 32
274+ ; PPC32-NEXT: .cfi_offset r31, -4
275+ ; PPC32-NEXT: mr 31, 1
276+ ; PPC32-NEXT: .cfi_def_cfa_register r31
277+ ; PPC32-NEXT: mfcr 12
278+ ; PPC32-NEXT: stw 12, 24(31)
279+ ; PPC32-NEXT: #APP
280+ ; PPC32-NEXT: # clobbers
281+ ; PPC32-NEXT: #NO_APP
282+ ; PPC32-NEXT: lwz 12, 24(31)
283+ ; PPC32-NEXT: mtocrf 32, 12
284+ ; PPC32-NEXT: mtocrf 16, 12
285+ ; PPC32-NEXT: mtocrf 8, 12
286+ ; PPC32-NEXT: lwz 31, 28(1)
287+ ; PPC32-NEXT: addi 1, 1, 32
288+ ; PPC32-NEXT: blr
289+ ;
290+ ; PPC64-LABEL: cloberAllNvCrField:
291+ ; PPC64: # %bb.0: # %entry
292+ ; PPC64-NEXT: mfcr 12
293+ ; PPC64-NEXT: stw 12, 8(1)
294+ ; PPC64-NEXT: #APP
295+ ; PPC64-NEXT: # clobbers
296+ ; PPC64-NEXT: #NO_APP
297+ ; PPC64-NEXT: lwz 12, 8(1)
298+ ; PPC64-NEXT: mtocrf 32, 12
299+ ; PPC64-NEXT: mtocrf 16, 12
300+ ; PPC64-NEXT: mtocrf 8, 12
301+ ; PPC64-NEXT: blr
302+ ;
303+ ; PPC64-ELFv2-LABEL: cloberAllNvCrField:
304+ ; PPC64-ELFv2: # %bb.0: # %entry
305+ ; PPC64-ELFv2-NEXT: mfcr 12
306+ ; PPC64-ELFv2-NEXT: stw 12, 8(1)
307+ ; PPC64-ELFv2-NEXT: #APP
308+ ; PPC64-ELFv2-NEXT: # clobbers
309+ ; PPC64-ELFv2-NEXT: #NO_APP
310+ ; PPC64-ELFv2-NEXT: lwz 12, 8(1)
311+ ; PPC64-ELFv2-NEXT: mtocrf 32, 12
312+ ; PPC64-ELFv2-NEXT: mtocrf 16, 12
313+ ; PPC64-ELFv2-NEXT: mtocrf 8, 12
314+ ; PPC64-ELFv2-NEXT: blr
78315entry:
79316 tail call void asm sideeffect "# clobbers" , "~{cr2},~{cr3},~{cr4}" ()
80317 ret void
81-
82- ; PPC64-ELFv2-LABEL: @cloberAllNvCrField
83- ; PPC64-ELFv2: mfcr [[REG1:[0-9]+]]
84318}
0 commit comments