diff options
| author | Artem Tamazov <artem.tamazov@amd.com> | 2016-04-27 15:17:03 +0000 |
|---|---|---|
| committer | Artem Tamazov <artem.tamazov@amd.com> | 2016-04-27 15:17:03 +0000 |
| commit | 5cd55b17848e16ba170e2898a5f426bcde3f350f (patch) | |
| tree | a8111b0dd8dc32aa4309fa46afab3fa4ad134490 /llvm/lib | |
| parent | e69b9548b87d30fd148e1b24eb3c6b1c8dda59ca (diff) | |
| download | bcm5719-llvm-5cd55b17848e16ba170e2898a5f426bcde3f350f.tar.gz bcm5719-llvm-5cd55b17848e16ba170e2898a5f426bcde3f350f.zip | |
[AMDGPU][llvm-mc] s_getreg/setreg* - Support symbolic names of hardware registers.
Possibility to specify code of hardware register kept.
Disassemble to symbolic name, if name is known.
Tests updated/added.
Differential Revision: http://reviews.llvm.org/D19335
llvm-svn: 267724
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp | 37 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp | 18 |
2 files changed, 42 insertions, 13 deletions
diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp index 500a3aa40e8..af85e64db20 100644 --- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp @@ -543,7 +543,7 @@ public: bool parseCnt(int64_t &IntVal); OperandMatchResultTy parseSWaitCntOps(OperandVector &Operands); - bool parseHwreg(int64_t &HwRegCode, int64_t &Offset, int64_t &Width); + bool parseHwreg(int64_t &HwRegCode, int64_t &Offset, int64_t &Width, bool &IsIdentifier); OperandMatchResultTy parseHwregOp(OperandVector &Operands); OperandMatchResultTy parseSOppBrTarget(OperandVector &Operands); @@ -1612,7 +1612,7 @@ AMDGPUAsmParser::parseSWaitCntOps(OperandVector &Operands) { return MatchOperand_Success; } -bool AMDGPUAsmParser::parseHwreg(int64_t &HwRegCode, int64_t &Offset, int64_t &Width) { +bool AMDGPUAsmParser::parseHwreg(int64_t &HwRegCode, int64_t &Offset, int64_t &Width, bool &IsIdentifier) { if (Parser.getTok().getString() != "hwreg") return true; Parser.Lex(); @@ -1621,10 +1621,25 @@ bool AMDGPUAsmParser::parseHwreg(int64_t &HwRegCode, int64_t &Offset, int64_t &W return true; Parser.Lex(); - if (getLexer().isNot(AsmToken::Integer)) - return true; - if (getParser().parseAbsoluteExpression(HwRegCode)) - return true; + if (getLexer().is(AsmToken::Identifier)) { + IsIdentifier = true; + HwRegCode = StringSwitch<unsigned>(Parser.getTok().getString()) + .Case("HW_REG_MODE" , 1) + .Case("HW_REG_STATUS" , 2) + .Case("HW_REG_TRAPSTS" , 3) + .Case("HW_REG_HW_ID" , 4) + .Case("HW_REG_GPR_ALLOC", 5) + .Case("HW_REG_LDS_ALLOC", 6) + .Case("HW_REG_IB_STS" , 7) + .Default(-1); + Parser.Lex(); + } else { + IsIdentifier = false; + if (getLexer().isNot(AsmToken::Integer)) + return true; + if (getParser().parseAbsoluteExpression(HwRegCode)) + return true; + } if (getLexer().is(AsmToken::RParen)) { Parser.Lex(); @@ -1676,16 +1691,20 @@ AMDGPUAsmParser::parseHwregOp(OperandVector &Operands) { break; case AsmToken::Identifier: { - int64_t HwRegCode = 0; + bool IsIdentifier = false; + int64_t HwRegCode = -1; int64_t Offset = 0; // default int64_t Width = 32; // default - if (parseHwreg(HwRegCode, Offset, Width)) + if (parseHwreg(HwRegCode, Offset, Width, IsIdentifier)) return MatchOperand_ParseFail; // HwRegCode (6) [5:0] // Offset (5) [10:6] // WidthMinusOne (5) [15:11] if (HwRegCode < 0 || HwRegCode > 63) - Error(S, "invalid code of hardware register: only 6-bit values are legal"); + if (IsIdentifier) + Error(S, "invalid symbolic name of hardware register"); + else + Error(S, "invalid code of hardware register: only 6-bit values are legal"); if (Offset < 0 || Offset > 31) Error(S, "invalid bit offset: only 5-bit values are legal"); if (Width < 1 || Width > 32) diff --git a/llvm/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp b/llvm/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp index 8ac3caf0081..1ea8c77be69 100644 --- a/llvm/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp +++ b/llvm/lib/Target/AMDGPU/InstPrinter/AMDGPUInstPrinter.cpp @@ -814,11 +814,21 @@ void AMDGPUInstPrinter::printHwreg(const MCInst *MI, unsigned OpNo, const unsigned Offset = (SImm16 >> 6) & 0x1f; const unsigned Width = ((SImm16 >> 11) & 0x1F) + 1; - if (Width == 32 && Offset == 0) { - O << "hwreg(" << HwRegCode << ')'; - } else { - O << "hwreg(" << HwRegCode << ", " << Offset << ", " << Width << ')'; + O << "hwreg("; + switch(HwRegCode) { + case 1: O << "HW_REG_MODE" ; break; + case 2: O << "HW_REG_STATUS" ; break; + case 3: O << "HW_REG_TRAPSTS" ; break; + case 4: O << "HW_REG_HW_ID" ; break; + case 5: O << "HW_REG_GPR_ALLOC" ; break; + case 6: O << "HW_REG_LDS_ALLOC" ; break; + case 7: O << "HW_REG_IB_STS" ; break; + default: O << HwRegCode; break; + } + if (! (Width == 32 && Offset == 0)) { + O << ", " << Offset << ", " << Width; } + O << ')'; } #include "AMDGPUGenAsmWriter.inc" |

