[llvm-commits] [llvm] r99952 - in /llvm/trunk/lib/Target/X86: X86InstrFormats.td X86InstrInfo.cpp X86InstrInfo.h

Jakob Stoklund Olesen stoklund at 2pi.dk
Tue Mar 30 15:46:53 PDT 2010


Author: stoklund
Date: Tue Mar 30 17:46:53 2010
New Revision: 99952

URL: http://llvm.org/viewvc/llvm-project?rev=99952&view=rev
Log:
Renumber SSE execution domains for better code size.

SSEDomainFix will collapse to the domain with the lower number when it has a
choice. The SSEPackedSingle domain often has smaller instructions, so prefer
that.

Modified:
    llvm/trunk/lib/Target/X86/X86InstrFormats.td
    llvm/trunk/lib/Target/X86/X86InstrInfo.cpp
    llvm/trunk/lib/Target/X86/X86InstrInfo.h

Modified: llvm/trunk/lib/Target/X86/X86InstrFormats.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrFormats.td?rev=99952&r1=99951&r2=99952&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrFormats.td (original)
+++ llvm/trunk/lib/Target/X86/X86InstrFormats.td Tue Mar 30 17:46:53 2010
@@ -69,14 +69,14 @@
 def SpecialFP  : FPFormat<7>;
 
 // Class specifying the SSE execution domain, used by the SSEDomainFix pass.
-// Instruction execution domain.
+// Keep in sync with tables in X86InstrInfo.cpp.
 class Domain<bits<2> val> {
   bits<2> Value = val;
 }
 def GenericDomain   : Domain<0>;
-def SSEPackedInt    : Domain<1>;
-def SSEPackedSingle : Domain<2>;
-def SSEPackedDouble : Domain<3>;
+def SSEPackedSingle : Domain<1>;
+def SSEPackedDouble : Domain<2>;
+def SSEPackedInt    : Domain<3>;
 
 // Prefix byte classes which are used to indicate to the ad-hoc machine code
 // emitter that various prefix bytes are required.

Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.cpp?rev=99952&r1=99951&r2=99952&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86InstrInfo.cpp Tue Mar 30 17:46:53 2010
@@ -3663,20 +3663,20 @@
 // by intrinsics.
 static const unsigned ReplaceableInstrs[][3] = {
   //PackedInt       PackedSingle     PackedDouble
-  { X86::MOVDQAmr,  X86::MOVAPSmr,   X86::MOVAPDmr  },
-  { X86::MOVDQArm,  X86::MOVAPSrm,   X86::MOVAPDrm  },
-  { X86::MOVDQArr,  X86::MOVAPSrr,   X86::MOVAPDrr  },
-  { X86::MOVDQUmr,  X86::MOVUPSmr,   X86::MOVUPDmr  },
-  { X86::MOVDQUrm,  X86::MOVUPSrm,   X86::MOVUPDrm  },
-  { X86::MOVNTDQmr, X86::MOVNTPSmr,  X86::MOVNTPDmr },
-  { X86::PANDNrm,   X86::ANDNPSrm,   X86::ANDNPDrm  },
-  { X86::PANDNrr,   X86::ANDNPSrr,   X86::ANDNPDrr  },
-  { X86::PANDrm,    X86::ANDPSrm,    X86::ANDPDrm   },
-  { X86::PANDrr,    X86::ANDPSrr,    X86::ANDPDrr   },
-  { X86::PORrm,     X86::ORPSrm,     X86::ORPDrm    },
-  { X86::PORrr,     X86::ORPSrr,     X86::ORPDrr    },
-  { X86::PXORrm,    X86::XORPSrm,    X86::XORPDrm   },
-  { X86::PXORrr,    X86::XORPSrr,    X86::XORPDrr   },
+  { X86::MOVAPSmr,   X86::MOVAPDmr,  X86::MOVDQAmr  },
+  { X86::MOVAPSrm,   X86::MOVAPDrm,  X86::MOVDQArm  },
+  { X86::MOVAPSrr,   X86::MOVAPDrr,  X86::MOVDQArr  },
+  { X86::MOVUPSmr,   X86::MOVUPDmr,  X86::MOVDQUmr  },
+  { X86::MOVUPSrm,   X86::MOVUPDrm,  X86::MOVDQUrm  },
+  { X86::MOVNTPSmr,  X86::MOVNTPDmr, X86::MOVNTDQmr },
+  { X86::ANDNPSrm,   X86::ANDNPDrm,  X86::PANDNrm   },
+  { X86::ANDNPSrr,   X86::ANDNPDrr,  X86::PANDNrr   },
+  { X86::ANDPSrm,    X86::ANDPDrm,   X86::PANDrm    },
+  { X86::ANDPSrr,    X86::ANDPDrr,   X86::PANDrr    },
+  { X86::ORPSrm,     X86::ORPDrm,    X86::PORrm     },
+  { X86::ORPSrr,     X86::ORPDrr,    X86::PORrr     },
+  { X86::XORPSrm,    X86::XORPDrm,   X86::PXORrm    },
+  { X86::XORPSrr,    X86::XORPDrr,   X86::PXORrr    },
 };
 
 // FIXME: Some shuffle and unpack instructions have equivalents in different
@@ -3692,8 +3692,8 @@
 std::pair<uint16_t, uint16_t>
 X86InstrInfo::GetSSEDomain(const MachineInstr *MI) const {
   uint16_t domain = (MI->getDesc().TSFlags >> X86II::SSEDomainShift) & 3;
-  return std::make_pair(domain, domain != NotSSEDomain &&
-                                lookup(MI->getOpcode(), domain) ? 0xe : 0);
+  return std::make_pair(domain,
+                        domain && lookup(MI->getOpcode(), domain) ? 0xe : 0);
 }
 
 void X86InstrInfo::SetSSEDomain(MachineInstr *MI, unsigned Domain) const {

Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.h?rev=99952&r1=99951&r2=99952&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrInfo.h (original)
+++ llvm/trunk/lib/Target/X86/X86InstrInfo.h Tue Mar 30 17:46:53 2010
@@ -399,7 +399,7 @@
     GS          = 2 << SegOvrShift,
 
     // Execution domain for SSE instructions in bits 22, 23.
-    // 0 in bits 22-23 means normal, non-SSE instruction. See SSEDomain below.
+    // 0 in bits 22-23 means normal, non-SSE instruction.
     SSEDomainShift = 22,
 
     OpcodeShift   = 24,
@@ -719,9 +719,6 @@
   ///
   unsigned getGlobalBaseReg(MachineFunction *MF) const;
 
-  /// Some SSE instructions come in variants for three domains.
-  enum SSEDomain { NotSSEDomain, PackedInt, PackedSingle, PackedDouble };
-
   /// GetSSEDomain - Return the SSE execution domain of MI as the first element,
   /// and a bitmask of possible arguments to SetSSEDomain ase the second.
   std::pair<uint16_t, uint16_t> GetSSEDomain(const MachineInstr *MI) const;





More information about the llvm-commits mailing list