@@ -27,6 +27,7 @@ define void @caller1(ptr %a) {
2727; CHECK-NEXT: .cfi_offset %r13, -32
2828; CHECK-NEXT: .cfi_offset %r14, -24
2929; CHECK-NEXT: .cfi_offset %r15, -16
30+ ; CHECK-NEXT: movq %rdi, %r12
3031; CHECK-NEXT: callq callee@PLT
3132; CHECK-NEXT: popq %rbx
3233; CHECK-NEXT: .cfi_def_cfa_offset 40
@@ -61,17 +62,17 @@ define preserve_nonecc i64 @callee_with_many_param(i64 %a1, i64 %a2, i64 %a3, i6
6162; CHECK: # %bb.0:
6263; CHECK-NEXT: pushq %rax
6364; CHECK-NEXT: .cfi_def_cfa_offset 16
65+ ; CHECK-NEXT: movq %r13, %r12
66+ ; CHECK-NEXT: movq %r14, %r13
67+ ; CHECK-NEXT: movq %r15, %r14
68+ ; CHECK-NEXT: movq %rdi, %r15
6469; CHECK-NEXT: movq %rsi, %rdi
6570; CHECK-NEXT: movq %rdx, %rsi
6671; CHECK-NEXT: movq %rcx, %rdx
6772; CHECK-NEXT: movq %r8, %rcx
6873; CHECK-NEXT: movq %r9, %r8
6974; CHECK-NEXT: movq %r11, %r9
70- ; CHECK-NEXT: movq %r12, %r11
71- ; CHECK-NEXT: movq %r13, %r12
72- ; CHECK-NEXT: movq %r14, %r13
73- ; CHECK-NEXT: movq %r15, %r14
74- ; CHECK-NEXT: movq %rax, %r15
75+ ; CHECK-NEXT: movq %rax, %r11
7576; CHECK-NEXT: callq callee_with_many_param2@PLT
7677; CHECK-NEXT: popq %rcx
7778; CHECK-NEXT: .cfi_def_cfa_offset 8
@@ -98,17 +99,17 @@ define i64 @caller3() {
9899; CHECK-NEXT: .cfi_offset %r13, -32
99100; CHECK-NEXT: .cfi_offset %r14, -24
100101; CHECK-NEXT: .cfi_offset %r15, -16
101- ; CHECK-NEXT: movl $1, %edi
102- ; CHECK-NEXT: movl $2, %esi
103- ; CHECK-NEXT: movl $3, %edx
104- ; CHECK-NEXT: movl $4, %ecx
105- ; CHECK-NEXT: movl $5, %r8d
106- ; CHECK-NEXT: movl $6, %r9d
107- ; CHECK-NEXT: movl $7, %r11d
108- ; CHECK-NEXT: movl $8, %r12d
109- ; CHECK-NEXT: movl $9, %r13d
110- ; CHECK-NEXT: movl $10, %r14d
111- ; CHECK-NEXT: movl $11, %r15d
102+ ; CHECK-NEXT: movl $1, %r12d
103+ ; CHECK-NEXT: movl $2, %r13d
104+ ; CHECK-NEXT: movl $3, %r14d
105+ ; CHECK-NEXT: movl $4, %r15d
106+ ; CHECK-NEXT: movl $5, %edi
107+ ; CHECK-NEXT: movl $6, %esi
108+ ; CHECK-NEXT: movl $7, %edx
109+ ; CHECK-NEXT: movl $8, %ecx
110+ ; CHECK-NEXT: movl $9, %r8d
111+ ; CHECK-NEXT: movl $10, %r9d
112+ ; CHECK-NEXT: movl $11, %r11d
112113; CHECK-NEXT: movl $12, %eax
113114; CHECK-NEXT: callq callee_with_many_param@PLT
114115; CHECK-NEXT: popq %rbx
@@ -125,3 +126,20 @@ define i64 @caller3() {
125126 %ret = call preserve_nonecc i64 @callee_with_many_param (i64 1 , i64 2 , i64 3 , i64 4 , i64 5 , i64 6 , i64 7 , i64 8 , i64 9 , i64 10 , i64 11 , i64 12 )
126127 ret i64 %ret
127128}
129+
130+ ; Non-volatile registers are used to pass the first few parameters.
131+ declare void @boring ()
132+ declare preserve_nonecc void @continuation (ptr , ptr , ptr , ptr )
133+ define preserve_nonecc void @entry (ptr %r12 , ptr %r13 , ptr %r14 , ptr %r15 ) {
134+ ; CHECK-LABEL: entry:
135+ ; CHECK: # %bb.0:
136+ ; CHECK-NEXT: pushq %rax
137+ ; CHECK-NEXT: .cfi_def_cfa_offset 16
138+ ; CHECK-NEXT: callq boring@PLT
139+ ; CHECK-NEXT: popq %rax
140+ ; CHECK-NEXT: .cfi_def_cfa_offset 8
141+ ; CHECK-NEXT: jmp continuation@PLT # TAILCALL
142+ call void @boring ()
143+ musttail call preserve_nonecc void @continuation (ptr %r12 , ptr %r13 , ptr %r14 , ptr %r15 )
144+ ret void
145+ }
0 commit comments