Lines Matching defs:RISCV

16 #include "RISCV.h"
62 using namespace RISCV;
69 namespace llvm::RISCV {
74 } // end namespace llvm::RISCV
77 : RISCVGenInstrInfo(RISCV::ADJCALLSTACKDOWN, RISCV::ADJCALLSTACKUP),
82 return MCInstBuilder(RISCV::C_NOP);
83 return MCInstBuilder(RISCV::ADDI)
84 .addReg(RISCV::X0)
85 .addReg(RISCV::X0)
101 case RISCV::LB:
102 case RISCV::LBU:
105 case RISCV::LH:
106 case RISCV::LH_INX:
107 case RISCV::LHU:
108 case RISCV::FLH:
111 case RISCV::LW:
112 case RISCV::LW_INX:
113 case RISCV::FLW:
114 case RISCV::LWU:
117 case RISCV::LD:
118 case RISCV::FLD:
144 case RISCV::SB:
147 case RISCV::SH:
148 case RISCV::SH_INX:
149 case RISCV::FSH:
152 case RISCV::SW:
153 case RISCV::SW_INX:
154 case RISCV::FSW:
157 case RISCV::SD:
158 case RISCV::FSD:
174 switch (RISCV::getRVVMCOpcode(MI.getOpcode())) {
175 case RISCV::VMV_V_X:
176 case RISCV::VFMV_V_F:
177 case RISCV::VMV_V_I:
178 case RISCV::VMV_S_X:
179 case RISCV::VFMV_S_F:
180 case RISCV::VID_V:
213 if (MBBI->getOpcode() == RISCV::PseudoVSETVLI ||
214 MBBI->getOpcode() == RISCV::PseudoVSETVLIX0 ||
215 MBBI->getOpcode() == RISCV::PseudoVSETIVLI) {
235 if (MBBI->getOperand(0).getReg() != RISCV::X0)
239 if (MBBI->getOperand(1).getReg() != RISCV::X0)
268 if (MBBI->modifiesRegister(RISCV::VL, /*TRI=*/nullptr))
360 return {RISCVII::LMUL_8, RISCV::VRM8RegClass, RISCV::VMV8R_V,
361 RISCV::PseudoVMV_V_V_M8, RISCV::PseudoVMV_V_I_M8};
364 return {RISCVII::LMUL_4, RISCV::VRM4RegClass, RISCV::VMV4R_V,
365 RISCV::PseudoVMV_V_V_M4, RISCV::PseudoVMV_V_I_M4};
368 return {RISCVII::LMUL_2, RISCV::VRM2RegClass, RISCV::VMV2R_V,
369 RISCV::PseudoVMV_V_V_M2, RISCV::PseudoVMV_V_I_M2};
371 return {RISCVII::LMUL_1, RISCV::VRRegClass, RISCV::VMV1R_V,
372 RISCV::PseudoVMV_V_V_M1, RISCV::PseudoVMV_V_I_M1};
378 return {RISCVII::LMUL_8, RISCV::VRM8RegClass, RISCV::VMV8R_V,
379 RISCV::PseudoVMV_V_V_M8, RISCV::PseudoVMV_V_I_M8};
381 return {RISCVII::LMUL_4, RISCV::VRM4RegClass, RISCV::VMV4R_V,
382 RISCV::PseudoVMV_V_V_M4, RISCV::PseudoVMV_V_I_M4};
384 return {RISCVII::LMUL_2, RISCV::VRM2RegClass, RISCV::VMV2R_V,
385 RISCV::PseudoVMV_V_V_M2, RISCV::PseudoVMV_V_I_M2};
387 return {RISCVII::LMUL_1, RISCV::VRRegClass, RISCV::VMV1R_V,
388 RISCV::PseudoVMV_V_V_M1, RISCV::PseudoVMV_V_I_M1};
392 MCRegister Reg = RISCV::V0 + Encoding;
395 return TRI->getMatchingSuperReg(Reg, RISCV::sub_vrm1_0, &RegClass);
422 bool UseVMV_V_I = RISCV::getRVVMCOpcode(Opc) == RISCV::VMV_V_I;
423 bool UseVMV = UseVMV_V_I || RISCV::getRVVMCOpcode(Opc) == RISCV::VMV_V_V;
437 MIB.addReg(RISCV::VL, RegState::Implicit);
438 MIB.addReg(RISCV::VTYPE, RegState::Implicit);
455 if (RISCV::GPRRegClass.contains(DstReg, SrcReg)) {
456 BuildMI(MBB, MBBI, DL, get(RISCV::ADDI), DstReg)
463 if (RISCV::GPRF16RegClass.contains(DstReg, SrcReg)) {
464 BuildMI(MBB, MBBI, DL, get(RISCV::PseudoMV_FPR16INX), DstReg)
470 if (RISCV::GPRF32RegClass.contains(DstReg, SrcReg)) {
471 BuildMI(MBB, MBBI, DL, get(RISCV::PseudoMV_FPR32INX), DstReg)
477 if (RISCV::GPRPairRegClass.contains(DstReg, SrcReg)) {
479 BuildMI(MBB, MBBI, DL, get(RISCV::ADDI),
480 TRI->getSubReg(DstReg, RISCV::sub_gpr_even))
481 .addReg(TRI->getSubReg(SrcReg, RISCV::sub_gpr_even),
484 BuildMI(MBB, MBBI, DL, get(RISCV::ADDI),
485 TRI->getSubReg(DstReg, RISCV::sub_gpr_odd))
486 .addReg(TRI->getSubReg(SrcReg, RISCV::sub_gpr_odd),
493 if (RISCV::VCSRRegClass.contains(SrcReg) &&
494 RISCV::GPRRegClass.contains(DstReg)) {
495 BuildMI(MBB, MBBI, DL, get(RISCV::CSRRS), DstReg)
497 .addReg(RISCV::X0);
501 if (RISCV::FPR16RegClass.contains(DstReg, SrcReg)) {
504 Opc = RISCV::FSGNJ_H;
510 DstReg = TRI->getMatchingSuperReg(DstReg, RISCV::sub_16,
511 &RISCV::FPR32RegClass);
512 SrcReg = TRI->getMatchingSuperReg(SrcReg, RISCV::sub_16,
513 &RISCV::FPR32RegClass);
514 Opc = RISCV::FSGNJ_S;
522 if (RISCV::FPR32RegClass.contains(DstReg, SrcReg)) {
523 BuildMI(MBB, MBBI, DL, get(RISCV::FSGNJ_S), DstReg)
529 if (RISCV::FPR64RegClass.contains(DstReg, SrcReg)) {
530 BuildMI(MBB, MBBI, DL, get(RISCV::FSGNJ_D), DstReg)
536 if (RISCV::FPR32RegClass.contains(DstReg) &&
537 RISCV::GPRRegClass.contains(SrcReg)) {
538 BuildMI(MBB, MBBI, DL, get(RISCV::FMV_W_X), DstReg)
543 if (RISCV::GPRRegClass.contains(DstReg) &&
544 RISCV::FPR32RegClass.contains(SrcReg)) {
545 BuildMI(MBB, MBBI, DL, get(RISCV::FMV_X_W), DstReg)
550 if (RISCV::FPR64RegClass.contains(DstReg) &&
551 RISCV::GPRRegClass.contains(SrcReg)) {
553 BuildMI(MBB, MBBI, DL, get(RISCV::FMV_D_X), DstReg)
558 if (RISCV::GPRRegClass.contains(DstReg) &&
559 RISCV::FPR64RegClass.contains(SrcReg)) {
561 BuildMI(MBB, MBBI, DL, get(RISCV::FMV_X_D), DstReg)
589 if (RISCV::GPRRegClass.hasSubClassEq(RC)) {
590 Opcode = TRI->getRegSizeInBits(RISCV::GPRRegClass) == 32 ?
591 RISCV::SW : RISCV::SD;
593 } else if (RISCV::GPRF16RegClass.hasSubClassEq(RC)) {
594 Opcode = RISCV::SH_INX;
596 } else if (RISCV::GPRF32RegClass.hasSubClassEq(RC)) {
597 Opcode = RISCV::SW_INX;
599 } else if (RISCV::GPRPairRegClass.hasSubClassEq(RC)) {
600 Opcode = RISCV::PseudoRV32ZdinxSD;
602 } else if (RISCV::FPR16RegClass.hasSubClassEq(RC)) {
603 Opcode = RISCV::FSH;
605 } else if (RISCV::FPR32RegClass.hasSubClassEq(RC)) {
606 Opcode = RISCV::FSW;
608 } else if (RISCV::FPR64RegClass.hasSubClassEq(RC)) {
609 Opcode = RISCV::FSD;
611 } else if (RISCV::VRRegClass.hasSubClassEq(RC)) {
612 Opcode = RISCV::VS1R_V;
613 } else if (RISCV::VRM2RegClass.hasSubClassEq(RC)) {
614 Opcode = RISCV::VS2R_V;
615 } else if (RISCV::VRM4RegClass.hasSubClassEq(RC)) {
616 Opcode = RISCV::VS4R_V;
617 } else if (RISCV::VRM8RegClass.hasSubClassEq(RC)) {
618 Opcode = RISCV::VS8R_V;
619 } else if (RISCV::VRN2M1RegClass.hasSubClassEq(RC))
620 Opcode = RISCV::PseudoVSPILL2_M1;
621 else if (RISCV::VRN2M2RegClass.hasSubClassEq(RC))
622 Opcode = RISCV::PseudoVSPILL2_M2;
623 else if (RISCV::VRN2M4RegClass.hasSubClassEq(RC))
624 Opcode = RISCV::PseudoVSPILL2_M4;
625 else if (RISCV::VRN3M1RegClass.hasSubClassEq(RC))
626 Opcode = RISCV::PseudoVSPILL3_M1;
627 else if (RISCV::VRN3M2RegClass.hasSubClassEq(RC))
628 Opcode = RISCV::PseudoVSPILL3_M2;
629 else if (RISCV::VRN4M1RegClass.hasSubClassEq(RC))
630 Opcode = RISCV::PseudoVSPILL4_M1;
631 else if (RISCV::VRN4M2RegClass.hasSubClassEq(RC))
632 Opcode = RISCV::PseudoVSPILL4_M2;
633 else if (RISCV::VRN5M1RegClass.hasSubClassEq(RC))
634 Opcode = RISCV::PseudoVSPILL5_M1;
635 else if (RISCV::VRN6M1RegClass.hasSubClassEq(RC))
636 Opcode = RISCV::PseudoVSPILL6_M1;
637 else if (RISCV::VRN7M1RegClass.hasSubClassEq(RC))
638 Opcode = RISCV::PseudoVSPILL7_M1;
639 else if (RISCV::VRN8M1RegClass.hasSubClassEq(RC))
640 Opcode = RISCV::PseudoVSPILL8_M1;
680 if (RISCV::GPRRegClass.hasSubClassEq(RC)) {
681 Opcode = TRI->getRegSizeInBits(RISCV::GPRRegClass) == 32 ?
682 RISCV::LW : RISCV::LD;
684 } else if (RISCV::GPRF16RegClass.hasSubClassEq(RC)) {
685 Opcode = RISCV::LH_INX;
687 } else if (RISCV::GPRF32RegClass.hasSubClassEq(RC)) {
688 Opcode = RISCV::LW_INX;
690 } else if (RISCV::GPRPairRegClass.hasSubClassEq(RC)) {
691 Opcode = RISCV::PseudoRV32ZdinxLD;
693 } else if (RISCV::FPR16RegClass.hasSubClassEq(RC)) {
694 Opcode = RISCV::FLH;
696 } else if (RISCV::FPR32RegClass.hasSubClassEq(RC)) {
697 Opcode = RISCV::FLW;
699 } else if (RISCV::FPR64RegClass.hasSubClassEq(RC)) {
700 Opcode = RISCV::FLD;
702 } else if (RISCV::VRRegClass.hasSubClassEq(RC)) {
703 Opcode = RISCV::VL1RE8_V;
704 } else if (RISCV::VRM2RegClass.hasSubClassEq(RC)) {
705 Opcode = RISCV::VL2RE8_V;
706 } else if (RISCV::VRM4RegClass.hasSubClassEq(RC)) {
707 Opcode = RISCV::VL4RE8_V;
708 } else if (RISCV::VRM8RegClass.hasSubClassEq(RC)) {
709 Opcode = RISCV::VL8RE8_V;
710 } else if (RISCV::VRN2M1RegClass.hasSubClassEq(RC))
711 Opcode = RISCV::PseudoVRELOAD2_M1;
712 else if (RISCV::VRN2M2RegClass.hasSubClassEq(RC))
713 Opcode = RISCV::PseudoVRELOAD2_M2;
714 else if (RISCV::VRN2M4RegClass.hasSubClassEq(RC))
715 Opcode = RISCV::PseudoVRELOAD2_M4;
716 else if (RISCV::VRN3M1RegClass.hasSubClassEq(RC))
717 Opcode = RISCV::PseudoVRELOAD3_M1;
718 else if (RISCV::VRN3M2RegClass.hasSubClassEq(RC))
719 Opcode = RISCV::PseudoVRELOAD3_M2;
720 else if (RISCV::VRN4M1RegClass.hasSubClassEq(RC))
721 Opcode = RISCV::PseudoVRELOAD4_M1;
722 else if (RISCV::VRN4M2RegClass.hasSubClassEq(RC))
723 Opcode = RISCV::PseudoVRELOAD4_M2;
724 else if (RISCV::VRN5M1RegClass.hasSubClassEq(RC))
725 Opcode = RISCV::PseudoVRELOAD5_M1;
726 else if (RISCV::VRN6M1RegClass.hasSubClassEq(RC))
727 Opcode = RISCV::PseudoVRELOAD6_M1;
728 else if (RISCV::VRN7M1RegClass.hasSubClassEq(RC))
729 Opcode = RISCV::PseudoVRELOAD7_M1;
730 else if (RISCV::VRN8M1RegClass.hasSubClassEq(RC))
731 Opcode = RISCV::PseudoVRELOAD8_M1;
775 if (RISCV::isSEXT_W(MI)) {
776 LoadOpc = RISCV::LW;
779 if (RISCV::isZEXT_W(MI)) {
780 LoadOpc = RISCV::LWU;
783 if (RISCV::isZEXT_B(MI)) {
784 LoadOpc = RISCV::LBU;
787 if (RISCV::getRVVMCOpcode(MI.getOpcode()) == RISCV::VMV_X_S) {
794 LoadOpc = RISCV::LB;
797 LoadOpc = RISCV::LH;
800 LoadOpc = RISCV::LW;
803 LoadOpc = RISCV::LD;
810 if (RISCV::getRVVMCOpcode(MI.getOpcode()) == RISCV::VFMV_F_S) {
815 LoadOpc = RISCV::FLH;
818 LoadOpc = RISCV::FLW;
821 LoadOpc = RISCV::FLD;
829 case RISCV::SEXT_H:
830 LoadOpc = RISCV::LH;
832 case RISCV::SEXT_B:
833 LoadOpc = RISCV::LB;
835 case RISCV::ZEXT_H_RV32:
836 case RISCV::ZEXT_H_RV64:
837 LoadOpc = RISCV::LHU;
853 Register SrcReg = RISCV::X0;
875 unsigned SrcRegState = getKillRegState(SrcReg != RISCV::X0) |
888 .addReg(RISCV::X0)
917 case RISCV::CV_BEQIMM:
919 case RISCV::CV_BNEIMM:
921 case RISCV::BEQ:
923 case RISCV::BNE:
925 case RISCV::BLT:
927 case RISCV::BGE:
929 case RISCV::BLTU:
931 case RISCV::BGEU:
937 // RISCVInstrInfo, giving us flexibility in what to push to it. For RISCV, we
956 return Imm ? RISCV::CV_BEQIMM : RISCV::BEQ;
958 return Imm ? RISCV::CV_BNEIMM : RISCV::BNE;
960 return RISCV::BLT;
962 return RISCV::BGE;
964 return RISCV::BLTU;
966 return RISCV::BGEU;
1113 MachineInstr &MI = *BuildMI(&MBB, DL, get(RISCV::PseudoBR)).addMBB(TBB);
1133 MachineInstr &MI = *BuildMI(&MBB, DL, get(RISCV::PseudoBR)).addMBB(FBB);
1163 Register ScratchReg = MRI.createVirtualRegister(&RISCV::GPRJALRRegClass);
1166 MachineInstr &MI = *BuildMI(MBB, II, DL, get(RISCV::PseudoJump))
1172 RS->scavengeRegisterBackwards(RISCV::GPRRegClass, MI.getIterator(),
1175 if (TmpGPR != RISCV::NoRegister)
1181 TmpGPR = RISCV::X27;
1188 &RISCV::GPRRegClass, TRI, Register());
1195 &RISCV::GPRRegClass, TRI, Register());
1247 if (MI->getOpcode() == RISCV::ADDI && MI->getOperand(1).isReg() &&
1248 MI->getOperand(1).getReg() == RISCV::X0) {
1342 case RISCV::BEQ:
1343 case RISCV::BNE:
1344 case RISCV::BLT:
1345 case RISCV::BGE:
1346 case RISCV::BLTU:
1347 case RISCV::BGEU:
1348 case RISCV::CV_BEQIMM:
1349 case RISCV::CV_BNEIMM:
1351 case RISCV::JAL:
1352 case RISCV::PseudoBR:
1354 case RISCV::PseudoJump:
1360 // instruction opcode. Otherwise, return RISCV::INSTRUCTION_LIST_END.
1364 case RISCV::ADD: return RISCV::PseudoCCADD; break;
1365 case RISCV::SUB: return RISCV::PseudoCCSUB; break;
1366 case RISCV::SLL: return RISCV::PseudoCCSLL; break;
1367 case RISCV::SRL: return RISCV::PseudoCCSRL; break;
1368 case RISCV::SRA: return RISCV::PseudoCCSRA; break;
1369 case RISCV::AND: return RISCV::PseudoCCAND; break;
1370 case RISCV::OR: return RISCV::PseudoCCOR; break;
1371 case RISCV::XOR: return RISCV::PseudoCCXOR; break;
1373 case RISCV::ADDI: return RISCV::PseudoCCADDI; break;
1374 case RISCV::SLLI: return RISCV::PseudoCCSLLI; break;
1375 case RISCV::SRLI: return RISCV::PseudoCCSRLI; break;
1376 case RISCV::SRAI: return RISCV::PseudoCCSRAI; break;
1377 case RISCV::ANDI: return RISCV::PseudoCCANDI; break;
1378 case RISCV::ORI: return RISCV::PseudoCCORI; break;
1379 case RISCV::XORI: return RISCV::PseudoCCXORI; break;
1381 case RISCV::ADDW: return RISCV::PseudoCCADDW; break;
1382 case RISCV::SUBW: return RISCV::PseudoCCSUBW; break;
1383 case RISCV::SLLW: return RISCV::PseudoCCSLLW; break;
1384 case RISCV::SRLW: return RISCV::PseudoCCSRLW; break;
1385 case RISCV::SRAW: return RISCV::PseudoCCSRAW; break;
1387 case RISCV::ADDIW: return RISCV::PseudoCCADDIW; break;
1388 case RISCV::SLLIW: return RISCV::PseudoCCSLLIW; break;
1389 case RISCV::SRLIW: return RISCV::PseudoCCSRLIW; break;
1390 case RISCV::SRAIW: return RISCV::PseudoCCSRAIW; break;
1392 case RISCV::ANDN: return RISCV::PseudoCCANDN; break;
1393 case RISCV::ORN: return RISCV::PseudoCCORN; break;
1394 case RISCV::XNOR: return RISCV::PseudoCCXNOR; break;
1397 return RISCV::INSTRUCTION_LIST_END;
1413 if (getPredicatedOpcode(MI->getOpcode()) == RISCV::INSTRUCTION_LIST_END)
1416 if (MI->getOpcode() == RISCV::ADDI && MI->getOperand(1).isReg() &&
1417 MI->getOperand(1).getReg() == RISCV::X0)
1445 assert(MI.getOpcode() == RISCV::PseudoCCMOVGPR &&
1468 assert(MI.getOpcode() == RISCV::PseudoCCMOVGPR &&
1490 assert(PredOpc != RISCV::INSTRUCTION_LIST_END && "Unexpected opcode!");
1564 case RISCV::PseudoMV_FPR16INX:
1565 case RISCV::PseudoMV_FPR32INX:
1621 case RISCV::FSGNJ_D:
1622 case RISCV::FSGNJ_S:
1623 case RISCV::FSGNJ_H:
1624 case RISCV::FSGNJ_D_INX:
1625 case RISCV::FSGNJ_D_IN32X:
1626 case RISCV::FSGNJ_S_INX:
1627 case RISCV::FSGNJ_H_INX:
1631 case RISCV::ADDI:
1632 case RISCV::ORI:
1633 case RISCV::XORI:
1635 MI.getOperand(1).getReg() == RISCV::X0) ||
1648 case RISCV::ADDI:
1654 case RISCV::FSGNJ_D:
1655 case RISCV::FSGNJ_S:
1656 case RISCV::FSGNJ_H:
1657 case RISCV::FSGNJ_D_INX:
1658 case RISCV::FSGNJ_D_IN32X:
1659 case RISCV::FSGNJ_S_INX:
1660 case RISCV::FSGNJ_H_INX:
1688 RISCV::getNamedOperandIdx(Root.getOpcode(), RISCV::OpName::frm);
1692 return RISCV::getNamedOperandIdx(MI->getOpcode(),
1693 RISCV::OpName::frm) < 0;
1704 if (static_cast<unsigned>(RISCV::getNamedOperandIdx(
1705 NewMI->getOpcode(), RISCV::OpName::frm)) != NewMI->getNumOperands())
1710 MIB.addUse(RISCV::FRM, RegState::Implicit);
1718 case RISCV::FADD_H:
1719 case RISCV::FADD_S:
1720 case RISCV::FADD_D:
1729 case RISCV::FSUB_H:
1730 case RISCV::FSUB_S:
1731 case RISCV::FSUB_D:
1740 case RISCV::FMUL_H:
1741 case RISCV::FMUL_S:
1742 case RISCV::FMUL_D:
1750 case RISCV::OPC##_M1: \
1751 case RISCV::OPC##_M2: \
1752 case RISCV::OPC##_M4: \
1753 case RISCV::OPC##_M8: \
1754 case RISCV::OPC##_MF2: \
1755 case RISCV::OPC##_MF4: \
1756 case RISCV::OPC##_MF8
1759 case RISCV::OPC##_M1_MASK: \
1760 case RISCV::OPC##_M2_MASK: \
1761 case RISCV::OPC##_M4_MASK: \
1762 case RISCV::OPC##_M8_MASK: \
1763 case RISCV::OPC##_MF2_MASK: \
1764 case RISCV::OPC##_MF4_MASK: \
1765 case RISCV::OPC##_MF8_MASK
1841 if (It->modifiesRegister(RISCV::V0, TRI)) {
1958 if (RISCV::getRVVMCOpcode(Root.getOpcode())) {
1980 RISCV::getNamedOperandIdx(Inst.getOpcode(), RISCV::OpName::frm);
1982 RISCV::getNamedOperandIdx(Sibling.getOpcode(), RISCV::OpName::frm);
1985 RISCV::hasEqualFRM(Inst, Sibling);
2008 case RISCV::ADD:
2009 case RISCV::ADDW:
2010 case RISCV::AND:
2011 case RISCV::OR:
2012 case RISCV::XOR:
2025 case RISCV::MUL:
2026 case RISCV::MULW:
2027 case RISCV::MIN:
2028 case RISCV::MINU:
2029 case RISCV::MAX:
2030 case RISCV::MAXU:
2031 case RISCV::FMIN_H:
2032 case RISCV::FMIN_S:
2033 case RISCV::FMIN_D:
2034 case RISCV::FMAX_H:
2035 case RISCV::FMAX_S:
2036 case RISCV::FMAX_D:
2046 case RISCV::OPC##_M1: \
2047 return RISCV::INV##_M1; \
2048 case RISCV::OPC##_M2: \
2049 return RISCV::INV##_M2; \
2050 case RISCV::OPC##_M4: \
2051 return RISCV::INV##_M4; \
2052 case RISCV::OPC##_M8: \
2053 return RISCV::INV##_M8; \
2054 case RISCV::OPC##_MF2: \
2055 return RISCV::INV##_MF2; \
2056 case RISCV::OPC##_MF4: \
2057 return RISCV::INV##_MF4; \
2058 case RISCV::OPC##_MF8: \
2059 return RISCV::INV##_MF8
2062 case RISCV::OPC##_M1_MASK: \
2063 return RISCV::INV##_M1_MASK; \
2064 case RISCV::OPC##_M2_MASK: \
2065 return RISCV::INV##_M2_MASK; \
2066 case RISCV::OPC##_M4_MASK: \
2067 return RISCV::INV##_M4_MASK; \
2068 case RISCV::OPC##_M8_MASK: \
2069 return RISCV::INV##_M8_MASK; \
2070 case RISCV::OPC##_MF2_MASK: \
2071 return RISCV::INV##_MF2_MASK; \
2072 case RISCV::OPC##_MF4_MASK: \
2073 return RISCV::INV##_MF4_MASK; \
2074 case RISCV::OPC##_MF8_MASK: \
2075 return RISCV::INV##_MF8_MASK
2080 case RISCV::FADD_H:
2081 return RISCV::FSUB_H;
2082 case RISCV::FADD_S:
2083 return RISCV::FSUB_S;
2084 case RISCV::FADD_D:
2085 return RISCV::FSUB_D;
2086 case RISCV::FSUB_H:
2087 return RISCV::FADD_H;
2088 case RISCV::FSUB_S:
2089 return RISCV::FADD_S;
2090 case RISCV::FSUB_D:
2091 return RISCV::FADD_D;
2092 case RISCV::ADD:
2093 return RISCV::SUB;
2094 case RISCV::SUB:
2095 return RISCV::ADD;
2096 case RISCV::ADDW:
2097 return RISCV::SUBW;
2098 case RISCV::SUBW:
2099 return RISCV::ADDW;
2136 return RISCV::hasEqualFRM(Root, *MI);
2194 const MachineInstr *ShiftMI = canCombine(MBB, MO, RISCV::SLLI);
2211 case RISCV::SH1ADD:
2213 case RISCV::SH2ADD:
2215 case RISCV::SH3ADD:
2230 const MachineInstr *AddMI = canCombine(MBB, Root.getOperand(2), RISCV::ADD);
2277 case RISCV::FADD_H:
2278 return RISCV::FMADD_H;
2279 case RISCV::FADD_S:
2280 return RISCV::FMADD_S;
2281 case RISCV::FADD_D:
2282 return RISCV::FMADD_D;
2283 case RISCV::FSUB_H:
2284 return Pattern == RISCVMachineCombinerPattern::FMSUB ? RISCV::FMSUB_H
2285 : RISCV::FNMSUB_H;
2286 case RISCV::FSUB_S:
2287 return Pattern == RISCVMachineCombinerPattern::FMSUB ? RISCV::FMSUB_S
2288 : RISCV::FNMSUB_S;
2289 case RISCV::FSUB_D:
2290 return Pattern == RISCVMachineCombinerPattern::FMSUB ? RISCV::FMSUB_D
2291 : RISCV::FNMSUB_D;
2377 InnerOpc = RISCV::ADD;
2380 InnerOpc = RISCV::SH1ADD;
2383 InnerOpc = RISCV::SH2ADD;
2386 InnerOpc = RISCV::SH3ADD;
2394 Register NewVR = MRI.createVirtualRegister(&RISCV::GPRRegClass);
2609 if (Op.isReg() && Op.getReg() != RISCV::NoRegister) {
2612 if (!RISCV::GPRRegClass.hasSubClassEq(RC)) {
2667 !MI.readsRegister(RISCV::FRM, /*TRI=*/nullptr)) {
2681 case RISCV::LB:
2682 case RISCV::LBU:
2683 case RISCV::LH:
2684 case RISCV::LH_INX:
2685 case RISCV::LHU:
2686 case RISCV::LW:
2687 case RISCV::LW_INX:
2688 case RISCV::LWU:
2689 case RISCV::LD:
2690 case RISCV::FLH:
2691 case RISCV::FLW:
2692 case RISCV::FLD:
2693 case RISCV::SB:
2694 case RISCV::SH:
2695 case RISCV::SH_INX:
2696 case RISCV::SW:
2697 case RISCV::SW_INX:
2698 case RISCV::SD:
2699 case RISCV::FSH:
2700 case RISCV::FSW:
2701 case RISCV::FSD:
2708 if (AddrI.getOpcode() != RISCV::ADDI || !AddrI.getOperand(1).isReg() ||
2756 case RISCV::LB:
2757 case RISCV::LBU:
2758 case RISCV::SB:
2759 case RISCV::LH:
2760 case RISCV::LH_INX:
2761 case RISCV::LHU:
2762 case RISCV::FLH:
2763 case RISCV::SH:
2764 case RISCV::SH_INX:
2765 case RISCV::FSH:
2766 case RISCV::LW:
2767 case RISCV::LW_INX:
2768 case RISCV::LWU:
2769 case RISCV::FLW:
2770 case RISCV::SW:
2771 case RISCV::SW_INX:
2772 case RISCV::FSW:
2773 case RISCV::LD:
2774 case RISCV::FLD:
2775 case RISCV::SD:
2776 case RISCV::FSD:
3027 return isMIModifiesReg(MI, TRI, RISCV::X5);
3030 return !C.isAvailableAcrossAndOutOfSeq(RISCV::X5, *TRI);
3106 (MI.isReturn() || isMIModifiesReg(MI, TRI, RISCV::X5)))
3145 MBB.addLiveIn(RISCV::X5);
3148 MBB.insert(MBB.end(), BuildMI(MF, DebugLoc(), get(RISCV::JALR))
3149 .addReg(RISCV::X0, RegState::Define)
3150 .addReg(RISCV::X5)
3159 It = MBB.insert(It, BuildMI(MF, DebugLoc(), get(RISCV::PseudoTAIL))
3167 BuildMI(MF, DebugLoc(), get(RISCV::PseudoCALLReg), RISCV::X5)
3183 if (MI.getOpcode() == RISCV::ADDI && MI.getOperand(1).isReg() &&
3244 RISCV::Pseudo##OP##_##LMUL
3247 RISCV::Pseudo##OP##_##LMUL##_MASK
3288 RISCV::PseudoV##OP##_##TYPE##_##LMUL
3310 RISCV::PseudoV##OP##_##TYPE##_##LMUL##_##SEW
3345 case RISCV::TH_MVEQZ:
3346 case RISCV::TH_MVNEZ:
3350 if (MI.getOperand(2).getReg() == RISCV::X0)
3354 case RISCV::TH_MULA:
3355 case RISCV::TH_MULAW:
3356 case RISCV::TH_MULAH:
3357 case RISCV::TH_MULS:
3358 case RISCV::TH_MULSW:
3359 case RISCV::TH_MULSH:
3362 case RISCV::PseudoCCMOVGPRNoX0:
3363 case RISCV::PseudoCCMOVGPR:
3501 case RISCV::PseudoV##OLDOP##_##TYPE##_##LMUL: \
3502 Opc = RISCV::PseudoV##NEWOP##_##TYPE##_##LMUL; \
3530 case RISCV::PseudoV##OLDOP##_##TYPE##_##LMUL##_##SEW: \
3531 Opc = RISCV::PseudoV##NEWOP##_##TYPE##_##LMUL##_##SEW; \
3573 case RISCV::TH_MVEQZ:
3574 case RISCV::TH_MVNEZ: {
3576 WorkingMI.setDesc(get(MI.getOpcode() == RISCV::TH_MVEQZ ? RISCV::TH_MVNEZ
3577 : RISCV::TH_MVEQZ));
3581 case RISCV::PseudoCCMOVGPRNoX0:
3582 case RISCV::PseudoCCMOVGPR: {
3701 RISCV::PseudoV##OP##_##LMUL##_TIED
3715 case RISCV::PseudoV##OP##_##LMUL##_TIED: \
3716 NewOpc = RISCV::PseudoV##OP##_##LMUL; \
3732 RISCV::PseudoV##OP##_##LMUL##_##SEW##_TIED
3746 case RISCV::PseudoV##OP##_##LMUL##_##SEW##_TIED: \
3747 NewOpc = RISCV::PseudoV##OP##_##LMUL##_##SEW; \
3886 BuildMI(MBB, II, DL, get(RISCV::SLLI), DestReg)
3898 Opc = RISCV::SH3ADD;
3901 Opc = RISCV::SH2ADD;
3904 Opc = RISCV::SH1ADD;
3910 BuildMI(MBB, II, DL, get(RISCV::SLLI), DestReg)
3919 Register ScaledRegister = MRI.createVirtualRegister(&RISCV::GPRRegClass);
3921 BuildMI(MBB, II, DL, get(RISCV::SLLI), ScaledRegister)
3925 BuildMI(MBB, II, DL, get(RISCV::ADD), DestReg)
3930 Register ScaledRegister = MRI.createVirtualRegister(&RISCV::GPRRegClass);
3932 BuildMI(MBB, II, DL, get(RISCV::SLLI), ScaledRegister)
3936 BuildMI(MBB, II, DL, get(RISCV::SUB), DestReg)
3941 Register N = MRI.createVirtualRegister(&RISCV::GPRRegClass);
3943 BuildMI(MBB, II, DL, get(RISCV::MUL), DestReg)
3953 BuildMI(MBB, II, DL, get(RISCV::SLLI), DestReg)
3960 Acc = MRI.createVirtualRegister(&RISCV::GPRRegClass);
3965 BuildMI(MBB, II, DL, get(RISCV::ADD), Acc)
3975 BuildMI(MBB, II, DL, get(RISCV::ADD), DestReg)
3997 bool RISCV::isSEXT_W(const MachineInstr &MI) {
3998 return MI.getOpcode() == RISCV::ADDIW && MI.getOperand(1).isReg() &&
4003 bool RISCV::isZEXT_W(const MachineInstr &MI) {
4004 return MI.getOpcode() == RISCV::ADD_UW && MI.getOperand(1).isReg() &&
4005 MI.getOperand(2).isReg() && MI.getOperand(2).getReg() == RISCV::X0;
4009 bool RISCV::isZEXT_B(const MachineInstr &MI) {
4010 return MI.getOpcode() == RISCV::ANDI && MI.getOperand(1).isReg() &&
4018 case RISCV::VS1R_V:
4019 case RISCV::VS2R_V:
4020 case RISCV::VS4R_V:
4021 case RISCV::VS8R_V:
4022 case RISCV::VL1RE8_V:
4023 case RISCV::VL2RE8_V:
4024 case RISCV::VL4RE8_V:
4025 case RISCV::VL8RE8_V:
4026 case RISCV::VL1RE16_V:
4027 case RISCV::VL2RE16_V:
4028 case RISCV::VL4RE16_V:
4029 case RISCV::VL8RE16_V:
4030 case RISCV::VL1RE32_V:
4031 case RISCV::VL2RE32_V:
4032 case RISCV::VL4RE32_V:
4033 case RISCV::VL8RE32_V:
4034 case RISCV::VL1RE64_V:
4035 case RISCV::VL2RE64_V:
4036 case RISCV::VL4RE64_V:
4037 case RISCV::VL8RE64_V:
4042 bool RISCV::isRVVSpill(const MachineInstr &MI) {
4053 RISCV::isRVVSpillForZvlsseg(unsigned Opcode) {
4057 case RISCV::PseudoVSPILL2_M1:
4058 case RISCV::PseudoVRELOAD2_M1:
4060 case RISCV::PseudoVSPILL2_M2:
4061 case RISCV::PseudoVRELOAD2_M2:
4063 case RISCV::PseudoVSPILL2_M4:
4064 case RISCV::PseudoVRELOAD2_M4:
4066 case RISCV::PseudoVSPILL3_M1:
4067 case RISCV::PseudoVRELOAD3_M1:
4069 case RISCV::PseudoVSPILL3_M2:
4070 case RISCV::PseudoVRELOAD3_M2:
4072 case RISCV::PseudoVSPILL4_M1:
4073 case RISCV::PseudoVRELOAD4_M1:
4075 case RISCV::PseudoVSPILL4_M2:
4076 case RISCV::PseudoVRELOAD4_M2:
4078 case RISCV::PseudoVSPILL5_M1:
4079 case RISCV::PseudoVRELOAD5_M1:
4081 case RISCV::PseudoVSPILL6_M1:
4082 case RISCV::PseudoVRELOAD6_M1:
4084 case RISCV::PseudoVSPILL7_M1:
4085 case RISCV::PseudoVRELOAD7_M1:
4087 case RISCV::PseudoVSPILL8_M1:
4088 case RISCV::PseudoVRELOAD8_M1:
4093 bool RISCV::isFaultFirstLoad(const MachineInstr &MI) {
4095 MI.modifiesRegister(RISCV::VL, /*TRI=*/nullptr) && !MI.isInlineAsm();
4098 bool RISCV::hasEqualFRM(const MachineInstr &MI1, const MachineInstr &MI2) {
4100 RISCV::getNamedOperandIdx(MI1.getOpcode(), RISCV::OpName::frm);
4102 RISCV::getNamedOperandIdx(MI2.getOpcode(), RISCV::OpName::frm);
4111 RISCV::getVectorLowDemandedScalarBits(uint16_t Opcode, unsigned Log2SEW) {
4118 case RISCV::VSLL_VX:
4119 case RISCV::VSRL_VX:
4120 case RISCV::VSRA_VX:
4122 case RISCV::VSSRL_VX:
4123 case RISCV::VSSRA_VX:
4128 case RISCV::VNSRL_WX:
4129 case RISCV::VNSRA_WX:
4131 case RISCV::VNCLIPU_WX:
4132 case RISCV::VNCLIP_WX:
4137 case RISCV::VADD_VX:
4138 case RISCV::VSUB_VX:
4139 case RISCV::VRSUB_VX:
4141 case RISCV::VWADDU_VX:
4142 case RISCV::VWSUBU_VX:
4143 case RISCV::VWADD_VX:
4144 case RISCV::VWSUB_VX:
4145 case RISCV::VWADDU_WX:
4146 case RISCV::VWSUBU_WX:
4147 case RISCV::VWADD_WX:
4148 case RISCV::VWSUB_WX:
4150 case RISCV::VADC_VXM:
4151 case RISCV::VADC_VIM:
4152 case RISCV::VMADC_VXM:
4153 case RISCV::VMADC_VIM:
4154 case RISCV::VMADC_VX:
4155 case RISCV::VSBC_VXM:
4156 case RISCV::VMSBC_VXM:
4157 case RISCV::VMSBC_VX:
4159 case RISCV::VAND_VX:
4160 case RISCV::VOR_VX:
4161 case RISCV::VXOR_VX:
4163 case RISCV::VMSEQ_VX:
4164 case RISCV::VMSNE_VX:
4165 case RISCV::VMSLTU_VX:
4166 case RISCV::VMSLT_VX:
4167 case RISCV::VMSLEU_VX:
4168 case RISCV::VMSLE_VX:
4169 case RISCV::VMSGTU_VX:
4170 case RISCV::VMSGT_VX:
4172 case RISCV::VMINU_VX:
4173 case RISCV::VMIN_VX:
4174 case RISCV::VMAXU_VX:
4175 case RISCV::VMAX_VX:
4177 case RISCV::VMUL_VX:
4178 case RISCV::VMULH_VX:
4179 case RISCV::VMULHU_VX:
4180 case RISCV::VMULHSU_VX:
4182 case RISCV::VDIVU_VX:
4183 case RISCV::VDIV_VX:
4184 case RISCV::VREMU_VX:
4185 case RISCV::VREM_VX:
4187 case RISCV::VWMUL_VX:
4188 case RISCV::VWMULU_VX:
4189 case RISCV::VWMULSU_VX:
4191 case RISCV::VMACC_VX:
4192 case RISCV::VNMSAC_VX:
4193 case RISCV::VMADD_VX:
4194 case RISCV::VNMSUB_VX:
4196 case RISCV::VWMACCU_VX:
4197 case RISCV::VWMACC_VX:
4198 case RISCV::VWMACCSU_VX:
4199 case RISCV::VWMACCUS_VX:
4201 case RISCV::VMERGE_VXM:
4203 case RISCV::VMV_V_X:
4205 case RISCV::VSADDU_VX:
4206 case RISCV::VSADD_VX:
4207 case RISCV::VSSUBU_VX:
4208 case RISCV::VSSUB_VX:
4210 case RISCV::VAADDU_VX:
4211 case RISCV::VAADD_VX:
4212 case RISCV::VASUBU_VX:
4213 case RISCV::VASUB_VX:
4215 case RISCV::VSMUL_VX:
4217 case RISCV::VMV_S_X:
4222 unsigned RISCV::getRVVMCOpcode(unsigned RVVPseudoOpcode) {
4230 unsigned RISCV::getDestLog2EEW(const MCInstrDesc &Desc, unsigned Log2SEW) {
4243 bool RISCV::isVLKnownLE(const MachineOperand &LHS, const MachineOperand &RHS) {
4247 if (RHS.isImm() && RHS.getImm() == RISCV::VLMaxSentinel)
4249 if (LHS.isImm() && LHS.getImm() == RISCV::VLMaxSentinel)