Pass swift_async context in a callee-saved register rather than as a
regular parameter. This is similar to the Swift `self` and `error`
parameters.
// Pass SwiftSelf in a callee saved register.
CCIfSwiftSelf<CCIfType<[i64], CCAssignToReg<[R13]>>>,
+ // Pass SwiftAsync in an otherwise callee saved register so that calls to
+ // normal functions don't need to save it somewhere.
+ CCIfSwiftAsync<CCIfType<[i64], CCAssignToReg<[R14]>>>,
+
// The 'CFGuardTarget' parameter, if any, is passed in RAX.
CCIfCFGuardTarget<CCAssignToReg<[RAX]>>,
--- /dev/null
+; RUN: llc -mtriple x86_64-unknown-windows-msvc %s -o - | FileCheck %s
+; RUN: llc -mtriple x86_64-unknown-windows-msvc %s -o - -fast-isel | FileCheck %s
+
+define i8* @argument(i8* swiftasync %in) {
+ ret i8* %in
+}
+
+; CHECK-LABEL: argument:
+; CHECK: movq %r14, %rax
+
+define void @call(i8* %in) {
+ call i8* @argument(i8* swiftasync %in)
+ ret void
+}
+
+; CHECK-LABEL: call:
+; CHECK: movq %rcx, %r14