1
; Test some of the calling convention lowering done by the MBlaze backend.
2
; We test that integer values are passed in the correct registers and
3
; returned in the correct registers. Additionally, we test that the stack
4
; is used as appropriate for passing arguments that cannot be placed into
7
; RUN: llc < %s -march=mblaze | FileCheck %s
9
declare i32 @printf(i8*, ...)
10
@MSG = internal constant [13 x i8] c"Message: %d\0A\00"
12
define void @params0_noret() {
13
; CHECK: params0_noret:
15
; CHECK-NOT: {{.* r3, r0, 1}}
16
; CHECK-NOT: {{.* r4, .*, .*}}
20
define i8 @params0_8bitret() {
21
; CHECK: params0_8bitret:
23
; CHECK: {{.* r3, r0, 1}}
24
; CHECK-NOT: {{.* r4, .*, .*}}
28
define i16 @params0_16bitret() {
29
; CHECK: params0_16bitret:
31
; CHECK: {{.* r3, r0, 1}}
32
; CHECK-NOT: {{.* r4, .*, .*}}
36
define i32 @params0_32bitret() {
37
; CHECK: params0_32bitret:
39
; CHECK: {{.* r3, r0, 1}}
40
; CHECK-NOT: {{.* r4, .*, .*}}
44
define i64 @params0_64bitret() {
45
; CHECK: params0_64bitret:
47
; CHECK: {{.* r3, r0, .*}}
48
; CHECK: {{.* r4, r0, 1}}
52
define i32 @params1_32bitret(i32 %a) {
53
; CHECK: params1_32bitret:
55
; CHECK: {{.* r3, r5, r0}}
56
; CHECK-NOT: {{.* r4, .*, .*}}
60
define i32 @params2_32bitret(i32 %a, i32 %b) {
61
; CHECK: params2_32bitret:
63
; CHECK: {{.* r3, r6, r0}}
64
; CHECK-NOT: {{.* r4, .*, .*}}
68
define i32 @params3_32bitret(i32 %a, i32 %b, i32 %c) {
69
; CHECK: params3_32bitret:
71
; CHECK: {{.* r3, r7, r0}}
72
; CHECK-NOT: {{.* r4, .*, .*}}
76
define i32 @params4_32bitret(i32 %a, i32 %b, i32 %c, i32 %d) {
77
; CHECK: params4_32bitret:
79
; CHECK: {{.* r3, r8, r0}}
80
; CHECK-NOT: {{.* r4, .*, .*}}
84
define i32 @params5_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
85
; CHECK: params5_32bitret:
87
; CHECK: {{.* r3, r9, r0}}
88
; CHECK-NOT: {{.* r4, .*, .*}}
92
define i32 @params6_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f) {
93
; CHECK: params6_32bitret:
95
; CHECK: {{.* r3, r10, r0}}
96
; CHECK-NOT: {{.* r4, .*, .*}}
100
define i32 @params7_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f,
102
; CHECK: params7_32bitret:
104
; CHECK: {{lwi? r3, r1, 8}}
105
; CHECK-NOT: {{.* r4, .*, .*}}
109
define i32 @params8_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f,
111
; CHECK: params8_32bitret:
113
; CHECK: {{lwi? r3, r1, 12}}
114
; CHECK-NOT: {{.* r4, .*, .*}}
118
define i32 @params9_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f,
119
i32 %g, i32 %h, i32 %i) {
120
; CHECK: params9_32bitret:
122
; CHECK: {{lwi? r3, r1, 16}}
123
; CHECK-NOT: {{.* r4, .*, .*}}
127
define i32 @params10_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f,
128
i32 %g, i32 %h, i32 %i, i32 %j) {
129
; CHECK: params10_32bitret:
131
; CHECK: {{lwi? r3, r1, 20}}
132
; CHECK-NOT: {{.* r4, .*, .*}}
136
define void @testing() {
137
%MSG.1 = getelementptr [13 x i8]* @MSG, i32 0, i32 0
139
call void @params0_noret()
142
%tmp.1 = call i8 @params0_8bitret()
144
call i32 (i8*,...)* @printf(i8* %MSG.1, i8 %tmp.1)
145
; CHECK: {{.* r5, .*, .*}}
146
; CHECK: {{.* r6, r3, r0}}
147
; CHECK-NOT: {{.* r7, .*, .*}}
150
%tmp.2 = call i16 @params0_16bitret()
152
call i32 (i8*,...)* @printf(i8* %MSG.1, i16 %tmp.2)
153
; CHECK: {{.* r5, .*, .*}}
154
; CHECK: {{.* r6, r3, r0}}
155
; CHECK-NOT: {{.* r7, .*, .*}}
158
%tmp.3 = call i32 @params0_32bitret()
160
call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.3)
161
; CHECK: {{.* r5, .*, .*}}
162
; CHECK: {{.* r6, r3, r0}}
163
; CHECK-NOT: {{.* r7, .*, .*}}
166
%tmp.4 = call i64 @params0_64bitret()
168
call i32 (i8*,...)* @printf(i8* %MSG.1, i64 %tmp.4)
169
; CHECK: {{.* r5, .*, .*}}
170
; CHECK: {{.* r6, r3, r0}}
171
; CHECK: {{.* r7, r4, r0}}
174
%tmp.5 = call i32 @params1_32bitret(i32 1)
175
; CHECK: {{.* r5, .*, .*}}
177
call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.5)
178
; CHECK: {{.* r5, .*, .*}}
179
; CHECK: {{.* r6, r3, r0}}
180
; CHECK-NOT: {{.* r7, .*, .*}}
183
%tmp.6 = call i32 @params2_32bitret(i32 1, i32 2)
184
; CHECK: {{.* r5, .*, .*}}
185
; CHECK: {{.* r6, .*, .*}}
187
call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.6)
188
; CHECK: {{.* r5, .*, .*}}
189
; CHECK: {{.* r6, r3, r0}}
190
; CHECK-NOT: {{.* r7, .*, .*}}
193
%tmp.7 = call i32 @params3_32bitret(i32 1, i32 2, i32 3)
194
; CHECK: {{.* r5, .*, .*}}
195
; CHECK: {{.* r6, .*, .*}}
196
; CHECK: {{.* r7, .*, .*}}
198
call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.7)
199
; CHECK: {{.* r5, .*, .*}}
200
; CHECK: {{.* r6, r3, r0}}
201
; CHECK-NOT: {{.* r7, .*, .*}}
204
%tmp.8 = call i32 @params4_32bitret(i32 1, i32 2, i32 3, i32 4)
205
; CHECK: {{.* r5, .*, .*}}
206
; CHECK: {{.* r6, .*, .*}}
207
; CHECK: {{.* r7, .*, .*}}
208
; CHECK: {{.* r8, .*, .*}}
210
call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.8)
211
; CHECK: {{.* r5, .*, .*}}
212
; CHECK: {{.* r6, r3, r0}}
213
; CHECK-NOT: {{.* r7, .*, .*}}
216
%tmp.9 = call i32 @params5_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5)
217
; CHECK: {{.* r5, .*, .*}}
218
; CHECK: {{.* r6, .*, .*}}
219
; CHECK: {{.* r7, .*, .*}}
220
; CHECK: {{.* r8, .*, .*}}
221
; CHECK: {{.* r9, .*, .*}}
223
call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.9)
224
; CHECK: {{.* r5, .*, .*}}
225
; CHECK: {{.* r6, r3, r0}}
226
; CHECK-NOT: {{.* r7, .*, .*}}
229
%tmp.10 = call i32 @params6_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5,
231
; CHECK: {{.* r5, .*, .*}}
232
; CHECK: {{.* r6, .*, .*}}
233
; CHECK: {{.* r7, .*, .*}}
234
; CHECK: {{.* r8, .*, .*}}
235
; CHECK: {{.* r9, .*, .*}}
236
; CHECK: {{.* r10, .*, .*}}
238
call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.10)
239
; CHECK: {{.* r5, .*, .*}}
240
; CHECK: {{.* r6, r3, r0}}
241
; CHECK-NOT: {{.* r7, .*, .*}}
244
%tmp.11 = call i32 @params7_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5,
246
; CHECK: {{swi? .*, r1, 4}}
247
; CHECK: {{.* r5, .*, .*}}
248
; CHECK: {{.* r6, .*, .*}}
249
; CHECK: {{.* r7, .*, .*}}
250
; CHECK: {{.* r8, .*, .*}}
251
; CHECK: {{.* r9, .*, .*}}
252
; CHECK: {{.* r10, .*, .*}}
254
call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.11)
255
; CHECK: {{.* r5, .*, .*}}
256
; CHECK: {{.* r6, r3, r0}}
257
; CHECK-NOT: {{.* r7, .*, .*}}
260
%tmp.12 = call i32 @params8_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5,
262
; CHECK: {{swi? .*, r1, 4}}
263
; CHECK: {{swi? .*, r1, 8}}
264
; CHECK: {{.* r5, .*, .*}}
265
; CHECK: {{.* r6, .*, .*}}
266
; CHECK: {{.* r7, .*, .*}}
267
; CHECK: {{.* r8, .*, .*}}
268
; CHECK: {{.* r9, .*, .*}}
269
; CHECK: {{.* r10, .*, .*}}
271
call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.12)
272
; CHECK: {{.* r5, .*, .*}}
273
; CHECK: {{.* r6, r3, r0}}
274
; CHECK-NOT: {{.* r7, .*, .*}}
277
%tmp.13 = call i32 @params9_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5,
278
i32 6, i32 7, i32 8, i32 9)
279
; CHECK: {{swi? .*, r1, 4}}
280
; CHECK: {{swi? .*, r1, 8}}
281
; CHECK: {{swi? .*, r1, 12}}
282
; CHECK: {{.* r5, .*, .*}}
283
; CHECK: {{.* r6, .*, .*}}
284
; CHECK: {{.* r7, .*, .*}}
285
; CHECK: {{.* r8, .*, .*}}
286
; CHECK: {{.* r9, .*, .*}}
287
; CHECK: {{.* r10, .*, .*}}
289
call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.13)
290
; CHECK: {{.* r5, .*, .*}}
291
; CHECK: {{.* r6, r3, r0}}
292
; CHECK-NOT: {{.* r7, .*, .*}}
295
%tmp.14 = call i32 @params10_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5,
296
i32 6, i32 7, i32 8, i32 9, i32 10)
297
; CHECK: {{swi? .*, r1, 4}}
298
; CHECK: {{swi? .*, r1, 8}}
299
; CHECK: {{swi? .*, r1, 12}}
300
; CHECK: {{swi? .*, r1, 16}}
301
; CHECK: {{.* r5, .*, .*}}
302
; CHECK: {{.* r6, .*, .*}}
303
; CHECK: {{.* r7, .*, .*}}
304
; CHECK: {{.* r8, .*, .*}}
305
; CHECK: {{.* r9, .*, .*}}
306
; CHECK: {{.* r10, .*, .*}}
308
call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.14)
309
; CHECK: {{.* r5, .*, .*}}
310
; CHECK: {{.* r6, r3, r0}}
311
; CHECK-NOT: {{.* r7, .*, .*}}