summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp')
-rw-r--r--llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp b/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp
index 7e92e4b33812..fd9dc32b04f5 100644
--- a/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp
+++ b/llvm/lib/Target/VE/AsmParser/VEAsmParser.cpp
@@ -84,6 +84,8 @@ class VEAsmParser : public MCTargetAsmParser {
StringRef splitMnemonic(StringRef Name, SMLoc NameLoc,
OperandVector *Operands);
+ bool parseLiteralValues(unsigned Size, SMLoc L);
+
public:
VEAsmParser(const MCSubtargetInfo &sti, MCAsmParser &parser,
const MCInstrInfo &MII, const MCTargetOptions &Options)
@@ -994,10 +996,43 @@ bool VEAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
}
bool VEAsmParser::ParseDirective(AsmToken DirectiveID) {
+ std::string IDVal = DirectiveID.getIdentifier().lower();
+
+ // Defines VE specific directives. Reference is "Vector Engine Assembly
+ // Language Reference Manual":
+ // https://www.hpc.nec/documents/sdk/pdfs/VectorEngine-as-manual-v1.3.pdf
+
+ // The .word is 4 bytes long on VE.
+ if (IDVal == ".word")
+ return parseLiteralValues(4, DirectiveID.getLoc());
+
+ // The .long is 8 bytes long on VE.
+ if (IDVal == ".long")
+ return parseLiteralValues(8, DirectiveID.getLoc());
+
+ // The .llong is 8 bytes long on VE.
+ if (IDVal == ".llong")
+ return parseLiteralValues(8, DirectiveID.getLoc());
+
// Let the MC layer to handle other directives.
return true;
}
+/// parseLiteralValues
+/// ::= .word expression [, expression]*
+/// ::= .long expression [, expression]*
+/// ::= .llong expression [, expression]*
+bool VEAsmParser::parseLiteralValues(unsigned Size, SMLoc L) {
+ auto parseOne = [&]() -> bool {
+ const MCExpr *Value;
+ if (getParser().parseExpression(Value))
+ return true;
+ getParser().getStreamer().emitValue(Value, Size, L);
+ return false;
+ };
+ return (parseMany(parseOne));
+}
+
/// Extract \code @lo32/@hi32/etc \endcode modifier from expression.
/// Recursively scan the expression and check for VK_VE_HI32/LO32/etc
/// symbol variants. If all symbols with modifier use the same