aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
diff options
context:
space:
mode:
authorArtem Tamazov <artem.tamazov@amd.com>2016-04-27 15:17:03 +0000
committerArtem Tamazov <artem.tamazov@amd.com>2016-04-27 15:17:03 +0000
commit5cd55b17848e16ba170e2898a5f426bcde3f350f (patch)
treea8111b0dd8dc32aa4309fa46afab3fa4ad134490 /llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
parente69b9548b87d30fd148e1b24eb3c6b1c8dda59ca (diff)
downloadllvm-5cd55b17848e16ba170e2898a5f426bcde3f350f.zip
llvm-5cd55b17848e16ba170e2898a5f426bcde3f350f.tar.gz
llvm-5cd55b17848e16ba170e2898a5f426bcde3f350f.tar.bz2
[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/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp37
1 files changed, 28 insertions, 9 deletions
diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp
index 500a3aa..af85e64 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)