brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · 5b3c050 Raw
66 lines · plain
1// RUN: llvm-tblgen -gen-searchable-tables -I %p/../../include %s | FileCheck %s2 3include "llvm/TableGen/SearchableTable.td"4 5class SysReg<string name, bits<12> op> {6  string Name = name;7  bits<12> Encoding = op;8  code FeaturesRequired = [{ {} }];9}10 11def List1 : GenericTable {12  let FilterClass = "SysReg";13  let Fields = [14     "Name", "Encoding", "FeaturesRequired",15  ];16 17  let PrimaryKey = [ "Encoding" ];18  let PrimaryKeyName = "lookupSysRegByEncoding";19  let PrimaryKeyReturnRange = true;20}21 22let FeaturesRequired = [{ {Feature1} }] in {23def : SysReg<"csr1", 0x7C0>;24}25 26let FeaturesRequired = [{ {Feature2} }] in {27def : SysReg<"csr2", 0x7C0>;28}29 30// CHECK: #ifdef GET_List1_DECL31// CHECK-NEXT: llvm::iterator_range<const SysReg *> lookupSysRegByEncoding(uint16_t Encoding);32// CHECK-NEXT: #endif33 34// CHECK: #ifdef GET_List1_IMPL35// CHECK-NEXT: constexpr SysReg List1[] = {36// CHECK-NEXT:   { "csr1", 0x7C0,  {Feature1}  }, // 037// CHECK-NEXT:   { "csr2", 0x7C0,  {Feature2}  }, // 138// CHECK-NEXT:  };39 40// CHECK: llvm::iterator_range<const SysReg *> lookupSysRegByEncoding(uint16_t Encoding) {41// CHECK-NEXT: struct KeyType {42// CHECK-NEXT:    uint16_t Encoding;43// CHECK-NEXT:  };44// CHECK-NEXT:  KeyType Key = {Encoding};45// CHECK-NEXT:  struct Comp {46// CHECK-NEXT:    bool operator()(const SysReg &LHS, const KeyType &RHS) const {47// CHECK-NEXT:      if (LHS.Encoding < RHS.Encoding)48// CHECK-NEXT:        return true;49// CHECK-NEXT:      if (LHS.Encoding > RHS.Encoding)50// CHECK-NEXT:        return false;51// CHECK-NEXT:      return false;52// CHECK-NEXT:    }53// CHECK-NEXT:    bool operator()(const KeyType &LHS, const SysReg &RHS) const {54// CHECK-NEXT:      if (LHS.Encoding < RHS.Encoding)55// CHECK-NEXT:        return true;56// CHECK-NEXT:      if (LHS.Encoding > RHS.Encoding)57// CHECK-NEXT:        return false;58// CHECK-NEXT:      return false;59// CHECK-NEXT:    }60// CHECK-NEXT:  };61// CHECK-NEXT:  auto Table = ArrayRef(List1);62// CHECK-NEXT:  auto It = std::equal_range(Table.begin(), Table.end(), Key, Comp());63// CHECK-NEXT:  return llvm::make_range(It.first, It.second);64// CHECK-NEXT: }65// CHECK-NEXT: #endif66