diff options
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp index 80ea8d6d61d..ac8323ac624 100644 --- a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp @@ -953,6 +953,60 @@ bool AArch64InstructionSelector::select(MachineInstr &I) const { case TargetOpcode::G_BITCAST: return selectCopy(I, TII, MRI, TRI, RBI); + case TargetOpcode::G_FPEXT: { + if (MRI.getType(I.getOperand(0).getReg()) != LLT::scalar(64)) { + DEBUG(dbgs() << "G_FPEXT to type " << Ty + << ", expected: " << LLT::scalar(64) << '\n'); + return false; + } + + if (MRI.getType(I.getOperand(1).getReg()) != LLT::scalar(32)) { + DEBUG(dbgs() << "G_FPEXT from type " << Ty + << ", expected: " << LLT::scalar(32) << '\n'); + return false; + } + + const unsigned DefReg = I.getOperand(0).getReg(); + const RegisterBank &RB = *RBI.getRegBank(DefReg, MRI, TRI); + + if (RB.getID() != AArch64::FPRRegBankID) { + DEBUG(dbgs() << "G_FPEXT on bank: " << RB << ", expected: FPR\n"); + return false; + } + + I.setDesc(TII.get(AArch64::FCVTDSr)); + constrainSelectedInstRegOperands(I, TII, TRI, RBI); + + return true; + } + + case TargetOpcode::G_FPTRUNC: { + if (MRI.getType(I.getOperand(0).getReg()) != LLT::scalar(32)) { + DEBUG(dbgs() << "G_FPTRUNC to type " << Ty + << ", expected: " << LLT::scalar(32) << '\n'); + return false; + } + + if (MRI.getType(I.getOperand(1).getReg()) != LLT::scalar(64)) { + DEBUG(dbgs() << "G_FPTRUNC from type " << Ty + << ", expected: " << LLT::scalar(64) << '\n'); + return false; + } + + const unsigned DefReg = I.getOperand(0).getReg(); + const RegisterBank &RB = *RBI.getRegBank(DefReg, MRI, TRI); + + if (RB.getID() != AArch64::FPRRegBankID) { + DEBUG(dbgs() << "G_FPTRUNC on bank: " << RB << ", expected: FPR\n"); + return false; + } + + I.setDesc(TII.get(AArch64::FCVTSDr)); + constrainSelectedInstRegOperands(I, TII, TRI, RBI); + + return true; + } + case TargetOpcode::G_SELECT: { if (MRI.getType(I.getOperand(1).getReg()) != LLT::scalar(1)) { DEBUG(dbgs() << "G_SELECT cond has type: " << Ty |