/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|*                                                                            *|
|* Pseudo-instruction MC lowering Source Fragment                             *|
|*                                                                            *|
|* Automatically generated file, do not edit!                                 *|
|*                                                                            *|
\*===----------------------------------------------------------------------===*/

bool RISCVAsmPrinter::
emitPseudoExpansionLowering(MCStreamer &OutStreamer,
                            const MachineInstr *MI) {
  switch (MI->getOpcode()) {
  default: return false;
  case RISCV::PseudoBR: {
    MCInst TmpInst;
    MCOperand MCOp;
    TmpInst.setOpcode(RISCV::JAL);
    // Operand: rd
    TmpInst.addOperand(MCOperand::createReg(RISCV::X0));
    // Operand: imm20
    lowerOperand(MI->getOperand(0), MCOp);
    TmpInst.addOperand(MCOp);
    EmitToStreamer(OutStreamer, TmpInst);
    break;
  }
  case RISCV::PseudoBRIND: {
    MCInst TmpInst;
    MCOperand MCOp;
    TmpInst.setOpcode(RISCV::JALR);
    // Operand: rd
    TmpInst.addOperand(MCOperand::createReg(RISCV::X0));
    // Operand: rs1
    lowerOperand(MI->getOperand(0), MCOp);
    TmpInst.addOperand(MCOp);
    // Operand: imm12
    lowerOperand(MI->getOperand(1), MCOp);
    TmpInst.addOperand(MCOp);
    EmitToStreamer(OutStreamer, TmpInst);
    break;
  }
  case RISCV::PseudoCALLIndirect: {
    MCInst TmpInst;
    MCOperand MCOp;
    TmpInst.setOpcode(RISCV::JALR);
    // Operand: rd
    TmpInst.addOperand(MCOperand::createReg(RISCV::X1));
    // Operand: rs1
    lowerOperand(MI->getOperand(0), MCOp);
    TmpInst.addOperand(MCOp);
    // Operand: imm12
    TmpInst.addOperand(MCOperand::createImm(0));
    EmitToStreamer(OutStreamer, TmpInst);
    break;
  }
  case RISCV::PseudoRET: {
    MCInst TmpInst;
    MCOperand MCOp;
    TmpInst.setOpcode(RISCV::JALR);
    // Operand: rd
    TmpInst.addOperand(MCOperand::createReg(RISCV::X0));
    // Operand: rs1
    TmpInst.addOperand(MCOperand::createReg(RISCV::X1));
    // Operand: imm12
    TmpInst.addOperand(MCOperand::createImm(0));
    EmitToStreamer(OutStreamer, TmpInst);
    break;
  }
  case RISCV::PseudoTAILIndirect: {
    MCInst TmpInst;
    MCOperand MCOp;
    TmpInst.setOpcode(RISCV::JALR);
    // Operand: rd
    TmpInst.addOperand(MCOperand::createReg(RISCV::X0));
    // Operand: rs1
    lowerOperand(MI->getOperand(0), MCOp);
    TmpInst.addOperand(MCOp);
    // Operand: imm12
    TmpInst.addOperand(MCOperand::createImm(0));
    EmitToStreamer(OutStreamer, TmpInst);
    break;
  }
  case RISCV::ReadFFLAGS: {
    MCInst TmpInst;
    MCOperand MCOp;
    TmpInst.setOpcode(RISCV::CSRRS);
    // Operand: rd
    lowerOperand(MI->getOperand(0), MCOp);
    TmpInst.addOperand(MCOp);
    // Operand: imm12
    TmpInst.addOperand(MCOperand::createImm(1));
    // Operand: rs1
    TmpInst.addOperand(MCOperand::createReg(RISCV::X0));
    EmitToStreamer(OutStreamer, TmpInst);
    break;
  }
  case RISCV::ReadFRM: {
    MCInst TmpInst;
    MCOperand MCOp;
    TmpInst.setOpcode(RISCV::CSRRS);
    // Operand: rd
    lowerOperand(MI->getOperand(0), MCOp);
    TmpInst.addOperand(MCOp);
    // Operand: imm12
    TmpInst.addOperand(MCOperand::createImm(2));
    // Operand: rs1
    TmpInst.addOperand(MCOperand::createReg(RISCV::X0));
    EmitToStreamer(OutStreamer, TmpInst);
    break;
  }
  case RISCV::SwapFRMImm: {
    MCInst TmpInst;
    MCOperand MCOp;
    TmpInst.setOpcode(RISCV::CSRRWI);
    // Operand: rd
    lowerOperand(MI->getOperand(0), MCOp);
    TmpInst.addOperand(MCOp);
    // Operand: imm12
    TmpInst.addOperand(MCOperand::createImm(2));
    // Operand: rs1
    lowerOperand(MI->getOperand(1), MCOp);
    TmpInst.addOperand(MCOp);
    EmitToStreamer(OutStreamer, TmpInst);
    break;
  }
  case RISCV::WriteFFLAGS: {
    MCInst TmpInst;
    MCOperand MCOp;
    TmpInst.setOpcode(RISCV::CSRRW);
    // Operand: rd
    TmpInst.addOperand(MCOperand::createReg(RISCV::X0));
    // Operand: imm12
    TmpInst.addOperand(MCOperand::createImm(1));
    // Operand: rs1
    lowerOperand(MI->getOperand(0), MCOp);
    TmpInst.addOperand(MCOp);
    EmitToStreamer(OutStreamer, TmpInst);
    break;
  }
  case RISCV::WriteFRM: {
    MCInst TmpInst;
    MCOperand MCOp;
    TmpInst.setOpcode(RISCV::CSRRW);
    // Operand: rd
    TmpInst.addOperand(MCOperand::createReg(RISCV::X0));
    // Operand: imm12
    TmpInst.addOperand(MCOperand::createImm(2));
    // Operand: rs1
    lowerOperand(MI->getOperand(0), MCOp);
    TmpInst.addOperand(MCOp);
    EmitToStreamer(OutStreamer, TmpInst);
    break;
  }
  case RISCV::WriteFRMImm: {
    MCInst TmpInst;
    MCOperand MCOp;
    TmpInst.setOpcode(RISCV::CSRRWI);
    // Operand: rd
    TmpInst.addOperand(MCOperand::createReg(RISCV::X0));
    // Operand: imm12
    TmpInst.addOperand(MCOperand::createImm(2));
    // Operand: rs1
    lowerOperand(MI->getOperand(0), MCOp);
    TmpInst.addOperand(MCOp);
    EmitToStreamer(OutStreamer, TmpInst);
    break;
  }
  }
  return true;
}

