]> granicus.if.org Git - llvm/commitdiff
TableGen: Add operator !or
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 15 Nov 2016 06:49:28 +0000 (06:49 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 15 Nov 2016 06:49:28 +0000 (06:49 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286936 91177308-0d34-0410-b5e6-96231b3b80d8

docs/TableGen/LangRef.rst
include/llvm/TableGen/Record.h
lib/TableGen/Record.cpp
lib/TableGen/TGLexer.cpp
lib/TableGen/TGLexer.h
lib/TableGen/TGParser.cpp
test/TableGen/math.td

index 58da6285c077eac82ef172448242da171921d143..285572fa481c985b5f4f14501e556ccd3f90a669 100644 (file)
@@ -97,7 +97,9 @@ wide variety of meanings:
    BangOperator: one of
                :!eq     !if      !head    !tail      !con
                :!add    !shl     !sra     !srl       !and
-               :!cast   !empty   !subst   !foreach   !listconcat   !strconcat
+               :!or     !empty   !subst   !foreach   !strconcat
+               :!cast   !listconcat
+
 
 Syntax
 ======
index 393cafa7924a8fd47ce9e9049d8cd1e8463e5647..87ba6fd68eccd99aeb1daa55379a906a7f4278ca 100644 (file)
@@ -798,7 +798,7 @@ public:
 ///
 class BinOpInit : public OpInit, public FoldingSetNode {
 public:
-  enum BinaryOp : uint8_t { ADD, AND, SHL, SRA, SRL, LISTCONCAT,
+  enum BinaryOp : uint8_t { ADD, AND, OR, SHL, SRA, SRL, LISTCONCAT,
                             STRCONCAT, CONCAT, EQ };
 
 private:
index 7f02c3189f3b6ca765139c8260b88c8047e5ac3e..bffe27144cf04a77cd8bbc2e2d43e1b8b682a219 100644 (file)
@@ -865,6 +865,7 @@ Init *BinOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const {
   }
   case ADD:
   case AND:
+  case OR:
   case SHL:
   case SRA:
   case SRL: {
@@ -879,6 +880,7 @@ Init *BinOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const {
       default: llvm_unreachable("Bad opcode!");
       case ADD: Result = LHSv +  RHSv; break;
       case AND: Result = LHSv &  RHSv; break;
+      case OR: Result = LHSv | RHSv; break;
       case SHL: Result = LHSv << RHSv; break;
       case SRA: Result = LHSv >> RHSv; break;
       case SRL: Result = (uint64_t)LHSv >> (uint64_t)RHSv; break;
@@ -906,6 +908,7 @@ std::string BinOpInit::getAsString() const {
   case CONCAT: Result = "!con"; break;
   case ADD: Result = "!add"; break;
   case AND: Result = "!and"; break;
+  case OR: Result = "!or"; break;
   case SHL: Result = "!shl"; break;
   case SRA: Result = "!sra"; break;
   case SRL: Result = "!srl"; break;
index c526fc05d08803a2f4fcbd58e48afa892bd98517..5d6f7c23e0b687a8534029c2283c8f49a797c104 100644 (file)
@@ -472,6 +472,7 @@ tgtok::TokKind TGLexer::LexExclaim() {
     .Case("con", tgtok::XConcat)
     .Case("add", tgtok::XADD)
     .Case("and", tgtok::XAND)
+    .Case("or", tgtok::XOR)
     .Case("shl", tgtok::XSHL)
     .Case("sra", tgtok::XSRA)
     .Case("srl", tgtok::XSRL)
index cbc30be8a572f5414f613d9c5bb7a64caeb0c7d2..b5b58161878bd41094f61a912006d701b1d75ae5 100644 (file)
@@ -45,9 +45,9 @@ namespace tgtok {
     // Keywords.
     Bit, Bits, Class, Code, Dag, Def, Foreach, Defm, Field, In, Int, Let, List,
     MultiClass, String,
-    
+
     // !keywords.
-    XConcat, XADD, XAND, XSRA, XSRL, XSHL, XListConcat, XStrConcat, XCast,
+    XConcat, XADD, XAND, XOR, XSRA, XSRL, XSHL, XListConcat, XStrConcat, XCast,
     XSubst, XForEach, XHead, XTail, XEmpty, XIf, XEq,
 
     // Integer value.
index 0a6752bb26d8e15d77bc0e0c0dc42fca6b82a032..ff5c96b0cd5d66547c6cf29eb234bd8d096505d2 100644 (file)
@@ -881,6 +881,7 @@ Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) {
   case tgtok::XConcat:
   case tgtok::XADD:
   case tgtok::XAND:
+  case tgtok::XOR:
   case tgtok::XSRA:
   case tgtok::XSRL:
   case tgtok::XSHL:
@@ -899,6 +900,7 @@ Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) {
     case tgtok::XConcat: Code = BinOpInit::CONCAT;Type = DagRecTy::get(); break;
     case tgtok::XADD:    Code = BinOpInit::ADD;   Type = IntRecTy::get(); break;
     case tgtok::XAND:    Code = BinOpInit::AND;   Type = IntRecTy::get(); break;
+    case tgtok::XOR:     Code = BinOpInit::OR;    Type = IntRecTy::get(); break;
     case tgtok::XSRA:    Code = BinOpInit::SRA;   Type = IntRecTy::get(); break;
     case tgtok::XSRL:    Code = BinOpInit::SRL;   Type = IntRecTy::get(); break;
     case tgtok::XSHL:    Code = BinOpInit::SHL;   Type = IntRecTy::get(); break;
@@ -1446,6 +1448,7 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType,
   case tgtok::XConcat:
   case tgtok::XADD:
   case tgtok::XAND:
+  case tgtok::XOR:
   case tgtok::XSRA:
   case tgtok::XSRL:
   case tgtok::XSHL:
index d966346596aef6645e0f342a5056cd89c5fe0fd7..a8b939176e0ad22c4bdcf291e56d791ef3116c75 100644 (file)
@@ -15,12 +15,18 @@ class Int<int value> {
   int Value = value;
 }
 
+def v1022   : Int<1022>;
+
 // CHECK: def v0
 // CHECK: Value = 0
 
 // CHECK: def v1
 // CHECK: Value = 1
 
+// CHECK: def v1023
+// CHECK: Value = 1023
+def v1023 : Int<!or(v1022.Value, 1)>;
+
 def v1024   : Int<1024>;
 // CHECK: def v1024
 // CHECK: Value = 1024
@@ -35,3 +41,7 @@ def v2048   : Int<!add(v1024.Value, v1024.Value)>;
 
 def v0 : Int<!and(v1024.Value, v2048.Value)>;
 def v1 : Int<!and(v1025.Value, 1)>;
+
+// CHECK: def v3072
+// CHECK: Value = 3072
+def v3072 : Int<!or(v1024.Value, v2048.Value)>;