diff options
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp | 15 | ||||
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 11 | 
3 files changed, 11 insertions, 18 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp index b18bd2ca426..60be9451f4b 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterInlineAsm.cpp @@ -601,7 +601,8 @@ void AsmPrinter::PrintSpecial(const MachineInstr *MI, raw_ostream &OS,  /// PrintAsmOperand - Print the specified operand of MI, an INLINEASM  /// instruction, using the specified assembler variant.  Targets should -/// override this to format as appropriate. +/// override this to format as appropriate for machine specific ExtraCodes +/// or when the arch-independent handling would be too complex otherwise.  bool AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,                                   const char *ExtraCode, raw_ostream &O) {    // Does this asm operand have a single letter operand modifier? @@ -613,18 +614,24 @@ bool AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,      switch (ExtraCode[0]) {      default:        return true;  // Unknown modifier. +    case 'a': // Print as memory address. +      if (MO.isReg()) { +        PrintAsmMemoryOperand(MI, OpNo, nullptr, O); +        return false; +      } +      LLVM_FALLTHROUGH; // GCC allows '%a' to behave like '%c' with immediates.      case 'c': // Substitute immediate value without immediate syntax -      if (MO.getType() != MachineOperand::MO_Immediate) +      if (!MO.isImm())          return true;        O << MO.getImm();        return false;      case 'n':  // Negate the immediate constant. -      if (MO.getType() != MachineOperand::MO_Immediate) +      if (!MO.isImm())          return true;        O << -MO.getImm();        return false;      case 's':  // The GCC deprecated s modifier -      if (MO.getType() != MachineOperand::MO_Immediate) +      if (!MO.isImm())          return true;        O << ((32 - MO.getImm()) & 31);        return false; diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp index ac5bdae9f1f..591d1a8bee1 100644 --- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -504,9 +504,6 @@ bool AArch64AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,      switch (ExtraCode[0]) {      default:        return true; // Unknown modifier. -    case 'a':      // Print 'a' modifier -      PrintAsmMemoryOperand(MI, OpNum, ExtraCode, O); -      return false;      case 'w':      // Print W register      case 'x':      // Print X register        if (MO.isReg()) diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp index dd2b472f8eb..94ff8ee4099 100644 --- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp @@ -264,17 +264,6 @@ bool ARMAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,      default:        // See if this is a generic print operand        return AsmPrinter::PrintAsmOperand(MI, OpNum, ExtraCode, O); -    case 'a': // Print as a memory address. -      if (MI->getOperand(OpNum).isReg()) { -        O << "[" -          << ARMInstPrinter::getRegisterName(MI->getOperand(OpNum).getReg()) -          << "]"; -        return false; -      } else if (MI->getOperand(OpNum).isImm()) { -        O << MI->getOperand(OpNum).getImm(); -        return false; -      } -      return true;      case 'P': // Print a VFP double precision register.      case 'q': // Print a NEON quad precision register.        printOperand(MI, OpNum, O);  | 

