diff options
| -rw-r--r-- | llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp | 75 | ||||
| -rw-r--r-- | llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.h | 6 | 
2 files changed, 47 insertions, 34 deletions
diff --git a/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp b/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp index 71058799069..a945afa6c7e 100644 --- a/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp +++ b/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.cpp @@ -41,43 +41,56 @@ void AMDGPUInstPrinter::printRegOperand(unsigned reg, raw_ostream &O) {      break;    } -  // It's seems there's no way to use SIRegisterInfo here, and dealing with the -  // giant enum of all the different shifted sets of registers is pretty -  // unmanagable, so parse the name and reformat it to be prettier. -  StringRef Name(getRegisterName(reg)); - -  std::pair<StringRef, StringRef> Split = Name.split('_'); -  StringRef SubRegName = Split.first; -  StringRef Rest = Split.second; - -  if (SubRegName.size() <= 4) { // Must at least be as long as "SGPR"/"VGPR". -    O << Name; -    return; -  } - -  unsigned RegIndex; -  StringRef RegIndexStr = SubRegName.drop_front(4); - -  if (RegIndexStr.getAsInteger(10, RegIndex)) { -    O << Name; +  char Type; +  unsigned NumRegs; + +  if (MRI.getRegClass(AMDGPU::VGPR_32RegClassID).contains(reg)) { +    Type = 'v'; +    NumRegs = 1; +  } else  if (MRI.getRegClass(AMDGPU::SGPR_32RegClassID).contains(reg)) { +    Type = 's'; +    NumRegs = 1; +  } else if (MRI.getRegClass(AMDGPU::VReg_64RegClassID).contains(reg)) { +    Type = 'v'; +    NumRegs = 2; +  } else  if (MRI.getRegClass(AMDGPU::SReg_64RegClassID).contains(reg)) { +    Type = 's'; +    NumRegs = 2; +  } else if (MRI.getRegClass(AMDGPU::VReg_128RegClassID).contains(reg)) { +    Type = 'v'; +    NumRegs = 4; +  } else  if (MRI.getRegClass(AMDGPU::SReg_128RegClassID).contains(reg)) { +    Type = 's'; +    NumRegs = 4; +  } else if (MRI.getRegClass(AMDGPU::VReg_96RegClassID).contains(reg)) { +    Type = 'v'; +    NumRegs = 3; +  } else if (MRI.getRegClass(AMDGPU::VReg_256RegClassID).contains(reg)) { +    Type = 'v'; +    NumRegs = 8; +  } else if (MRI.getRegClass(AMDGPU::SReg_256RegClassID).contains(reg)) { +    Type = 's'; +    NumRegs = 8; +  } else if (MRI.getRegClass(AMDGPU::VReg_512RegClassID).contains(reg)) { +    Type = 'v'; +    NumRegs = 16; +  } else if (MRI.getRegClass(AMDGPU::SReg_512RegClassID).contains(reg)) { +    Type = 's'; +    NumRegs = 16; +  } else { +    O << getRegisterName(reg);      return;    } -  if (SubRegName.front() == 'V') -    O << 'v'; -  else if (SubRegName.front() == 'S') -    O << 's'; -  else { -    O << Name; +  // The low 8 bits encoding value is the register index, for both VGPRs and +  // SGPRs. +  unsigned RegIdx = MRI.getEncodingValue(reg) & ((1 << 8)  - 1); +  if (NumRegs == 1) { +    O << Type << RegIdx;      return;    } -  if (Rest.empty()) // Only 1 32-bit register -    O << RegIndex; -  else { -    unsigned NumReg = Rest.count('_') + 2; -    O << '[' << RegIndex << ':' << (RegIndex + NumReg - 1) << ']'; -  } +  O << Type << '[' << RegIdx << ':' << (RegIdx + NumRegs - 1) << ']';  }  void AMDGPUInstPrinter::printOperand(const MCInst *MI, unsigned OpNo, diff --git a/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.h b/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.h index 1d24680f1f2..90865d93e1f 100644 --- a/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.h +++ b/llvm/lib/Target/R600/InstPrinter/AMDGPUInstPrinter.h @@ -32,10 +32,10 @@ public:    virtual void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot);  private: -  static void printRegOperand(unsigned RegNo, raw_ostream &O); -  static void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); +  void printRegOperand(unsigned RegNo, raw_ostream &O); +  void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);    static void printInterpSlot(const MCInst *MI, unsigned OpNum, raw_ostream &O); -  static void printMemOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); +  void printMemOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);    static void printIfSet(const MCInst *MI, unsigned OpNo, raw_ostream &O,                           StringRef Asm, StringRef Default = "");    static void printAbs(const MCInst *MI, unsigned OpNo, raw_ostream &O);  | 

