summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-04-19 01:11:03 +0000
committerChris Lattner <sabre@nondot.org>2005-04-19 01:11:03 +0000
commitb9266f880a1978e60a0457743d873dd03c3f2034 (patch)
treec6c667f3d27721dfa5c2b4adb2fbc49f78224309
parent1cbf3abbb8c716721b502da6d5ff75a9755b525a (diff)
downloadllvm-b9266f880a1978e60a0457743d873dd03c3f2034.tar.gz
llvm-b9266f880a1978e60a0457743d873dd03c3f2034.tar.bz2
llvm-b9266f880a1978e60a0457743d873dd03c3f2034.tar.xz
Add initial lexer and parser support for shifting values. Every use of this
will lead to it being rejected though. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21335 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--utils/TableGen/FileLexer.l5
-rw-r--r--utils/TableGen/FileParser.y19
-rw-r--r--utils/TableGen/Record.h5
3 files changed, 29 insertions, 0 deletions
diff --git a/utils/TableGen/FileLexer.l b/utils/TableGen/FileLexer.l
index 08daf2fc2e..a433587996 100644
--- a/utils/TableGen/FileLexer.l
+++ b/utils/TableGen/FileLexer.l
@@ -195,6 +195,11 @@ field { return FIELD; }
let { return LET; }
in { return IN; }
+!sra { return SRATOK; }
+!srl { return SRLTOK; }
+!shl { return SHLTOK; }
+
+
{Identifier} { Filelval.StrVal = new std::string(yytext, yytext+yyleng);
return ID; }
${Identifier} { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng);
diff --git a/utils/TableGen/FileParser.y b/utils/TableGen/FileParser.y
index 8781049956..e7d50322ef 100644
--- a/utils/TableGen/FileParser.y
+++ b/utils/TableGen/FileParser.y
@@ -189,6 +189,7 @@ using namespace llvm;
};
%token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD LET IN
+%token SHLTOK SRATOK SRLTOK
%token <IntVal> INTVAL
%token <StrVal> ID VARNAME STRVAL CODEFRAGMENT
@@ -308,6 +309,24 @@ Value : INTVAL {
exit(1);
}
delete $3;
+ } | SHLTOK '(' Value ',' Value ')' {
+ $$ = $3->getBinaryOp(Init::SHL, $5);
+ if ($$ == 0) {
+ err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
+ exit(1);
+ }
+ } | SRATOK '(' Value ',' Value ')' {
+ $$ = $3->getBinaryOp(Init::SRA, $5);
+ if ($$ == 0) {
+ err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
+ exit(1);
+ }
+ } | SRLTOK '(' Value ',' Value ')' {
+ $$ = $3->getBinaryOp(Init::SRL, $5);
+ if ($$ == 0) {
+ err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
+ exit(1);
+ }
};
OptVarName : /* empty */ {
diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h
index e2b9c0e6ef..9c5166c0cc 100644
--- a/utils/TableGen/Record.h
+++ b/utils/TableGen/Record.h
@@ -463,6 +463,11 @@ struct Init {
virtual Init *getFieldInit(Record &R, const std::string &FieldName) const {
return 0;
}
+
+ enum BinaryOp { SHL, SRA, SRL };
+ virtual Init *getBinaryOp(BinaryOp Op, Init *RHS) {
+ return 0;
+ }
/// resolveReferences - This method is used by classes that refer to other
/// variables which may not be defined at the time they expression is formed.