diff options
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 17 | ||||
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfo.cpp | 41 | ||||
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfo.td | 13 | ||||
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfoF.td | 16 |
4 files changed, 70 insertions, 17 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index 49301e3d76f..834b960a293 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -109,6 +109,14 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM, if (Subtarget.hasStdExtF()) { setOperationAction(ISD::FMINNUM, MVT::f32, Legal); setOperationAction(ISD::FMAXNUM, MVT::f32, Legal); + for (auto CC : + {ISD::SETOGT, ISD::SETOGE, ISD::SETONE, ISD::SETO, ISD::SETUEQ, + ISD::SETUGT, ISD::SETUGE, ISD::SETULT, ISD::SETULE, ISD::SETUNE, + ISD::SETGT, ISD::SETGE, ISD::SETNE}) + setCondCodeAction(CC, MVT::f32, Expand); + setOperationAction(ISD::SELECT_CC, MVT::f32, Expand); + setOperationAction(ISD::SELECT, MVT::f32, Custom); + setOperationAction(ISD::BR_CC, MVT::f32, Expand); } setOperationAction(ISD::GlobalAddress, XLenVT, Custom); @@ -390,8 +398,13 @@ RISCVTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI, const TargetInstrInfo &TII = *BB->getParent()->getSubtarget().getInstrInfo(); DebugLoc DL = MI.getDebugLoc(); - assert(MI.getOpcode() == RISCV::Select_GPR_Using_CC_GPR && - "Unexpected instr type to insert"); + switch (MI.getOpcode()) { + default: + llvm_unreachable("Unexpected instr type to insert"); + case RISCV::Select_GPR_Using_CC_GPR: + case RISCV::Select_FPR32_Using_CC_GPR: + break; + } // To "insert" a SELECT instruction, we actually have to insert the triangle // control-flow pattern. The incoming instruction knows the destination vreg diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp index 6a10329d4b8..0aafcf26d2e 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -36,12 +36,21 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, unsigned DstReg, unsigned SrcReg, bool KillSrc) const { - assert(RISCV::GPRRegClass.contains(DstReg, SrcReg) && - "Impossible reg-to-reg copy"); + if (RISCV::GPRRegClass.contains(DstReg, SrcReg)) { + BuildMI(MBB, MBBI, DL, get(RISCV::ADDI), DstReg) + .addReg(SrcReg, getKillRegState(KillSrc)) + .addImm(0); + return; + } - BuildMI(MBB, MBBI, DL, get(RISCV::ADDI), DstReg) - .addReg(SrcReg, getKillRegState(KillSrc)) - .addImm(0); + if (RISCV::FPR32RegClass.contains(DstReg, SrcReg)) { + BuildMI(MBB, MBBI, DL, get(RISCV::FSGNJ_S), DstReg) + .addReg(SrcReg, getKillRegState(KillSrc)) + .addReg(SrcReg, getKillRegState(KillSrc)); + return; + } + + llvm_unreachable("Impossible reg-to-reg copy"); } void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB, @@ -53,13 +62,19 @@ void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB, if (I != MBB.end()) DL = I->getDebugLoc(); + unsigned Opcode; + if (RISCV::GPRRegClass.hasSubClassEq(RC)) - BuildMI(MBB, I, DL, get(RISCV::SW)) - .addReg(SrcReg, getKillRegState(IsKill)) - .addFrameIndex(FI) - .addImm(0); + Opcode = RISCV::SW; + else if (RISCV::FPR32RegClass.hasSubClassEq(RC)) + Opcode = RISCV::FSW; else llvm_unreachable("Can't store this register to stack slot"); + + BuildMI(MBB, I, DL, get(Opcode)) + .addReg(SrcReg, getKillRegState(IsKill)) + .addFrameIndex(FI) + .addImm(0); } void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB, @@ -71,10 +86,16 @@ void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB, if (I != MBB.end()) DL = I->getDebugLoc(); + unsigned Opcode; + if (RISCV::GPRRegClass.hasSubClassEq(RC)) - BuildMI(MBB, I, DL, get(RISCV::LW), DstReg).addFrameIndex(FI).addImm(0); + Opcode = RISCV::LW; + else if (RISCV::FPR32RegClass.hasSubClassEq(RC)) + Opcode = RISCV::FLW; else llvm_unreachable("Can't load this register from stack slot"); + + BuildMI(MBB, I, DL, get(Opcode), DstReg).addFrameIndex(FI).addImm(0); } void RISCVInstrInfo::movImm32(MachineBasicBlock &MBB, diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index bbb209378d1..8b5b89ba422 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -536,11 +536,14 @@ def : Pat<(setge GPR:$rs1, GPR:$rs2), (XORI (SLT GPR:$rs1, GPR:$rs2), 1)>; def : Pat<(setle GPR:$rs1, GPR:$rs2), (XORI (SLT GPR:$rs2, GPR:$rs1), 1)>; let usesCustomInserter = 1 in -def Select_GPR_Using_CC_GPR - : Pseudo<(outs GPR:$dst), - (ins GPR:$lhs, GPR:$rhs, ixlenimm:$imm, GPR:$src, GPR:$src2), - [(set XLenVT:$dst, (SelectCC GPR:$lhs, GPR:$rhs, - (XLenVT imm:$imm), GPR:$src, GPR:$src2))]>; +class SelectCC_rrirr<RegisterClass valty, RegisterClass cmpty> + : Pseudo<(outs valty:$dst), + (ins cmpty:$lhs, cmpty:$rhs, ixlenimm:$imm, + valty:$truev, valty:$falsev), + [(set valty:$dst, (SelectCC cmpty:$lhs, cmpty:$rhs, + (XLenVT imm:$imm), valty:$truev, valty:$falsev))]>; + +def Select_GPR_Using_CC_GPR : SelectCC_rrirr<GPR, GPR>; /// Branches and jumps diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td index 760ea57ca86..6121dea277c 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td @@ -272,10 +272,26 @@ def : Pat<(fcopysign FPR32:$rs1, (fneg FPR32:$rs2)), (FSGNJN_S $rs1, $rs2)>; def : PatFpr32Fpr32<fminnum, FMIN_S>; def : PatFpr32Fpr32<fmaxnum, FMAX_S>; +/// Setcc + +def : PatFpr32Fpr32<seteq, FEQ_S>; def : PatFpr32Fpr32<setoeq, FEQ_S>; +def : PatFpr32Fpr32<setlt, FLT_S>; def : PatFpr32Fpr32<setolt, FLT_S>; +def : PatFpr32Fpr32<setle, FLE_S>; def : PatFpr32Fpr32<setole, FLE_S>; +// Define pattern expansions for setcc operations which aren't directly +// handled by a RISC-V instruction and aren't expanded in the SelectionDAG +// Legalizer. + +def : Pat<(setuo FPR32:$rs1, FPR32:$rs2), + (SLTIU (AND (FEQ_S FPR32:$rs1, FPR32:$rs1), + (FEQ_S FPR32:$rs2, FPR32:$rs2)), + 1)>; + +def Select_FPR32_Using_CC_GPR : SelectCC_rrirr<FPR32, GPR>; + /// Loads defm : LdPat<load, FLW>; |