@@ -23,6 +23,7 @@ using namespace llvm;
23
23
// are currently emitted in X86GenInstrInfo.inc in alphabetical order. Which
24
24
// makes sorting these tables a simple matter of alphabetizing the table.
25
25
#include " X86GenFoldTables.inc"
26
+
26
27
// Table to map instructions safe to broadcast using a different width from the
27
28
// element width.
28
29
static const X86FoldTableEntry BroadcastSizeTable2[] = {
@@ -186,6 +187,10 @@ struct X86MemUnfoldTable {
186
187
// Index 3, folded broadcast
187
188
addTableEntry (Entry, TB_INDEX_3 | TB_FOLDED_LOAD | TB_FOLDED_BCAST);
188
189
190
+ for (const X86FoldTableEntry &Entry : BroadcastTable4)
191
+ // Index 4, folded broadcast
192
+ addTableEntry (Entry, TB_INDEX_4 | TB_FOLDED_LOAD | TB_FOLDED_BCAST);
193
+
189
194
// Sort the memory->reg unfold table.
190
195
array_pod_sort (Table.begin (), Table.end ());
191
196
@@ -266,6 +271,17 @@ struct X86BroadcastFoldTable {
266
271
}
267
272
}
268
273
274
+ for (const X86FoldTableEntry &Reg2Bcst : BroadcastTable4) {
275
+ unsigned RegOp = Reg2Bcst.KeyOp ;
276
+ unsigned BcstOp = Reg2Bcst.DstOp ;
277
+ if (const X86FoldTableEntry *Reg2Mem = lookupFoldTable (RegOp, 4 )) {
278
+ unsigned MemOp = Reg2Mem->DstOp ;
279
+ uint16_t Flags = Reg2Mem->Flags | Reg2Bcst.Flags | TB_INDEX_4 |
280
+ TB_FOLDED_LOAD | TB_FOLDED_BCAST;
281
+ Table.push_back ({MemOp, BcstOp, Flags});
282
+ }
283
+ }
284
+
269
285
// Sort the memory->broadcast fold table.
270
286
array_pod_sort (Table.begin (), Table.end ());
271
287
}
0 commit comments