aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Target/VE/AsmParser
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2021-06-13 19:31:46 +0000
committerDimitry Andric <dim@FreeBSD.org>2021-06-13 19:37:19 +0000
commite8d8bef961a50d4dc22501cde4fb9fb0be1b2532 (patch)
tree94f04805f47bb7c59ae29690d8952b6074fff602 /contrib/llvm-project/llvm/lib/Target/VE/AsmParser
parentbb130ff39747b94592cb26d71b7cb097b9a4ea6b (diff)
parentb60736ec1405bb0a8dd40989f67ef4c93da068ab (diff)
downloadsrc-e8d8bef961a50d4dc22501cde4fb9fb0be1b2532.tar.gz
src-e8d8bef961a50d4dc22501cde4fb9fb0be1b2532.zip
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/VE/AsmParser')
-rw-r--r--contrib/llvm-project/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp103
1 files changed, 99 insertions, 4 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp b/contrib/llvm-project/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp
index 7a899b4b38e2..a3309a68c76d 100644
--- a/contrib/llvm-project/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp
+++ b/contrib/llvm-project/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp
@@ -125,6 +125,9 @@ static const MCPhysReg F128Regs[32] = {
VE::Q16, VE::Q17, VE::Q18, VE::Q19, VE::Q20, VE::Q21, VE::Q22, VE::Q23,
VE::Q24, VE::Q25, VE::Q26, VE::Q27, VE::Q28, VE::Q29, VE::Q30, VE::Q31};
+static const MCPhysReg VM512Regs[8] = {VE::VMP0, VE::VMP1, VE::VMP2, VE::VMP3,
+ VE::VMP4, VE::VMP5, VE::VMP6, VE::VMP7};
+
static const MCPhysReg MISCRegs[31] = {
VE::USRCC, VE::PSW, VE::SAR, VE::NoRegister,
VE::NoRegister, VE::NoRegister, VE::NoRegister, VE::PMMR,
@@ -277,6 +280,17 @@ public:
}
return false;
}
+ bool isUImm4() {
+ if (!isImm())
+ return false;
+
+ // Constant case
+ if (const auto *ConstExpr = dyn_cast<MCConstantExpr>(Imm.Val)) {
+ int64_t Value = ConstExpr->getValue();
+ return isUInt<4>(Value);
+ }
+ return false;
+ }
bool isUImm6() {
if (!isImm())
return false;
@@ -476,6 +490,10 @@ public:
addImmOperands(Inst, N);
}
+ void addUImm4Operands(MCInst &Inst, unsigned N) const {
+ addImmOperands(Inst, N);
+ }
+
void addUImm6Operands(MCInst &Inst, unsigned N) const {
addImmOperands(Inst, N);
}
@@ -648,6 +666,15 @@ public:
return true;
}
+ static bool MorphToVM512Reg(VEOperand &Op) {
+ unsigned Reg = Op.getReg();
+ unsigned regIdx = Reg - VE::VM0;
+ if (regIdx % 2 || regIdx > 15)
+ return false;
+ Op.Reg.RegNum = VM512Regs[regIdx / 2];
+ return true;
+ }
+
static bool MorphToMISCReg(VEOperand &Op) {
const auto *ConstExpr = dyn_cast<MCConstantExpr>(Op.getImm());
if (!ConstExpr)
@@ -902,6 +929,24 @@ StringRef VEAsmParser::splitMnemonic(StringRef Name, SMLoc NameLoc,
Mnemonic = parseRD(Name, 10, NameLoc, Operands);
} else if (Name.startswith("cvt.l.d")) {
Mnemonic = parseRD(Name, 7, NameLoc, Operands);
+ } else if (Name.startswith("vcvt.w.d.sx") || Name.startswith("vcvt.w.d.zx") ||
+ Name.startswith("vcvt.w.s.sx") || Name.startswith("vcvt.w.s.zx")) {
+ Mnemonic = parseRD(Name, 11, NameLoc, Operands);
+ } else if (Name.startswith("vcvt.l.d")) {
+ Mnemonic = parseRD(Name, 8, NameLoc, Operands);
+ } else if (Name.startswith("pvcvt.w.s.lo") ||
+ Name.startswith("pvcvt.w.s.up")) {
+ Mnemonic = parseRD(Name, 12, NameLoc, Operands);
+ } else if (Name.startswith("pvcvt.w.s")) {
+ Mnemonic = parseRD(Name, 9, NameLoc, Operands);
+ } else if (Name.startswith("vfmk.l.") || Name.startswith("vfmk.w.") ||
+ Name.startswith("vfmk.d.") || Name.startswith("vfmk.s.")) {
+ bool ICC = Name[5] == 'l' || Name[5] == 'w' ? true : false;
+ Mnemonic = parseCC(Name, 7, Name.size(), ICC, true, NameLoc, Operands);
+ } else if (Name.startswith("pvfmk.w.lo.") || Name.startswith("pvfmk.w.up.") ||
+ Name.startswith("pvfmk.s.lo.") || Name.startswith("pvfmk.s.up.")) {
+ bool ICC = Name[6] == 'l' || Name[6] == 'w' ? true : false;
+ Mnemonic = parseCC(Name, 11, Name.size(), ICC, true, NameLoc, Operands);
} else {
Operands->push_back(VEOperand::CreateToken(Mnemonic, NameLoc));
}
@@ -1362,9 +1407,38 @@ OperandMatchResultTy VEAsmParser::parseOperand(OperandVector &Operands,
return ResTy;
switch (getLexer().getKind()) {
- case AsmToken::LParen:
- // FIXME: Parsing "(" + %vreg + ", " + %vreg + ")"
- // FALLTHROUGH
+ case AsmToken::LParen: {
+ // Parsing "(" + %vreg + ", " + %vreg + ")"
+ const AsmToken Tok1 = Parser.getTok();
+ Parser.Lex(); // Eat the '('.
+
+ unsigned RegNo1;
+ SMLoc S1, E1;
+ if (tryParseRegister(RegNo1, S1, E1) != MatchOperand_Success) {
+ getLexer().UnLex(Tok1);
+ return MatchOperand_NoMatch;
+ }
+
+ if (!Parser.getTok().is(AsmToken::Comma))
+ return MatchOperand_ParseFail;
+ Parser.Lex(); // Eat the ','.
+
+ unsigned RegNo2;
+ SMLoc S2, E2;
+ if (tryParseRegister(RegNo2, S2, E2) != MatchOperand_Success)
+ return MatchOperand_ParseFail;
+
+ if (!Parser.getTok().is(AsmToken::RParen))
+ return MatchOperand_ParseFail;
+
+ Operands.push_back(VEOperand::CreateToken(Tok1.getString(), Tok1.getLoc()));
+ Operands.push_back(VEOperand::CreateReg(RegNo1, S1, E1));
+ Operands.push_back(VEOperand::CreateReg(RegNo2, S2, E2));
+ Operands.push_back(VEOperand::CreateToken(Parser.getTok().getString(),
+ Parser.getTok().getLoc()));
+ Parser.Lex(); // Eat the ')'.
+ break;
+ }
default: {
std::unique_ptr<VEOperand> Op;
ResTy = parseVEAsmOperand(Op);
@@ -1377,7 +1451,24 @@ OperandMatchResultTy VEAsmParser::parseOperand(OperandVector &Operands,
if (!Parser.getTok().is(AsmToken::LParen))
break;
- // FIXME: Parsing %vec-reg + "(" + %sclar-reg/number + ")"
+ // Parsing %vec-reg + "(" + %sclar-reg/number + ")"
+ std::unique_ptr<VEOperand> Op1 = VEOperand::CreateToken(
+ Parser.getTok().getString(), Parser.getTok().getLoc());
+ Parser.Lex(); // Eat the '('.
+
+ std::unique_ptr<VEOperand> Op2;
+ ResTy = parseVEAsmOperand(Op2);
+ if (ResTy != MatchOperand_Success || !Op2)
+ return MatchOperand_ParseFail;
+
+ if (!Parser.getTok().is(AsmToken::RParen))
+ return MatchOperand_ParseFail;
+
+ Operands.push_back(std::move(Op1));
+ Operands.push_back(std::move(Op2));
+ Operands.push_back(VEOperand::CreateToken(Parser.getTok().getString(),
+ Parser.getTok().getLoc()));
+ Parser.Lex(); // Eat the ')'.
break;
}
}
@@ -1445,6 +1536,10 @@ unsigned VEAsmParser::validateTargetOperandClass(MCParsedAsmOperand &GOp,
if (Op.isReg() && VEOperand::MorphToF128Reg(Op))
return MCTargetAsmParser::Match_Success;
break;
+ case MCK_VM512:
+ if (Op.isReg() && VEOperand::MorphToVM512Reg(Op))
+ return MCTargetAsmParser::Match_Success;
+ break;
case MCK_MISC:
if (Op.isImm() && VEOperand::MorphToMISCReg(Op))
return MCTargetAsmParser::Match_Success;