[llvm] [X86][tablgen] Fix the broadcast tables (PR #79675)
Shengchen Kan via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 27 02:48:12 PST 2024
================
@@ -529,45 +530,22 @@ void X86FoldTablesEmitter::addBroadcastEntry(
assert(Table.find(RegInst) == Table.end() && "Override entry unexpectedly");
X86FoldTableEntry Result = X86FoldTableEntry(RegInst, MemInst);
- Record *RegRec = RegInst->TheDef;
- StringRef RegInstName = RegRec->getName();
- StringRef MemInstName = MemInst->TheDef->getName();
- Record *Domain = RegRec->getValueAsDef("ExeDomain");
- bool IsSSEPackedInt = Domain->getName() == "SSEPackedInt";
- if ((RegInstName.contains("DZ") || RegInstName.contains("DWZ") ||
- RegInstName.contains("Dr") || RegInstName.contains("I32")) &&
- IsSSEPackedInt) {
- assert((MemInstName.contains("DZ") || RegInstName.contains("DWZ") ||
- MemInstName.contains("Dr") || MemInstName.contains("I32")) &&
- "Unmatched names for broadcast");
- Result.BroadcastKind = X86FoldTableEntry::BCAST_D;
- } else if ((RegInstName.contains("QZ") || RegInstName.contains("QBZ") ||
- RegInstName.contains("Qr") || RegInstName.contains("I64")) &&
- IsSSEPackedInt) {
- assert((MemInstName.contains("QZ") || MemInstName.contains("QBZ") ||
- MemInstName.contains("Qr") || MemInstName.contains("I64")) &&
- "Unmatched names for broadcast");
- Result.BroadcastKind = X86FoldTableEntry::BCAST_Q;
- } else if ((RegInstName.contains("PS") || RegInstName.contains("F32") ||
- RegInstName.contains("CPH")) &&
- !RegInstName.contains("PH2PS")) {
- assert((MemInstName.contains("PS") || MemInstName.contains("F32") ||
- MemInstName.contains("CPH")) &&
- "Unmatched names for broadcast");
- Result.BroadcastKind = X86FoldTableEntry::BCAST_SS;
- } else if ((RegInstName.contains("PD") || RegInstName.contains("F64")) &&
- !RegInstName.contains("PH2PD")) {
- assert((MemInstName.contains("PD") || MemInstName.contains("F64")) &&
- "Unmatched names for broadcast");
- Result.BroadcastKind = X86FoldTableEntry::BCAST_SD;
- } else if (RegInstName.contains("PH")) {
- assert(MemInstName.contains("PH") && "Unmatched names for broadcast");
- Result.BroadcastKind = X86FoldTableEntry::BCAST_SH;
- } else {
- errs() << RegInstName << ", " << MemInstName << "\n";
- llvm_unreachable("Name is not canoicalized for broadcast or "
- "ExeDomain is incorrect");
+ DagInit *In = MemInst->TheDef->getValueAsDag("InOperandList");
+ for (unsigned I = 0, E = In->getNumArgs(); I != E; ++I) {
+ Result.BroadcastKind =
+ StringSwitch<X86FoldTableEntry::BcastType>(In->getArg(I)->getAsString())
+ .Case("i32mem", X86FoldTableEntry::BCAST_D)
+ .Case("i64mem", X86FoldTableEntry::BCAST_Q)
+ .Case("i16mem", X86FoldTableEntry::BCAST_SH)
----------------
KanRobert wrote:
Sounds good. Done.
https://github.com/llvm/llvm-project/pull/79675
More information about the llvm-commits
mailing list