@@ -24,10 +24,11 @@ include "llvm/TableGen/SearchableTable.td"
24
24
25
25
// CHECK-LABEL: GET_ATable_IMPL
26
26
// CHECK: constexpr AEntry ATable[] = {
27
- // CHECK: { "baz"
28
- // CHECK: { "foo"
29
- // CHECK: { "foobar"
30
- // CHECK: { "bar"
27
+ // CHECK-NOT: { "aaa"
28
+ // CHECK: { "baz"
29
+ // CHECK: { "foo"
30
+ // CHECK: { "foobar"
31
+ // CHECK: { "bar"
31
32
// CHECK: };
32
33
33
34
// CHECK: const AEntry *lookupATableByValues(uint8_t Val1, uint16_t Val2) {
@@ -38,15 +39,18 @@ class AEntry<string str, int val1, int val2> {
38
39
string Str = str;
39
40
bits<8> Val1 = val1;
40
41
bits<10> Val2 = val2;
42
+ bit IsNeeded = 1;
41
43
}
42
44
45
+ def : AEntry<"aaa", 0, 0> { let IsNeeded = 0; }
43
46
def : AEntry<"bar", 5, 3>;
44
47
def : AEntry<"baz", 2, 6>;
45
48
def : AEntry<"foo", 4, 4>;
46
49
def : AEntry<"foobar", 4, 5>;
47
50
48
51
def ATable : GenericTable {
49
52
let FilterClass = "AEntry";
53
+ let FilterClassField = "IsNeeded";
50
54
let Fields = ["Str", "Val1", "Val2"];
51
55
52
56
let PrimaryKey = ["Val1", "Val2"];
@@ -171,3 +175,65 @@ def DTable : GenericTable {
171
175
}
172
176
173
177
#endif // ERROR1
178
+
179
+ // CHECK-LABEL: GET_EEntryEvenTable_DECL
180
+ // CHECK: const EEntry *lookupEEntryEvenTableByValue(uint8_t Value);
181
+
182
+ // CHECK-LABEL: GET_EEntryEvenTable_IMPL
183
+ // CHECK: constexpr EEntry EEntryEvenTable[] = {
184
+ // CHECK: { 0x2
185
+ // CHECK: { 0x4
186
+ // CHECK: { 0x6
187
+ // CHECK: { 0x8
188
+ // CHECK: { 0xA
189
+ // CHECK: };
190
+
191
+ // CHECK: const EEntry *lookupEEntryEvenTableByValue(uint8_t Value) {
192
+ // CHECK: return &*Idx;
193
+ // CHECK: }
194
+
195
+ // CHECK-LABEL: GET_EEntryOddTable_DECL
196
+ // CHECK: const EEntry *lookupEEntryOddTableByValue(uint8_t Value);
197
+
198
+ // CHECK-LABEL: GET_EEntryOddTable_IMPL
199
+ // CHECK: constexpr EEntry EEntryOddTable[] = {
200
+ // CHECK: { 0x1
201
+ // CHECK: { 0x3
202
+ // CHECK: { 0x5
203
+ // CHECK: { 0x7
204
+ // CHECK: { 0x9
205
+ // CHECK: };
206
+
207
+ // CHECK: const EEntry *lookupEEntryOddTableByValue(uint8_t Value) {
208
+ // CHECK: return &*Idx;
209
+ // CHECK: }
210
+
211
+ // We can construct two GenericTables with the same FilterClass, so that they
212
+ // select from the same overall set of records, but assign them with different
213
+ // FilterClassField values so that they include different subsets of the records
214
+ // of that class.
215
+ class EEntry<bits<8> value> {
216
+ bits<8> Value = value;
217
+ bit IsEven = !eq(!and(value, 1), 0);
218
+ bit IsOdd = !not(IsEven);
219
+ }
220
+
221
+ foreach i = {1-10} in {
222
+ def : EEntry<i>;
223
+ }
224
+
225
+ def EEntryEvenTable : GenericTable {
226
+ let FilterClass = "EEntry";
227
+ let FilterClassField = "IsEven";
228
+ let Fields = ["Value"];
229
+ let PrimaryKey = ["Value"];
230
+ let PrimaryKeyName = "lookupEEntryEvenTableByValue";
231
+ }
232
+
233
+ def EEntryOddTable : GenericTable {
234
+ let FilterClass = "EEntry";
235
+ let FilterClassField = "IsOdd";
236
+ let Fields = ["Value"];
237
+ let PrimaryKey = ["Value"];
238
+ let PrimaryKeyName = "lookupEEntryOddTableByValue";
239
+ }
0 commit comments