diff options
Diffstat (limited to 'llvm/lib/Target/RISCV')
| -rw-r--r-- | llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp | 36 | 
1 files changed, 27 insertions, 9 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp index 2afa1fb0e4c..57631dcb511 100644 --- a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp +++ b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp @@ -87,20 +87,38 @@ bool RISCVAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,    if (!AsmPrinter::PrintAsmOperand(MI, OpNo, ExtraCode, OS))      return false; -  if (!ExtraCode) { -    const MachineOperand &MO = MI->getOperand(OpNo); -    switch (MO.getType()) { -    case MachineOperand::MO_Immediate: -      OS << MO.getImm(); -      return false; -    case MachineOperand::MO_Register: -      OS << RISCVInstPrinter::getRegisterName(MO.getReg()); -      return false; +  const MachineOperand &MO = MI->getOperand(OpNo); +  if (ExtraCode && ExtraCode[0]) { +    if (ExtraCode[1] != 0) +      return true; // Unknown modifier. + +    switch (ExtraCode[0]) {      default: +      return true; // Unknown modifier. +    case 'z':      // Print zero register if zero, regular printing otherwise. +      if (MO.isImm() && MO.getImm() == 0) { +        OS << RISCVInstPrinter::getRegisterName(RISCV::X0); +        return false; +      }        break; +    case 'i': // Literal 'i' if operand is not a register. +      if (!MO.isReg()) +        OS << 'i'; +      return false;      }    } +  switch (MO.getType()) { +  case MachineOperand::MO_Immediate: +    OS << MO.getImm(); +    return false; +  case MachineOperand::MO_Register: +    OS << RISCVInstPrinter::getRegisterName(MO.getReg()); +    return false; +  default: +    break; +  } +    return true;  }  | 

