diff options
Diffstat (limited to 'lib/Target/X86/X86InstrInfo.h')
-rw-r--r-- | lib/Target/X86/X86InstrInfo.h | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/Target/X86/X86InstrInfo.h b/lib/Target/X86/X86InstrInfo.h index 5111719a20..965740dcaf 100644 --- a/lib/Target/X86/X86InstrInfo.h +++ b/lib/Target/X86/X86InstrInfo.h @@ -398,7 +398,10 @@ namespace X86II { FS = 1 << SegOvrShift, GS = 2 << SegOvrShift, - // Bits 22 -> 23 are unused + // Execution domain for SSE instructions in bits 22, 23. + // 0 in bits 22-23 means normal, non-SSE instruction. See SSEDomain below. + SSEDomainShift = 22, + OpcodeShift = 24, OpcodeMask = 0xFF << OpcodeShift }; @@ -486,7 +489,7 @@ class X86InstrInfo : public TargetInstrInfoImpl { /// MemOp2RegOpTable - Load / store unfolding opcode map. /// DenseMap<unsigned*, std::pair<unsigned, unsigned> > MemOp2RegOpTable; - + public: explicit X86InstrInfo(X86TargetMachine &tm); @@ -716,6 +719,15 @@ public: /// 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, or NotSSEDomain for + /// unknown instructions. If the instruction has equivalents for other + /// domains, equiv points to a list of opcodes for [PackedInt, PackedSingle, + /// PackedDouble]. + SSEDomain GetSSEDomain(const MachineInstr *MI, const unsigned *&equiv) const; + private: MachineInstr * convertToThreeAddressWithLEA(unsigned MIOpc, MachineFunction::iterator &MFI, |