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
5; registers.
6;
7; RUN: llc < %s -march=mblaze | FileCheck %s
8
9declare i32 @printf(i8*, ...)
10@MSG = internal constant [13 x i8] c"Message: %d\0A\00"
11
12define void @params0_noret() {
13    ; CHECK:        params0_noret:
14    ret void
15    ; CHECK-NOT:    {{.* r3, .*, .*}}
16    ; CHECK-NOT:    {{.* r4, .*, .*}}
17    ; CHECK:        rtsd
18}
19
20define i8 @params0_8bitret() {
21    ; CHECK:        params0_8bitret:
22    ret i8 1
23    ; CHECK-NOT:    {{.* r3, .*, .*}}
24    ; CHECK-NOT:    {{.* r4, .*, .*}}
25    ; CHECK:        rtsd
26    ; CHECK:        {{.* r3, r0, 1}}
27}
28
29define i16 @params0_16bitret() {
30    ; CHECK:        params0_16bitret:
31    ret i16 1
32    ; CHECK:        rtsd
33    ; CHECK:        {{.* r3, r0, 1}}
34    ; CHECK-NOT:    {{.* r4, .*, .*}}
35}
36
37define i32 @params0_32bitret() {
38    ; CHECK:        params0_32bitret:
39    ret i32 1
40    ; CHECK-NOT:    {{.* r4, .*, .*}}
41    ; CHECK:        rtsd
42    ; CHECK:        {{.* r3, r0, 1}}
43}
44
45define i64 @params0_64bitret() {
46    ; CHECK:        params0_64bitret:
47    ret i64 1
48    ; CHECK:        {{.* r3, r0, .*}}
49    ; CHECK:        rtsd
50    ; CHECK:        {{.* r4, r0, 1}}
51}
52
53define i32 @params1_32bitret(i32 %a) {
54    ; CHECK:        params1_32bitret:
55    ret i32 %a
56    ; CHECK-NOT:    {{.* r3, .*, .*}}
57    ; CHECK-NOT:    {{.* r4, .*, .*}}
58    ; CHECK:        rtsd
59    ; CHECK:        {{.* r3, r5, r0}}
60}
61
62define i32 @params2_32bitret(i32 %a, i32 %b) {
63    ; CHECK:        params2_32bitret:
64    ret i32 %b
65    ; CHECK-NOT:    {{.* r3, .*, .*}}
66    ; CHECK-NOT:    {{.* r4, .*, .*}}
67    ; CHECK:        rtsd
68    ; CHECK:        {{.* r3, r6, r0}}
69}
70
71define i32 @params3_32bitret(i32 %a, i32 %b, i32 %c) {
72    ; CHECK:        params3_32bitret:
73    ret i32 %c
74    ; CHECK-NOT:    {{.* r3, .*, .*}}
75    ; CHECK-NOT:    {{.* r4, .*, .*}}
76    ; CHECK:        rtsd
77    ; CHECK:        {{.* r3, r7, r0}}
78}
79
80define i32 @params4_32bitret(i32 %a, i32 %b, i32 %c, i32 %d) {
81    ; CHECK:        params4_32bitret:
82    ret i32 %d
83    ; CHECK-NOT:    {{.* r3, .*, .*}}
84    ; CHECK-NOT:    {{.* r4, .*, .*}}
85    ; CHECK:        rtsd
86    ; CHECK:        {{.* r3, r8, r0}}
87}
88
89define i32 @params5_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
90    ; CHECK:        params5_32bitret:
91    ret i32 %e
92    ; CHECK-NOT:    {{.* r3, .*, .*}}
93    ; CHECK-NOT:    {{.* r4, .*, .*}}
94    ; CHECK:        rtsd
95    ; CHECK:        {{.* r3, r9, r0}}
96}
97
98define i32 @params6_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f) {
99    ; CHECK:        params6_32bitret:
100    ret i32 %f
101    ; CHECK-NOT:    {{.* r3, .*, .*}}
102    ; CHECK-NOT:    {{.* r4, .*, .*}}
103    ; CHECK:        rtsd
104    ; CHECK:        {{.* r3, r10, r0}}
105}
106
107define i32 @params7_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f,
108                             i32 %g) {
109    ; CHECK:        params7_32bitret:
110    ret i32 %g
111    ; CHECK:        {{lwi? r3, r1, 32}}
112    ; CHECK-NOT:    {{.* r4, .*, .*}}
113    ; CHECK:        rtsd
114}
115
116define i32 @params8_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f,
117                             i32 %g, i32 %h) {
118    ; CHECK:        params8_32bitret:
119    ret i32 %h
120    ; CHECK:        {{lwi? r3, r1, 36}}
121    ; CHECK-NOT:    {{.* r4, .*, .*}}
122    ; CHECK:        rtsd
123}
124
125define i32 @params9_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f,
126                             i32 %g, i32 %h, i32 %i) {
127    ; CHECK:        params9_32bitret:
128    ret i32 %i
129    ; CHECK:        {{lwi? r3, r1, 40}}
130    ; CHECK-NOT:    {{.* r4, .*, .*}}
131    ; CHECK:        rtsd
132}
133
134define i32 @params10_32bitret(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f,
135                              i32 %g, i32 %h, i32 %i, i32 %j) {
136    ; CHECK:        params10_32bitret:
137    ret i32 %j
138    ; CHECK:        {{lwi? r3, r1, 44}}
139    ; CHECK-NOT:    {{.* r4, .*, .*}}
140    ; CHECK:        rtsd
141}
142
143define void @testing() {
144    %MSG.1 = getelementptr [13 x i8]* @MSG, i32 0, i32 0
145
146    call void @params0_noret()
147    ; CHECK:        brlid
148
149    %tmp.1 = call i8 @params0_8bitret()
150    ; CHECK:        brlid
151    call i32 (i8*,...)* @printf(i8* %MSG.1, i8 %tmp.1)
152
153    %tmp.2 = call i16 @params0_16bitret()
154    ; CHECK:        brlid
155    call i32 (i8*,...)* @printf(i8* %MSG.1, i16 %tmp.2)
156
157    %tmp.3 = call i32 @params0_32bitret()
158    ; CHECK:        brlid
159    call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.3)
160
161    %tmp.4 = call i64 @params0_64bitret()
162    ; CHECK:        brlid
163    call i32 (i8*,...)* @printf(i8* %MSG.1, i64 %tmp.4)
164
165    %tmp.5 = call i32 @params1_32bitret(i32 1)
166    ; CHECK:        {{.* r5, .*, .*}}
167    ; CHECK:        brlid
168    call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.5)
169
170    %tmp.6 = call i32 @params2_32bitret(i32 1, i32 2)
171    ; CHECK:        {{.* r5, .*, .*}}
172    ; CHECK:        {{.* r6, .*, .*}}
173    ; CHECK:        brlid
174    call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.6)
175
176    %tmp.7 = call i32 @params3_32bitret(i32 1, i32 2, i32 3)
177    ; CHECK:        {{.* r5, .*, .*}}
178    ; CHECK:        {{.* r6, .*, .*}}
179    ; CHECK:        {{.* r7, .*, .*}}
180    ; CHECK:        brlid
181    call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.7)
182
183    %tmp.8 = call i32 @params4_32bitret(i32 1, i32 2, i32 3, i32 4)
184    ; CHECK:        {{.* r5, .*, .*}}
185    ; CHECK:        {{.* r6, .*, .*}}
186    ; CHECK:        {{.* r7, .*, .*}}
187    ; CHECK:        {{.* r8, .*, .*}}
188    ; CHECK:        brlid
189    call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.8)
190
191    %tmp.9 = call i32 @params5_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5)
192    ; CHECK:        {{.* r5, .*, .*}}
193    ; CHECK:        {{.* r6, .*, .*}}
194    ; CHECK:        {{.* r7, .*, .*}}
195    ; CHECK:        {{.* r8, .*, .*}}
196    ; CHECK:        {{.* r9, .*, .*}}
197    ; CHECK:        brlid
198    call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.9)
199
200    %tmp.10 = call i32 @params6_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5,
201                                         i32 6)
202    ; CHECK:        {{.* r5, .*, .*}}
203    ; CHECK:        {{.* r6, .*, .*}}
204    ; CHECK:        {{.* r7, .*, .*}}
205    ; CHECK:        {{.* r8, .*, .*}}
206    ; CHECK:        {{.* r9, .*, .*}}
207    ; CHECK:        {{.* r10, .*, .*}}
208    ; CHECK:        brlid
209    call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.10)
210
211    %tmp.11 = call i32 @params7_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5,
212                                         i32 6, i32 7)
213    ; CHECK:        {{swi? .*, r1, 28}}
214    ; CHECK:        {{.* r5, .*, .*}}
215    ; CHECK:        {{.* r6, .*, .*}}
216    ; CHECK:        {{.* r7, .*, .*}}
217    ; CHECK:        {{.* r8, .*, .*}}
218    ; CHECK:        {{.* r9, .*, .*}}
219    ; CHECK:        {{.* r10, .*, .*}}
220    ; CHECK:        brlid
221    call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.11)
222
223    %tmp.12 = call i32 @params8_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5,
224                                         i32 6, i32 7, i32 8)
225    ; CHECK:        {{swi? .*, r1, 28}}
226    ; CHECK:        {{swi? .*, r1, 32}}
227    ; CHECK:        {{.* r5, .*, .*}}
228    ; CHECK:        {{.* r6, .*, .*}}
229    ; CHECK:        {{.* r7, .*, .*}}
230    ; CHECK:        {{.* r8, .*, .*}}
231    ; CHECK:        {{.* r9, .*, .*}}
232    ; CHECK:        {{.* r10, .*, .*}}
233    ; CHECK:        brlid
234    call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.12)
235
236    %tmp.13 = call i32 @params9_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5,
237                                         i32 6, i32 7, i32 8, i32 9)
238    ; CHECK:        {{swi? .*, r1, 28}}
239    ; CHECK:        {{swi? .*, r1, 32}}
240    ; CHECK:        {{swi? .*, r1, 36}}
241    ; CHECK:        {{.* r5, .*, .*}}
242    ; CHECK:        {{.* r6, .*, .*}}
243    ; CHECK:        {{.* r7, .*, .*}}
244    ; CHECK:        {{.* r8, .*, .*}}
245    ; CHECK:        {{.* r9, .*, .*}}
246    ; CHECK:        {{.* r10, .*, .*}}
247    ; CHECK:        brlid
248    call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.13)
249
250    %tmp.14 = call i32 @params10_32bitret(i32 1, i32 2, i32 3, i32 4, i32 5,
251                                          i32 6, i32 7, i32 8, i32 9, i32 10)
252    ; CHECK:        {{swi? .*, r1, 28}}
253    ; CHECK:        {{swi? .*, r1, 32}}
254    ; CHECK:        {{swi? .*, r1, 36}}
255    ; CHECK:        {{swi? .*, r1, 40}}
256    ; CHECK:        {{.* r5, .*, .*}}
257    ; CHECK:        {{.* r6, .*, .*}}
258    ; CHECK:        {{.* r7, .*, .*}}
259    ; CHECK:        {{.* r8, .*, .*}}
260    ; CHECK:        {{.* r9, .*, .*}}
261    ; CHECK:        {{.* r10, .*, .*}}
262    ; CHECK:        brlid
263    call i32 (i8*,...)* @printf(i8* %MSG.1, i32 %tmp.14)
264
265    ret void
266}
267