1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
1
2
; RUN: llc -O0 -frame-pointer=all -mtriple=powerpc-unknown-linux-gnu -mcpu=g5 < %s | FileCheck %s -check-prefix=PPC32
2
3
; RUN: llc -O0 -mtriple=powerpc64-unknown-linux-gnu -mcpu=g5 < %s | FileCheck %s -check-prefix=PPC64
3
4
; RUN: llc -O0 -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s -check-prefix=PPC64-ELFv2
4
5
5
6
declare void @foo ()
6
7
7
8
define 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
8
104
entry:
9
105
%ret = alloca i32 , align 4
10
106
%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:
14
110
ret i32 %1
15
111
}
16
112
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
-
37
113
define 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
38
211
entry:
39
212
%ret = alloca i32 , align 4
40
213
%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:
44
217
ret i32 %1
45
218
}
46
219
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
-
66
220
; Generate mfocrf in prologue when we need to save 1 nonvolatile CR field
67
221
define 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
68
262
entry:
69
263
tail call void asm sideeffect "# clobbers" , "~{cr2}" ()
70
264
ret void
71
-
72
- ; PPC64-ELFv2-LABEL: @cloberOneNvCrField
73
- ; PPC64-ELFv2: mfocrf [[REG1:[0-9]+]], 32
74
265
}
75
266
76
267
; Generate mfcr in prologue when we need to save all nonvolatile CR field
77
268
define 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
78
315
entry:
79
316
tail call void asm sideeffect "# clobbers" , "~{cr2},~{cr3},~{cr4}" ()
80
317
ret void
81
-
82
- ; PPC64-ELFv2-LABEL: @cloberAllNvCrField
83
- ; PPC64-ELFv2: mfcr [[REG1:[0-9]+]]
84
318
}
0 commit comments