diff options
author | Matheus Almeida <matheus.almeida@imgtec.com> | 2013-10-21 12:26:50 +0000 |
---|---|---|
committer | Matheus Almeida <matheus.almeida@imgtec.com> | 2013-10-21 12:26:50 +0000 |
commit | 006cff8d7b60ddf632f8642f01693dace7827d8b (patch) | |
tree | 9789dabdb04ff17f902100ce5385d30a57334644 /lib/Target/Mips/AsmParser | |
parent | cebd4010222f28bb68c217047fd0b2c90498f7ca (diff) | |
download | llvm-006cff8d7b60ddf632f8642f01693dace7827d8b.tar.gz llvm-006cff8d7b60ddf632f8642f01693dace7827d8b.tar.bz2 llvm-006cff8d7b60ddf632f8642f01693dace7827d8b.tar.xz |
[mips][msa] Direct Object Emission support for CTCMSA and CFCMSA.
These instructions are logically related as they allow read/write of MSA control registers.
Currently MSA control registers are emitted by number but hopefully that will change as soon
as GAS starts accepting them by name as that would make the assembly easier to read.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193078 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Mips/AsmParser')
-rw-r--r-- | lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 79 |
1 files changed, 78 insertions, 1 deletions
diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index 16260857c2..fa7f7c5cdc 100644 --- a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -92,6 +92,10 @@ class MipsAsmParser : public MCTargetAsmParser { int RegKind); MipsAsmParser::OperandMatchResultTy + parseMSACtrlRegs(SmallVectorImpl<MCParsedAsmOperand *> &Operands, + int RegKind); + + MipsAsmParser::OperandMatchResultTy parseMemOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands); bool parsePtrReg(SmallVectorImpl<MCParsedAsmOperand*> &Operands, int RegKind); @@ -151,6 +155,9 @@ class MipsAsmParser : public MCTargetAsmParser { parseMSA128DRegs(SmallVectorImpl<MCParsedAsmOperand*> &Operands); MipsAsmParser::OperandMatchResultTy + parseMSA128CtrlRegs(SmallVectorImpl<MCParsedAsmOperand*> &Operands); + + MipsAsmParser::OperandMatchResultTy parseInvNum(SmallVectorImpl<MCParsedAsmOperand*> &Operands); bool searchSymbolAlias(SmallVectorImpl<MCParsedAsmOperand*> &Operands, @@ -228,6 +235,8 @@ class MipsAsmParser : public MCTargetAsmParser { int matchMSA128RegisterName(StringRef Name); + int matchMSA128CtrlRegisterName(StringRef Name); + int regKindToRegClass(int RegKind); unsigned getReg(int RC, int RegNo); @@ -282,7 +291,8 @@ public: Kind_MSA128BRegs, Kind_MSA128HRegs, Kind_MSA128WRegs, - Kind_MSA128DRegs + Kind_MSA128DRegs, + Kind_MSA128CtrlRegs }; private: @@ -521,6 +531,10 @@ public: return Kind == k_Register && Reg.Kind == Kind_MSA128DRegs; } + bool isMSA128CRAsm() const { + return Kind == k_Register && Reg.Kind == Kind_MSA128CtrlRegs; + } + /// getStartLoc - Get the location of the first token of this operand. SMLoc getStartLoc() const { return StartLoc; @@ -982,6 +996,23 @@ int MipsAsmParser::matchMSA128RegisterName(StringRef Name) { return IntVal; } +int MipsAsmParser::matchMSA128CtrlRegisterName(StringRef Name) { + int CC; + + CC = StringSwitch<unsigned>(Name) + .Case("msair", 0) + .Case("msacsr", 1) + .Case("msaaccess", 2) + .Case("msasave", 3) + .Case("msamodify", 4) + .Case("msarequest", 5) + .Case("msamap", 6) + .Case("msaunmap", 7) + .Default(-1); + + return CC; +} + int MipsAsmParser::matchRegisterName(StringRef Name, bool is64BitReg) { int CC; @@ -1014,6 +1045,7 @@ int MipsAsmParser::regKindToRegClass(int RegKind) { case MipsOperand::Kind_MSA128HRegs: return Mips::MSA128HRegClassID; case MipsOperand::Kind_MSA128WRegs: return Mips::MSA128WRegClassID; case MipsOperand::Kind_MSA128DRegs: return Mips::MSA128DRegClassID; + case MipsOperand::Kind_MSA128CtrlRegs: return Mips::MSACtrlRegClassID; default :return -1; } @@ -1715,6 +1747,45 @@ MipsAsmParser::parseMSARegs(SmallVectorImpl<MCParsedAsmOperand*> &Operands, } MipsAsmParser::OperandMatchResultTy +MipsAsmParser::parseMSACtrlRegs(SmallVectorImpl<MCParsedAsmOperand *> &Operands, + int RegKind) { + MipsOperand::RegisterKind Kind = (MipsOperand::RegisterKind)RegKind; + + if (Kind != MipsOperand::Kind_MSA128CtrlRegs) + return MatchOperand_NoMatch; + + if (Parser.getTok().isNot(AsmToken::Dollar)) + return MatchOperand_ParseFail; + + SMLoc S = Parser.getTok().getLoc(); + + Parser.Lex(); // Eat the '$' symbol. + + int RegNum = -1; + if (getLexer().getKind() == AsmToken::Identifier) + RegNum = matchMSA128CtrlRegisterName(Parser.getTok().getString().lower()); + else if (getLexer().getKind() == AsmToken::Integer) + RegNum = Parser.getTok().getIntVal(); + else + return MatchOperand_ParseFail; + + if (RegNum < 0 || RegNum > 7) + return MatchOperand_ParseFail; + + int RegVal = getReg(regKindToRegClass(Kind), RegNum); + if (RegVal == -1) + return MatchOperand_ParseFail; + + MipsOperand *RegOp = MipsOperand::CreateReg(RegVal, S, + Parser.getTok().getLoc()); + RegOp->setRegKind(MipsOperand::Kind_MSA128CtrlRegs); + Operands.push_back(RegOp); + Parser.Lex(); // Eat the register identifier. + + return MatchOperand_Success; +} + +MipsAsmParser::OperandMatchResultTy MipsAsmParser::parseGPR64(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { if (!isMips64()) @@ -1878,6 +1949,12 @@ MipsAsmParser::parseMSA128DRegs( return parseMSARegs(Operands, (int) MipsOperand::Kind_MSA128DRegs); } +MipsAsmParser::OperandMatchResultTy +MipsAsmParser::parseMSA128CtrlRegs( + SmallVectorImpl<MCParsedAsmOperand *> &Operands) { + return parseMSACtrlRegs(Operands, (int) MipsOperand::Kind_MSA128CtrlRegs); +} + bool MipsAsmParser::searchSymbolAlias( SmallVectorImpl<MCParsedAsmOperand*> &Operands, unsigned RegKind) { |