@@ -27,6 +27,7 @@ define void @caller1(ptr %a) {
27
27
; CHECK-NEXT: .cfi_offset %r13, -32
28
28
; CHECK-NEXT: .cfi_offset %r14, -24
29
29
; CHECK-NEXT: .cfi_offset %r15, -16
30
+ ; CHECK-NEXT: movq %rdi, %r12
30
31
; CHECK-NEXT: callq callee@PLT
31
32
; CHECK-NEXT: popq %rbx
32
33
; 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
61
62
; CHECK: # %bb.0:
62
63
; CHECK-NEXT: pushq %rax
63
64
; 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
64
69
; CHECK-NEXT: movq %rsi, %rdi
65
70
; CHECK-NEXT: movq %rdx, %rsi
66
71
; CHECK-NEXT: movq %rcx, %rdx
67
72
; CHECK-NEXT: movq %r8, %rcx
68
73
; CHECK-NEXT: movq %r9, %r8
69
74
; 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
75
76
; CHECK-NEXT: callq callee_with_many_param2@PLT
76
77
; CHECK-NEXT: popq %rcx
77
78
; CHECK-NEXT: .cfi_def_cfa_offset 8
@@ -98,17 +99,17 @@ define i64 @caller3() {
98
99
; CHECK-NEXT: .cfi_offset %r13, -32
99
100
; CHECK-NEXT: .cfi_offset %r14, -24
100
101
; 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
112
113
; CHECK-NEXT: movl $12, %eax
113
114
; CHECK-NEXT: callq callee_with_many_param@PLT
114
115
; CHECK-NEXT: popq %rbx
@@ -125,3 +126,20 @@ define i64 @caller3() {
125
126
%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 )
126
127
ret i64 %ret
127
128
}
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