Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions llvm/lib/Target/AArch64/AArch64CallingConvention.td
Original file line number Diff line number Diff line change
Expand Up @@ -610,6 +610,12 @@ def CSR_Win_AArch64_AAPCS_SwiftError
def CSR_Win_AArch64_AAPCS_SwiftTail
: CalleeSavedRegs<(sub CSR_Win_AArch64_AAPCS, X20, X22)>;

def CSR_Win_AArch64_RT_MostRegs
: CalleeSavedRegs<(add CSR_Win_AArch64_AAPCS, (sequence "X%u", 9, 15))>;

def CSR_Win_AArch64_RT_AllRegs
: CalleeSavedRegs<(add CSR_Win_AArch64_RT_MostRegs, (sequence "Q%u", 8, 31))>;

// The Control Flow Guard check call uses a custom calling convention that also
// preserves X0-X8 and Q0-Q7.
def CSR_Win_AArch64_CFGuard_Check : CalleeSavedRegs<(add CSR_Win_AArch64_AAPCS,
Expand Down
14 changes: 10 additions & 4 deletions llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,16 @@ AArch64RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
if (MF->getSubtarget<AArch64Subtarget>().isTargetDarwin())
return getDarwinCalleeSavedRegs(MF);

if (MF->getFunction().getCallingConv() == CallingConv::PreserveMost)
return MF->getSubtarget<AArch64Subtarget>().isTargetWindows()
? CSR_Win_AArch64_RT_MostRegs_SaveList
: CSR_AArch64_RT_MostRegs_SaveList;

if (MF->getFunction().getCallingConv() == CallingConv::PreserveAll)
return MF->getSubtarget<AArch64Subtarget>().isTargetWindows()
? CSR_Win_AArch64_RT_AllRegs_SaveList
: CSR_AArch64_RT_AllRegs_SaveList;

if (MF->getFunction().getCallingConv() == CallingConv::CFGuard_Check)
return CSR_Win_AArch64_CFGuard_Check_SaveList;
if (MF->getSubtarget<AArch64Subtarget>().isTargetWindows()) {
Expand Down Expand Up @@ -140,10 +150,6 @@ AArch64RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
return CSR_AArch64_AAPCS_SwiftError_SaveList;
if (MF->getFunction().getCallingConv() == CallingConv::SwiftTail)
return CSR_AArch64_AAPCS_SwiftTail_SaveList;
if (MF->getFunction().getCallingConv() == CallingConv::PreserveMost)
return CSR_AArch64_RT_MostRegs_SaveList;
if (MF->getFunction().getCallingConv() == CallingConv::PreserveAll)
return CSR_AArch64_RT_AllRegs_SaveList;
if (MF->getFunction().getCallingConv() == CallingConv::Win64)
// This is for OSes other than Windows; Windows is a separate case further
// above.
Expand Down
38 changes: 24 additions & 14 deletions llvm/test/CodeGen/AArch64/preserve_mostcc.ll
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
; RUN: llc < %s -mtriple=arm64-apple-ios-8.0.0 | FileCheck %s
; RUN: llc < %s -mtriple=arm64-apple-ios-8.0.0 | FileCheck -check-prefix CHECK -check-prefix CHECK-DARWIN %s
; RUN: llc < %s -mtriple=aarch64-unknown-windiws-msvc | FileCheck -check-prefix CHECK -check-prefix CHECK-WIN %s

declare void @standard_cc_func()
declare preserve_mostcc void @preserve_mostcc_func()
Expand All @@ -8,18 +9,26 @@ declare preserve_mostcc void @preserve_mostcc_func()
define preserve_mostcc void @preserve_mostcc1() nounwind {
entry:
;CHECK-LABEL: preserve_mostcc1
;CHECK-NOT: stp
;CHECK-NOT: str
;CHECK: str x15
;CHECK-NEXT: stp x14, x13,
;CHECK-NEXT: stp x12, x11,
;CHECK-NEXT: stp x10, x9,
;CHECK: bl _standard_cc_func
;CHECK-DARWIN-NOT: stp
;CHECK-DARWIN-NOT: str
;CHECK-DARWIN: str x15
;CHECK-DARWIN-NEXT: stp x14, x13,
;CHECK-DARWIN-NEXT: stp x12, x11,
;CHECK-DARWIN-NEXT: stp x10, x9,
;CHECK-WIN: stp x15, x14
;CHECK-WIN-NEXT: stp x13, x12,
;CHECK-WIN-NEXT: stp x11, x10,
;CHECK-WIN-NEXT: stp x9, x30
;CHECK: bl {{_?}}standard_cc_func
call void @standard_cc_func()
;CHECK: ldp x10, x9,
;CHECK-NEXT: ldp x12, x11,
;CHECK-NEXT: ldp x14, x13,
;CHECK-NEXT: ldr x15
;CHECK-DARWIN: ldp x10, x9,
;CHECK-DARWIN-NEXT: ldp x12, x11,
;CHECK-DARWIN-NEXT: ldp x14, x13,
;CHECK-DARWIN-NEXT: ldr x15
;CHECK-WIN: ldp x9, x30
;CHECK-WIN-NEXT: ldp x11, x10,
;CHECK-WIN-NEXT: ldp x13, x12,
;CHECK-WIN-NEXT: ldp x15, x14,
ret void
}

Expand All @@ -31,9 +40,10 @@ define preserve_mostcc void @preserve_mostcc2() nounwind {
entry:
;CHECK-LABEL: preserve_mostcc2
;CHECK-NOT: x14
;CHECK: stp x29, x30,
;CHECK-DARWIN: stp x29, x30,
;CHECK-WIN: str x30
;CHECK-NOT: x14
;CHECK: bl _preserve_mostcc_func
;CHECK: bl {{_?}}preserve_mostcc_func
call preserve_mostcc void @preserve_mostcc_func()
ret void
}
Expand Down