@@ -1536,6 +1536,52 @@ static void printConstant(const Constant *COp, unsigned BitWidth,
1536
1536
}
1537
1537
}
1538
1538
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
+
1539
1585
void X86AsmPrinter::EmitSEHInstruction (const MachineInstr *MI) {
1540
1586
assert (MF->hasWinCFI () && " SEH_ instruction in function without WinCFI?" );
1541
1587
assert ((getSubtarget ().isOSWindows () || TM.getTargetTriple ().isUEFI ()) &&
@@ -1807,94 +1853,28 @@ static void addConstantComments(const MachineInstr *MI,
1807
1853
}
1808
1854
1809
1855
case X86::MOVSDrm:
1810
- case X86::MOVSSrm:
1811
1856
case X86::VMOVSDrm:
1812
- case X86::VMOVSSrm:
1813
1857
case X86::VMOVSDZrm:
1814
- case X86::VMOVSSZrm:
1815
1858
case X86::MOVSDrm_alt:
1816
- case X86::MOVSSrm_alt:
1817
1859
case X86::VMOVSDrm_alt:
1818
- case X86::VMOVSSrm_alt:
1819
1860
case X86::VMOVSDZrm_alt:
1820
- case X86::VMOVSSZrm_alt:
1821
- case X86::MOVDI2PDIrm:
1822
1861
case X86::MOVQI2PQIrm:
1823
- case X86::VMOVDI2PDIrm:
1824
1862
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" );
1846
1865
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 ()) << " = " ;
1864
1866
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" );
1896
1877
break ;
1897
- }
1898
1878
1899
1879
#define MOV_CASE (Prefix, Suffix ) \
1900
1880
case X86::Prefix##MOVAPD##Suffix##rm: \
0 commit comments