All instructions that can raise fp exceptions also read FPCR, with the only other instructions that interact with it being the MSR/MRS to write/read FPCR. Introducing an FPCR register also requires adjusting invalidateWindowsRegisterPairing in AArch64FrameLowering.cpp to use the encoded value of registers instead of their enum value, as the enum value is based on the alphabetical order of register names and now FPCR is placed between FP and LR. This change unfortunately means a large number of mir tests need to be adjusted due to instructions now requiring an implicit fpcr operand to be present. Differential Revision: https://reviews.llvm.org/D121929
60 lines
1.8 KiB
YAML
60 lines
1.8 KiB
YAML
# RUN: llc -o - %s -mtriple=aarch64-windows -start-before=prologepilog \
|
|
# RUN: -stop-after=prologepilog | FileCheck %s
|
|
# Check save_freg_x, save_freg
|
|
|
|
# CHECK: early-clobber $sp = frame-setup STRDpre killed $d8, $sp, -16
|
|
# CHECK-NEXT: frame-setup SEH_SaveFReg_X 8, -16
|
|
# CHECK-NEXT: frame-setup STRDui killed $d10, $sp, 1 :: (store (s64) into %stack.0)
|
|
# CHECK-NEXT: frame-setup SEH_SaveFReg 10, 8
|
|
# CHECK-NEXT: frame-setup SEH_PrologEnd
|
|
# CHECK: frame-destroy SEH_EpilogStart
|
|
# CHECK-NEXT: $d10 = frame-destroy LDRDui $sp, 1 :: (load (s64) from %stack.0)
|
|
# CHECK-NEXT: frame-destroy SEH_SaveFReg 10, 8
|
|
# CHECK-NEXT: early-clobber $sp, $d8 = frame-destroy LDRDpost $sp, 16 :: (load (s64) from %stack.1)
|
|
# CHECK-NEXT: frame-destroy SEH_SaveFReg_X 8, -16
|
|
# CHECK-NEXT: frame-destroy SEH_EpilogEnd
|
|
# CHECK-NEXT: RET_ReallyLR implicit $x0
|
|
...
|
|
---
|
|
name: test
|
|
alignment: 4
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
failedISel: false
|
|
tracksRegLiveness: true
|
|
hasWinCFI: true
|
|
registers:
|
|
liveins:
|
|
- { reg: '$w0', virtual-reg: '' }
|
|
frameInfo:
|
|
isFrameAddressTaken: false
|
|
isReturnAddressTaken: false
|
|
hasStackMap: false
|
|
hasPatchPoint: false
|
|
stackSize: 112
|
|
offsetAdjustment: 0
|
|
maxAlignment: 8
|
|
adjustsStack: false
|
|
hasCalls: false
|
|
stackProtector: ''
|
|
maxCallFrameSize: 0
|
|
hasOpaqueSPAdjustment: true
|
|
hasVAStart: false
|
|
hasMustTailInVarArgFunc: false
|
|
localFrameSize: 0
|
|
savePoint: ''
|
|
restorePoint: ''
|
|
fixedStack:
|
|
stack:
|
|
constants:
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: $d0, $d1
|
|
$d8 = FADDDrr $d0, killed $d1, implicit $fpcr
|
|
$d10 = FADDDrr killed $d8, $d0, implicit $fpcr
|
|
$x0 = COPY killed $d10
|
|
RET_ReallyLR implicit $x0
|
|
...
|