diff options
author | Tim Northover <tnorthover@apple.com> | 2014-05-27 12:16:02 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2014-05-27 12:16:02 +0000 |
commit | 1bed9afd30cbd4074d95aff686c952eae08ce4d3 (patch) | |
tree | 4ba48abe66774ffdbf08d3d769841534fa20ee7a /llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | |
parent | 4f1909f1da178001187b1bbbee237f73945b9477 (diff) | |
download | bcm5719-llvm-1bed9afd30cbd4074d95aff686c952eae08ce4d3.tar.gz bcm5719-llvm-1bed9afd30cbd4074d95aff686c952eae08ce4d3.zip |
AArch64: implement copies to/from NZCV as a last ditch effort.
A test in test/Generic creates a DAG where the NZCV output of an ADCS is used
by multiple nodes. This makes LLVM want to save a copy of NZCV for later, which
it couldn't do before.
This should be the last fix required for the aarch64 buildbot.
llvm-svn: 209651
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64InstrInfo.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp index 52e3b333eb0..ff115c0bd5e 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -1507,7 +1507,25 @@ void AArch64InstrInfo::copyPhysReg(MachineBasicBlock &MBB, return; } - assert(0 && "unimplemented reg-to-reg copy"); + if (DestReg == AArch64::NZCV) { + assert(AArch64::GPR64RegClass.contains(SrcReg) && "Invalid NZCV copy"); + BuildMI(MBB, I, DL, get(AArch64::MSR)) + .addImm(AArch64SysReg::NZCV) + .addReg(SrcReg, getKillRegState(KillSrc)) + .addReg(AArch64::NZCV, RegState::Implicit | RegState::Define); + return; + } + + if (SrcReg == AArch64::NZCV) { + assert(AArch64::GPR64RegClass.contains(DestReg) && "Invalid NZCV copy"); + BuildMI(MBB, I, DL, get(AArch64::MRS)) + .addReg(DestReg) + .addImm(AArch64SysReg::NZCV) + .addReg(AArch64::NZCV, RegState::Implicit | getKillRegState(KillSrc)); + return; + } + + llvm_unreachable("unimplemented reg-to-reg copy"); } void AArch64InstrInfo::storeRegToStackSlot( |