diff options
Diffstat (limited to 'llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp')
| -rw-r--r-- | llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp index d5a3a19446c7..2b815a366ccd 100644 --- a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp +++ b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp @@ -565,7 +565,7 @@ struct InsnMatchEntry { StringRef Format; uint64_t Opcode; int32_t NumOperands; - MatchClassKind OperandKinds[5]; + MatchClassKind OperandKinds[7]; }; // For equal_range comparison. @@ -633,7 +633,20 @@ static struct InsnMatchEntry InsnMatchTable[] = { { "sse", SystemZ::InsnSSE, 3, { MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12 } }, { "ssf", SystemZ::InsnSSF, 4, - { MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg } } + { MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg } }, + { "vri", SystemZ::InsnVRI, 6, + { MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U12Imm, MCK_U4Imm, MCK_U4Imm } }, + { "vrr", SystemZ::InsnVRR, 7, + { MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm, MCK_U4Imm, + MCK_U4Imm } }, + { "vrs", SystemZ::InsnVRS, 5, + { MCK_U48Imm, MCK_AnyReg, MCK_VR128, MCK_BDAddr64Disp12, MCK_U4Imm } }, + { "vrv", SystemZ::InsnVRV, 4, + { MCK_U48Imm, MCK_VR128, MCK_BDVAddr64Disp12, MCK_U4Imm } }, + { "vrx", SystemZ::InsnVRX, 4, + { MCK_U48Imm, MCK_VR128, MCK_BDXAddr64Disp12, MCK_U4Imm } }, + { "vsi", SystemZ::InsnVSI, 4, + { MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_U8Imm } } }; static void printMCExpr(const MCExpr *E, raw_ostream &OS) { @@ -838,10 +851,11 @@ SystemZAsmParser::parseRegister(OperandVector &Operands, RegisterKind Kind) { // Parse any type of register (including integers) and add it to Operands. OperandMatchResultTy SystemZAsmParser::parseAnyRegister(OperandVector &Operands) { + SMLoc StartLoc = Parser.getTok().getLoc(); + // Handle integer values. if (Parser.getTok().is(AsmToken::Integer)) { const MCExpr *Register; - SMLoc StartLoc = Parser.getTok().getLoc(); if (Parser.parseExpression(Register)) return MatchOperand_ParseFail; @@ -863,6 +877,11 @@ SystemZAsmParser::parseAnyRegister(OperandVector &Operands) { if (parseRegister(Reg)) return MatchOperand_ParseFail; + if (Reg.Num > 15) { + Error(StartLoc, "invalid register"); + return MatchOperand_ParseFail; + } + // Map to the correct register kind. RegisterKind Kind; unsigned RegNo; @@ -1195,10 +1214,14 @@ bool SystemZAsmParser::ParseDirectiveInsn(SMLoc L) { OperandMatchResultTy ResTy; if (Kind == MCK_AnyReg) ResTy = parseAnyReg(Operands); + else if (Kind == MCK_VR128) + ResTy = parseVR128(Operands); else if (Kind == MCK_BDXAddr64Disp12 || Kind == MCK_BDXAddr64Disp20) ResTy = parseBDXAddr64(Operands); else if (Kind == MCK_BDAddr64Disp12 || Kind == MCK_BDAddr64Disp20) ResTy = parseBDAddr64(Operands); + else if (Kind == MCK_BDVAddr64Disp12) + ResTy = parseBDVAddr64(Operands); else if (Kind == MCK_PCRel32) ResTy = parsePCRel32(Operands); else if (Kind == MCK_PCRel16) @@ -1243,6 +1266,8 @@ bool SystemZAsmParser::ParseDirectiveInsn(SMLoc L) { ZOperand.addBDAddrOperands(Inst, 2); else if (ZOperand.isMem(BDXMem)) ZOperand.addBDXAddrOperands(Inst, 3); + else if (ZOperand.isMem(BDVMem)) + ZOperand.addBDVAddrOperands(Inst, 3); else if (ZOperand.isImm()) ZOperand.addImmOperands(Inst, 1); else @@ -1297,6 +1322,11 @@ OperandMatchResultTy SystemZAsmParser::tryParseRegister(unsigned &RegNo, bool SystemZAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name, SMLoc NameLoc, OperandVector &Operands) { + + // Apply mnemonic aliases first, before doing anything else, in + // case the target uses it. + applyMnemonicAliases(Name, getAvailableFeatures(), 0 /*VariantID*/); + Operands.push_back(SystemZOperand::createToken(Name, NameLoc)); // Read the remaining operands. |
