@@ -139,13 +139,28 @@ define void @large_caller(%twenty_bytes* byval(%twenty_bytes) align 4 %a) {
139
139
; CHECK-NEXT: sub sp, sp, #16
140
140
; CHECK-NEXT: .save {r4, lr}
141
141
; CHECK-NEXT: push {r4, lr}
142
- ; CHECK-NEXT: add r12, sp, #8
143
- ; CHECK-NEXT: add lr, sp, #24
142
+ ; CHECK-NEXT: .pad #20
143
+ ; CHECK-NEXT: sub sp, sp, #20
144
+ ; CHECK-NEXT: add r12, sp, #28
145
+ ; CHECK-NEXT: add lr, sp, #44
144
146
; CHECK-NEXT: stm r12, {r0, r1, r2, r3}
145
- ; CHECK-NEXT: add r12, sp, #8
146
- ; CHECK-NEXT: add r12, r12, #16
147
+ ; CHECK-NEXT: add r0, sp, #28
148
+ ; CHECK-NEXT: mov r1, sp
149
+ ; CHECK-NEXT: ldr r2, [r0], #4
150
+ ; CHECK-NEXT: add r12, r1, #16
151
+ ; CHECK-NEXT: str r2, [r1], #4
152
+ ; CHECK-NEXT: ldr r2, [r0], #4
153
+ ; CHECK-NEXT: str r2, [r1], #4
154
+ ; CHECK-NEXT: ldr r2, [r0], #4
155
+ ; CHECK-NEXT: str r2, [r1], #4
156
+ ; CHECK-NEXT: ldr r2, [r0], #4
157
+ ; CHECK-NEXT: str r2, [r1], #4
158
+ ; CHECK-NEXT: ldr r2, [r0], #4
159
+ ; CHECK-NEXT: str r2, [r1], #4
160
+ ; CHECK-NEXT: ldm sp, {r0, r1, r2, r3}
147
161
; CHECK-NEXT: ldr r4, [r12], #4
148
162
; CHECK-NEXT: str r4, [lr], #4
163
+ ; CHECK-NEXT: add sp, sp, #20
149
164
; CHECK-NEXT: pop {r4, lr}
150
165
; CHECK-NEXT: add sp, sp, #16
151
166
; CHECK-NEXT: b large_callee
@@ -163,17 +178,30 @@ define void @large_caller_check_regs(%twenty_bytes* byval(%twenty_bytes) align 4
163
178
; CHECK-NEXT: sub sp, sp, #16
164
179
; CHECK-NEXT: .save {r4, lr}
165
180
; CHECK-NEXT: push {r4, lr}
166
- ; CHECK-NEXT: add r12, sp, #8
167
- ; CHECK-NEXT: add lr, sp, #24
181
+ ; CHECK-NEXT: .pad #20
182
+ ; CHECK-NEXT: sub sp, sp, #20
183
+ ; CHECK-NEXT: add r12, sp, #28
184
+ ; CHECK-NEXT: add lr, sp, #44
168
185
; CHECK-NEXT: stm r12, {r0, r1, r2, r3}
169
186
; CHECK-NEXT: @APP
170
187
; CHECK-NEXT: @NO_APP
171
- ; CHECK-NEXT: add r3, sp, #8
172
- ; CHECK-NEXT: add r0, sp, #8
173
- ; CHECK-NEXT: add r12, r0, #16
174
- ; CHECK-NEXT: ldm r3, {r0, r1, r2, r3}
188
+ ; CHECK-NEXT: add r0, sp, #28
189
+ ; CHECK-NEXT: mov r1, sp
190
+ ; CHECK-NEXT: add r12, r1, #16
191
+ ; CHECK-NEXT: ldr r2, [r0], #4
192
+ ; CHECK-NEXT: str r2, [r1], #4
193
+ ; CHECK-NEXT: ldr r2, [r0], #4
194
+ ; CHECK-NEXT: str r2, [r1], #4
195
+ ; CHECK-NEXT: ldr r2, [r0], #4
196
+ ; CHECK-NEXT: str r2, [r1], #4
197
+ ; CHECK-NEXT: ldr r2, [r0], #4
198
+ ; CHECK-NEXT: str r2, [r1], #4
199
+ ; CHECK-NEXT: ldr r2, [r0], #4
200
+ ; CHECK-NEXT: str r2, [r1], #4
201
+ ; CHECK-NEXT: ldm sp, {r0, r1, r2, r3}
175
202
; CHECK-NEXT: ldr r4, [r12], #4
176
203
; CHECK-NEXT: str r4, [lr], #4
204
+ ; CHECK-NEXT: add sp, sp, #20
177
205
; CHECK-NEXT: pop {r4, lr}
178
206
; CHECK-NEXT: add sp, sp, #16
179
207
; CHECK-NEXT: b large_callee
@@ -190,30 +218,44 @@ entry:
190
218
define void @large_caller_new_value (%twenty_bytes* byval (%twenty_bytes ) align 4 %a ) {
191
219
; CHECK-LABEL: large_caller_new_value:
192
220
; CHECK: @ %bb.0: @ %entry
193
- ; CHECK-NEXT: .pad #36
194
- ; CHECK-NEXT: sub sp, sp, #36
195
- ; CHECK-NEXT: add r12, sp, #20
221
+ ; CHECK-NEXT: .pad #16
222
+ ; CHECK-NEXT: sub sp, sp, #16
223
+ ; CHECK-NEXT: .save {r4, lr}
224
+ ; CHECK-NEXT: push {r4, lr}
225
+ ; CHECK-NEXT: .pad #40
226
+ ; CHECK-NEXT: sub sp, sp, #40
227
+ ; CHECK-NEXT: add r12, sp, #48
228
+ ; CHECK-NEXT: add lr, sp, #64
196
229
; CHECK-NEXT: stm r12, {r0, r1, r2, r3}
197
230
; CHECK-NEXT: mov r0, #4
198
- ; CHECK-NEXT: add r1, sp, #36
199
- ; CHECK-NEXT: str r0, [sp, #16 ]
231
+ ; CHECK-NEXT: mov r1, sp
232
+ ; CHECK-NEXT: str r0, [sp, #36 ]
200
233
; CHECK-NEXT: mov r0, #3
201
- ; CHECK-NEXT: str r0, [sp, #12 ]
234
+ ; CHECK-NEXT: str r0, [sp, #32 ]
202
235
; CHECK-NEXT: mov r0, #2
203
- ; CHECK-NEXT: str r0, [sp, #8 ]
236
+ ; CHECK-NEXT: str r0, [sp, #28 ]
204
237
; CHECK-NEXT: mov r0, #1
205
- ; CHECK-NEXT: str r0, [sp, #4 ]
238
+ ; CHECK-NEXT: str r0, [sp, #24 ]
206
239
; CHECK-NEXT: mov r0, #0
207
- ; CHECK-NEXT: str r0, [sp]
208
- ; CHECK-NEXT: mov r0, sp
209
- ; CHECK-NEXT: add r0, r0, #16
210
- ; CHECK-NEXT: mov r3, #3
240
+ ; CHECK-NEXT: str r0, [sp, #20]
241
+ ; CHECK-NEXT: add r0, sp, #20
242
+ ; CHECK-NEXT: add r12, r1, #16
211
243
; CHECK-NEXT: ldr r2, [r0], #4
212
244
; CHECK-NEXT: str r2, [r1], #4
213
- ; CHECK-NEXT: mov r0, #0
214
- ; CHECK-NEXT: mov r1, #1
215
- ; CHECK-NEXT: mov r2, #2
216
- ; CHECK-NEXT: add sp, sp, #36
245
+ ; CHECK-NEXT: ldr r2, [r0], #4
246
+ ; CHECK-NEXT: str r2, [r1], #4
247
+ ; CHECK-NEXT: ldr r2, [r0], #4
248
+ ; CHECK-NEXT: str r2, [r1], #4
249
+ ; CHECK-NEXT: ldr r2, [r0], #4
250
+ ; CHECK-NEXT: str r2, [r1], #4
251
+ ; CHECK-NEXT: ldr r2, [r0], #4
252
+ ; CHECK-NEXT: str r2, [r1], #4
253
+ ; CHECK-NEXT: ldm sp, {r0, r1, r2, r3}
254
+ ; CHECK-NEXT: ldr r4, [r12], #4
255
+ ; CHECK-NEXT: str r4, [lr], #4
256
+ ; CHECK-NEXT: add sp, sp, #40
257
+ ; CHECK-NEXT: pop {r4, lr}
258
+ ; CHECK-NEXT: add sp, sp, #16
217
259
; CHECK-NEXT: b large_callee
218
260
entry:
219
261
%y = alloca %twenty_bytes , align 4
@@ -229,3 +271,67 @@ entry:
229
271
musttail call void @large_callee (%twenty_bytes* byval (%twenty_bytes ) align 4 %y )
230
272
ret void
231
273
}
274
+
275
+ declare void @two_byvals_callee (%twenty_bytes* byval (%twenty_bytes ) align 4 , %twenty_bytes* byval (%twenty_bytes ) align 4 )
276
+ define void @swap_byvals (%twenty_bytes* byval (%twenty_bytes ) align 4 %a , %twenty_bytes* byval (%twenty_bytes ) align 4 %b ) {
277
+ ; CHECK-LABEL: swap_byvals:
278
+ ; CHECK: @ %bb.0: @ %entry
279
+ ; CHECK-NEXT: .pad #16
280
+ ; CHECK-NEXT: sub sp, sp, #16
281
+ ; CHECK-NEXT: .save {r4, r5, r11, lr}
282
+ ; CHECK-NEXT: push {r4, r5, r11, lr}
283
+ ; CHECK-NEXT: .pad #40
284
+ ; CHECK-NEXT: sub sp, sp, #40
285
+ ; CHECK-NEXT: add r12, sp, #56
286
+ ; CHECK-NEXT: add lr, sp, #20
287
+ ; CHECK-NEXT: stm r12, {r0, r1, r2, r3}
288
+ ; CHECK-NEXT: add r0, sp, #56
289
+ ; CHECK-NEXT: mov r12, sp
290
+ ; CHECK-NEXT: ldr r1, [r0], #4
291
+ ; CHECK-NEXT: mov r2, r12
292
+ ; CHECK-NEXT: str r1, [r2], #4
293
+ ; CHECK-NEXT: add r3, sp, #20
294
+ ; CHECK-NEXT: ldr r1, [r0], #4
295
+ ; CHECK-NEXT: add r4, sp, #76
296
+ ; CHECK-NEXT: str r1, [r2], #4
297
+ ; CHECK-NEXT: ldr r1, [r0], #4
298
+ ; CHECK-NEXT: str r1, [r2], #4
299
+ ; CHECK-NEXT: ldr r1, [r0], #4
300
+ ; CHECK-NEXT: str r1, [r2], #4
301
+ ; CHECK-NEXT: ldr r1, [r0], #4
302
+ ; CHECK-NEXT: add r0, sp, #76
303
+ ; CHECK-NEXT: str r1, [r2], #4
304
+ ; CHECK-NEXT: mov r2, lr
305
+ ; CHECK-NEXT: ldr r1, [r0], #4
306
+ ; CHECK-NEXT: str r1, [r2], #4
307
+ ; CHECK-NEXT: ldr r1, [r0], #4
308
+ ; CHECK-NEXT: str r1, [r2], #4
309
+ ; CHECK-NEXT: ldr r1, [r0], #4
310
+ ; CHECK-NEXT: str r1, [r2], #4
311
+ ; CHECK-NEXT: ldr r1, [r0], #4
312
+ ; CHECK-NEXT: str r1, [r2], #4
313
+ ; CHECK-NEXT: ldr r1, [r0], #4
314
+ ; CHECK-NEXT: str r1, [r2], #4
315
+ ; CHECK-NEXT: ldm r3, {r0, r1, r2, r3}
316
+ ; CHECK-NEXT: ldr r5, [r12], #4
317
+ ; CHECK-NEXT: str r5, [r4], #4
318
+ ; CHECK-NEXT: ldr r5, [r12], #4
319
+ ; CHECK-NEXT: str r5, [r4], #4
320
+ ; CHECK-NEXT: ldr r5, [r12], #4
321
+ ; CHECK-NEXT: str r5, [r4], #4
322
+ ; CHECK-NEXT: ldr r5, [r12], #4
323
+ ; CHECK-NEXT: str r5, [r4], #4
324
+ ; CHECK-NEXT: ldr r5, [r12], #4
325
+ ; CHECK-NEXT: str r5, [r4], #4
326
+ ; CHECK-NEXT: add r5, lr, #16
327
+ ; CHECK-NEXT: add r12, sp, #72
328
+ ; CHECK-NEXT: ldr r4, [r5], #4
329
+ ; CHECK-NEXT: str r4, [r12], #4
330
+ ; CHECK-NEXT: add sp, sp, #40
331
+ ; CHECK-NEXT: pop {r4, r5, r11, lr}
332
+ ; CHECK-NEXT: add sp, sp, #16
333
+ ; CHECK-NEXT: b two_byvals_callee
334
+ entry:
335
+ musttail call void @two_byvals_callee (%twenty_bytes* byval (%twenty_bytes ) align 4 %b , %twenty_bytes* byval (%twenty_bytes ) align 4 %a )
336
+ ret void
337
+ }
0 commit comments