xref: /llvm-project/llvm/test/CodeGen/PowerPC/elf64-byval-cc.ll (revision 53c37f300dd1b450671f2aee4cc649c380adb5ad)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs < %s | FileCheck %s
3
4target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
5target triple = "powerpc64le-unknown-linux-gnu"
6
7%struct_S1 = type { [1 x i8] }
8@gS1 = external global %struct_S1, align 1
9
10define void @call_test_byval_mem1() #0 {
11; CHECK-LABEL: call_test_byval_mem1:
12; CHECK:       # %bb.0: # %entry
13; CHECK-NEXT:    mflr 0
14; CHECK-NEXT:    stdu 1, -32(1)
15; CHECK-NEXT:    std 0, 48(1)
16; CHECK-NEXT:    .cfi_def_cfa_offset 32
17; CHECK-NEXT:    .cfi_offset lr, 16
18; CHECK-NEXT:    addis 3, 2, .LC0@toc@ha
19; CHECK-NEXT:    ld 3, .LC0@toc@l(3)
20; CHECK-NEXT:    lbz 3, 0(3)
21; CHECK-NEXT:    bl test_byval_mem1
22; CHECK-NEXT:    nop
23; CHECK-NEXT:    addi 1, 1, 32
24; CHECK-NEXT:    ld 0, 16(1)
25; CHECK-NEXT:    mtlr 0
26; CHECK-NEXT:    blr
27entry:
28  %call = call zeroext i8 @test_byval_mem1(ptr byval(%struct_S1) align 1 @gS1)
29  ret void
30}
31
32define zeroext i8 @test_byval_mem1(ptr byval(%struct_S1) align 1 %s) {
33; CHECK-LABEL: test_byval_mem1:
34; CHECK:       # %bb.0: # %entry
35; CHECK-NEXT:    stb 3, -8(1)
36; CHECK-NEXT:    clrldi 3, 3, 56
37; CHECK-NEXT:    blr
38entry:
39  %0 = load i8, ptr %s, align 1
40  ret i8 %0
41}
42
43define void @call_test_byval_mem1_2() #0 {
44; CHECK-LABEL: call_test_byval_mem1_2:
45; CHECK:       # %bb.0: # %entry
46; CHECK-NEXT:    mflr 0
47; CHECK-NEXT:    stdu 1, -112(1)
48; CHECK-NEXT:    std 0, 128(1)
49; CHECK-NEXT:    .cfi_def_cfa_offset 112
50; CHECK-NEXT:    .cfi_offset lr, 16
51; CHECK-NEXT:    addis 3, 2, .LC0@toc@ha
52; CHECK-NEXT:    li 4, 1
53; CHECK-NEXT:    li 5, 2
54; CHECK-NEXT:    li 6, 3
55; CHECK-NEXT:    li 7, 4
56; CHECK-NEXT:    li 8, 5
57; CHECK-NEXT:    li 9, 6
58; CHECK-NEXT:    li 10, 7
59; CHECK-NEXT:    ld 3, .LC0@toc@l(3)
60; CHECK-NEXT:    lbz 3, 0(3)
61; CHECK-NEXT:    stb 3, 96(1)
62; CHECK-NEXT:    li 3, 0
63; CHECK-NEXT:    bl test_byval_mem1_2
64; CHECK-NEXT:    nop
65; CHECK-NEXT:    addi 1, 1, 112
66; CHECK-NEXT:    ld 0, 16(1)
67; CHECK-NEXT:    mtlr 0
68; CHECK-NEXT:    blr
69entry:
70  %call = call zeroext i8 @test_byval_mem1_2(i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, ptr byval(%struct_S1) align 1 @gS1)
71  ret void
72}
73
74define zeroext i8 @test_byval_mem1_2(i64 %v1, i64 %v2, i64 %v3, i64 %v4, i64 %v5, i64 %v6, i64 %v7, i64 %v8, ptr byval(%struct_S1) align 1 %s) {
75; CHECK-LABEL: test_byval_mem1_2:
76; CHECK:       # %bb.0: # %entry
77; CHECK-NEXT:    lbz 3, 96(1)
78; CHECK-NEXT:    blr
79entry:
80  %0 = load i8, ptr %s, align 1
81  ret i8 %0
82}
83
84define void @call_test_byval_mem1_3() #0 {
85; CHECK-LABEL: call_test_byval_mem1_3:
86; CHECK:       # %bb.0: # %entry
87; CHECK-NEXT:    mflr 0
88; CHECK-NEXT:    stdu 1, -32(1)
89; CHECK-NEXT:    std 0, 48(1)
90; CHECK-NEXT:    .cfi_def_cfa_offset 32
91; CHECK-NEXT:    .cfi_offset lr, 16
92; CHECK-NEXT:    addis 3, 2, .LC0@toc@ha
93; CHECK-NEXT:    li 4, 1
94; CHECK-NEXT:    li 5, 2
95; CHECK-NEXT:    li 6, 3
96; CHECK-NEXT:    li 7, 4
97; CHECK-NEXT:    li 8, 5
98; CHECK-NEXT:    li 9, 6
99; CHECK-NEXT:    ld 3, .LC0@toc@l(3)
100; CHECK-NEXT:    lbz 10, 0(3)
101; CHECK-NEXT:    li 3, 0
102; CHECK-NEXT:    bl test_byval_mem1_3
103; CHECK-NEXT:    nop
104; CHECK-NEXT:    addi 1, 1, 32
105; CHECK-NEXT:    ld 0, 16(1)
106; CHECK-NEXT:    mtlr 0
107; CHECK-NEXT:    blr
108entry:
109  %call = call zeroext i8 @test_byval_mem1_3(i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, ptr byval(%struct_S1) align 1 @gS1)
110  ret void
111}
112
113define zeroext i8 @test_byval_mem1_3(i64 %v1, i64 %v2, i64 %v3, i64 %v4, i64 %v5, i64 %v6, i64 %v7, ptr byval(%struct_S1) align 1 %s) {
114; CHECK-LABEL: test_byval_mem1_3:
115; CHECK:       # %bb.0: # %entry
116; CHECK-NEXT:    clrldi 3, 10, 56
117; CHECK-NEXT:    stb 10, -8(1)
118; CHECK-NEXT:    blr
119entry:
120  %0 = load i8, ptr %s, align 1
121  ret i8 %0
122}
123
124define void @call_test_byval_mem1_4() #0 {
125; CHECK-LABEL: call_test_byval_mem1_4:
126; CHECK:       # %bb.0: # %entry
127; CHECK-NEXT:    mflr 0
128; CHECK-NEXT:    stdu 1, -112(1)
129; CHECK-NEXT:    std 0, 128(1)
130; CHECK-NEXT:    .cfi_def_cfa_offset 112
131; CHECK-NEXT:    .cfi_offset lr, 16
132; CHECK-NEXT:    li 3, 7
133; CHECK-NEXT:    li 4, 1
134; CHECK-NEXT:    li 5, 2
135; CHECK-NEXT:    li 7, 3
136; CHECK-NEXT:    li 8, 4
137; CHECK-NEXT:    li 9, 5
138; CHECK-NEXT:    li 10, 6
139; CHECK-NEXT:    std 3, 96(1)
140; CHECK-NEXT:    addis 3, 2, .LC0@toc@ha
141; CHECK-NEXT:    ld 3, .LC0@toc@l(3)
142; CHECK-NEXT:    lbz 6, 0(3)
143; CHECK-NEXT:    li 3, 0
144; CHECK-NEXT:    bl test_byval_mem1_4
145; CHECK-NEXT:    nop
146; CHECK-NEXT:    addi 1, 1, 112
147; CHECK-NEXT:    ld 0, 16(1)
148; CHECK-NEXT:    mtlr 0
149; CHECK-NEXT:    blr
150entry:
151  %call = call zeroext i8 @test_byval_mem1_4(i64 0, i64 1, i64 2, ptr byval(%struct_S1) align 1 @gS1, i64 3, i64 4, i64 5, i64 6, i64 7)
152  ret void
153}
154
155define zeroext i8 @test_byval_mem1_4(i64 %v1, i64 %v2, i64 %v3, ptr byval(%struct_S1) align 1 %s, i64 %v4, i64 %v5, i64 %v6, i64 %v7, i64 %v8) {
156; CHECK-LABEL: test_byval_mem1_4:
157; CHECK:       # %bb.0: # %entry
158; CHECK-NEXT:    clrldi 3, 6, 56
159; CHECK-NEXT:    stb 6, 56(1)
160; CHECK-NEXT:    blr
161entry:
162  %0 = load i8, ptr %s, align 1
163  ret i8 %0
164}
165
166define void @call_test_byval_mem1_5() #0 {
167; CHECK-LABEL: call_test_byval_mem1_5:
168; CHECK:       # %bb.0: # %entry
169; CHECK-NEXT:    mflr 0
170; CHECK-NEXT:    stdu 1, -32(1)
171; CHECK-NEXT:    std 0, 48(1)
172; CHECK-NEXT:    .cfi_def_cfa_offset 32
173; CHECK-NEXT:    .cfi_offset lr, 16
174; CHECK-NEXT:    addis 3, 2, .LC0@toc@ha
175; CHECK-NEXT:    li 4, 1
176; CHECK-NEXT:    li 5, 2
177; CHECK-NEXT:    li 7, 3
178; CHECK-NEXT:    li 8, 4
179; CHECK-NEXT:    li 9, 5
180; CHECK-NEXT:    li 10, 6
181; CHECK-NEXT:    ld 3, .LC0@toc@l(3)
182; CHECK-NEXT:    lbz 6, 0(3)
183; CHECK-NEXT:    li 3, 0
184; CHECK-NEXT:    bl test_byval_mem1_5
185; CHECK-NEXT:    nop
186; CHECK-NEXT:    addi 1, 1, 32
187; CHECK-NEXT:    ld 0, 16(1)
188; CHECK-NEXT:    mtlr 0
189; CHECK-NEXT:    blr
190entry:
191  %call = call zeroext i8 @test_byval_mem1_5(i64 0, i64 1, i64 2, ptr byval(%struct_S1) align 1 @gS1, i64 3, i64 4, i64 5, i64 6)
192  ret void
193}
194
195define zeroext i8 @test_byval_mem1_5(i64 %v1, i64 %v2, i64 %v3, ptr byval(%struct_S1) align 1 %s, i64 %v4, i64 %v5, i64 %v6, i64 %v7) {
196; CHECK-LABEL: test_byval_mem1_5:
197; CHECK:       # %bb.0: # %entry
198; CHECK-NEXT:    clrldi 3, 6, 56
199; CHECK-NEXT:    stb 6, -8(1)
200; CHECK-NEXT:    blr
201entry:
202  %0 = load i8, ptr %s, align 1
203  ret i8 %0
204}
205
206%struct_S2 = type { [2 x i8] }
207@gS2 = external global %struct_S2, align 1
208
209define void @call_test_byval_mem2() #0 {
210; CHECK-LABEL: call_test_byval_mem2:
211; CHECK:       # %bb.0: # %entry
212; CHECK-NEXT:    mflr 0
213; CHECK-NEXT:    stdu 1, -32(1)
214; CHECK-NEXT:    std 0, 48(1)
215; CHECK-NEXT:    .cfi_def_cfa_offset 32
216; CHECK-NEXT:    .cfi_offset lr, 16
217; CHECK-NEXT:    addis 3, 2, .LC1@toc@ha
218; CHECK-NEXT:    ld 3, .LC1@toc@l(3)
219; CHECK-NEXT:    lhz 3, 0(3)
220; CHECK-NEXT:    bl test_byval_mem2
221; CHECK-NEXT:    nop
222; CHECK-NEXT:    addi 1, 1, 32
223; CHECK-NEXT:    ld 0, 16(1)
224; CHECK-NEXT:    mtlr 0
225; CHECK-NEXT:    blr
226entry:
227  %call = call zeroext i8 @test_byval_mem2(ptr byval(%struct_S2) align 1 @gS2)
228  ret void
229}
230
231define zeroext i8 @test_byval_mem2(ptr byval(%struct_S2) align 1 %s) {
232; CHECK-LABEL: test_byval_mem2:
233; CHECK:       # %bb.0: # %entry
234; CHECK-NEXT:    sth 3, -8(1)
235; CHECK-NEXT:    lbz 3, -8(1)
236; CHECK-NEXT:    blr
237entry:
238  %0 = load i8, ptr %s, align 1
239  ret i8 %0
240}
241
242%struct_S3 = type { [3 x i8] }
243@gS3 = external global %struct_S3, align 1
244
245define void @call_test_byval_mem3() #0 {
246; CHECK-LABEL: call_test_byval_mem3:
247; CHECK:       # %bb.0: # %entry
248; CHECK-NEXT:    mflr 0
249; CHECK-NEXT:    stdu 1, -32(1)
250; CHECK-NEXT:    std 0, 48(1)
251; CHECK-NEXT:    .cfi_def_cfa_offset 32
252; CHECK-NEXT:    .cfi_offset lr, 16
253; CHECK-NEXT:    addis 3, 2, .LC2@toc@ha
254; CHECK-NEXT:    ld 3, .LC2@toc@l(3)
255; CHECK-NEXT:    lbz 4, 2(3)
256; CHECK-NEXT:    stb 4, 34(1)
257; CHECK-NEXT:    lhz 3, 0(3)
258; CHECK-NEXT:    sth 3, 32(1)
259; CHECK-NEXT:    ld 3, 32(1)
260; CHECK-NEXT:    bl test_byval_mem3
261; CHECK-NEXT:    nop
262; CHECK-NEXT:    addi 1, 1, 32
263; CHECK-NEXT:    ld 0, 16(1)
264; CHECK-NEXT:    mtlr 0
265; CHECK-NEXT:    blr
266entry:
267  %call = call zeroext i8 @test_byval_mem3(ptr byval(%struct_S3) align 1 @gS3)
268  ret void
269}
270
271define zeroext i8 @test_byval_mem3(ptr byval(%struct_S3) align 1 %s) {
272; CHECK-LABEL: test_byval_mem3:
273; CHECK:       # %bb.0: # %entry
274; CHECK-NEXT:    sth 3, -8(1)
275; CHECK-NEXT:    rldicl 3, 3, 48, 16
276; CHECK-NEXT:    stb 3, -6(1)
277; CHECK-NEXT:    lbz 3, -8(1)
278; CHECK-NEXT:    blr
279entry:
280  %0 = load i8, ptr %s, align 1
281  ret i8 %0
282}
283
284%struct_S4 = type { [4 x i8] }
285@gS4 = external global %struct_S4, align 1
286
287define void @call_test_byval_mem4() #0 {
288; CHECK-LABEL: call_test_byval_mem4:
289; CHECK:       # %bb.0: # %entry
290; CHECK-NEXT:    mflr 0
291; CHECK-NEXT:    stdu 1, -32(1)
292; CHECK-NEXT:    std 0, 48(1)
293; CHECK-NEXT:    .cfi_def_cfa_offset 32
294; CHECK-NEXT:    .cfi_offset lr, 16
295; CHECK-NEXT:    addis 3, 2, .LC3@toc@ha
296; CHECK-NEXT:    ld 3, .LC3@toc@l(3)
297; CHECK-NEXT:    lwz 3, 0(3)
298; CHECK-NEXT:    bl test_byval_mem4
299; CHECK-NEXT:    nop
300; CHECK-NEXT:    addi 1, 1, 32
301; CHECK-NEXT:    ld 0, 16(1)
302; CHECK-NEXT:    mtlr 0
303; CHECK-NEXT:    blr
304entry:
305  %call = call zeroext i8 @test_byval_mem4(ptr byval(%struct_S4) align 1 @gS4)
306  ret void
307}
308
309define zeroext i8 @test_byval_mem4(ptr byval(%struct_S4) align 1 %s) {
310; CHECK-LABEL: test_byval_mem4:
311; CHECK:       # %bb.0: # %entry
312; CHECK-NEXT:    stw 3, -8(1)
313; CHECK-NEXT:    lbz 3, -8(1)
314; CHECK-NEXT:    blr
315entry:
316  %0 = load i8, ptr %s, align 1
317  ret i8 %0
318}
319
320%struct_S8 = type { [8 x i8] }
321@gS8 = external global %struct_S8, align 1
322
323define void @call_test_byval_mem8() #0 {
324; CHECK-LABEL: call_test_byval_mem8:
325; CHECK:       # %bb.0: # %entry
326; CHECK-NEXT:    mflr 0
327; CHECK-NEXT:    stdu 1, -32(1)
328; CHECK-NEXT:    std 0, 48(1)
329; CHECK-NEXT:    .cfi_def_cfa_offset 32
330; CHECK-NEXT:    .cfi_offset lr, 16
331; CHECK-NEXT:    addis 3, 2, .LC4@toc@ha
332; CHECK-NEXT:    ld 3, .LC4@toc@l(3)
333; CHECK-NEXT:    ld 3, 0(3)
334; CHECK-NEXT:    bl test_byval_mem8
335; CHECK-NEXT:    nop
336; CHECK-NEXT:    addi 1, 1, 32
337; CHECK-NEXT:    ld 0, 16(1)
338; CHECK-NEXT:    mtlr 0
339; CHECK-NEXT:    blr
340entry:
341  %call = call zeroext i8 @test_byval_mem8(ptr byval(%struct_S8) align 1 @gS8)
342  ret void
343}
344
345define zeroext i8 @test_byval_mem8(ptr byval(%struct_S8) align 1 %s) {
346; CHECK-LABEL: test_byval_mem8:
347; CHECK:       # %bb.0: # %entry
348; CHECK-NEXT:    std 3, -8(1)
349; CHECK-NEXT:    clrldi 3, 3, 56
350; CHECK-NEXT:    blr
351entry:
352  %0 = load i8, ptr %s, align 1
353  ret i8 %0
354}
355
356%struct_S32 = type {[32 x i8] }
357@gS32 = external global %struct_S32, align 1
358
359define void @call_test_byval_mem32() #0 {
360; CHECK-LABEL: call_test_byval_mem32:
361; CHECK:       # %bb.0: # %entry
362; CHECK-NEXT:    mflr 0
363; CHECK-NEXT:    stdu 1, -32(1)
364; CHECK-NEXT:    std 0, 48(1)
365; CHECK-NEXT:    .cfi_def_cfa_offset 32
366; CHECK-NEXT:    .cfi_offset lr, 16
367; CHECK-NEXT:    addis 3, 2, .LC5@toc@ha
368; CHECK-NEXT:    ld 3, .LC5@toc@l(3)
369; CHECK-NEXT:    ld 6, 24(3)
370; CHECK-NEXT:    ld 5, 16(3)
371; CHECK-NEXT:    ld 4, 8(3)
372; CHECK-NEXT:    ld 3, 0(3)
373; CHECK-NEXT:    bl test_byval_mem32
374; CHECK-NEXT:    nop
375; CHECK-NEXT:    addi 1, 1, 32
376; CHECK-NEXT:    ld 0, 16(1)
377; CHECK-NEXT:    mtlr 0
378; CHECK-NEXT:    blr
379entry:
380  %call = call zeroext i8 @test_byval_mem32(ptr byval(%struct_S32) align 1 @gS32)
381  ret void
382}
383
384define zeroext i8 @test_byval_mem32(ptr byval(%struct_S32) align 1 %s) {
385; CHECK-LABEL: test_byval_mem32:
386; CHECK:       # %bb.0: # %entry
387; CHECK-NEXT:    std 3, -32(1)
388; CHECK-NEXT:    clrldi 3, 3, 56
389; CHECK-NEXT:    std 4, -24(1)
390; CHECK-NEXT:    std 5, -16(1)
391; CHECK-NEXT:    std 6, -8(1)
392; CHECK-NEXT:    blr
393entry:
394  %0 = load i8, ptr %s, align 1
395  ret i8 %0
396}
397
398define void @call_test_byval_mem32_2() #0 {
399; CHECK-LABEL: call_test_byval_mem32_2:
400; CHECK:       # %bb.0: # %entry
401; CHECK-NEXT:    mflr 0
402; CHECK-NEXT:    stdu 1, -32(1)
403; CHECK-NEXT:    std 0, 48(1)
404; CHECK-NEXT:    .cfi_def_cfa_offset 32
405; CHECK-NEXT:    .cfi_offset lr, 16
406; CHECK-NEXT:    vspltisw 2, 1
407; CHECK-NEXT:    addis 3, 2, .LC5@toc@ha
408; CHECK-NEXT:    ld 3, .LC5@toc@l(3)
409; CHECK-NEXT:    xvcvsxwdp 1, 34
410; CHECK-NEXT:    ld 7, 24(3)
411; CHECK-NEXT:    ld 6, 16(3)
412; CHECK-NEXT:    ld 5, 8(3)
413; CHECK-NEXT:    ld 4, 0(3)
414; CHECK-NEXT:    bl test_byval_mem32_2
415; CHECK-NEXT:    nop
416; CHECK-NEXT:    addi 1, 1, 32
417; CHECK-NEXT:    ld 0, 16(1)
418; CHECK-NEXT:    mtlr 0
419; CHECK-NEXT:    blr
420entry:
421  %call = call zeroext i8 @test_byval_mem32_2(float 1.0, ptr byval(%struct_S32) align 1 @gS32)
422  ret void
423}
424
425define zeroext i8 @test_byval_mem32_2(float %f, ptr byval(%struct_S32) align 1 %s) {
426; CHECK-LABEL: test_byval_mem32_2:
427; CHECK:       # %bb.0: # %entry
428; CHECK-NEXT:    clrldi 3, 4, 56
429; CHECK-NEXT:    std 4, -32(1)
430; CHECK-NEXT:    std 5, -24(1)
431; CHECK-NEXT:    std 6, -16(1)
432; CHECK-NEXT:    std 7, -8(1)
433; CHECK-NEXT:    blr
434entry:
435  %0 = load i8, ptr %s, align 1
436  ret i8 %0
437}
438
439define void @call_test_byval_mem32_3() #0 {
440; CHECK-LABEL: call_test_byval_mem32_3:
441; CHECK:       # %bb.0: # %entry
442; CHECK-NEXT:    mflr 0
443; CHECK-NEXT:    stdu 1, -112(1)
444; CHECK-NEXT:    std 0, 128(1)
445; CHECK-NEXT:    .cfi_def_cfa_offset 112
446; CHECK-NEXT:    .cfi_offset lr, 16
447; CHECK-NEXT:    addis 3, 2, .LC5@toc@ha
448; CHECK-NEXT:    li 4, 16
449; CHECK-NEXT:    vspltisw 2, 1
450; CHECK-NEXT:    vspltisw 3, 4
451; CHECK-NEXT:    li 5, 3
452; CHECK-NEXT:    li 7, 2
453; CHECK-NEXT:    ld 3, .LC5@toc@l(3)
454; CHECK-NEXT:    xvcvsxwdp 1, 34
455; CHECK-NEXT:    xvcvsxwdp 2, 35
456; CHECK-NEXT:    lxvd2x 0, 3, 4
457; CHECK-NEXT:    li 4, 88
458; CHECK-NEXT:    stxvd2x 0, 1, 4
459; CHECK-NEXT:    li 4, 72
460; CHECK-NEXT:    lxvd2x 0, 0, 3
461; CHECK-NEXT:    stxvd2x 0, 1, 4
462; CHECK-NEXT:    ld 10, 16(3)
463; CHECK-NEXT:    ld 9, 8(3)
464; CHECK-NEXT:    ld 8, 0(3)
465; CHECK-NEXT:    li 3, 1
466; CHECK-NEXT:    bl test_byval_mem32_3
467; CHECK-NEXT:    nop
468; CHECK-NEXT:    addi 1, 1, 112
469; CHECK-NEXT:    ld 0, 16(1)
470; CHECK-NEXT:    mtlr 0
471; CHECK-NEXT:    blr
472entry:
473  %call = call zeroext i8 @test_byval_mem32_3(i64 1, float 1.0, i64 3, double 4.0, i32 2, ptr byval(%struct_S32) align 1 @gS32)
474  ret void
475}
476
477define zeroext i8 @test_byval_mem32_3(i64 %i1, float %f, i64 %i2, double %d, i32 %i3, ptr byval(%struct_S32) align 1 %s) {
478; CHECK-LABEL: test_byval_mem32_3:
479; CHECK:       # %bb.0: # %entry
480; CHECK-NEXT:    clrldi 3, 8, 56
481; CHECK-NEXT:    std 8, 72(1)
482; CHECK-NEXT:    std 9, 80(1)
483; CHECK-NEXT:    std 10, 88(1)
484; CHECK-NEXT:    blr
485entry:
486  %0 = load i8, ptr %s, align 1
487  ret i8 %0
488}
489
490%struct_S64 = type {[64 x i8] }
491@gS64= external global %struct_S64, align 1
492
493define void @call_test_byval_mem64() #0 {
494; CHECK-LABEL: call_test_byval_mem64:
495; CHECK:       # %bb.0: # %entry
496; CHECK-NEXT:    mflr 0
497; CHECK-NEXT:    stdu 1, -32(1)
498; CHECK-NEXT:    std 0, 48(1)
499; CHECK-NEXT:    .cfi_def_cfa_offset 32
500; CHECK-NEXT:    .cfi_offset lr, 16
501; CHECK-NEXT:    addis 3, 2, .LC6@toc@ha
502; CHECK-NEXT:    ld 3, .LC6@toc@l(3)
503; CHECK-NEXT:    ld 10, 56(3)
504; CHECK-NEXT:    ld 9, 48(3)
505; CHECK-NEXT:    ld 8, 40(3)
506; CHECK-NEXT:    ld 7, 32(3)
507; CHECK-NEXT:    ld 6, 24(3)
508; CHECK-NEXT:    ld 5, 16(3)
509; CHECK-NEXT:    ld 4, 8(3)
510; CHECK-NEXT:    ld 3, 0(3)
511; CHECK-NEXT:    bl test_byval_mem64
512; CHECK-NEXT:    nop
513; CHECK-NEXT:    addi 1, 1, 32
514; CHECK-NEXT:    ld 0, 16(1)
515; CHECK-NEXT:    mtlr 0
516; CHECK-NEXT:    blr
517entry:
518  %call = call zeroext i8 @test_byval_mem64(ptr byval(%struct_S64) align 1 @gS64)
519  ret void
520}
521
522define zeroext i8 @test_byval_mem64(ptr byval(%struct_S64) align 1 %s) {
523; CHECK-LABEL: test_byval_mem64:
524; CHECK:       # %bb.0: # %entry
525; CHECK-NEXT:    std 3, -64(1)
526; CHECK-NEXT:    clrldi 3, 3, 56
527; CHECK-NEXT:    std 4, -56(1)
528; CHECK-NEXT:    std 5, -48(1)
529; CHECK-NEXT:    std 6, -40(1)
530; CHECK-NEXT:    std 7, -32(1)
531; CHECK-NEXT:    std 8, -24(1)
532; CHECK-NEXT:    std 9, -16(1)
533; CHECK-NEXT:    std 10, -8(1)
534; CHECK-NEXT:    blr
535entry:
536  %0 = load i8, ptr %s, align 1
537  ret i8 %0
538}
539
540%struct_S65 = type { [65 x i8] }
541@gS65 = external global %struct_S65, align 1
542
543define void @call_test_byval_mem65() #0 {
544; CHECK-LABEL: call_test_byval_mem65:
545; CHECK:       # %bb.0: # %entry
546; CHECK-NEXT:    mflr 0
547; CHECK-NEXT:    stdu 1, -112(1)
548; CHECK-NEXT:    std 0, 128(1)
549; CHECK-NEXT:    .cfi_def_cfa_offset 112
550; CHECK-NEXT:    .cfi_offset lr, 16
551; CHECK-NEXT:    addis 3, 2, .LC7@toc@ha
552; CHECK-NEXT:    li 4, 48
553; CHECK-NEXT:    li 5, 80
554; CHECK-NEXT:    li 6, 64
555; CHECK-NEXT:    ld 3, .LC7@toc@l(3)
556; CHECK-NEXT:    lxvd2x 0, 3, 4
557; CHECK-NEXT:    stxvd2x 0, 1, 5
558; CHECK-NEXT:    li 5, 32
559; CHECK-NEXT:    lxvd2x 0, 3, 5
560; CHECK-NEXT:    stxvd2x 0, 1, 6
561; CHECK-NEXT:    li 6, 16
562; CHECK-NEXT:    lxvd2x 0, 3, 6
563; CHECK-NEXT:    stxvd2x 0, 1, 4
564; CHECK-NEXT:    lxvd2x 0, 0, 3
565; CHECK-NEXT:    stxvd2x 0, 1, 5
566; CHECK-NEXT:    lbz 4, 64(3)
567; CHECK-NEXT:    stb 4, 96(1)
568; CHECK-NEXT:    ld 10, 56(3)
569; CHECK-NEXT:    ld 9, 48(3)
570; CHECK-NEXT:    ld 8, 40(3)
571; CHECK-NEXT:    ld 7, 32(3)
572; CHECK-NEXT:    ld 6, 24(3)
573; CHECK-NEXT:    ld 5, 16(3)
574; CHECK-NEXT:    ld 4, 8(3)
575; CHECK-NEXT:    ld 3, 0(3)
576; CHECK-NEXT:    bl test_byval_mem65
577; CHECK-NEXT:    nop
578; CHECK-NEXT:    addi 1, 1, 112
579; CHECK-NEXT:    ld 0, 16(1)
580; CHECK-NEXT:    mtlr 0
581; CHECK-NEXT:    blr
582entry:
583  %call = call zeroext i8 @test_byval_mem65(ptr byval(%struct_S65) align 1 @gS65)
584  ret void
585}
586
587define zeroext i8 @test_byval_mem65(ptr byval(%struct_S65) align 1 %s) {
588; CHECK-LABEL: test_byval_mem65:
589; CHECK:       # %bb.0: # %entry
590; CHECK-NEXT:    std 3, 32(1)
591; CHECK-NEXT:    clrldi 3, 3, 56
592; CHECK-NEXT:    std 4, 40(1)
593; CHECK-NEXT:    std 5, 48(1)
594; CHECK-NEXT:    std 6, 56(1)
595; CHECK-NEXT:    std 7, 64(1)
596; CHECK-NEXT:    std 8, 72(1)
597; CHECK-NEXT:    std 9, 80(1)
598; CHECK-NEXT:    std 10, 88(1)
599; CHECK-NEXT:    blr
600entry:
601  %0 = load i8, ptr %s, align 1
602  ret i8 %0
603}
604