xref: /llvm-project/llvm/test/CodeGen/X86/byval2.ll (revision 2f448bf509432c1a19ec46ab8cbc7353c03c6280)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-linux -mattr=-avx | FileCheck %s -check-prefix=X64
3; Win64 has not supported byval yet.
4; RUN: llc < %s -mtriple=i686-- -mattr=-avx | FileCheck %s -check-prefix=X86
5
6%struct.s = type { i64, i64, i64, i64, i64, i64, i64, i64,
7                   i64, i64, i64, i64, i64, i64, i64, i64,
8                   i64 }
9
10define void @g(i64 %a, i64 %b, i64 %c) nounwind {
11; X64-LABEL: g:
12; X64:       # %bb.0: # %entry
13; X64-NEXT:    pushq %rbx
14; X64-NEXT:    subq $288, %rsp # imm = 0x120
15; X64-NEXT:    movq %rdi, {{[0-9]+}}(%rsp)
16; X64-NEXT:    movq %rsi, {{[0-9]+}}(%rsp)
17; X64-NEXT:    movq %rdx, {{[0-9]+}}(%rsp)
18; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rbx
19; X64-NEXT:    movl $17, %ecx
20; X64-NEXT:    movq %rsp, %rdi
21; X64-NEXT:    movq %rbx, %rsi
22; X64-NEXT:    rep;movsq (%rsi), %es:(%rdi)
23; X64-NEXT:    callq f@PLT
24; X64-NEXT:    movl $17, %ecx
25; X64-NEXT:    movq %rsp, %rdi
26; X64-NEXT:    movq %rbx, %rsi
27; X64-NEXT:    rep;movsq (%rsi), %es:(%rdi)
28; X64-NEXT:    callq f@PLT
29; X64-NEXT:    addq $288, %rsp # imm = 0x120
30; X64-NEXT:    popq %rbx
31; X64-NEXT:    retq
32;
33; X86-LABEL: g:
34; X86:       # %bb.0: # %entry
35; X86-NEXT:    pushl %ebp
36; X86-NEXT:    movl %esp, %ebp
37; X86-NEXT:    pushl %ebx
38; X86-NEXT:    pushl %edi
39; X86-NEXT:    pushl %esi
40; X86-NEXT:    andl $-16, %esp
41; X86-NEXT:    subl $288, %esp # imm = 0x120
42; X86-NEXT:    movl 12(%ebp), %eax
43; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)
44; X86-NEXT:    movl 8(%ebp), %eax
45; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)
46; X86-NEXT:    movl 20(%ebp), %eax
47; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)
48; X86-NEXT:    movl 16(%ebp), %eax
49; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)
50; X86-NEXT:    movl 28(%ebp), %eax
51; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)
52; X86-NEXT:    movl 24(%ebp), %eax
53; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)
54; X86-NEXT:    leal {{[0-9]+}}(%esp), %ebx
55; X86-NEXT:    movl $34, %ecx
56; X86-NEXT:    movl %esp, %edi
57; X86-NEXT:    movl %ebx, %esi
58; X86-NEXT:    rep;movsl (%esi), %es:(%edi)
59; X86-NEXT:    calll f@PLT
60; X86-NEXT:    movl $34, %ecx
61; X86-NEXT:    movl %esp, %edi
62; X86-NEXT:    movl %ebx, %esi
63; X86-NEXT:    rep;movsl (%esi), %es:(%edi)
64; X86-NEXT:    calll f@PLT
65; X86-NEXT:    leal -12(%ebp), %esp
66; X86-NEXT:    popl %esi
67; X86-NEXT:    popl %edi
68; X86-NEXT:    popl %ebx
69; X86-NEXT:    popl %ebp
70; X86-NEXT:    retl
71entry:
72	%d = alloca %struct.s, align 16
73	store i64 %a, ptr %d, align 16
74	%tmp2 = getelementptr %struct.s, ptr %d, i32 0, i32 1
75	store i64 %b, ptr %tmp2, align 16
76	%tmp4 = getelementptr %struct.s, ptr %d, i32 0, i32 2
77	store i64 %c, ptr %tmp4, align 16
78	call void @f(ptr byval(%struct.s) %d)
79	call void @f(ptr byval(%struct.s) %d)
80	ret void
81}
82
83declare void @f(ptr byval(%struct.s))
84