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