Skip to content

Commit 1a5eead

Browse files
committed
[X86] Add printZeroUpperMove constant/shuffle comments helper. NFC.
Pull out helper instead of repeating switch cases.
1 parent c1729c8 commit 1a5eead

File tree

1 file changed

+58
-78
lines changed

1 file changed

+58
-78
lines changed

llvm/lib/Target/X86/X86MCInstLower.cpp

Lines changed: 58 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1536,6 +1536,52 @@ static void printConstant(const Constant *COp, unsigned BitWidth,
15361536
}
15371537
}
15381538

1539+
static void printZeroUpperMove(const MachineInstr *MI, MCStreamer &OutStreamer,
1540+
int SclWidth, int VecWidth,
1541+
const char *ShuffleComment) {
1542+
assert(MI->getNumOperands() >= (1 + X86::AddrNumOperands) &&
1543+
"Unexpected number of operands!");
1544+
1545+
std::string Comment;
1546+
raw_string_ostream CS(Comment);
1547+
const MachineOperand &DstOp = MI->getOperand(0);
1548+
CS << X86ATTInstPrinter::getRegisterName(DstOp.getReg()) << " = ";
1549+
1550+
if (auto *C =
1551+
X86::getConstantFromPool(*MI, MI->getOperand(1 + X86::AddrDisp))) {
1552+
int CstEltSize = C->getType()->getScalarSizeInBits();
1553+
if (SclWidth == CstEltSize) {
1554+
if (auto *CI = dyn_cast<ConstantInt>(C)) {
1555+
CS << "[";
1556+
printConstant(CI->getValue(), CS);
1557+
for (int I = 1, E = VecWidth / SclWidth; I < E; ++I) {
1558+
CS << ",0";
1559+
}
1560+
CS << "]";
1561+
OutStreamer.AddComment(CS.str());
1562+
return; // early-out
1563+
}
1564+
1565+
if (auto *CF = dyn_cast<ConstantFP>(C)) {
1566+
CS << "[";
1567+
printConstant(CF->getValue(), CS);
1568+
APFloat ZeroFP = APFloat::getZero(CF->getValue().getSemantics());
1569+
for (int I = 1, E = VecWidth / SclWidth; I < E; ++I) {
1570+
CS << ",";
1571+
printConstant(ZeroFP, CS);
1572+
}
1573+
CS << "]";
1574+
OutStreamer.AddComment(CS.str());
1575+
return; // early-out
1576+
}
1577+
}
1578+
}
1579+
1580+
// We didn't find a constant load, fallback to a shuffle mask decode.
1581+
CS << ShuffleComment;
1582+
OutStreamer.AddComment(CS.str());
1583+
}
1584+
15391585
void X86AsmPrinter::EmitSEHInstruction(const MachineInstr *MI) {
15401586
assert(MF->hasWinCFI() && "SEH_ instruction in function without WinCFI?");
15411587
assert((getSubtarget().isOSWindows() || TM.getTargetTriple().isUEFI()) &&
@@ -1807,94 +1853,28 @@ static void addConstantComments(const MachineInstr *MI,
18071853
}
18081854

18091855
case X86::MOVSDrm:
1810-
case X86::MOVSSrm:
18111856
case X86::VMOVSDrm:
1812-
case X86::VMOVSSrm:
18131857
case X86::VMOVSDZrm:
1814-
case X86::VMOVSSZrm:
18151858
case X86::MOVSDrm_alt:
1816-
case X86::MOVSSrm_alt:
18171859
case X86::VMOVSDrm_alt:
1818-
case X86::VMOVSSrm_alt:
18191860
case X86::VMOVSDZrm_alt:
1820-
case X86::VMOVSSZrm_alt:
1821-
case X86::MOVDI2PDIrm:
18221861
case X86::MOVQI2PQIrm:
1823-
case X86::VMOVDI2PDIrm:
18241862
case X86::VMOVQI2PQIrm:
1825-
case X86::VMOVDI2PDIZrm:
1826-
case X86::VMOVQI2PQIZrm: {
1827-
assert(MI->getNumOperands() >= (1 + X86::AddrNumOperands) &&
1828-
"Unexpected number of operands!");
1829-
int SclWidth = 32;
1830-
int VecWidth = 128;
1831-
1832-
switch (MI->getOpcode()) {
1833-
default:
1834-
llvm_unreachable("Invalid opcode");
1835-
case X86::MOVSDrm:
1836-
case X86::VMOVSDrm:
1837-
case X86::VMOVSDZrm:
1838-
case X86::MOVSDrm_alt:
1839-
case X86::VMOVSDrm_alt:
1840-
case X86::VMOVSDZrm_alt:
1841-
case X86::MOVQI2PQIrm:
1842-
case X86::VMOVQI2PQIrm:
1843-
case X86::VMOVQI2PQIZrm:
1844-
SclWidth = 64;
1845-
VecWidth = 128;
1863+
case X86::VMOVQI2PQIZrm:
1864+
printZeroUpperMove(MI, OutStreamer, 64, 128, "mem[0],zero");
18461865
break;
1847-
case X86::MOVSSrm:
1848-
case X86::VMOVSSrm:
1849-
case X86::VMOVSSZrm:
1850-
case X86::MOVSSrm_alt:
1851-
case X86::VMOVSSrm_alt:
1852-
case X86::VMOVSSZrm_alt:
1853-
case X86::MOVDI2PDIrm:
1854-
case X86::VMOVDI2PDIrm:
1855-
case X86::VMOVDI2PDIZrm:
1856-
SclWidth = 32;
1857-
VecWidth = 128;
1858-
break;
1859-
}
1860-
std::string Comment;
1861-
raw_string_ostream CS(Comment);
1862-
const MachineOperand &DstOp = MI->getOperand(0);
1863-
CS << X86ATTInstPrinter::getRegisterName(DstOp.getReg()) << " = ";
18641866

1865-
if (auto *C =
1866-
X86::getConstantFromPool(*MI, MI->getOperand(1 + X86::AddrDisp))) {
1867-
if ((unsigned)SclWidth == C->getType()->getScalarSizeInBits()) {
1868-
if (auto *CI = dyn_cast<ConstantInt>(C)) {
1869-
CS << "[";
1870-
printConstant(CI->getValue(), CS);
1871-
for (int I = 1, E = VecWidth / SclWidth; I < E; ++I) {
1872-
CS << ",0";
1873-
}
1874-
CS << "]";
1875-
OutStreamer.AddComment(CS.str());
1876-
break; // early-out
1877-
}
1878-
if (auto *CF = dyn_cast<ConstantFP>(C)) {
1879-
CS << "[";
1880-
printConstant(CF->getValue(), CS);
1881-
APFloat ZeroFP = APFloat::getZero(CF->getValue().getSemantics());
1882-
for (int I = 1, E = VecWidth / SclWidth; I < E; ++I) {
1883-
CS << ",";
1884-
printConstant(ZeroFP, CS);
1885-
}
1886-
CS << "]";
1887-
OutStreamer.AddComment(CS.str());
1888-
break; // early-out
1889-
}
1890-
}
1891-
}
1892-
1893-
// We didn't find a constant load, fallback to a shuffle mask decode.
1894-
CS << (SclWidth == 32 ? "mem[0],zero,zero,zero" : "mem[0],zero");
1895-
OutStreamer.AddComment(CS.str());
1867+
case X86::MOVSSrm:
1868+
case X86::VMOVSSrm:
1869+
case X86::VMOVSSZrm:
1870+
case X86::MOVSSrm_alt:
1871+
case X86::VMOVSSrm_alt:
1872+
case X86::VMOVSSZrm_alt:
1873+
case X86::MOVDI2PDIrm:
1874+
case X86::VMOVDI2PDIrm:
1875+
case X86::VMOVDI2PDIZrm:
1876+
printZeroUpperMove(MI, OutStreamer, 32, 128, "mem[0],zero,zero,zero");
18961877
break;
1897-
}
18981878

18991879
#define MOV_CASE(Prefix, Suffix) \
19001880
case X86::Prefix##MOVAPD##Suffix##rm: \

0 commit comments

Comments
 (0)