LLVM API Documentation

X86InstrInfo.cpp

Go to the documentation of this file.
00001 //===- X86InstrInfo.cpp - X86 Instruction Information -----------*- C++ -*-===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file contains the X86 implementation of the TargetInstrInfo class.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #include "X86InstrInfo.h"
00015 #include "X86.h"
00016 #include "X86GenInstrInfo.inc"
00017 #include "X86InstrBuilder.h"
00018 #include "X86MachineFunctionInfo.h"
00019 #include "X86Subtarget.h"
00020 #include "X86TargetMachine.h"
00021 #include "llvm/DerivedTypes.h"
00022 #include "llvm/ADT/STLExtras.h"
00023 #include "llvm/CodeGen/MachineConstantPool.h"
00024 #include "llvm/CodeGen/MachineFrameInfo.h"
00025 #include "llvm/CodeGen/MachineInstrBuilder.h"
00026 #include "llvm/CodeGen/MachineRegisterInfo.h"
00027 #include "llvm/CodeGen/LiveVariables.h"
00028 #include "llvm/Support/CommandLine.h"
00029 #include "llvm/Target/TargetOptions.h"
00030 #include "llvm/Target/TargetAsmInfo.h"
00031 
00032 using namespace llvm;
00033 
00034 namespace {
00035   cl::opt<bool>
00036   NoFusing("disable-spill-fusing",
00037            cl::desc("Disable fusing of spill code into instructions"));
00038   cl::opt<bool>
00039   PrintFailedFusing("print-failed-fuse-candidates",
00040                     cl::desc("Print instructions that the allocator wants to"
00041                              " fuse, but the X86 backend currently can't"),
00042                     cl::Hidden);
00043   cl::opt<bool>
00044   ReMatPICStubLoad("remat-pic-stub-load",
00045                    cl::desc("Re-materialize load from stub in PIC mode"),
00046                    cl::init(false), cl::Hidden);
00047 }
00048 
00049 X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
00050   : TargetInstrInfoImpl(X86Insts, array_lengthof(X86Insts)),
00051     TM(tm), RI(tm, *this) {
00052   SmallVector<unsigned,16> AmbEntries;
00053   static const unsigned OpTbl2Addr[][2] = {
00054     { X86::ADC32ri,     X86::ADC32mi },
00055     { X86::ADC32ri8,    X86::ADC32mi8 },
00056     { X86::ADC32rr,     X86::ADC32mr },
00057     { X86::ADC64ri32,   X86::ADC64mi32 },
00058     { X86::ADC64ri8,    X86::ADC64mi8 },
00059     { X86::ADC64rr,     X86::ADC64mr },
00060     { X86::ADD16ri,     X86::ADD16mi },
00061     { X86::ADD16ri8,    X86::ADD16mi8 },
00062     { X86::ADD16rr,     X86::ADD16mr },
00063     { X86::ADD32ri,     X86::ADD32mi },
00064     { X86::ADD32ri8,    X86::ADD32mi8 },
00065     { X86::ADD32rr,     X86::ADD32mr },
00066     { X86::ADD64ri32,   X86::ADD64mi32 },
00067     { X86::ADD64ri8,    X86::ADD64mi8 },
00068     { X86::ADD64rr,     X86::ADD64mr },
00069     { X86::ADD8ri,      X86::ADD8mi },
00070     { X86::ADD8rr,      X86::ADD8mr },
00071     { X86::AND16ri,     X86::AND16mi },
00072     { X86::AND16ri8,    X86::AND16mi8 },
00073     { X86::AND16rr,     X86::AND16mr },
00074     { X86::AND32ri,     X86::AND32mi },
00075     { X86::AND32ri8,    X86::AND32mi8 },
00076     { X86::AND32rr,     X86::AND32mr },
00077     { X86::AND64ri32,   X86::AND64mi32 },
00078     { X86::AND64ri8,    X86::AND64mi8 },
00079     { X86::AND64rr,     X86::AND64mr },
00080     { X86::AND8ri,      X86::AND8mi },
00081     { X86::AND8rr,      X86::AND8mr },
00082     { X86::DEC16r,      X86::DEC16m },
00083     { X86::DEC32r,      X86::DEC32m },
00084     { X86::DEC64_16r,   X86::DEC64_16m },
00085     { X86::DEC64_32r,   X86::DEC64_32m },
00086     { X86::DEC64r,      X86::DEC64m },
00087     { X86::DEC8r,       X86::DEC8m },
00088     { X86::INC16r,      X86::INC16m },
00089     { X86::INC32r,      X86::INC32m },
00090     { X86::INC64_16r,   X86::INC64_16m },
00091     { X86::INC64_32r,   X86::INC64_32m },
00092     { X86::INC64r,      X86::INC64m },
00093     { X86::INC8r,       X86::INC8m },
00094     { X86::NEG16r,      X86::NEG16m },
00095     { X86::NEG32r,      X86::NEG32m },
00096     { X86::NEG64r,      X86::NEG64m },
00097     { X86::NEG8r,       X86::NEG8m },
00098     { X86::NOT16r,      X86::NOT16m },
00099     { X86::NOT32r,      X86::NOT32m },
00100     { X86::NOT64r,      X86::NOT64m },
00101     { X86::NOT8r,       X86::NOT8m },
00102     { X86::OR16ri,      X86::OR16mi },
00103     { X86::OR16ri8,     X86::OR16mi8 },
00104     { X86::OR16rr,      X86::OR16mr },
00105     { X86::OR32ri,      X86::OR32mi },
00106     { X86::OR32ri8,     X86::OR32mi8 },
00107     { X86::OR32rr,      X86::OR32mr },
00108     { X86::OR64ri32,    X86::OR64mi32 },
00109     { X86::OR64ri8,     X86::OR64mi8 },
00110     { X86::OR64rr,      X86::OR64mr },
00111     { X86::OR8ri,       X86::OR8mi },
00112     { X86::OR8rr,       X86::OR8mr },
00113     { X86::ROL16r1,     X86::ROL16m1 },
00114     { X86::ROL16rCL,    X86::ROL16mCL },
00115     { X86::ROL16ri,     X86::ROL16mi },
00116     { X86::ROL32r1,     X86::ROL32m1 },
00117     { X86::ROL32rCL,    X86::ROL32mCL },
00118     { X86::ROL32ri,     X86::ROL32mi },
00119     { X86::ROL64r1,     X86::ROL64m1 },
00120     { X86::ROL64rCL,    X86::ROL64mCL },
00121     { X86::ROL64ri,     X86::ROL64mi },
00122     { X86::ROL8r1,      X86::ROL8m1 },
00123     { X86::ROL8rCL,     X86::ROL8mCL },
00124     { X86::ROL8ri,      X86::ROL8mi },
00125     { X86::ROR16r1,     X86::ROR16m1 },
00126     { X86::ROR16rCL,    X86::ROR16mCL },
00127     { X86::ROR16ri,     X86::ROR16mi },
00128     { X86::ROR32r1,     X86::ROR32m1 },
00129     { X86::ROR32rCL,    X86::ROR32mCL },
00130     { X86::ROR32ri,     X86::ROR32mi },
00131     { X86::ROR64r1,     X86::ROR64m1 },
00132     { X86::ROR64rCL,    X86::ROR64mCL },
00133     { X86::ROR64ri,     X86::ROR64mi },
00134     { X86::ROR8r1,      X86::ROR8m1 },
00135     { X86::ROR8rCL,     X86::ROR8mCL },
00136     { X86::ROR8ri,      X86::ROR8mi },
00137     { X86::SAR16r1,     X86::SAR16m1 },
00138     { X86::SAR16rCL,    X86::SAR16mCL },
00139     { X86::SAR16ri,     X86::SAR16mi },
00140     { X86::SAR32r1,     X86::SAR32m1 },
00141     { X86::SAR32rCL,    X86::SAR32mCL },
00142     { X86::SAR32ri,     X86::SAR32mi },
00143     { X86::SAR64r1,     X86::SAR64m1 },
00144     { X86::SAR64rCL,    X86::SAR64mCL },
00145     { X86::SAR64ri,     X86::SAR64mi },
00146     { X86::SAR8r1,      X86::SAR8m1 },
00147     { X86::SAR8rCL,     X86::SAR8mCL },
00148     { X86::SAR8ri,      X86::SAR8mi },
00149     { X86::SBB32ri,     X86::SBB32mi },
00150     { X86::SBB32ri8,    X86::SBB32mi8 },
00151     { X86::SBB32rr,     X86::SBB32mr },
00152     { X86::SBB64ri32,   X86::SBB64mi32 },
00153     { X86::SBB64ri8,    X86::SBB64mi8 },
00154     { X86::SBB64rr,     X86::SBB64mr },
00155     { X86::SHL16rCL,    X86::SHL16mCL },
00156     { X86::SHL16ri,     X86::SHL16mi },
00157     { X86::SHL32rCL,    X86::SHL32mCL },
00158     { X86::SHL32ri,     X86::SHL32mi },
00159     { X86::SHL64rCL,    X86::SHL64mCL },
00160     { X86::SHL64ri,     X86::SHL64mi },
00161     { X86::SHL8rCL,     X86::SHL8mCL },
00162     { X86::SHL8ri,      X86::SHL8mi },
00163     { X86::SHLD16rrCL,  X86::SHLD16mrCL },
00164     { X86::SHLD16rri8,  X86::SHLD16mri8 },
00165     { X86::SHLD32rrCL,  X86::SHLD32mrCL },
00166     { X86::SHLD32rri8,  X86::SHLD32mri8 },
00167     { X86::SHLD64rrCL,  X86::SHLD64mrCL },
00168     { X86::SHLD64rri8,  X86::SHLD64mri8 },
00169     { X86::SHR16r1,     X86::SHR16m1 },
00170     { X86::SHR16rCL,    X86::SHR16mCL },
00171     { X86::SHR16ri,     X86::SHR16mi },
00172     { X86::SHR32r1,     X86::SHR32m1 },
00173     { X86::SHR32rCL,    X86::SHR32mCL },
00174     { X86::SHR32ri,     X86::SHR32mi },
00175     { X86::SHR64r1,     X86::SHR64m1 },
00176     { X86::SHR64rCL,    X86::SHR64mCL },
00177     { X86::SHR64ri,     X86::SHR64mi },
00178     { X86::SHR8r1,      X86::SHR8m1 },
00179     { X86::SHR8rCL,     X86::SHR8mCL },
00180     { X86::SHR8ri,      X86::SHR8mi },
00181     { X86::SHRD16rrCL,  X86::SHRD16mrCL },
00182     { X86::SHRD16rri8,  X86::SHRD16mri8 },
00183     { X86::SHRD32rrCL,  X86::SHRD32mrCL },
00184     { X86::SHRD32rri8,  X86::SHRD32mri8 },
00185     { X86::SHRD64rrCL,  X86::SHRD64mrCL },
00186     { X86::SHRD64rri8,  X86::SHRD64mri8 },
00187     { X86::SUB16ri,     X86::SUB16mi },
00188     { X86::SUB16ri8,    X86::SUB16mi8 },
00189     { X86::SUB16rr,     X86::SUB16mr },
00190     { X86::SUB32ri,     X86::SUB32mi },
00191     { X86::SUB32ri8,    X86::SUB32mi8 },
00192     { X86::SUB32rr,     X86::SUB32mr },
00193     { X86::SUB64ri32,   X86::SUB64mi32 },
00194     { X86::SUB64ri8,    X86::SUB64mi8 },
00195     { X86::SUB64rr,     X86::SUB64mr },
00196     { X86::SUB8ri,      X86::SUB8mi },
00197     { X86::SUB8rr,      X86::SUB8mr },
00198     { X86::XOR16ri,     X86::XOR16mi },
00199     { X86::XOR16ri8,    X86::XOR16mi8 },
00200     { X86::XOR16rr,     X86::XOR16mr },
00201     { X86::XOR32ri,     X86::XOR32mi },
00202     { X86::XOR32ri8,    X86::XOR32mi8 },
00203     { X86::XOR32rr,     X86::XOR32mr },
00204     { X86::XOR64ri32,   X86::XOR64mi32 },
00205     { X86::XOR64ri8,    X86::XOR64mi8 },
00206     { X86::XOR64rr,     X86::XOR64mr },
00207     { X86::XOR8ri,      X86::XOR8mi },
00208     { X86::XOR8rr,      X86::XOR8mr }
00209   };
00210 
00211   for (unsigned i = 0, e = array_lengthof(OpTbl2Addr); i != e; ++i) {
00212     unsigned RegOp = OpTbl2Addr[i][0];
00213     unsigned MemOp = OpTbl2Addr[i][1];
00214     if (!RegOp2MemOpTable2Addr.insert(std::make_pair((unsigned*)RegOp,
00215                                                      MemOp)).second)
00216       assert(false && "Duplicated entries?");
00217     unsigned AuxInfo = 0 | (1 << 4) | (1 << 5); // Index 0,folded load and store
00218     if (!MemOp2RegOpTable.insert(std::make_pair((unsigned*)MemOp,
00219                                                 std::make_pair(RegOp,
00220                                                               AuxInfo))).second)
00221       AmbEntries.push_back(MemOp);
00222   }
00223 
00224   // If the third value is 1, then it's folding either a load or a store.
00225   static const unsigned OpTbl0[][3] = {
00226     { X86::BT16ri8,     X86::BT16mi8, 1 },
00227     { X86::BT32ri8,     X86::BT32mi8, 1 },
00228     { X86::BT64ri8,     X86::BT64mi8, 1 },
00229     { X86::CALL32r,     X86::CALL32m, 1 },
00230     { X86::CALL64r,     X86::CALL64m, 1 },
00231     { X86::CMP16ri,     X86::CMP16mi, 1 },
00232     { X86::CMP16ri8,    X86::CMP16mi8, 1 },
00233     { X86::CMP16rr,     X86::CMP16mr, 1 },
00234     { X86::CMP32ri,     X86::CMP32mi, 1 },
00235     { X86::CMP32ri8,    X86::CMP32mi8, 1 },
00236     { X86::CMP32rr,     X86::CMP32mr, 1 },
00237     { X86::CMP64ri32,   X86::CMP64mi32, 1 },
00238     { X86::CMP64ri8,    X86::CMP64mi8, 1 },
00239     { X86::CMP64rr,     X86::CMP64mr, 1 },
00240     { X86::CMP8ri,      X86::CMP8mi, 1 },
00241     { X86::CMP8rr,      X86::CMP8mr, 1 },
00242     { X86::DIV16r,      X86::DIV16m, 1 },
00243     { X86::DIV32r,      X86::DIV32m, 1 },
00244     { X86::DIV64r,      X86::DIV64m, 1 },
00245     { X86::DIV8r,       X86::DIV8m, 1 },
00246     { X86::EXTRACTPSrr, X86::EXTRACTPSmr, 0 },
00247     { X86::FsMOVAPDrr,  X86::MOVSDmr, 0 },
00248     { X86::FsMOVAPSrr,  X86::MOVSSmr, 0 },
00249     { X86::IDIV16r,     X86::IDIV16m, 1 },
00250     { X86::IDIV32r,     X86::IDIV32m, 1 },
00251     { X86::IDIV64r,     X86::IDIV64m, 1 },
00252     { X86::IDIV8r,      X86::IDIV8m, 1 },
00253     { X86::IMUL16r,     X86::IMUL16m, 1 },
00254     { X86::IMUL32r,     X86::IMUL32m, 1 },
00255     { X86::IMUL64r,     X86::IMUL64m, 1 },
00256     { X86::IMUL8r,      X86::IMUL8m, 1 },
00257     { X86::JMP32r,      X86::JMP32m, 1 },
00258     { X86::JMP64r,      X86::JMP64m, 1 },
00259     { X86::MOV16ri,     X86::MOV16mi, 0 },
00260     { X86::MOV16rr,     X86::MOV16mr, 0 },
00261     { X86::MOV16to16_,  X86::MOV16_mr, 0 },
00262     { X86::MOV32ri,     X86::MOV32mi, 0 },
00263     { X86::MOV32rr,     X86::MOV32mr, 0 },
00264     { X86::MOV32to32_,  X86::MOV32_mr, 0 },
00265     { X86::MOV64ri32,   X86::MOV64mi32, 0 },
00266     { X86::MOV64rr,     X86::MOV64mr, 0 },
00267     { X86::MOV8ri,      X86::MOV8mi, 0 },
00268     { X86::MOV8rr,      X86::MOV8mr, 0 },
00269     { X86::MOVAPDrr,    X86::MOVAPDmr, 0 },
00270     { X86::MOVAPSrr,    X86::MOVAPSmr, 0 },
00271     { X86::MOVDQArr,    X86::MOVDQAmr, 0 },
00272     { X86::MOVPDI2DIrr, X86::MOVPDI2DImr, 0 },
00273     { X86::MOVPQIto64rr,X86::MOVPQI2QImr, 0 },
00274     { X86::MOVPS2SSrr,  X86::MOVPS2SSmr, 0 },
00275     { X86::MOVSDrr,     X86::MOVSDmr, 0 },
00276     { X86::MOVSDto64rr, X86::MOVSDto64mr, 0 },
00277     { X86::MOVSS2DIrr,  X86::MOVSS2DImr, 0 },
00278     { X86::MOVSSrr,     X86::MOVSSmr, 0 },
00279     { X86::MOVUPDrr,    X86::MOVUPDmr, 0 },
00280     { X86::MOVUPSrr,    X86::MOVUPSmr, 0 },
00281     { X86::MUL16r,      X86::MUL16m, 1 },
00282     { X86::MUL32r,      X86::MUL32m, 1 },
00283     { X86::MUL64r,      X86::MUL64m, 1 },
00284     { X86::MUL8r,       X86::MUL8m, 1 },
00285     { X86::SETAEr,      X86::SETAEm, 0 },
00286     { X86::SETAr,       X86::SETAm, 0 },
00287     { X86::SETBEr,      X86::SETBEm, 0 },
00288     { X86::SETBr,       X86::SETBm, 0 },
00289     { X86::SETEr,       X86::SETEm, 0 },
00290     { X86::SETGEr,      X86::SETGEm, 0 },
00291     { X86::SETGr,       X86::SETGm, 0 },
00292     { X86::SETLEr,      X86::SETLEm, 0 },
00293     { X86::SETLr,       X86::SETLm, 0 },
00294     { X86::SETNEr,      X86::SETNEm, 0 },
00295     { X86::SETNOr,      X86::SETNOm, 0 },
00296     { X86::SETNPr,      X86::SETNPm, 0 },
00297     { X86::SETNSr,      X86::SETNSm, 0 },
00298     { X86::SETOr,       X86::SETOm, 0 },
00299     { X86::SETPr,       X86::SETPm, 0 },
00300     { X86::SETSr,       X86::SETSm, 0 },
00301     { X86::TAILJMPr,    X86::TAILJMPm, 1 },
00302     { X86::TEST16ri,    X86::TEST16mi, 1 },
00303     { X86::TEST32ri,    X86::TEST32mi, 1 },
00304     { X86::TEST64ri32,  X86::TEST64mi32, 1 },
00305     { X86::TEST8ri,     X86::TEST8mi, 1 }
00306   };
00307 
00308   for (unsigned i = 0, e = array_lengthof(OpTbl0); i != e; ++i) {
00309     unsigned RegOp = OpTbl0[i][0];
00310     unsigned MemOp = OpTbl0[i][1];
00311     if (!RegOp2MemOpTable0.insert(std::make_pair((unsigned*)RegOp,
00312                                                  MemOp)).second)
00313       assert(false && "Duplicated entries?");
00314     unsigned FoldedLoad = OpTbl0[i][2];
00315     // Index 0, folded load or store.
00316     unsigned AuxInfo = 0 | (FoldedLoad << 4) | ((FoldedLoad^1) << 5);
00317     if (RegOp != X86::FsMOVAPDrr && RegOp != X86::FsMOVAPSrr)
00318       if (!MemOp2RegOpTable.insert(std::make_pair((unsigned*)MemOp,
00319                                      std::make_pair(RegOp, AuxInfo))).second)
00320         AmbEntries.push_back(MemOp);
00321   }
00322 
00323   static const unsigned OpTbl1[][2] = {
00324     { X86::CMP16rr,         X86::CMP16rm },
00325     { X86::CMP32rr,         X86::CMP32rm },
00326     { X86::CMP64rr,         X86::CMP64rm },
00327     { X86::CMP8rr,          X86::CMP8rm },
00328     { X86::CVTSD2SSrr,      X86::CVTSD2SSrm },
00329     { X86::CVTSI2SD64rr,    X86::CVTSI2SD64rm },
00330     { X86::CVTSI2SDrr,      X86::CVTSI2SDrm },
00331     { X86::CVTSI2SS64rr,    X86::CVTSI2SS64rm },
00332     { X86::CVTSI2SSrr,      X86::CVTSI2SSrm },
00333     { X86::CVTSS2SDrr,      X86::CVTSS2SDrm },
00334     { X86::CVTTSD2SI64rr,   X86::CVTTSD2SI64rm },
00335     { X86::CVTTSD2SIrr,     X86::CVTTSD2SIrm },
00336     { X86::CVTTSS2SI64rr,   X86::CVTTSS2SI64rm },
00337     { X86::CVTTSS2SIrr,     X86::CVTTSS2SIrm },
00338     { X86::FsMOVAPDrr,      X86::MOVSDrm },
00339     { X86::FsMOVAPSrr,      X86::MOVSSrm },
00340     { X86::IMUL16rri,       X86::IMUL16rmi },
00341     { X86::IMUL16rri8,      X86::IMUL16rmi8 },
00342     { X86::IMUL32rri,       X86::IMUL32rmi },
00343     { X86::IMUL32rri8,      X86::IMUL32rmi8 },
00344     { X86::IMUL64rri32,     X86::IMUL64rmi32 },
00345     { X86::IMUL64rri8,      X86::IMUL64rmi8 },
00346     { X86::Int_CMPSDrr,     X86::Int_CMPSDrm },
00347     { X86::Int_CMPSSrr,     X86::Int_CMPSSrm },
00348     { X86::Int_COMISDrr,    X86::Int_COMISDrm },
00349     { X86::Int_COMISSrr,    X86::Int_COMISSrm },
00350     { X86::Int_CVTDQ2PDrr,  X86::Int_CVTDQ2PDrm },
00351     { X86::Int_CVTDQ2PSrr,  X86::Int_CVTDQ2PSrm },
00352     { X86::Int_CVTPD2DQrr,  X86::Int_CVTPD2DQrm },
00353     { X86::Int_CVTPD2PSrr,  X86::Int_CVTPD2PSrm },
00354     { X86::Int_CVTPS2DQrr,  X86::Int_CVTPS2DQrm },
00355     { X86::Int_CVTPS2PDrr,  X86::Int_CVTPS2PDrm },
00356     { X86::Int_CVTSD2SI64rr,X86::Int_CVTSD2SI64rm },
00357     { X86::Int_CVTSD2SIrr,  X86::Int_CVTSD2SIrm },
00358     { X86::Int_CVTSD2SSrr,  X86::Int_CVTSD2SSrm },
00359     { X86::Int_CVTSI2SD64rr,X86::Int_CVTSI2SD64rm },
00360     { X86::Int_CVTSI2SDrr,  X86::Int_CVTSI2SDrm },
00361     { X86::Int_CVTSI2SS64rr,X86::Int_CVTSI2SS64rm },
00362     { X86::Int_CVTSI2SSrr,  X86::Int_CVTSI2SSrm },
00363     { X86::Int_CVTSS2SDrr,  X86::Int_CVTSS2SDrm },
00364     { X86::Int_CVTSS2SI64rr,X86::Int_CVTSS2SI64rm },
00365     { X86::Int_CVTSS2SIrr,  X86::Int_CVTSS2SIrm },
00366     { X86::Int_CVTTPD2DQrr, X86::Int_CVTTPD2DQrm },
00367     { X86::Int_CVTTPS2DQrr, X86::Int_CVTTPS2DQrm },
00368     { X86::Int_CVTTSD2SI64rr,X86::Int_CVTTSD2SI64rm },
00369     { X86::Int_CVTTSD2SIrr, X86::Int_CVTTSD2SIrm },
00370     { X86::Int_CVTTSS2SI64rr,X86::Int_CVTTSS2SI64rm },
00371     { X86::Int_CVTTSS2SIrr, X86::Int_CVTTSS2SIrm },
00372     { X86::Int_UCOMISDrr,   X86::Int_UCOMISDrm },
00373     { X86::Int_UCOMISSrr,   X86::Int_UCOMISSrm },
00374     { X86::MOV16rr,         X86::MOV16rm },
00375     { X86::MOV16to16_,      X86::MOV16_rm },
00376     { X86::MOV32rr,         X86::MOV32rm },
00377     { X86::MOV32to32_,      X86::MOV32_rm },
00378     { X86::MOV64rr,         X86::MOV64rm },
00379     { X86::MOV64toPQIrr,    X86::MOVQI2PQIrm },
00380     { X86::MOV64toSDrr,     X86::MOV64toSDrm },
00381     { X86::MOV8rr,          X86::MOV8rm },
00382     { X86::MOVAPDrr,        X86::MOVAPDrm },
00383     { X86::MOVAPSrr,        X86::MOVAPSrm },
00384     { X86::MOVDDUPrr,       X86::MOVDDUPrm },
00385     { X86::MOVDI2PDIrr,     X86::MOVDI2PDIrm },
00386     { X86::MOVDI2SSrr,      X86::MOVDI2SSrm },
00387     { X86::MOVDQArr,        X86::MOVDQArm },
00388     { X86::MOVSD2PDrr,      X86::MOVSD2PDrm },
00389     { X86::MOVSDrr,         X86::MOVSDrm },
00390     { X86::MOVSHDUPrr,      X86::MOVSHDUPrm },
00391     { X86::MOVSLDUPrr,      X86::MOVSLDUPrm },
00392     { X86::MOVSS2PSrr,      X86::MOVSS2PSrm },
00393     { X86::MOVSSrr,         X86::MOVSSrm },
00394     { X86::MOVSX16rr8,      X86::MOVSX16rm8 },
00395     { X86::MOVSX32rr16,     X86::MOVSX32rm16 },
00396     { X86::MOVSX32rr8,      X86::MOVSX32rm8 },
00397     { X86::MOVSX64rr16,     X86::MOVSX64rm16 },
00398     { X86::MOVSX64rr32,     X86::MOVSX64rm32 },
00399     { X86::MOVSX64rr8,      X86::MOVSX64rm8 },
00400     { X86::MOVUPDrr,        X86::MOVUPDrm },
00401     { X86::MOVUPSrr,        X86::MOVUPSrm },
00402     { X86::MOVZDI2PDIrr,    X86::MOVZDI2PDIrm },
00403     { X86::MOVZQI2PQIrr,    X86::MOVZQI2PQIrm },
00404     { X86::MOVZPQILo2PQIrr, X86::MOVZPQILo2PQIrm },
00405     { X86::MOVZX16rr8,      X86::MOVZX16rm8 },
00406     { X86::MOVZX32rr16,     X86::MOVZX32rm16 },
00407     { X86::MOVZX32rr8,      X86::MOVZX32rm8 },
00408     { X86::MOVZX64rr16,     X86::MOVZX64rm16 },
00409     { X86::MOVZX64rr32,     X86::MOVZX64rm32 },
00410     { X86::MOVZX64rr8,      X86::MOVZX64rm8 },
00411     { X86::PSHUFDri,        X86::PSHUFDmi },
00412     { X86::PSHUFHWri,       X86::PSHUFHWmi },
00413     { X86::PSHUFLWri,       X86::PSHUFLWmi },
00414     { X86::RCPPSr,          X86::RCPPSm },
00415     { X86::RCPPSr_Int,      X86::RCPPSm_Int },
00416     { X86::RSQRTPSr,        X86::RSQRTPSm },
00417     { X86::RSQRTPSr_Int,    X86::RSQRTPSm_Int },
00418     { X86::RSQRTSSr,        X86::RSQRTSSm },
00419     { X86::RSQRTSSr_Int,    X86::RSQRTSSm_Int },
00420     { X86::SQRTPDr,         X86::SQRTPDm },
00421     { X86::SQRTPDr_Int,     X86::SQRTPDm_Int },
00422     { X86::SQRTPSr,         X86::SQRTPSm },
00423     { X86::SQRTPSr_Int,     X86::SQRTPSm_Int },
00424     { X86::SQRTSDr,         X86::SQRTSDm },
00425     { X86::SQRTSDr_Int,     X86::SQRTSDm_Int },
00426     { X86::SQRTSSr,         X86::SQRTSSm },
00427     { X86::SQRTSSr_Int,     X86::SQRTSSm_Int },
00428     { X86::TEST16rr,        X86::TEST16rm },
00429     { X86::TEST32rr,        X86::TEST32rm },
00430     { X86::TEST64rr,        X86::TEST64rm },
00431     { X86::TEST8rr,         X86::TEST8rm },
00432     // FIXME: TEST*rr EAX,EAX ---> CMP [mem], 0
00433     { X86::UCOMISDrr,       X86::UCOMISDrm },
00434     { X86::UCOMISSrr,       X86::UCOMISSrm }
00435   };
00436 
00437   for (unsigned i = 0, e = array_lengthof(OpTbl1); i != e; ++i) {
00438     unsigned RegOp = OpTbl1[i][0];
00439     unsigned MemOp = OpTbl1[i][1];
00440     if (!RegOp2MemOpTable1.insert(std::make_pair((unsigned*)RegOp,
00441                                                  MemOp)).second)
00442       assert(false && "Duplicated entries?");
00443     unsigned AuxInfo = 1 | (1 << 4); // Index 1, folded load
00444     if (RegOp != X86::FsMOVAPDrr && RegOp != X86::FsMOVAPSrr)
00445       if (!MemOp2RegOpTable.insert(std::make_pair((unsigned*)MemOp,
00446                                      std::make_pair(RegOp, AuxInfo))).second)
00447         AmbEntries.push_back(MemOp);
00448   }
00449 
00450   static const unsigned OpTbl2[][2] = {
00451     { X86::ADC32rr,         X86::ADC32rm },
00452     { X86::ADC64rr,         X86::ADC64rm },
00453     { X86::ADD16rr,         X86::ADD16rm },
00454     { X86::ADD32rr,         X86::ADD32rm },
00455     { X86::ADD64rr,         X86::ADD64rm },
00456     { X86::ADD8rr,          X86::ADD8rm },
00457     { X86::ADDPDrr,         X86::ADDPDrm },
00458     { X86::ADDPSrr,         X86::ADDPSrm },
00459     { X86::ADDSDrr,         X86::ADDSDrm },
00460     { X86::ADDSSrr,         X86::ADDSSrm },
00461     { X86::ADDSUBPDrr,      X86::ADDSUBPDrm },
00462     { X86::ADDSUBPSrr,      X86::ADDSUBPSrm },
00463     { X86::AND16rr,         X86::AND16rm },
00464     { X86::AND32rr,         X86::AND32rm },
00465     { X86::AND64rr,         X86::AND64rm },
00466     { X86::AND8rr,          X86::AND8rm },
00467     { X86::ANDNPDrr,        X86::ANDNPDrm },
00468     { X86::ANDNPSrr,        X86::ANDNPSrm },
00469     { X86::ANDPDrr,         X86::ANDPDrm },
00470     { X86::ANDPSrr,         X86::ANDPSrm },
00471     { X86::CMOVA16rr,       X86::CMOVA16rm },
00472     { X86::CMOVA32rr,       X86::CMOVA32rm },
00473     { X86::CMOVA64rr,       X86::CMOVA64rm },
00474     { X86::CMOVAE16rr,      X86::CMOVAE16rm },
00475     { X86::CMOVAE32rr,      X86::CMOVAE32rm },
00476     { X86::CMOVAE64rr,      X86::CMOVAE64rm },
00477     { X86::CMOVB16rr,       X86::CMOVB16rm },
00478     { X86::CMOVB32rr,       X86::CMOVB32rm },
00479     { X86::CMOVB64rr,       X86::CMOVB64rm },
00480     { X86::CMOVBE16rr,      X86::CMOVBE16rm },
00481     { X86::CMOVBE32rr,      X86::CMOVBE32rm },
00482     { X86::CMOVBE64rr,      X86::CMOVBE64rm },
00483     { X86::CMOVE16rr,       X86::CMOVE16rm },
00484     { X86::CMOVE32rr,       X86::CMOVE32rm },
00485     { X86::CMOVE64rr,       X86::CMOVE64rm },
00486     { X86::CMOVG16rr,       X86::CMOVG16rm },
00487     { X86::CMOVG32rr,       X86::CMOVG32rm },
00488     { X86::CMOVG64rr,       X86::CMOVG64rm },
00489     { X86::CMOVGE16rr,      X86::CMOVGE16rm },
00490     { X86::CMOVGE32rr,      X86::CMOVGE32rm },
00491     { X86::CMOVGE64rr,      X86::CMOVGE64rm },
00492     { X86::CMOVL16rr,       X86::CMOVL16rm },
00493     { X86::CMOVL32rr,       X86::CMOVL32rm },
00494     { X86::CMOVL64rr,       X86::CMOVL64rm },
00495     { X86::CMOVLE16rr,      X86::CMOVLE16rm },
00496     { X86::CMOVLE32rr,      X86::CMOVLE32rm },
00497     { X86::CMOVLE64rr,      X86::CMOVLE64rm },
00498     { X86::CMOVNE16rr,      X86::CMOVNE16rm },
00499     { X86::CMOVNE32rr,      X86::CMOVNE32rm },
00500     { X86::CMOVNE64rr,      X86::CMOVNE64rm },
00501     { X86::CMOVNO16rr,      X86::CMOVNO16rm },
00502     { X86::CMOVNO32rr,      X86::CMOVNO32rm },
00503     { X86::CMOVNO64rr,      X86::CMOVNO64rm },
00504     { X86::CMOVNP16rr,      X86::CMOVNP16rm },
00505     { X86::CMOVNP32rr,      X86::CMOVNP32rm },
00506     { X86::CMOVNP64rr,      X86::CMOVNP64rm },
00507     { X86::CMOVNS16rr,      X86::CMOVNS16rm },
00508     { X86::CMOVNS32rr,      X86::CMOVNS32rm },
00509     { X86::CMOVNS64rr,      X86::CMOVNS64rm },
00510     { X86::CMOVO16rr,       X86::CMOVO16rm },
00511     { X86::CMOVO32rr,       X86::CMOVO32rm },
00512     { X86::CMOVO64rr,       X86::CMOVO64rm },
00513     { X86::CMOVP16rr,       X86::CMOVP16rm },
00514     { X86::CMOVP32rr,       X86::CMOVP32rm },
00515     { X86::CMOVP64rr,       X86::CMOVP64rm },
00516     { X86::CMOVS16rr,       X86::CMOVS16rm },
00517     { X86::CMOVS32rr,       X86::CMOVS32rm },
00518     { X86::CMOVS64rr,       X86::CMOVS64rm },
00519     { X86::CMPPDrri,        X86::CMPPDrmi },
00520     { X86::CMPPSrri,        X86::CMPPSrmi },
00521     { X86::CMPSDrr,         X86::CMPSDrm },
00522     { X86::CMPSSrr,         X86::CMPSSrm },
00523     { X86::DIVPDrr,         X86::DIVPDrm },
00524     { X86::DIVPSrr,         X86::DIVPSrm },
00525     { X86::DIVSDrr,         X86::DIVSDrm },
00526     { X86::DIVSSrr,         X86::DIVSSrm },
00527     { X86::FsANDNPDrr,      X86::FsANDNPDrm },
00528     { X86::FsANDNPSrr,      X86::FsANDNPSrm },
00529     { X86::FsANDPDrr,       X86::FsANDPDrm },
00530     { X86::FsANDPSrr,       X86::FsANDPSrm },
00531     { X86::FsORPDrr,        X86::FsORPDrm },
00532     { X86::FsORPSrr,        X86::FsORPSrm },
00533     { X86::FsXORPDrr,       X86::FsXORPDrm },
00534     { X86::FsXORPSrr,       X86::FsXORPSrm },
00535     { X86::HADDPDrr,        X86::HADDPDrm },
00536     { X86::HADDPSrr,        X86::HADDPSrm },
00537     { X86::HSUBPDrr,        X86::HSUBPDrm },
00538     { X86::HSUBPSrr,        X86::HSUBPSrm },
00539     { X86::IMUL16rr,        X86::IMUL16rm },
00540     { X86::IMUL32rr,        X86::IMUL32rm },
00541     { X86::IMUL64rr,        X86::IMUL64rm },
00542     { X86::MAXPDrr,         X86::MAXPDrm },
00543     { X86::MAXPDrr_Int,     X86::MAXPDrm_Int },
00544     { X86::MAXPSrr,         X86::MAXPSrm },
00545     { X86::MAXPSrr_Int,     X86::MAXPSrm_Int },
00546     { X86::MAXSDrr,         X86::MAXSDrm },
00547     { X86::MAXSDrr_Int,     X86::MAXSDrm_Int },
00548     { X86::MAXSSrr,         X86::MAXSSrm },
00549     { X86::MAXSSrr_Int,     X86::MAXSSrm_Int },
00550     { X86::MINPDrr,         X86::MINPDrm },
00551     { X86::MINPDrr_Int,     X86::MINPDrm_Int },
00552     { X86::MINPSrr,         X86::MINPSrm },
00553     { X86::MINPSrr_Int,     X86::MINPSrm_Int },
00554     { X86::MINSDrr,         X86::MINSDrm },
00555     { X86::MINSDrr_Int,     X86::MINSDrm_Int },
00556     { X86::MINSSrr,         X86::MINSSrm },
00557     { X86::MINSSrr_Int,     X86::MINSSrm_Int },
00558     { X86::MULPDrr,         X86::MULPDrm },
00559     { X86::MULPSrr,         X86::MULPSrm },
00560     { X86::MULSDrr,         X86::MULSDrm },
00561     { X86::MULSSrr,         X86::MULSSrm },
00562     { X86::OR16rr,          X86::OR16rm },
00563     { X86::OR32rr,          X86::OR32rm },
00564     { X86::OR64rr,          X86::OR64rm },
00565     { X86::OR8rr,           X86::OR8rm },
00566     { X86::ORPDrr,          X86::ORPDrm },
00567     { X86::ORPSrr,          X86::ORPSrm },
00568     { X86::PACKSSDWrr,      X86::PACKSSDWrm },
00569     { X86::PACKSSWBrr,      X86::PACKSSWBrm },
00570     { X86::PACKUSWBrr,      X86::PACKUSWBrm },
00571     { X86::PADDBrr,         X86::PADDBrm },
00572     { X86::PADDDrr,         X86::PADDDrm },
00573     { X86::PADDQrr,         X86::PADDQrm },
00574     { X86::PADDSBrr,        X86::PADDSBrm },
00575     { X86::PADDSWrr,        X86::PADDSWrm },
00576     { X86::PADDWrr,         X86::PADDWrm },
00577     { X86::PANDNrr,         X86::PANDNrm },
00578     { X86::PANDrr,          X86::PANDrm },
00579     { X86::PAVGBrr,         X86::PAVGBrm },
00580     { X86::PAVGWrr,         X86::PAVGWrm },
00581     { X86::PCMPEQBrr,       X86::PCMPEQBrm },
00582     { X86::PCMPEQDrr,       X86::PCMPEQDrm },
00583     { X86::PCMPEQWrr,       X86::PCMPEQWrm },
00584     { X86::PCMPGTBrr,       X86::PCMPGTBrm },
00585     { X86::PCMPGTDrr,       X86::PCMPGTDrm },
00586     { X86::PCMPGTWrr,       X86::PCMPGTWrm },
00587     { X86::PINSRWrri,       X86::PINSRWrmi },
00588     { X86::PMADDWDrr,       X86::PMADDWDrm },
00589     { X86::PMAXSWrr,        X86::PMAXSWrm },
00590     { X86::PMAXUBrr,        X86::PMAXUBrm },
00591     { X86::PMINSWrr,        X86::PMINSWrm },
00592     { X86::PMINUBrr,        X86::PMINUBrm },
00593     { X86::PMULDQrr,        X86::PMULDQrm },
00594     { X86::PMULHUWrr,       X86::PMULHUWrm },
00595     { X86::PMULHWrr,        X86::PMULHWrm },
00596     { X86::PMULLDrr,        X86::PMULLDrm },
00597     { X86::PMULLDrr_int,    X86::PMULLDrm_int },
00598     { X86::PMULLWrr,        X86::PMULLWrm },
00599     { X86::PMULUDQrr,       X86::PMULUDQrm },
00600     { X86::PORrr,           X86::PORrm },
00601     { X86::PSADBWrr,        X86::PSADBWrm },
00602     { X86::PSLLDrr,         X86::PSLLDrm },
00603     { X86::PSLLQrr,         X86::PSLLQrm },
00604     { X86::PSLLWrr,         X86::PSLLWrm },
00605     { X86::PSRADrr,         X86::PSRADrm },
00606     { X86::PSRAWrr,         X86::PSRAWrm },
00607     { X86::PSRLDrr,         X86::PSRLDrm },
00608     { X86::PSRLQrr,         X86::PSRLQrm },
00609     { X86::PSRLWrr,         X86::PSRLWrm },
00610     { X86::PSUBBrr,         X86::PSUBBrm },
00611     { X86::PSUBDrr,         X86::PSUBDrm },
00612     { X86::PSUBSBrr,        X86::PSUBSBrm },
00613     { X86::PSUBSWrr,        X86::PSUBSWrm },
00614     { X86::PSUBWrr,         X86::PSUBWrm },
00615     { X86::PUNPCKHBWrr,     X86::PUNPCKHBWrm },
00616     { X86::PUNPCKHDQrr,     X86::PUNPCKHDQrm },
00617     { X86::PUNPCKHQDQrr,    X86::PUNPCKHQDQrm },
00618     { X86::PUNPCKHWDrr,     X86::PUNPCKHWDrm },
00619     { X86::PUNPCKLBWrr,     X86::PUNPCKLBWrm },
00620     { X86::PUNPCKLDQrr,     X86::PUNPCKLDQrm },
00621     { X86::PUNPCKLQDQrr,    X86::PUNPCKLQDQrm },
00622     { X86::PUNPCKLWDrr,     X86::PUNPCKLWDrm },
00623     { X86::PXORrr,          X86::PXORrm },
00624     { X86::SBB32rr,         X86::SBB32rm },
00625     { X86::SBB64rr,         X86::SBB64rm },
00626     { X86::SHUFPDrri,       X86::SHUFPDrmi },
00627     { X86::SHUFPSrri,       X86::SHUFPSrmi },
00628     { X86::SUB16rr,         X86::SUB16rm },
00629     { X86::SUB32rr,         X86::SUB32rm },
00630     { X86::SUB64rr,         X86::SUB64rm },
00631     { X86::SUB8rr,          X86::SUB8rm },
00632     { X86::SUBPDrr,         X86::SUBPDrm },
00633     { X86::SUBPSrr,         X86::SUBPSrm },
00634     { X86::SUBSDrr,         X86::SUBSDrm },
00635     { X86::SUBSSrr,         X86::SUBSSrm },
00636     // FIXME: TEST*rr -> swapped operand of TEST*mr.
00637     { X86::UNPCKHPDrr,      X86::UNPCKHPDrm },
00638     { X86::UNPCKHPSrr,      X86::UNPCKHPSrm },
00639     { X86::UNPCKLPDrr,      X86::UNPCKLPDrm },
00640     { X86::UNPCKLPSrr,      X86::UNPCKLPSrm },
00641     { X86::XOR16rr,         X86::XOR16rm },
00642     { X86::XOR32rr,         X86::XOR32rm },
00643     { X86::XOR64rr,         X86::XOR64rm },
00644     { X86::XOR8rr,          X86::XOR8rm },
00645     { X86::XORPDrr,         X86::XORPDrm },
00646     { X86::XORPSrr,         X86::XORPSrm }
00647   };
00648 
00649   for (unsigned i = 0, e = array_lengthof(OpTbl2); i != e; ++i) {
00650     unsigned RegOp = OpTbl2[i][0];
00651     unsigned MemOp = OpTbl2[i][1];
00652     if (!RegOp2MemOpTable2.insert(std::make_pair((unsigned*)RegOp,
00653                                                  MemOp)).second)
00654       assert(false && "Duplicated entries?");
00655     unsigned AuxInfo = 2 | (1 << 4); // Index 1, folded load
00656     if (!MemOp2RegOpTable.insert(std::make_pair((unsigned*)MemOp,
00657                                    std::make_pair(RegOp, AuxInfo))).second)
00658       AmbEntries.push_back(MemOp);
00659   }
00660 
00661   // Remove ambiguous entries.
00662   assert(AmbEntries.empty() && "Duplicated entries in unfolding maps?");
00663 }
00664 
00665 bool X86InstrInfo::isMoveInstr(const MachineInstr& MI,
00666                                unsigned &SrcReg, unsigned &DstReg,
00667                                unsigned &SrcSubIdx, unsigned &DstSubIdx) const {
00668   switch (MI.getOpcode()) {
00669   default:
00670     return false;
00671   case X86::MOV8rr:
00672   case X86::MOV16rr:
00673   case X86::MOV32rr: 
00674   case X86::MOV64rr:
00675   case X86::MOV16to16_:
00676   case X86::MOV32to32_:
00677   case X86::MOVSSrr:
00678   case X86::MOVSDrr:
00679 
00680   // FP Stack register class copies
00681   case X86::MOV_Fp3232: case X86::MOV_Fp6464: case X86::MOV_Fp8080:
00682   case X86::MOV_Fp3264: case X86::MOV_Fp3280:
00683   case X86::MOV_Fp6432: case X86::MOV_Fp8032:
00684       
00685   case X86::FsMOVAPSrr:
00686   case X86::FsMOVAPDrr:
00687   case X86::MOVAPSrr:
00688   case X86::MOVAPDrr:
00689   case X86::MOVDQArr:
00690   case X86::MOVSS2PSrr:
00691   case X86::MOVSD2PDrr:
00692   case X86::MOVPS2SSrr:
00693   case X86::MOVPD2SDrr:
00694   case X86::MMX_MOVD64rr:
00695   case X86::MMX_MOVQ64rr:
00696     assert(MI.getNumOperands() >= 2 &&
00697            MI.getOperand(0).isReg() &&
00698            MI.getOperand(1).isReg() &&
00699            "invalid register-register move instruction");
00700     SrcReg = MI.getOperand(1).getReg();
00701     DstReg = MI.getOperand(0).getReg();
00702     SrcSubIdx = MI.getOperand(1).getSubReg();
00703     DstSubIdx = MI.getOperand(0).getSubReg();
00704     return true;
00705   }
00706 }
00707 
00708 unsigned X86InstrInfo::isLoadFromStackSlot(const MachineInstr *MI, 
00709                                            int &FrameIndex) const {
00710   switch (MI->getOpcode()) {
00711   default: break;
00712   case X86::MOV8rm:
00713   case X86::MOV16rm:
00714   case X86::MOV16_rm:
00715   case X86::MOV32rm:
00716   case X86::MOV32_rm:
00717   case X86::MOV64rm:
00718   case X86::LD_Fp64m:
00719   case X86::MOVSSrm:
00720   case X86::MOVSDrm:
00721   case X86::MOVAPSrm:
00722   case X86::MOVAPDrm:
00723   case X86::MOVDQArm:
00724   case X86::MMX_MOVD64rm:
00725   case X86::MMX_MOVQ64rm:
00726     if (MI->getOperand(1).isFI() && MI->getOperand(2).isImm() &&
00727         MI->getOperand(3).isReg() && MI->getOperand(4).isImm() &&
00728         MI->getOperand(2).getImm() == 1 &&
00729         MI->getOperand(3).getReg() == 0 &&
00730         MI->getOperand(4).getImm() == 0) {
00731       FrameIndex = MI->getOperand(1).getIndex();
00732       return MI->getOperand(0).getReg();
00733     }
00734     break;
00735   }
00736   return 0;
00737 }
00738 
00739 unsigned X86InstrInfo::isStoreToStackSlot(const MachineInstr *MI,
00740                                           int &FrameIndex) const {
00741   switch (MI->getOpcode()) {
00742   default: break;
00743   case X86::MOV8mr:
00744   case X86::MOV16mr:
00745   case X86::MOV16_mr:
00746   case X86::MOV32mr:
00747   case X86::MOV32_mr:
00748   case X86::MOV64mr:
00749   case X86::ST_FpP64m:
00750   case X86::MOVSSmr:
00751   case X86::MOVSDmr:
00752   case X86::MOVAPSmr:
00753   case X86::MOVAPDmr:
00754   case X86::MOVDQAmr:
00755   case X86::MMX_MOVD64mr:
00756   case X86::MMX_MOVQ64mr:
00757   case X86::MMX_MOVNTQmr:
00758     if (MI->getOperand(0).isFI() && MI->getOperand(1).isImm() &&
00759         MI->getOperand(2).isReg() && MI->getOperand(3).isImm() &&
00760         MI->getOperand(1).getImm() == 1 &&
00761         MI->getOperand(2).getReg() == 0 &&
00762         MI->getOperand(3).getImm() == 0) {
00763       FrameIndex = MI->getOperand(0).getIndex();
00764       return MI->getOperand(4).getReg();
00765     }
00766     break;
00767   }
00768   return 0;
00769 }
00770 
00771 
00772 /// regIsPICBase - Return true if register is PIC base (i.e.g defined by
00773 /// X86::MOVPC32r.
00774 static bool regIsPICBase(unsigned BaseReg, const MachineRegisterInfo &MRI) {
00775   bool isPICBase = false;
00776   for (MachineRegisterInfo::def_iterator I = MRI.def_begin(BaseReg),
00777          E = MRI.def_end(); I != E; ++I) {
00778     MachineInstr *DefMI = I.getOperand().getParent();
00779     if (DefMI->getOpcode() != X86::MOVPC32r)
00780       return false;
00781     assert(!isPICBase && "More than one PIC base?");
00782     isPICBase = true;
00783   }
00784   return isPICBase;
00785 }
00786 
00787 /// isGVStub - Return true if the GV requires an extra load to get the
00788 /// real address.
00789 static inline bool isGVStub(GlobalValue *GV, X86TargetMachine &TM) {
00790   return TM.getSubtarget<X86Subtarget>().GVRequiresExtraLoad(GV, TM, false);
00791 }
00792  
00793 bool
00794 X86InstrInfo::isReallyTriviallyReMaterializable(const MachineInstr *MI) const {
00795   switch (MI->getOpcode()) {
00796   default: break;
00797     case X86::MOV8rm:
00798     case X86::MOV16rm:
00799     case X86::MOV16_rm:
00800     case X86::MOV32rm:
00801     case X86::MOV32_rm:
00802     case X86::MOV64rm:
00803     case X86::LD_Fp64m:
00804     case X86::MOVSSrm:
00805     case X86::MOVSDrm:
00806     case X86::MOVAPSrm:
00807     case X86::MOVAPDrm:
00808     case X86::MOVDQArm:
00809     case X86::MMX_MOVD64rm:
00810     case X86::MMX_MOVQ64rm: {
00811       // Loads from constant pools are trivially rematerializable.
00812       if (MI->getOperand(1).isReg() &&
00813           MI->getOperand(2).isImm() &&
00814           MI->getOperand(3).isReg() && MI->getOperand(3).getReg() == 0 &&
00815           (MI->getOperand(4).isCPI() ||
00816            (MI->getOperand(4).isGlobal() &&
00817             isGVStub(MI->getOperand(4).getGlobal(), TM)))) {
00818         unsigned BaseReg = MI->getOperand(1).getReg();
00819         if (BaseReg == 0)
00820           return true;
00821         // Allow re-materialization of PIC load.
00822         if (!ReMatPICStubLoad && MI->getOperand(4).isGlobal())
00823           return false;
00824         const MachineFunction &MF = *MI->getParent()->getParent();
00825         const MachineRegisterInfo &MRI = MF.getRegInfo();
00826         bool isPICBase = false;
00827         for (MachineRegisterInfo::def_iterator I = MRI.def_begin(BaseReg),
00828                E = MRI.def_end(); I != E; ++I) {
00829           MachineInstr *DefMI = I.getOperand().getParent();
00830           if (DefMI->getOpcode() != X86::MOVPC32r)
00831             return false;
00832           assert(!isPICBase && "More than one PIC base?");
00833           isPICBase = true;
00834         }
00835         return isPICBase;
00836       } 
00837       return false;
00838     }
00839  
00840      case X86::LEA32r:
00841      case X86::LEA64r: {
00842        if (MI->getOperand(2).isImm() &&
00843            MI->getOperand(3).isReg() && MI->getOperand(3).getReg() == 0 &&
00844            !MI->getOperand(4).isReg()) {
00845          // lea fi#, lea GV, etc. are all rematerializable.
00846          if (!MI->getOperand(1).isReg())
00847            return true;
00848          unsigned BaseReg = MI->getOperand(1).getReg();
00849          if (BaseReg == 0)
00850            return true;
00851          // Allow re-materialization of lea PICBase + x.
00852          const MachineFunction &MF = *MI->getParent()->getParent();
00853          const MachineRegisterInfo &MRI = MF.getRegInfo();
00854          return regIsPICBase(BaseReg, MRI);
00855        }
00856        return false;
00857      }
00858   }
00859 
00860   // All other instructions marked M_REMATERIALIZABLE are always trivially
00861   // rematerializable.
00862   return true;
00863 }
00864 
00865 /// isSafeToClobberEFLAGS - Return true if it's safe insert an instruction that
00866 /// would clobber the EFLAGS condition register. Note the result may be
00867 /// conservative. If it cannot definitely determine the safety after visiting
00868 /// two instructions it assumes it's not safe.
00869 static bool isSafeToClobberEFLAGS(MachineBasicBlock &MBB,
00870                                   MachineBasicBlock::iterator I) {
00871   // It's always safe to clobber EFLAGS at the end of a block.
00872   if (I == MBB.end())
00873     return true;
00874 
00875   // For compile time consideration, if we are not able to determine the
00876   // safety after visiting 2 instructions, we will assume it's not safe.
00877   for (unsigned i = 0; i < 2; ++i) {
00878     bool SeenDef = false;
00879     for (unsigned j = 0, e = I->getNumOperands(); j != e; ++j) {
00880       MachineOperand &MO = I->getOperand(j);
00881       if (!MO.isReg())
00882         continue;
00883       if (MO.getReg() == X86::EFLAGS) {
00884         if (MO.isUse())
00885           return false;
00886         SeenDef = true;
00887       }
00888     }
00889 
00890     if (SeenDef)
00891       // This instruction defines EFLAGS, no need to look any further.
00892       return true;
00893     ++I;
00894 
00895     // If we make it to the end of the block, it's safe to clobber EFLAGS.
00896     if (I == MBB.end())
00897       return true;
00898   }
00899 
00900   // Conservative answer.
00901   return false;
00902 }
00903 
00904 void X86InstrInfo::reMaterialize(MachineBasicBlock &MBB,
00905                                  MachineBasicBlock::iterator I,
00906                                  unsigned DestReg,
00907                                  const MachineInstr *Orig) const {
00908   unsigned SubIdx = Orig->getOperand(0).isReg()
00909     ? Orig->getOperand(0).getSubReg() : 0;
00910   bool ChangeSubIdx = SubIdx != 0;
00911   if (SubIdx && TargetRegisterInfo::isPhysicalRegister(DestReg)) {
00912     DestReg = RI.getSubReg(DestReg, SubIdx);
00913     SubIdx = 0;
00914   }
00915 
00916   // MOV32r0 etc. are implemented with xor which clobbers condition code.
00917   // Re-materialize them as movri instructions to avoid side effects.
00918   bool Emitted = false;
00919   switch (Orig->getOpcode()) {
00920   default: break;
00921   case X86::MOV8r0:
00922   case X86::MOV16r0:
00923   case X86::MOV32r0:
00924   case X86::MOV64r0: {
00925     if (!isSafeToClobberEFLAGS(MBB, I)) {
00926       unsigned Opc = 0;
00927       switch (Orig->getOpcode()) {
00928       default: break;
00929       case X86::MOV8r0:  Opc = X86::MOV8ri;  break;
00930       case X86::MOV16r0: Opc = X86::MOV16ri; break;
00931       case X86::MOV32r0: Opc = X86::MOV32ri; break;
00932       case X86::MOV64r0: Opc = X86::MOV64ri32; break;
00933       }
00934       BuildMI(MBB, I, get(Opc), DestReg).addImm(0);
00935       Emitted = true;
00936     }
00937     break;
00938   }
00939   }
00940 
00941   if (!Emitted) {
00942     MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig);
00943     MI->getOperand(0).setReg(DestReg);
00944     MBB.insert(I, MI);
00945   }
00946 
00947   if (ChangeSubIdx) {
00948     MachineInstr *NewMI = prior(I);
00949     NewMI->getOperand(0).setSubReg(SubIdx);
00950   }
00951 }
00952 
00953 /// isInvariantLoad - Return true if the specified instruction (which is marked
00954 /// mayLoad) is loading from a location whose value is invariant across the
00955 /// function.  For example, loading a value from the constant pool or from
00956 /// from the argument area of a function if it does not change.  This should
00957 /// only return true of *all* loads the instruction does are invariant (if it
00958 /// does multiple loads).
00959 bool X86InstrInfo::isInvariantLoad(const MachineInstr *MI) const {
00960   // This code cares about loads from three cases: constant pool entries,
00961   // invariant argument slots, and global stubs.  In order to handle these cases
00962   // for all of the myriad of X86 instructions, we just scan for a CP/FI/GV
00963   // operand and base our analysis on it.  This is safe because the address of
00964   // none of these three cases is ever used as anything other than a load base
00965   // and X86 doesn't have any instructions that load from multiple places.
00966   
00967   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
00968     const MachineOperand &MO = MI->getOperand(i);
00969     // Loads from constant pools are trivially invariant.
00970     if (MO.isCPI())
00971       return true;
00972 
00973     if (MO.isGlobal())
00974       return isGVStub(MO.getGlobal(), TM);
00975 
00976     // If this is a load from an invariant stack slot, the load is a constant.
00977     if (MO.isFI()) {
00978       const MachineFrameInfo &MFI =
00979         *MI->getParent()->getParent()->getFrameInfo();
00980       int Idx = MO.getIndex();
00981       return MFI.isFixedObjectIndex(Idx) && MFI.isImmutableObjectIndex(Idx);
00982     }
00983   }
00984   
00985   // All other instances of these instructions are presumed to have other
00986   // issues.
00987   return false;
00988 }
00989 
00990 /// hasLiveCondCodeDef - True if MI has a condition code def, e.g. EFLAGS, that
00991 /// is not marked dead.
00992 static bool hasLiveCondCodeDef(MachineInstr *MI) {
00993   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
00994     MachineOperand &MO = MI->getOperand(i);
00995     if (MO.isReg() && MO.isDef() &&
00996         MO.getReg() == X86::EFLAGS && !MO.isDead()) {
00997       return true;
00998     }
00999   }
01000   return false;
01001 }
01002 
01003 /// convertToThreeAddress - This method must be implemented by targets that
01004 /// set the M_CONVERTIBLE_TO_3_ADDR flag.  When this flag is set, the target
01005 /// may be able to convert a two-address instruction into a true
01006 /// three-address instruction on demand.  This allows the X86 target (for
01007 /// example) to convert ADD and SHL instructions into LEA instructions if they
01008 /// would require register copies due to two-addressness.
01009 ///
01010 /// This method returns a null pointer if the transformation cannot be
01011 /// performed, otherwise it returns the new instruction.
01012 ///
01013 MachineInstr *
01014 X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
01015                                     MachineBasicBlock::iterator &MBBI,
01016                                     LiveVariables *LV) const {
01017   MachineInstr *MI = MBBI;
01018   MachineFunction &MF = *MI->getParent()->getParent();
01019   // All instructions input are two-addr instructions.  Get the known operands.
01020   unsigned Dest = MI->getOperand(0).getReg();
01021   unsigned Src = MI->getOperand(1).getReg();
01022   bool isDead = MI->getOperand(0).isDead();
01023   bool isKill = MI->getOperand(1).isKill();
01024 
01025   MachineInstr *NewMI = NULL;
01026   // FIXME: 16-bit LEA's are really slow on Athlons, but not bad on P4's.  When
01027   // we have better subtarget support, enable the 16-bit LEA generation here.
01028   bool DisableLEA16 = true;
01029 
01030   unsigned MIOpc = MI->getOpcode();
01031   switch (MIOpc) {
01032   case X86::SHUFPSrri: {
01033     assert(MI->getNumOperands() == 4 && "Unknown shufps instruction!");
01034     if (!TM.getSubtarget<X86Subtarget>().hasSSE2()) return 0;
01035     
01036     unsigned B = MI->getOperand(1).getReg();
01037     unsigned C = MI->getOperand(2).getReg();
01038     if (B != C) return 0;
01039     unsigned A = MI->getOperand(0).getReg();
01040     unsigned M = MI->getOperand(3).getImm();
01041     NewMI = BuildMI(MF, get(X86::PSHUFDri)).addReg(A, true, false, false, isDead)
01042       .addReg(B, false, false, isKill).addImm(M);
01043     break;
01044   }
01045   case X86::SHL64ri: {
01046     assert(MI->getNumOperands() >= 3 && "Unknown shift instruction!");
01047     // NOTE: LEA doesn't produce flags like shift does, but LLVM never uses
01048     // the flags produced by a shift yet, so this is safe.
01049     unsigned ShAmt = MI->getOperand(2).getImm();
01050     if (ShAmt == 0 || ShAmt >= 4) return 0;
01051 
01052     NewMI = BuildMI(MF, get(X86::LEA64r)).addReg(Dest, true, false, false, isDead)
01053       .addReg(0).addImm(1 << ShAmt).addReg(Src, false, false, isKill).addImm(0);
01054     break;
01055   }
01056   case X86::SHL32ri: {
01057     assert(MI->getNumOperands() >= 3 && "Unknown shift instruction!");
01058     // NOTE: LEA doesn't produce flags like shift does, but LLVM never uses
01059     // the flags produced by a shift yet, so this is safe.
01060     unsigned ShAmt = MI->getOperand(2).getImm();
01061     if (ShAmt == 0 || ShAmt >= 4) return 0;
01062 
01063     unsigned Opc = TM.getSubtarget<X86Subtarget>().is64Bit() ?
01064       X86::LEA64_32r : X86::LEA32r;
01065     NewMI = BuildMI(MF, get(Opc)).addReg(Dest, true, false, false, isDead)
01066       .addReg(0).addImm(1 << ShAmt)
01067       .addReg(Src, false, false, isKill).addImm(0);
01068     break;
01069   }
01070   case X86::SHL16ri: {
01071     assert(MI->getNumOperands() >= 3 && "Unknown shift instruction!");
01072     // NOTE: LEA doesn't produce flags like shift does, but LLVM never uses
01073     // the flags produced by a shift yet, so this is safe.
01074     unsigned ShAmt = MI->getOperand(2).getImm();
01075     if (ShAmt == 0 || ShAmt >= 4) return 0;
01076 
01077     if (DisableLEA16) {
01078       // If 16-bit LEA is disabled, use 32-bit LEA via subregisters.
01079       MachineRegisterInfo &RegInfo = MFI->getParent()->getRegInfo();
01080       unsigned Opc = TM.getSubtarget<X86Subtarget>().is64Bit()
01081         ? X86::LEA64_32r : X86::LEA32r;
01082       unsigned leaInReg = RegInfo.createVirtualRegister(&X86::GR32RegClass);
01083       unsigned leaOutReg = RegInfo.createVirtualRegister(&X86::GR32RegClass);
01084             
01085       // Build and insert into an implicit UNDEF value. This is OK because
01086       // well be shifting and then extracting the lower 16-bits. 
01087       BuildMI(*MFI, MBBI, get(X86::IMPLICIT_DEF), leaInReg);      
01088       MachineInstr *InsMI =  BuildMI(*MFI, MBBI, get(X86::INSERT_SUBREG),leaInReg)
01089         .addReg(leaInReg).addReg(Src, false, false, isKill)
01090         .addImm(X86::SUBREG_16BIT);
01091       
01092       NewMI = BuildMI(*MFI, MBBI, get(Opc), leaOutReg).addReg(0).addImm(1 << ShAmt)
01093         .addReg(leaInReg, false, false, true).addImm(0);
01094       
01095       MachineInstr *ExtMI = BuildMI(*MFI, MBBI, get(X86::EXTRACT_SUBREG))
01096         .addReg(Dest, true, false, false, isDead)
01097         .addReg(leaOutReg, false, false, true).addImm(X86::SUBREG_16BIT);
01098       if (LV) {
01099         // Update live variables
01100         LV->getVarInfo(leaInReg).Kills.push_back(NewMI);
01101         LV->getVarInfo(leaOutReg).Kills.push_back(ExtMI);
01102         if (isKill)
01103           LV->replaceKillInstruction(Src, MI, InsMI);
01104         if (isDead)
01105           LV->replaceKillInstruction(Dest, MI, ExtMI);
01106       }
01107       return ExtMI;
01108     } else {
01109       NewMI = BuildMI(MF, get(X86::LEA16r)).addReg(Dest, true, false, false, isDead)
01110         .addReg(0).addImm(1 << ShAmt)
01111         .addReg(Src, false, false, isKill).addImm(0);
01112     }
01113     break;
01114   }
01115   default: {
01116     // The following opcodes also sets the condition code register(s). Only
01117     // convert them to equivalent lea if the condition code register def's
01118     // are dead!
01119     if (hasLiveCondCodeDef(MI))
01120       return 0;
01121 
01122     bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit();
01123     switch (MIOpc) {
01124     default: return 0;
01125     case X86::INC64r:
01126     case X86::INC32r:
01127     case X86::INC64_32r: {
01128       assert(MI->getNumOperands() >= 2 && "Unknown inc instruction!");
01129       unsigned Opc = MIOpc == X86::INC64r ? X86::LEA64r
01130         : (is64Bit ? X86::LEA64_32r : X86::LEA32r);
01131       NewMI = addRegOffset(BuildMI(MF, get(Opc))
01132                            .addReg(Dest, true, false, false, isDead),
01133                            Src, isKill, 1);
01134       break;
01135     }
01136     case X86::INC16r:
01137     case X86::INC64_16r:
01138       if (DisableLEA16) return 0;
01139       assert(MI->getNumOperands() >= 2 && "Unknown inc instruction!");
01140       NewMI = addRegOffset(BuildMI(MF, get(X86::LEA16r))
01141                            .addReg(Dest, true, false, false, isDead),
01142                            Src, isKill, 1);
01143       break;
01144     case X86::DEC64r:
01145     case X86::DEC32r:
01146     case X86::DEC64_32r: {
01147       assert(MI->getNumOperands() >= 2 && "Unknown dec instruction!");
01148       unsigned Opc = MIOpc == X86::DEC64r ? X86::LEA64r
01149         : (is64Bit ? X86::LEA64_32r : X86::LEA32r);
01150       NewMI = addRegOffset(BuildMI(MF, get(Opc))
01151                            .addReg(Dest, true, false, false, isDead),
01152                            Src, isKill, -1);
01153       break;
01154     }
01155     case X86::DEC16r:
01156     case X86::DEC64_16r:
01157       if (DisableLEA16) return 0;
01158       assert(MI->getNumOperands() >= 2 && "Unknown dec instruction!");
01159       NewMI = addRegOffset(BuildMI(MF, get(X86::LEA16r))
01160                            .addReg(Dest, true, false, false, isDead),
01161                            Src, isKill, -1);
01162       break;
01163     case X86::ADD64rr:
01164     case X86::ADD32rr: {
01165       assert(MI->getNumOperands() >= 3 && "Unknown add instruction!");
01166       unsigned Opc = MIOpc == X86::ADD64rr ? X86::LEA64r
01167         : (is64Bit ? X86::LEA64_32r : X86::LEA32r);
01168       unsigned Src2 = MI->getOperand(2).getReg();
01169       bool isKill2 = MI->getOperand(2).isKill();
01170       NewMI = addRegReg(BuildMI(MF, get(Opc))
01171                         .addReg(Dest, true, false, false, isDead),
01172                         Src, isKill, Src2, isKill2);
01173       if (LV && isKill2)
01174         LV->replaceKillInstruction(Src2, MI, NewMI);
01175       break;
01176     }
01177     case X86::ADD16rr: {
01178       if (DisableLEA16) return 0;
01179       assert(MI->getNumOperands() >= 3 && "Unknown add instruction!");
01180       unsigned Src2 = MI->getOperand(2).getReg();
01181       bool isKill2 = MI->getOperand(2).isKill();
01182       NewMI = addRegReg(BuildMI(MF, get(X86::LEA16r))
01183                         .addReg(Dest, true, false, false, isDead),
01184                         Src, isKill, Src2, isKill2);
01185       if (LV && isKill2)
01186         LV->replaceKillInstruction(Src2, MI, NewMI);
01187       break;
01188     }
01189     case X86::ADD64ri32:
01190     case X86::ADD64ri8:
01191       assert(MI->getNumOperands() >= 3 && "Unknown add instruction!");
01192       if (MI->getOperand(2).isImm())
01193         NewMI = addRegOffset(BuildMI(MF, get(X86::LEA64r))
01194                              .addReg(Dest, true, false, false, isDead),
01195                              Src, isKill, MI->getOperand(2).getImm());
01196       break;
01197     case X86::ADD32ri:
01198     case X86::ADD32ri8:
01199       assert(MI->getNumOperands() >= 3 && "Unknown add instruction!");
01200       if (MI->getOperand(2).isImm()) {
01201         unsigned Opc = is64Bit ? X86::LEA64_32r : X86::LEA32r;
01202         NewMI = addRegOffset(BuildMI(MF, get(Opc))
01203                              .addReg(Dest, true, false, false, isDead),
01204                              Src, isKill, MI->getOperand(2).getImm());
01205       }
01206       break;
01207     case X86::ADD16ri:
01208     case X86::ADD16ri8:
01209       if (DisableLEA16) return 0;
01210       assert(MI->getNumOperands() >= 3 && "Unknown add instruction!");
01211       if (MI->getOperand(2).isImm())
01212         NewMI = addRegOffset(BuildMI(MF, get(X86::LEA16r))
01213                              .addReg(Dest, true, false, false, isDead),
01214                              Src, isKill, MI->getOperand(2).getImm());
01215       break;
01216     case X86::SHL16ri:
01217       if (DisableLEA16) return 0;
01218     case X86::SHL32ri:
01219     case X86::SHL64ri: {
01220       assert(MI->getNumOperands() >= 3 && MI->getOperand(2).isImm() &&
01221              "Unknown shl instruction!");
01222       unsigned ShAmt = MI->getOperand(2).getImm();
01223       if (ShAmt == 1 || ShAmt == 2 || ShAmt == 3) {
01224         X86AddressMode AM;
01225         AM.Scale = 1 << ShAmt;
01226         AM.IndexReg = Src;
01227         unsigned Opc = MIOpc == X86::SHL64ri ? X86::LEA64r
01228           : (MIOpc == X86::SHL32ri
01229              ? (is64Bit ? X86::LEA64_32r : X86::LEA32r) : X86::LEA16r);
01230         NewMI = addFullAddress(BuildMI(MF, get(Opc))
01231                                .addReg(Dest, true, false, false, isDead), AM);
01232         if (isKill)
01233           NewMI->getOperand(3).setIsKill(true);
01234       }
01235       break;
01236     }
01237     }
01238   }
01239   }
01240 
01241   if (!NewMI) return 0;
01242 
01243   if (LV) {  // Update live variables
01244     if (isKill)
01245       LV->replaceKillInstruction(Src, MI, NewMI);
01246     if (isDead)
01247       LV->replaceKillInstruction(Dest, MI, NewMI);
01248   }
01249 
01250   MFI->insert(MBBI, NewMI);          // Insert the new inst    
01251   return NewMI;
01252 }
01253 
01254 /// commuteInstruction - We have a few instructions that must be hacked on to
01255 /// commute them.
01256 ///
01257 MachineInstr *
01258 X86InstrInfo::commuteInstruction(MachineInstr *MI, bool NewMI) const {
01259   switch (MI->getOpcode()) {
01260   case X86::SHRD16rri8: // A = SHRD16rri8 B, C, I -> A = SHLD16rri8 C, B, (16-I)
01261   case X86::SHLD16rri8: // A = SHLD16rri8 B, C, I -> A = SHRD16rri8 C, B, (16-I)
01262   case X86::SHRD32rri8: // A = SHRD32rri8 B, C, I -> A = SHLD32rri8 C, B, (32-I)
01263   case X86::SHLD32rri8: // A = SHLD32rri8 B, C, I -> A = SHRD32rri8 C, B, (32-I)
01264   case X86::SHRD64rri8: // A = SHRD64rri8 B, C, I -> A = SHLD64rri8 C, B, (64-I)
01265   case X86::SHLD64rri8:{// A = SHLD64rri8 B, C, I -> A = SHRD64rri8 C, B, (64-I)
01266     unsigned Opc;
01267     unsigned Size;
01268     switch (MI->getOpcode()) {
01269     default: assert(0 && "Unreachable!");
01270     case X86::SHRD16rri8: Size = 16; Opc = X86::SHLD16rri8; break;
01271     case X86::SHLD16rri8: Size = 16; Opc = X86::SHRD16rri8; break;
01272     case X86::SHRD32rri8: Size = 32; Opc = X86::SHLD32rri8; break;
01273     case X86::SHLD32rri8: Size = 32; Opc = X86::SHRD32rri8; break;
01274     case X86::SHRD64rri8: Size = 64; Opc = X86::SHLD64rri8; break;
01275     case X86::SHLD64rri8: Size = 64; Opc = X86::SHRD64rri8; break;
01276     }
01277     unsigned Amt = MI->getOperand(3).getImm();
01278     if (NewMI) {
01279       MachineFunction &MF = *MI->getParent()->getParent();
01280       MI = MF.CloneMachineInstr(MI);
01281       NewMI = false;
01282     }
01283     MI->setDesc(get(Opc));
01284     MI->getOperand(3).setImm(Size-Amt);
01285     return TargetInstrInfoImpl::commuteInstruction(MI, NewMI);
01286   }
01287   case X86::CMOVB16rr:
01288   case X86::CMOVB32rr:
01289   case X86::CMOVB64rr:
01290   case X86::CMOVAE16rr:
01291   case X86::CMOVAE32rr:
01292   case X86::CMOVAE64rr:
01293   case X86::CMOVE16rr:
01294   case X86::CMOVE32rr:
01295   case X86::CMOVE64rr:
01296   case X86::CMOVNE16rr:
01297   case X86::CMOVNE32rr:
01298   case X86::CMOVNE64rr:
01299   case X86::CMOVBE16rr:
01300   case X86::CMOVBE32rr:
01301   case X86::CMOVBE64rr:
01302   case X86::CMOVA16rr:
01303   case X86::CMOVA32rr:
01304   case X86::CMOVA64rr:
01305   case X86::CMOVL16rr:
01306   case X86::CMOVL32rr:
01307   case X86::CMOVL64rr:
01308   case X86::CMOVGE16rr:
01309   case X86::CMOVGE32rr:
01310   case X86::CMOVGE64rr:
01311   case X86::CMOVLE16rr:
01312   case X86::CMOVLE32rr:
01313   case X86::CMOVLE64rr:
01314   case X86::CMOVG16rr:
01315   case X86::CMOVG32rr:
01316   case X86::CMOVG64rr:
01317   case X86::CMOVS16rr:
01318   case X86::CMOVS32rr:
01319   case X86::CMOVS64rr:
01320   case X86::CMOVNS16rr:
01321   case X86::CMOVNS32rr:
01322   case X86::CMOVNS64rr:
01323   case X86::CMOVP16rr:
01324   case X86::CMOVP32rr:
01325   case X86::CMOVP64rr:
01326   case X86::CMOVNP16rr:
01327   case X86::CMOVNP32rr:
01328   case X86::CMOVNP64rr:
01329   case X86::CMOVO16rr:
01330   case X86::CMOVO32rr:
01331   case X86::CMOVO64rr:
01332   case X86::CMOVNO16rr:
01333   case X86::CMOVNO32rr:
01334   case X86::CMOVNO64rr: {
01335     unsigned Opc = 0;
01336     switch (MI->getOpcode()) {
01337     default: break;
01338     case X86::CMOVB16rr:  Opc = X86::CMOVAE16rr; break;
01339     case X86::CMOVB32rr:  Opc = X86::CMOVAE32rr; break;
01340     case X86::CMOVB64rr:  Opc = X86::CMOVAE64rr; break;
01341     case X86::CMOVAE16rr: Opc = X86::CMOVB16rr; break;
01342     case X86::CMOVAE32rr: Opc = X86::CMOVB32rr; break;
01343     case X86::CMOVAE64rr: Opc = X86::CMOVB64rr; break;
01344     case X86::CMOVE16rr:  Opc = X86::CMOVNE16rr; break;
01345     case X86::CMOVE32rr:  Opc = X86::CMOVNE32rr; break;
01346     case X86::CMOVE64rr:  Opc = X86::CMOVNE64rr; break;
01347     case X86::CMOVNE16rr: Opc = X86::CMOVE16rr; break;
01348     case X86::CMOVNE32rr: Opc = X86::CMOVE32rr; break;
01349     case X86::CMOVNE64rr: Opc = X86::CMOVE64rr; break;
01350     case X86::CMOVBE16rr: Opc = X86::CMOVA16rr; break;
01351     case X86::CMOVBE32rr: Opc = X86::CMOVA32rr; break;
01352     case X86::CMOVBE64rr: Opc = X86::CMOVA64rr; break;
01353     case X86::CMOVA16rr:  Opc = X86::CMOVBE16rr; break;
01354     case X86::CMOVA32rr:  Opc = X86::CMOVBE32rr; break;
01355     case X86::CMOVA64rr:  Opc = X86::CMOVBE64rr; break;
01356     case X86::CMOVL16rr:  Opc = X86::CMOVGE16rr; break;
01357     case X86::CMOVL32rr:  Opc = X86::CMOVGE32rr; break;
01358     case X86::CMOVL64rr:  Opc = X86::CMOVGE64rr; break;
01359     case X86::CMOVGE16rr: Opc = X86::CMOVL16rr; break;
01360     case X86::CMOVGE32rr: Opc = X86::CMOVL32rr; break;
01361     case X86::CMOVGE64rr: Opc = X86::CMOVL64rr; break;
01362     case X86::CMOVLE16rr: Opc = X86::CMOVG16rr; break;
01363     case X86::CMOVLE32rr: Opc = X86::CMOVG32rr; break;
01364     case X86::CMOVLE64rr: Opc = X86::CMOVG64rr; break;
01365     case X86::CMOVG16rr:  Opc = X86::CMOVLE16rr; break;
01366     case X86::CMOVG32rr:  Opc = X86::CMOVLE32rr; break;
01367     case X86::CMOVG64rr:  Opc = X86::CMOVLE64rr; break;
01368     case X86::CMOVS16rr:  Opc = X86::CMOVNS16rr; break;
01369     case X86::CMOVS32rr:  Opc = X86::CMOVNS32rr; break;
01370     case X86::CMOVS64rr:  Opc = X86::CMOVNS32rr; break;
01371     case X86::CMOVNS16rr: Opc = X86::CMOVS16rr; break;
01372     case X86::CMOVNS32rr: Opc = X86::CMOVS32rr; break;
01373     case X86::CMOVNS64rr: Opc = X86::CMOVS64rr; break;
01374     case X86::CMOVP16rr:  Opc = X86::CMOVNP16rr; break;
01375     case X86::CMOVP32rr:  Opc = X86::CMOVNP32rr; break;
01376     case X86::CMOVP64rr:  Opc = X86::CMOVNP32rr; break;
01377     case X86::CMOVNP16rr: Opc = X86::CMOVP16rr; break;
01378     case X86::CMOVNP32rr: Opc = X86::CMOVP32rr; break;
01379     case X86::CMOVNP64rr: Opc = X86::CMOVP64rr; break;
01380     case X86::CMOVO16rr:  Opc = X86::CMOVNO16rr; break;
01381     case X86::CMOVO32rr:  Opc = X86::CMOVNO32rr; break;
01382     case X86::CMOVO64rr:  Opc = X86::CMOVNO32rr; break;
01383     case X86::CMOVNO16rr: Opc = X86::CMOVO16rr; break;
01384     case X86::CMOVNO32rr: Opc = X86::CMOVO32rr; break;
01385     case X86::CMOVNO64rr: Opc = X86::CMOVO64rr; break;
01386     }
01387     if (NewMI) {
01388       MachineFunction &MF = *MI->getParent()->getParent();
01389       MI = MF.CloneMachineInstr(MI);
01390       NewMI = false;
01391     }
01392     MI->setDesc(get(Opc));
01393     // Fallthrough intended.
01394   }
01395   default:
01396     return TargetInstrInfoImpl::commuteInstruction(MI, NewMI);
01397   }
01398 }
01399 
01400 static X86::CondCode GetCondFromBranchOpc(unsigned BrOpc) {
01401   switch (BrOpc) {
01402   default: return X86::COND_INVALID;
01403   case X86::JE:  return X86::COND_E;
01404   case X86::JNE: return X86::COND_NE;
01405   case X86::JL:  return X86::COND_L;
01406   case X86::JLE: return X86::COND_LE;
01407   case X86::JG:  return X86::COND_G;
01408   case X86::JGE: return X86::COND_GE;
01409   case X86::JB:  return X86::COND_B;
01410   case X86::JBE: return X86::COND_BE;
01411   case X86::JA:  return X86::COND_A;
01412   case X86::JAE: return X86::COND_AE;
01413   case X86::JS:  return X86::COND_S;
01414   case X86::JNS: return X86::COND_NS;
01415   case X86::JP:  return X86::COND_P;
01416   case X86::JNP: return X86::COND_NP;
01417   case X86::JO:  return X86::COND_O;
01418   case X86::JNO: return X86::COND_NO;
01419   }
01420 }
01421 
01422 unsigned X86::GetCondBranchFromCond(X86::CondCode CC) {
01423   switch (CC) {
01424   default: assert(0 && "Illegal condition code!");
01425   case X86::COND_E:  return X86::JE;
01426   case X86::COND_NE: return X86::JNE;
01427   case X86::COND_L:  return X86::JL;
01428   case X86::COND_LE: return X86::JLE;
01429   case X86::COND_G:  return X86::JG;
01430   case X86::COND_GE: return X86::JGE;
01431   case X86::COND_B:  return X86::JB;
01432   case X86::COND_BE: return X86::JBE;
01433   case X86::COND_A:  return X86::JA;
01434   case X86::COND_AE: return X86::JAE;
01435   case X86::COND_S:  return X86::JS;
01436   case X86::COND_NS: return X86::JNS;
01437   case X86::COND_P:  return X86::JP;
01438   case X86::COND_NP: return X86::JNP;
01439   case X86::COND_O:  return X86::JO;
01440   case X86::COND_NO: return X86::JNO;
01441   }
01442 }
01443 
01444 /// GetOppositeBranchCondition - Return the inverse of the specified condition,
01445 /// e.g. turning COND_E to COND_NE.
01446 X86::CondCode X86::GetOppositeBranchCondition(X86::CondCode CC) {
01447   switch (CC) {
01448   default: assert(0 && "Illegal condition code!");
01449   case X86::COND_E:  return X86::COND_NE;
01450   case X86::COND_NE: return X86::COND_E;
01451   case X86::COND_L:  return X86::COND_GE;
01452   case X86::COND_LE: return X86::COND_G;
01453   case X86::COND_G:  return X86::COND_LE;
01454   case X86::COND_GE: return X86::COND_L;
01455   case X86::COND_B:  return X86::COND_AE;
01456   case X86::COND_BE: return X86::COND_A;
01457   case X86::COND_A:  return X86::COND_BE;
01458   case X86::COND_AE: return X86::COND_B;
01459   case X86::COND_S:  return X86::COND_NS;
01460   case X86::COND_NS: return X86::COND_S;
01461   case X86::COND_P:  return X86::COND_NP;
01462   case X86::COND_NP: return X86::COND_P;
01463   case X86::COND_O:  return X86::COND_NO;
01464   case X86::COND_NO: return X86::COND_O;
01465   }
01466 }
01467 
01468 bool X86InstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
01469   const TargetInstrDesc &TID = MI->getDesc();
01470   if (!TID.isTerminator()) return false;
01471   
01472   // Conditional branch is a special case.
01473   if (TID.isBranch() && !TID.isBarrier())
01474     return true;
01475   if (!TID.isPredicable())
01476     return true;
01477   return !isPredicated(MI);
01478 }
01479 
01480 // For purposes of branch analysis do not count FP_REG_KILL as a terminator.
01481 static bool isBrAnalysisUnpredicatedTerminator(const MachineInstr *MI,
01482                                                const X86InstrInfo &TII) {
01483   if (MI->getOpcode() == X86::FP_REG_KILL)
01484     return false;
01485   return TII.isUnpredicatedTerminator(MI);
01486 }
01487 
01488 bool X86InstrInfo::AnalyzeBranch(MachineBasicBlock &MBB, 
01489                                  MachineBasicBlock *&TBB,
01490                                  MachineBasicBlock *&FBB,
01491                                  SmallVectorImpl<MachineOperand> &Cond,
01492                                  bool AllowModify) const {
01493   // Start from the bottom of the block and work up, examining the
01494   // terminator instructions.
01495   MachineBasicBlock::iterator I = MBB.end();
01496   while (I != MBB.begin()) {
01497     --I;
01498     // Working from the bottom, when we see a non-terminator
01499     // instruction, we're done.
01500     if (!isBrAnalysisUnpredicatedTerminator(I, *this))
01501       break;
01502     // A terminator that isn't a branch can't easily be handled
01503     // by this analysis.
01504     if (!I->getDesc().isBranch())
01505       return true;
01506     // Handle unconditional branches.
01507     if (I->getOpcode() == X86::JMP) {
01508       if (!AllowModify) {
01509         TBB = I->getOperand(0).getMBB();
01510         return false;
01511       }
01512 
01513       // If the block has any instructions after a JMP, delete them.
01514       while (next(I) != MBB.end())
01515         next(I)->eraseFromParent();
01516       Cond.clear();
01517       FBB = 0;
01518       // Delete the JMP if it's equivalent to a fall-through.
01519       if (MBB.isLayoutSuccessor(I->getOperand(0).getMBB())) {
01520         TBB = 0;
01521         I->eraseFromParent();
01522         I = MBB.end();
01523         continue;
01524       }
01525       // TBB is used to indicate the unconditinal destination.
01526       TBB = I->getOperand(0).getMBB();
01527       continue;
01528     }
01529     // Handle conditional branches.
01530     X86::CondCode BranchCode = GetCondFromBranchOpc(I->getOpcode());
01531     if (BranchCode == X86::COND_INVALID)
01532       return true;  // Can't handle indirect branch.
01533     // Working from the bottom, handle the first conditional branch.
01534     if (Cond.empty()) {
01535       FBB = TBB;
01536       TBB = I->getOperand(0).getMBB();
01537       Cond.push_back(MachineOperand::CreateImm(BranchCode));
01538       continue;
01539     }
01540     // Handle subsequent conditional branches. Only handle the case
01541     // where all conditional branches branch to the same destination
01542     // and their condition opcodes fit one of the special
01543     // multi-branch idioms.
01544     assert(Cond.size() == 1);
01545     assert(TBB);
01546     // Only handle the case where all conditional branches branch to
01547     // the same destination.
01548     if (TBB != I->getOperand(0).getMBB())
01549       return true;
01550     X86::CondCode OldBranchCode = (X86::CondCode)Cond[0].getImm();
01551     // If the conditions are the same, we can leave them alone.
01552     if (OldBranchCode == BranchCode)
01553       continue;
01554     // If they differ, see if they fit one of the known patterns.
01555     // Theoretically we could handle more patterns here, but
01556     // we shouldn't expect to see them if instruction selection
01557     // has done a reasonable job.
01558     if ((OldBranchCode == X86::COND_NP &&
01559          BranchCode == X86::COND_E) ||
01560         (OldBranchCode == X86::COND_E &&
01561          BranchCode == X86::COND_NP))
01562       BranchCode = X86::COND_NP_OR_E;
01563     else if ((OldBranchCode == X86::COND_P &&
01564               BranchCode == X86::COND_NE) ||
01565              (OldBranchCode == X86::COND_NE &&
01566               BranchCode == X86::COND_P))
01567       BranchCode = X86::COND_NE_OR_P;
01568     else
01569       return true;
01570     // Update the MachineOperand.
01571     Cond[0].setImm(BranchCode);
01572   }
01573 
01574   return false;
01575 }
01576 
01577 unsigned X86InstrInfo::RemoveBranch(MachineBasicBlock &MBB) const {
01578   MachineBasicBlock::iterator I = MBB.end();
01579   unsigned Count = 0;
01580 
01581   while (I != MBB.begin()) {
01582     --I;
01583     if (I->getOpcode() != X86::JMP &&
01584         GetCondFromBranchOpc(I->getOpcode()) == X86::COND_INVALID)
01585       break;
01586     // Remove the branch.
01587     I->eraseFromParent();
01588     I = MBB.end();
01589     ++Count;
01590   }
01591   
01592   return Count;
01593 }
01594 
01595 static const MachineInstrBuilder &X86InstrAddOperand(MachineInstrBuilder &MIB,
01596                                                      const MachineOperand &MO) {
01597   if (MO.isReg())
01598     MIB = MIB.addReg(MO.getReg(), MO.isDef(), MO.isImplicit(),
01599                      MO.isKill(), MO.isDead(), MO.getSubReg());
01600   else if (MO.isImm())
01601     MIB = MIB.addImm(MO.getImm());
01602   else if (MO.isFI())
01603     MIB = MIB.addFrameIndex(MO.getIndex());
01604   else if (MO.isGlobal())
01605     MIB = MIB.addGlobalAddress(MO.getGlobal(), MO.getOffset());
01606   else if (MO.isCPI())
01607     MIB = MIB.addConstantPoolIndex(MO.getIndex(), MO.getOffset());
01608   else if (MO.isJTI())
01609     MIB = MIB.addJumpTableIndex(MO.getIndex());
01610   else if (MO.isSymbol())
01611     MIB = MIB.addExternalSymbol(MO.getSymbolName());
01612   else
01613     assert(0 && "Unknown operand for X86InstrAddOperand!");
01614 
01615   return MIB;
01616 }
01617 
01618 unsigned
01619 X86InstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
01620                            MachineBasicBlock *FBB,
01621                            const SmallVectorImpl<MachineOperand> &Cond) const {
01622   // Shouldn't be a fall through.
01623   assert(TBB && "InsertBranch must not be told to insert a fallthrough");
01624   assert((Cond.size() == 1 || Cond.size() == 0) &&
01625          "X86 branch conditions have one component!");
01626 
01627   if (Cond.empty()) {
01628     // Unconditional branch?
01629     assert(!FBB && "Unconditional branch with multiple successors!");
01630     BuildMI(&MBB, get(X86::JMP)).addMBB(TBB);
01631     return 1;
01632   }
01633 
01634   // Conditional branch.
01635   unsigned Count = 0;
01636   X86::CondCode CC = (X86::CondCode)Cond[0].getImm();
01637   switch (CC) {
01638   case X86::COND_NP_OR_E:
01639     // Synthesize NP_OR_E with two branches.
01640     BuildMI(&MBB, get(X86::JNP)).addMBB(TBB);
01641     ++Count;
01642     BuildMI(&MBB, get(X86::JE)).addMBB(TBB);
01643     ++Count;
01644     break;
01645   case X86::COND_NE_OR_P:
01646     // Synthesize NE_OR_P with two branches.
01647     BuildMI(&MBB, get(X86::JNE)).addMBB(TBB);
01648     ++Count;
01649     BuildMI(&MBB, get(X86::JP)).addMBB(TBB);
01650     ++Count;
01651     break;
01652   default: {
01653     unsigned Opc = GetCondBranchFromCond(CC);
01654     BuildMI(&MBB, get(Opc)).addMBB(TBB);
01655     ++Count;
01656   }
01657   }
01658   if (FBB) {
01659     // Two-way Conditional branch. Insert the second branch.
01660     BuildMI(&MBB, get(X86::JMP)).addMBB(FBB);
01661     ++Count;
01662   }
01663   return Count;
01664 }
01665 
01666 bool X86InstrInfo::copyRegToReg(MachineBasicBlock &MBB,
01667                                 MachineBasicBlock::iterator MI,
01668                                 unsigned DestReg, unsigned SrcReg,
01669                                 const TargetRegisterClass *DestRC,
01670                                 const TargetRegisterClass *SrcRC) const {
01671   if (DestRC == SrcRC) {
01672     unsigned Opc;
01673     if (DestRC == &X86::GR64RegClass) {
01674       Opc = X86::MOV64rr;
01675     } else if (DestRC == &X86::GR32RegClass) {
01676       Opc = X86::MOV32rr;
01677     } else if (DestRC == &X86::GR16RegClass) {
01678       Opc = X86::MOV16rr;
01679     } else if (DestRC == &X86::GR8RegClass) {
01680       Opc = X86::MOV8rr;
01681     } else if (DestRC == &X86::GR32_RegClass) {
01682       Opc = X86::MOV32_rr;
01683     } else if (DestRC == &X86::GR16_RegClass) {
01684       Opc = X86::MOV16_rr;
01685     } else if (DestRC == &X86::RFP32RegClass) {
01686       Opc = X86::MOV_Fp3232;
01687     } else if (DestRC == &X86::RFP64RegClass || DestRC == &X86::RSTRegClass) {
01688       Opc = X86::MOV_Fp6464;
01689     } else if (DestRC == &X86::RFP80RegClass) {
01690       Opc = X86::MOV_Fp8080;
01691     } else if (DestRC == &X86::FR32RegClass) {
01692       Opc = X86::FsMOVAPSrr;
01693     } else if (DestRC == &X86::FR64RegClass) {
01694       Opc = X86::FsMOVAPDrr;
01695     } else if (DestRC == &X86::VR128RegClass) {
01696       Opc = X86::MOVAPSrr;
01697     } else if (DestRC == &X86::VR64RegClass) {
01698       Opc = X86::MMX_MOVQ64rr;
01699     } else {
01700       return false;
01701     }
01702     BuildMI(MBB, MI, get(Opc), DestReg).addReg(SrcReg);
01703     return true;
01704   }
01705   
01706   // Moving EFLAGS to / from another register requires a push and a pop.
01707   if (SrcRC == &X86::CCRRegClass) {
01708     if (SrcReg != X86::EFLAGS)
01709       return false;
01710     if (DestRC == &X86::GR64RegClass) {
01711       BuildMI(MBB, MI, get(X86::PUSHFQ));
01712       BuildMI(MBB, MI, get(X86::POP64r), DestReg);
01713       return true;
01714     } else if (DestRC == &X86::GR32RegClass) {
01715       BuildMI(MBB, MI, get(X86::PUSHFD));
01716       BuildMI(MBB, MI, get(X86::POP32r), DestReg);
01717       return true;
01718     }
01719   } else if (DestRC == &X86::CCRRegClass) {
01720     if (DestReg != X86::EFLAGS)
01721       return false;
01722     if (SrcRC == &X86::GR64RegClass) {
01723       BuildMI(MBB, MI, get(X86::PUSH64r)).addReg(SrcReg);
01724       BuildMI(MBB, MI, get(X86::POPFQ));
01725       return true;
01726     } else if (SrcRC == &X86::GR32RegClass) {
01727       BuildMI(MBB, MI, get(X86::PUSH32r)).addReg(SrcReg);
01728       BuildMI(MBB, MI, get(X86::POPFD));
01729       return true;
01730     }
01731   }
01732   
01733   // Moving from ST(0) turns into FpGET_ST0_32 etc.
01734   if (SrcRC == &X86::RSTRegClass) {
01735     // Copying from ST(0)/ST(1).
01736     if (SrcReg != X86::ST0 && SrcReg != X86::ST1)
01737       // Can only copy from ST(0)/ST(1) right now
01738       return false;
01739     bool isST0 = SrcReg == X86::ST0;
01740     unsigned Opc;
01741     if (DestRC == &X86::RFP32RegClass)
01742       Opc = isST0 ? X86::FpGET_ST0_32 : X86::FpGET_ST1_32;
01743     else if (DestRC == &X86::RFP64RegClass)
01744       Opc = isST0 ? X86::FpGET_ST0_64 : X86::FpGET_ST1_64;
01745     else {
01746       if (DestRC != &X86::RFP80RegClass)
01747         return false;
01748       Opc = isST0 ? X86::FpGET_ST0_80 : X86::FpGET_ST1_80;
01749     }
01750     BuildMI(MBB, MI, get(Opc), DestReg);
01751     return true;
01752   }
01753 
01754   // Moving to ST(0) turns into FpSET_ST0_32 etc.
01755   if (DestRC == &X86::RSTRegClass) {
01756     // Copying to ST(0).  FIXME: handle ST(1) also
01757     if (DestReg != X86::ST0)
01758       // Can only copy to TOS right now
01759       return false;
01760     unsigned Opc;
01761     if (SrcRC == &X86::RFP32RegClass)
01762       Opc = X86::FpSET_ST0_32;
01763     else if (SrcRC == &X86::RFP64RegClass)
01764       Opc = X86::FpSET_ST0_64;
01765     else {
01766       if (SrcRC != &X86::RFP80RegClass)
01767         return false;
01768       Opc = X86::FpSET_ST0_80;
01769     }
01770     BuildMI(MBB, MI, get(Opc)).addReg(SrcReg);
01771     return true;
01772   }
01773   
01774   // Not yet supported!
01775   return false;
01776 }
01777 
01778 static unsigned getStoreRegOpcode(const TargetRegisterClass *RC,
01779                                   bool isStackAligned) {
01780   unsigned Opc = 0;
01781   if (RC == &X86::GR64RegClass) {
01782     Opc = X86::MOV64mr;
01783   } else if (RC == &X86::GR32RegClass) {
01784     Opc = X86::MOV32mr;
01785   } else if (RC == &X86::GR16RegClass) {
01786     Opc = X86::MOV16mr;
01787   } else if (RC == &X86::GR8RegClass) {
01788     Opc = X86::MOV8mr;
01789   } else if (RC == &X86::GR32_RegClass) {
01790     Opc = X86::MOV32_mr;
01791   } else if (RC == &X86::GR16_RegClass) {
01792     Opc = X86::MOV16_mr;
01793   } else if (RC == &X86::RFP80RegClass) {
01794     Opc = X86::ST_FpP80m;   // pops
01795   } else if (RC == &X86::RFP64RegClass) {
01796     Opc = X86::ST_Fp64m;
01797   } else if (RC == &X86::RFP32RegClass) {
01798     Opc = X86::ST_Fp32m;
01799   } else if (RC == &X86::FR32RegClass) {
01800     Opc = X86::MOVSSmr;
01801   } else if (RC == &X86::FR64RegClass) {
01802     Opc = X86::MOVSDmr;
01803   } else if (RC == &X86::VR128RegClass) {
01804     // If stack is realigned we can use aligned stores.
01805     Opc = isStackAligned ? X86::MOVAPSmr : X86::MOVUPSmr;
01806   } else if (RC == &X86::VR64RegClass) {
01807     Opc = X86::MMX_MOVQ64mr;
01808   } else {
01809     assert(0 && "Unknown regclass");
01810     abort();
01811   }
01812 
01813   return Opc;
01814 }
01815 
01816 void X86InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
01817                                        MachineBasicBlock::iterator MI,
01818                                        unsigned SrcReg, bool isKill, int FrameIdx,
01819                                        const TargetRegisterClass *RC) const {
01820   const MachineFunction &MF = *MBB.getParent();
01821   bool isAligned = (RI.getStackAlignment() >= 16) ||
01822     RI.needsStackRealignment(MF);
01823   unsigned Opc = getStoreRegOpcode(RC, isAligned);
01824   addFrameReference(BuildMI(MBB, MI, get(Opc)), FrameIdx)
01825     .addReg(SrcReg, false, false, isKill);
01826 }
01827 
01828 void X86InstrInfo::storeRegToAddr(MachineFunction &MF, unsigned SrcReg,
01829                                   bool isKill,
01830                                   SmallVectorImpl<MachineOperand> &Addr,
01831                                   const TargetRegisterClass *RC,
01832                                   SmallVectorImpl<MachineInstr*> &NewMIs) const {
01833   bool isAligned = (RI.getStackAlignment() >= 16) ||
01834     RI.needsStackRealignment(MF);
01835   unsigned Opc = getStoreRegOpcode(RC, isAligned);
01836   MachineInstrBuilder MIB = BuildMI(MF, get(Opc));
01837   for (unsigned i = 0, e = Addr.size(); i != e; ++i)
01838     MIB = X86InstrAddOperand(MIB, Addr[i]);
01839   MIB.addReg(SrcReg, false, false, isKill);
01840   NewMIs.push_back(MIB);
01841 }
01842 
01843 static unsigned getLoadRegOpcode(const TargetRegisterClass *RC,
01844                                  bool isStackAligned) {
01845   unsigned Opc = 0;
01846   if (RC == &X86::GR64RegClass) {
01847     Opc = X86::MOV64rm;
01848   } else if (RC == &X86::GR32RegClass) {
01849     Opc = X86::MOV32rm;
01850   } else if (RC == &X86::GR16RegClass) {
01851     Opc = X86::MOV16rm;
01852   } else if (RC == &X86::GR8RegClass) {
01853     Opc = X86::MOV8rm;
01854   } else if (RC == &X86::GR32_RegClass) {
01855     Opc = X86::MOV32_rm;
01856   } else if (RC == &X86::GR16_RegClass) {
01857     Opc = X86::MOV16_rm;
01858   } else if (RC == &X86::RFP80RegClass) {
01859     Opc = X86::LD_Fp80m;
01860   } else if (RC == &X86::RFP64RegClass) {
01861     Opc = X86::LD_Fp64m;
01862   } else if (RC == &X86::RFP32RegClass) {
01863     Opc = X86::LD_Fp32m;
01864   } else if (RC == &X86::FR32RegClass) {
01865     Opc = X86::MOVSSrm;
01866   } else if (RC == &X86::FR64RegClass) {
01867     Opc = X86::MOVSDrm;
01868   } else if (RC == &X86::VR128RegClass) {
01869     // If stack is realigned we can use aligned loads.
01870     Opc = isStackAligned ? X86::MOVAPSrm : X86::MOVUPSrm;
01871   } else if (RC == &X86::VR64RegClass) {
01872     Opc = X86::MMX_MOVQ64rm;
01873   } else {
01874     assert(0 && "Unknown regclass");
01875     abort();
01876   }
01877 
01878   return Opc;
01879 }
01880 
01881 void X86InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
01882                                         MachineBasicBlock::iterator MI,
01883                                         unsigned DestReg, int FrameIdx,
01884                                         const TargetRegisterClass *RC) const{
01885   const MachineFunction &MF = *MBB.getParent();
01886   bool isAligned = (RI.getStackAlignment() >= 16) ||
01887     RI.needsStackRealignment(MF);
01888   unsigned Opc = getLoadRegOpcode(RC, isAligned);
01889   addFrameReference(BuildMI(MBB, MI, get(Opc), DestReg), FrameIdx);
01890 }
01891 
01892 void X86InstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg,
01893                                  SmallVectorImpl<MachineOperand> &Addr,
01894                                  const TargetRegisterClass *RC,
01895                                  SmallVectorImpl<MachineInstr*> &NewMIs) const {
01896   bool isAligned = (RI.getStackAlignment() >= 16) ||
01897     RI.needsStackRealignment(MF);
01898   unsigned Opc = getLoadRegOpcode(RC, isAligned);
01899   MachineInstrBuilder MIB = BuildMI(MF, get(Opc), DestReg);
01900   for (unsigned i = 0, e = Addr.size(); i != e; ++i)
01901     MIB = X86InstrAddOperand(MIB, Addr[i]);
01902   NewMIs.push_back(MIB);
01903 }
01904 
01905 bool X86InstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
01906                                                 MachineBasicBlock::iterator MI,
01907                                 const std::vector<CalleeSavedInfo> &CSI) const {
01908   if (CSI.empty())
01909     return false;
01910 
01911   bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit();
01912   unsigned SlotSize = is64Bit ? 8 : 4;
01913 
01914   MachineFunction &MF = *MBB.getParent();
01915   X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
01916   X86FI->setCalleeSavedFrameSize(CSI.size() * SlotSize);
01917   
01918   unsigned Opc = is64Bit ? X86::PUSH64r : X86::PUSH32r;
01919   for (unsigned i = CSI.size(); i != 0; --i) {
01920     unsigned Reg = CSI[i-1].getReg();
01921     // Add the callee-saved register as live-in. It's killed at the spill.
01922     MBB.addLiveIn(Reg);
01923     BuildMI(MBB, MI, get(Opc))
01924       .addReg(Reg, /*isDef=*/false, /*isImp=*/false, /*isKill=*/true);
01925   }
01926   return true;
01927 }
01928 
01929 bool X86InstrInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
01930                                                  MachineBasicBlock::iterator MI,
01931                                 const std::vector<CalleeSavedInfo> &CSI) const {
01932   if (CSI.empty())
01933     return false;
01934     
01935   bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit();
01936 
01937   unsigned Opc = is64Bit ? X86::POP64r : X86::POP32r;
01938   for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
01939     unsigned Reg = CSI[i].getReg();
01940     BuildMI(MBB, MI, get(Opc), Reg);
01941   }
01942   return true;
01943 }
01944 
01945 static MachineInstr *FuseTwoAddrInst(MachineFunction &MF, unsigned Opcode,
01946                                      const SmallVectorImpl<MachineOperand> &MOs,
01947                                      MachineInstr *MI,
01948                                      const TargetInstrInfo &TII) {
01949   // Create the base instruction with the memory operand as the first part.
01950   MachineInstr *NewMI = MF.CreateMachineInstr(TII.get(Opcode),
01951                                               MI->getDebugLoc(), true);
01952   MachineInstrBuilder MIB(NewMI);
01953   unsigned NumAddrOps = MOs.size();
01954   for (unsigned i = 0; i != NumAddrOps; ++i)
01955     MIB = X86InstrAddOperand(MIB, MOs[i]);
01956   if (NumAddrOps < 4)  // FrameIndex only
01957     MIB.addImm(1).addReg(0).addImm(0);
01958   
01959   // Loop over the rest of the ri operands, converting them over.
01960   unsigned NumOps = MI->getDesc().getNumOperands()-2;
01961   for (unsigned i = 0; i != NumOps; ++i) {
01962     MachineOperand &MO = MI->getOperand(i+2);
01963     MIB = X86InstrAddOperand(MIB, MO);
01964   }
01965   for (unsigned i = NumOps+2, e = MI->getNumOperands(); i != e; ++i) {
01966     MachineOperand &MO = MI->getOperand(i);
01967     MIB = X86InstrAddOperand(MIB, MO);
01968   }
01969   return MIB;
01970 }
01971 
01972 static MachineInstr *FuseInst(MachineFunction &MF,
01973                               unsigned Opcode, unsigned OpNo,
01974                               const SmallVectorImpl<MachineOperand> &MOs,
01975                               MachineInstr *MI, const TargetInstrInfo &TII) {
01976   MachineInstr *NewMI = MF.CreateMachineInstr(TII.get(Opcode),
01977                                               MI->getDebugLoc(), true);
01978   MachineInstrBuilder MIB(NewMI);
01979   
01980   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
01981     MachineOperand &MO = MI->getOperand(i);
01982     if (i == OpNo) {
01983       assert(MO.isReg() && "Expected to fold into reg operand!");
01984       unsigned NumAddrOps = MOs.size();
01985       for (unsigned i = 0; i != NumAddrOps; ++i)
01986         MIB = X86InstrAddOperand(MIB, MOs[i]);
01987       if (NumAddrOps < 4)  // FrameIndex only
01988         MIB.addImm(1).addReg(0).addImm(0);
01989     } else {
01990       MIB = X86InstrAddOperand(MIB, MO);
01991     }
01992   }
01993   return MIB;
01994 }
01995 
01996 static MachineInstr *MakeM0Inst(const TargetInstrInfo &TII, unsigned Opcode,
01997                                 const SmallVectorImpl<MachineOperand> &MOs,
01998                                 MachineInstr *MI) {
01999   MachineFunction &MF = *MI->getParent()->getParent();
02000   MachineInstrBuilder MIB = BuildMI(MF, TII.get(Opcode));
02001 
02002   unsigned NumAddrOps = MOs.size();
02003   for (unsigned i = 0; i != NumAddrOps; ++i)
02004     MIB = X86InstrAddOperand(MIB, MOs[i]);
02005   if (NumAddrOps < 4)  // FrameIndex only
02006     MIB.addImm(1).addReg(0).addImm(0);
02007   return MIB.addImm(0);
02008 }
02009 
02010 MachineInstr*
02011 X86InstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
02012                                     MachineInstr *MI, unsigned i,
02013                                     const SmallVectorImpl<MachineOperand> &MOs) const{
02014   const DenseMap<unsigned*, unsigned> *OpcodeTablePtr = NULL;
02015   bool isTwoAddrFold = false;
02016   unsigned NumOps = MI->getDesc().getNumOperands();
02017   bool isTwoAddr = NumOps > 1 &&
02018     MI->getDesc().getOperandConstraint(1, TOI::TIED_TO) != -1;
02019 
02020   MachineInstr *NewMI = NULL;
02021   // Folding a memory location into the two-address part of a two-address
02022   // instruction is different than folding it other places.  It requires
02023   // replacing the *two* registers with the memory location.
02024   if (isTwoAddr && NumOps >= 2 && i < 2 &&
02025       MI->getOperand(0).isReg() &&
02026       MI->getOperand(1).isReg() &&
02027       MI->getOperand(0).getReg() == MI->getOperand(1).getReg()) { 
02028     OpcodeTablePtr = &RegOp2MemOpTable2Addr;
02029     isTwoAddrFold = true;
02030   } else if (i == 0) { // If operand 0
02031     if (MI->getOpcode() == X86::MOV16r0)
02032       NewMI = MakeM0Inst(*this, X86::MOV16mi, MOs, MI);
02033     else if (MI->getOpcode() == X86::MOV32r0)
02034       NewMI = MakeM0Inst(*this, X86::MOV32mi, MOs, MI);
02035     else if (MI->getOpcode() == X86::MOV64r0)
02036       NewMI = MakeM0Inst(*this, X86::MOV64mi32, MOs, MI);
02037     else if (MI->getOpcode() == X86::MOV8r0)
02038       NewMI = MakeM0Inst(*this, X86::MOV8mi, MOs, MI);
02039     if (NewMI)
02040       return NewMI;
02041     
02042     OpcodeTablePtr = &RegOp2MemOpTable0;
02043   } else if (i == 1) {
02044     OpcodeTablePtr = &RegOp2MemOpTable1;
02045   } else if (i == 2) {
02046     OpcodeTablePtr = &RegOp2MemOpTable2;
02047   }
02048   
02049   // If table selected...
02050   if (OpcodeTablePtr) {
02051     // Find the Opcode to fuse
02052     DenseMap<unsigned*, unsigned>::iterator I =
02053       OpcodeTablePtr->find((unsigned*)MI->getOpcode());
02054     if (I != OpcodeTablePtr->end()) {
02055       if (isTwoAddrFold)
02056         NewMI = FuseTwoAddrInst(MF, I->second, MOs, MI, *this);
02057       else
02058         NewMI = FuseInst(MF, I->second, i, MOs, MI, *this);
02059       return NewMI;
02060     }
02061   }
02062   
02063   // No fusion 
02064   if (PrintFailedFusing)
02065     cerr << "We failed to fuse operand " << i << " in " << *MI;
02066   return NULL;
02067 }
02068 
02069 
02070 MachineInstr* X86InstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
02071                                                   MachineInstr *MI,
02072                                                   const SmallVectorImpl<unsigned> &Ops,
02073                                                   int FrameIndex) const {
02074   // Check switch flag 
02075   if (NoFusing) return NULL;
02076 
02077   const MachineFrameInfo *MFI = MF.getFrameInfo();
02078   unsigned Alignment = MFI->getObjectAlignment(FrameIndex);
02079   // FIXME: Move alignment requirement into tables?
02080   if (Alignment < 16) {
02081     switch (MI->getOpcode()) {
02082     default: break;
02083     // Not always safe to fold movsd into these instructions since their load
02084     // folding variants expects the address to be 16 byte aligned.
02085     case X86::FsANDNPDrr:
02086     case X86::FsANDNPSrr:
02087     case X86::FsANDPDrr:
02088     case X86::FsANDPSrr:
02089     case X86::FsORPDrr:
02090     case X86::FsORPSrr:
02091     case X86::FsXORPDrr:
02092     case X86::FsXORPSrr:
02093       return NULL;
02094     }
02095   }
02096 
02097   if (Ops.size() == 2 && Ops[0] == 0 && Ops[1] == 1) {
02098     unsigned NewOpc = 0;
02099     switch (MI->getOpcode()) {
02100     default: return NULL;
02101     case X86::TEST8rr:  NewOpc = X86::CMP8ri; break;
02102     case X86::TEST16rr: NewOpc = X86::CMP16ri; break;
02103     case X86::TEST32rr: NewOpc = X86::CMP32ri; break;
02104     case X86::TEST64rr: NewOpc = X86::CMP64ri32; break;
02105     }
02106     // Change to CMPXXri r, 0 first.
02107     MI->setDesc(get(NewOpc));
02108     MI->getOperand(1).ChangeToImmediate(0);
02109   } else if (Ops.size() != 1)
02110     return NULL;
02111 
02112   SmallVector<MachineOperand,4> MOs;
02113   MOs.push_back(MachineOperand::CreateFI(FrameIndex));
02114   return foldMemoryOperandImpl(MF, MI, Ops[0], MOs);
02115 }
02116 
02117 MachineInstr* X86InstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
02118                                                   MachineInstr *MI,
02119                                             const SmallVectorImpl<unsigned> &Ops,
02120                                                   MachineInstr *LoadMI) const {
02121   // Check switch flag 
02122   if (NoFusing) return NULL;
02123 
02124   // Determine the alignment of the load.
02125   unsigned Alignment = 0;
02126   if (LoadMI->hasOneMemOperand())
02127     Alignment = LoadMI->memoperands_begin()->getAlignment();
02128 
02129   // FIXME: Move alignment requirement into tables?
02130   if (Alignment < 16) {
02131     switch (MI->getOpcode()) {
02132     default: break;
02133     // Not always safe to fold movsd into these instructions since their load
02134     // folding variants expects the address to be 16 byte aligned.
02135     case X86::FsANDNPDrr:
02136     case X86::FsANDNPSrr:
02137     case X86::FsANDPDrr:
02138     case X86::FsANDPSrr:
02139     case X86::FsORPDrr:
02140     case X86::FsORPSrr:
02141     case X86::FsXORPDrr:
02142     case X86::FsXORPSrr:
02143       return NULL;
02144     }
02145   }
02146 
02147   if (Ops.size() == 2 && Ops[0] == 0 && Ops[1] == 1) {
02148     unsigned NewOpc = 0;
02149     switch (MI->getOpcode()) {
02150     default: return NULL;
02151     case X86::TEST8rr:  NewOpc = X86::CMP8ri; break;
02152     case X86::TEST16rr: NewOpc = X86::CMP16ri; break;
02153     case X86::TEST32rr: NewOpc = X86::CMP32ri; break;
02154     case X86::TEST64rr: NewOpc = X86::CMP64ri32; break;
02155     }
02156     // Change to CMPXXri r, 0 first.
02157     MI->setDesc(get(NewOpc));
02158     MI->getOperand(1).ChangeToImmediate(0);
02159   } else if (Ops.size() != 1)
02160     return NULL;
02161 
02162   SmallVector<MachineOperand,4> MOs;
02163   if (LoadMI->getOpcode() == X86::V_SET0 ||
02164       LoadMI->getOpcode() == X86::V_SETALLONES) {
02165     // Folding a V_SET0 or V_SETALLONES as a load, to ease register pressure.
02166     // Create a constant-pool entry and operands to load from it.
02167 
02168     // x86-32 PIC requires a PIC base register for constant pools.
02169     unsigned PICBase = 0;
02170     if (TM.getRelocationModel() == Reloc::PIC_ &&
02171         !TM.getSubtarget<X86Subtarget>().is64Bit())
02172       // FIXME: PICBase = TM.getInstrInfo()->getGlobalBaseReg(&MF);
02173       // This doesn't work for several reasons.
02174       // 1. GlobalBaseReg may have been spilled.
02175       // 2. It may not be live at MI.
02176       return false;
02177 
02178     // Create a v4i32 constant-pool entry.
02179     MachineConstantPool &MCP = *MF.getConstantPool();
02180     const VectorType *Ty = VectorType::get(Type::Int32Ty, 4);
02181     Constant *C = LoadMI->getOpcode() == X86::V_SET0 ?
02182                     ConstantVector::getNullValue(Ty) :
02183                     ConstantVector::getAllOnesValue(Ty);
02184     unsigned CPI = MCP.getConstantPoolIndex(C, /*AlignmentLog2=*/4);
02185 
02186     // Create operands to load from the constant pool entry.
02187     MOs.push_back(MachineOperand::CreateReg(PICBase, false));
02188     MOs.push_back(MachineOperand::CreateImm(1));
02189     MOs.push_back(MachineOperand::CreateReg(0, false));
02190     MOs.push_back(MachineOperand::CreateCPI(CPI, 0));
02191   } else {
02192     // Folding a normal load. Just copy the load's address operands.
02193     unsigned NumOps = LoadMI->getDesc().getNumOperands();
02194     for (unsigned i = NumOps - 4; i != NumOps; ++i)
02195       MOs.push_back(LoadMI->getOperand(i));
02196   }
02197   return foldMemoryOperandImpl(MF, MI, Ops[0], MOs);
02198 }
02199 
02200 
02201 bool X86InstrInfo::canFoldMemoryOperand(const MachineInstr *MI,
02202                                   const SmallVectorImpl<unsigned> &Ops) const {
02203   // Check switch flag 
02204   if (NoFusing) return 0;
02205 
02206   if (Ops.size() == 2 && Ops[0] == 0 && Ops[1] == 1) {
02207     switch (MI->getOpcode()) {
02208     default: return false;
02209     case X86::TEST8rr: 
02210     case X86::TEST16rr:
02211     case X86::TEST32rr:
02212     case X86::TEST64rr:
02213       return true;
02214     }
02215   }
02216 
02217   if (Ops.size() != 1)
02218     return false;
02219 
02220   unsigned OpNum = Ops[0];
02221   unsigned Opc = MI->getOpcode();
02222   unsigned NumOps = MI->getDesc().getNumOperands();
02223   bool isTwoAddr = NumOps > 1 &&
02224     MI->getDesc().getOperandConstraint(1, TOI::TIED_TO) != -1;
02225 
02226   // Folding a memory location into the two-address part of a two-address
02227   // instruction is different than folding it other places.  It requires
02228   // replacing the *two* registers with the memory location.
02229   const DenseMap<unsigned*, unsigned> *OpcodeTablePtr = NULL;
02230   if (isTwoAddr && NumOps >= 2 && OpNum < 2) { 
02231     OpcodeTablePtr = &RegOp2MemOpTable2Addr;
02232   } else if (OpNum == 0) { // If operand 0
02233     switch (Opc) {
02234     case X86::MOV16r0:
02235     case X86::MOV32r0:
02236     case X86::MOV64r0:
02237     case X86::MOV8r0:
02238       return true;
02239     default: break;
02240     }
02241     OpcodeTablePtr = &RegOp2MemOpTable0;
02242   } else if (OpNum == 1) {
02243     OpcodeTablePtr = &RegOp2MemOpTable1;
02244   } else if (OpNum == 2) {
02245     OpcodeTablePtr = &RegOp2MemOpTable2;
02246   }
02247   
02248   if (OpcodeTablePtr) {
02249     // Find the Opcode to fuse
02250     DenseMap<unsigned*, unsigned>::iterator I =
02251       OpcodeTablePtr->find((unsigned*)Opc);
02252     if (I != OpcodeTablePtr->end())
02253       return true;
02254   }
02255   return false;
02256 }
02257 
02258 bool X86InstrInfo::unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI,
02259                                 unsigned Reg, bool UnfoldLoad, bool UnfoldStore,
02260                                  SmallVectorImpl<MachineInstr*> &NewMIs) const {
02261   DenseMap<unsigned*, std::pair<unsigned,unsigned> >::iterator I =
02262     MemOp2RegOpTable.find((unsigned*)MI->getOpcode());
02263   if (I == MemOp2RegOpTable.end())
02264     return false;
02265   unsigned Opc = I->second.first;
02266   unsigned Index = I->second.second & 0xf;
02267   bool FoldedLoad = I->second.second & (1 << 4);
02268   bool FoldedStore = I->second.second & (1 << 5);
02269   if (UnfoldLoad && !FoldedLoad)
02270     return false;
02271   UnfoldLoad &= FoldedLoad;
02272   if (UnfoldStore && !FoldedStore)
02273     return false;
02274   UnfoldStore &= FoldedStore;
02275 
02276   const TargetInstrDesc &TID = get(Opc);
02277   const TargetOperandInfo &TOI = TID.OpInfo[Index];
02278   const TargetRegisterClass *RC = TOI.isLookupPtrRegClass()
02279     ? getPointerRegClass() : RI.getRegClass(TOI.RegClass);
02280   SmallVector<MachineOperand,4> AddrOps;
02281   SmallVector<MachineOperand,2> BeforeOps;
02282   SmallVector<MachineOperand,2> AfterOps;
02283   SmallVector<MachineOperand,4> ImpOps;
02284   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
02285     MachineOperand &Op = MI->getOperand(i);
02286     if (i >= Index && i < Index+4)
02287       AddrOps.push_back(Op);
02288     else if (Op.isReg() && Op.isImplicit())
02289       ImpOps.push_back(Op);
02290     else if (i < Index)
02291       BeforeOps.push_back(Op);
02292     else if (i > Index)
02293       AfterOps.push_back(Op);
02294   }
02295 
02296   // Emit the load instruction.
02297   if (UnfoldLoad) {
02298     loadRegFromAddr(MF, Reg, AddrOps, RC, NewMIs);
02299     if (UnfoldStore) {
02300       // Address operands cannot be marked isKill.
02301       for (unsigned i = 1; i != 5; ++i) {
02302         MachineOperand &MO = NewMIs[0]->getOperand(i);
02303         if (MO.isReg())
02304           MO.setIsKill(false);
02305       }
02306     }
02307   }
02308 
02309   // Emit the data processing instruction.
02310   MachineInstr *DataMI = MF.CreateMachineInstr(TID, MI->getDebugLoc(), true);
02311   MachineInstrBuilder MIB(DataMI);
02312   
02313   if (FoldedStore)
02314     MIB.addReg(Reg, true);
02315   for (unsigned i = 0, e = BeforeOps.size(); i != e; ++i)
02316     MIB = X86InstrAddOperand(MIB, BeforeOps[i]);
02317   if (FoldedLoad)
02318     MIB.addReg(Reg);
02319   for (unsigned i = 0, e = AfterOps.size(); i != e; ++i)
02320     MIB = X86InstrAddOperand(MIB, AfterOps[i]);
02321   for (unsigned i = 0, e = ImpOps.size(); i != e; ++i) {
02322     MachineOperand &MO = ImpOps[i];
02323     MIB.addReg(MO.getReg(), MO.isDef(), true, MO.isKill(), MO.isDead());
02324   }
02325   // Change CMP32ri r, 0 back to TEST32rr r, r, etc.
02326   unsigned NewOpc = 0;
02327   switch (DataMI->getOpcode()) {
02328   default: break;
02329   case X86::CMP64ri32:
02330   case X86::CMP32ri:
02331   case X86::CMP16ri:
02332   case X86::CMP8ri: {
02333     MachineOperand &MO0 = DataMI->getOperand(0);
02334     MachineOperand &MO1 = DataMI->getOperand(1);
02335     if (MO1.getImm() == 0) {
02336       switch (DataMI->getOpcode()) {
02337       default: break;
02338       case X86::CMP64ri32: NewOpc = X86::TEST64rr; break;
02339       case X86::CMP32ri:   NewOpc = X86::TEST32rr; break;
02340       case X86::CMP16ri:   NewOpc = X86::TEST16rr; break;
02341       case X86::CMP8ri:    NewOpc = X86::TEST8rr; break;
02342       }
02343       DataMI->setDesc(get(NewOpc));
02344       MO1.ChangeToRegister(MO0.getReg(), false);
02345     }
02346   }
02347   }
02348   NewMIs.push_back(DataMI);
02349 
02350   // Emit the store instruction.
02351   if (UnfoldStore) {
02352     const TargetOperandInfo &DstTOI = TID.OpInfo[0];
02353     const TargetRegisterClass *DstRC = DstTOI.isLookupPtrRegClass()
02354       ? getPointerRegClass() : RI.getRegClass(DstTOI.RegClass);
02355     storeRegToAddr(MF, Reg, true, AddrOps, DstRC, NewMIs);
02356   }
02357 
02358   return true;
02359 }
02360 
02361 bool
02362 X86InstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
02363                                      SmallVectorImpl<SDNode*> &NewNodes) const {
02364   if (!N->isMachineOpcode())
02365     return false;
02366 
02367   DenseMap<unsigned*, std::pair<unsigned,unsigned> >::iterator I =
02368     MemOp2RegOpTable.find((unsigned*)N->getMachineOpcode());
02369   if (I == MemOp2RegOpTable.end())
02370     return false;
02371   unsigned Opc = I->second.first;
02372   unsigned Index = I->second.second & 0xf;
02373   bool FoldedLoad = I->second.second & (1 << 4);
02374   bool FoldedStore = I->second.second & (1 << 5);
02375   const TargetInstrDesc &TID = get(Opc);
02376   const TargetOperandInfo &TOI = TID.OpInfo[Index];
02377   const TargetRegisterClass *RC = TOI.isLookupPtrRegClass()
02378     ? getPointerRegClass() : RI.getRegClass(TOI.RegClass);
02379   std::vector<SDValue> AddrOps;
02380   std::vector<SDValue> BeforeOps;
02381   std::vector<SDValue> AfterOps;
02382   unsigned NumOps = N->getNumOperands();
02383   for (unsigned i = 0; i != NumOps-1; ++i) {
02384     SDValue Op = N->getOperand(i);
02385     if (i >= Index && i < Index+4)
02386       AddrOps.push_back(Op);
02387     else if (i < Index)
02388       BeforeOps.push_back(Op);
02389     else if (i > Index)
02390       AfterOps.push_back(Op);
02391   }
02392   SDValue Chain = N->getOperand(NumOps-1);
02393   AddrOps.push_back(Chain);
02394 
02395   // Emit the load instruction.
02396   SDNode *Load = 0;
02397   const MachineFunction &MF = DAG.getMachineFunction();
02398   if (FoldedLoad) {
02399     MVT VT = *RC->vt_begin();
02400     bool isAligned = (RI.getStackAlignment() >= 16) ||
02401       RI.needsStackRealignment(MF);
02402     Load = DAG.getTargetNode(getLoadRegOpcode(RC, isAligned),
02403                              VT, MVT::Other,
02404                              &AddrOps[0], AddrOps.size());
02405     NewNodes.push_back(Load);
02406   }
02407 
02408   // Emit the data processing instruction.
02409   std::vector<MVT> VTs;
02410   const TargetRegisterClass *DstRC = 0;
02411   if (TID.getNumDefs() > 0) {
02412     const TargetOperandInfo &DstTOI = TID.OpInfo[0];
02413     DstRC = DstTOI.isLookupPtrRegClass()
02414       ? getPointerRegClass() : RI.getRegClass(DstTOI.RegClass);
02415     VTs.push_back(*DstRC->vt_begin());
02416   }
02417   for (unsigned i = 0, e = N->getNumValues(); i != e; ++i) {
02418     MVT VT = N->getValueType(i);
02419     if (VT != MVT::Other && i >= (unsigned)TID.getNumDefs())
02420       VTs.push_back(VT);
02421   }
02422   if (Load)
02423     BeforeOps.push_back(SDValue(Load, 0));
02424   std::copy(AfterOps.begin(), AfterOps.end(), std::back_inserter(BeforeOps));
02425   SDNode *NewNode= DAG.getTargetNode(Opc, VTs, &BeforeOps[0], BeforeOps.size());
02426   NewNodes.push_back(NewNode);
02427 
02428   // Emit the store instruction.
02429   if (FoldedStore) {
02430     AddrOps.pop_back();
02431     AddrOps.push_back(SDValue(NewNode, 0));
02432     AddrOps.push_back(Chain);
02433     bool isAligned = (RI.getStackAlignment() >= 16) ||
02434       RI.needsStackRealignment(MF);
02435     SDNode *Store = DAG.getTargetNode(getStoreRegOpcode(DstRC, isAligned),
02436                                       MVT::Other, &AddrOps[0], AddrOps.size());
02437     NewNodes.push_back(Store);
02438   }
02439 
02440   return true;
02441 }
02442 
02443 unsigned X86InstrInfo::getOpcodeAfterMemoryUnfold(unsigned Opc,
02444                                       bool UnfoldLoad, bool UnfoldStore) const {
02445   DenseMap<unsigned*, std::pair<unsigned,unsigned> >::iterator I =
02446     MemOp2RegOpTable.find((unsigned*)Opc);
02447   if (I == MemOp2RegOpTable.end())
02448     return 0;
02449   bool FoldedLoad = I->second.second & (1 << 4);
02450   bool FoldedStore = I->second.second & (1 << 5);
02451   if (UnfoldLoad && !FoldedLoad)
02452     return 0;
02453   if (UnfoldStore && !FoldedStore)
02454     return 0;
02455   return I->second.first;
02456 }
02457 
02458 bool X86InstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
02459   if (MBB.empty()) return false;
02460   
02461   switch (MBB.back().getOpcode()) {
02462   case X86::TCRETURNri:
02463   case X86::TCRETURNdi:
02464   case X86::RET:     // Return.
02465   case X86::RETI:
02466   case X86::TAILJMPd:
02467   case X86::TAILJMPr:
02468   case X86::TAILJMPm:
02469   case X86::JMP:     // Uncond branch.
02470   case X86::JMP32r:  // Indirect branch.
02471   case X86::JMP64r:  // Indirect branch (64-bit).
02472   case X86::JMP32m:  // Indirect branch through mem.
02473   case X86::JMP64m:  // Indirect branch through mem (64-bit).
02474     return true;
02475   default: return false;
02476   }
02477 }
02478 
02479 bool X86InstrInfo::
02480 ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
02481   assert(Cond.size() == 1 && "Invalid X86 branch condition!");
02482   X86::CondCode CC = static_cast<X86::CondCode>(Cond[0].getImm());
02483   if (CC == X86::COND_NE_OR_P || CC == X86::COND_NP_OR_E)
02484     return true;
02485   Cond[0].setImm(GetOppositeBranchCondition(CC));
02486   return false;
02487 }
02488 
02489 bool X86InstrInfo::
02490 IgnoreRegisterClassBarriers(const TargetRegisterClass *RC) const {
02491   // FIXME: Ignore bariers of x87 stack registers for now. We can't
02492   // allow any loads of these registers before FpGet_ST0_80.
02493   return RC == &X86::CCRRegClass || RC == &X86::RFP32RegClass ||
02494     RC == &X86::RFP64RegClass || RC == &X86::RFP80RegClass;
02495 }
02496 
02497 const TargetRegisterClass *X86InstrInfo::getPointerRegClass() const {
02498   const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
02499   if (Subtarget->is64Bit())
02500     return &X86::GR64RegClass;
02501   else
02502     return &X86::GR32RegClass;
02503 }
02504 
02505 unsigned X86InstrInfo::sizeOfImm(const TargetInstrDesc *Desc) {
02506   switch (Desc->TSFlags & X86II::ImmMask) {
02507   case X86II::Imm8:   return 1;
02508   case X86II::Imm16:  return 2;
02509   case X86II::Imm32:  return 4;
02510   case X86II::Imm64:  return 8;
02511   default: assert(0 && "Immediate size not set!");
02512     return 0;
02513   }
02514 }
02515 
02516 /// isX86_64ExtendedReg - Is the MachineOperand a x86-64 extended register?
02517 /// e.g. r8, xmm8, etc.
02518 bool X86InstrInfo::isX86_64ExtendedReg(const MachineOperand &MO) {
02519   if (!MO.isReg()) return false;
02520   switch (MO.getReg()) {
02521   default: break;
02522   case X86::R8:    case X86::R9:    case X86::R10:   case X86::R11:
02523   case X86::R12:   case X86::R13:   case X86::R14:   case X86::R15:
02524   case X86::R8D:   case X86::R9D:   case X86::R10D:  case X86::R11D:
02525   case X86::R12D:  case X86::R13D:  case X86::R14D:  case X86::R15D:
02526   case X86::R8W:   case X86::R9W:   case X86::R10W:  case X86::R11W:
02527   case X86::R12W:  case X86::R13W:  case X86::R14W:  case X86::R15W:
02528   case X86::R8B:   case X86::R9B:   case X86::R10B:  case X86::R11B:
02529   case X86::R12B:  case X86::R13B:  case X86::R14B:  case X86::R15B:
02530   case X86::XMM8:  case X86::XMM9:  case X86::XMM10: case X86::XMM11:
02531   case X86::XMM12: case X86::XMM13: case X86::XMM14: case X86::XMM15:
02532     return true;
02533   }
02534   return false;
02535 }
02536 
02537 
02538 /// determineREX - Determine if the MachineInstr has to be encoded with a X86-64
02539 /// REX prefix which specifies 1) 64-bit instructions, 2) non-default operand
02540 /// size, and 3) use of X86-64 extended registers.
02541 unsigned X86InstrInfo::determineREX(const MachineInstr &MI) {
02542   unsigned REX = 0;
02543   const TargetInstrDesc &Desc = MI.getDesc();
02544 
02545   // Pseudo instructions do not need REX prefix byte.
02546   if ((Desc.TSFlags & X86II::FormMask) == X86II::Pseudo)
02547     return 0;
02548   if (Desc.TSFlags & X86II::REX_W)
02549     REX |= 1 << 3;
02550 
02551   unsigned NumOps = Desc.getNumOperands();
02552   if (NumOps) {
02553     bool isTwoAddr = NumOps > 1 &&
02554       Desc.getOperandConstraint(1, TOI::TIED_TO) != -1;
02555 
02556     // If it accesses SPL, BPL, SIL, or DIL, then it requires a 0x40 REX prefix.
02557     unsigned i = isTwoAddr ? 1 : 0;
02558     for (unsigned e = NumOps; i != e; ++i) {
02559       const MachineOperand& MO = MI.getOperand(i);
02560       if (MO.isReg()) {
02561         unsigned Reg = MO.getReg();
02562         if (isX86_64NonExtLowByteReg(Reg))
02563           REX |= 0x40;
02564       }
02565     }
02566 
02567     switch (Desc.TSFlags & X86II::FormMask) {
02568     case X86II::MRMInitReg:
02569       if (isX86_64ExtendedReg(MI.getOperand(0)))
02570         REX |= (1 << 0) | (1 << 2);
02571       break;
02572     case X86II::MRMSrcReg: {
02573       if (isX86_64ExtendedReg(MI.getOperand(0)))
02574         REX |= 1 << 2;
02575       i = isTwoAddr ? 2 : 1;
02576       for (unsigned e = NumOps; i != e; ++i) {
02577         const MachineOperand& MO = MI.getOperand(i);
02578         if (isX86_64ExtendedReg(MO))
02579           REX |= 1 << 0;
02580       }
02581       break;
02582     }
02583     case X86II::MRMSrcMem: {
02584       if (isX86_64ExtendedReg(MI.getOperand(0)))
02585         REX |= 1 << 2;
02586       unsigned Bit = 0;
02587       i = isTwoAddr ? 2 : 1;
02588       for (; i != NumOps; ++i) {
02589         const MachineOperand& MO = MI.getOperand(i);
02590         if (MO.isReg()) {
02591           if (isX86_64ExtendedReg(MO))
02592             REX |= 1 << Bit;
02593           Bit++;
02594         }
02595       }
02596       break;
02597     }
02598     case X86II::MRM0m: case X86II::MRM1m:
02599     case X86II::MRM2m: case X86II::MRM3m:
02600     case X86II::MRM4m: case X86II::MRM5m:
02601     case X86II::MRM6m: case X86II::MRM7m:
02602     case X86II::MRMDestMem: {
02603       unsigned e = isTwoAddr ? 5 : 4;
02604       i = isTwoAddr ? 1 : 0;
02605       if (NumOps > e && isX86_64ExtendedReg(MI.getOperand(e)))
02606         REX |= 1 << 2;
02607       unsigned Bit = 0;
02608       for (; i != e; ++i) {
02609         const MachineOperand& MO = MI.getOperand(i);
02610         if (MO.isReg()) {
02611           if (isX86_64ExtendedReg(MO))
02612             REX |= 1 << Bit;
02613           Bit++;
02614         }
02615       }
02616       break;
02617     }
02618     default: {
02619       if (isX86_64ExtendedReg(MI.getOperand(0)))
02620         REX |= 1 << 0;
02621       i = isTwoAddr ? 2 : 1;
02622       for (unsigned e = NumOps; i != e; ++i) {
02623         const MachineOperand& MO = MI.getOperand(i);
02624         if (isX86_64ExtendedReg(MO))
02625           REX |= 1 << 2;
02626       }
02627       break;
02628     }
02629     }
02630   }
02631   return REX;
02632 }
02633 
02634 /// sizePCRelativeBlockAddress - This method returns the size of a PC
02635 /// relative block address instruction
02636 ///
02637 static unsigned sizePCRelativeBlockAddress() {
02638   return 4;
02639 }
02640 
02641 /// sizeGlobalAddress - Give the size of the emission of this global address
02642 ///
02643 static unsigned sizeGlobalAddress(bool dword) {
02644   return dword ? 8 : 4;
02645 }
02646 
02647 /// sizeConstPoolAddress - Give the size of the emission of this constant
02648 /// pool address
02649 ///
02650 static unsigned sizeConstPoolAddress(bool dword) {
02651   return dword ? 8 : 4;
02652 }
02653 
02654 /// sizeExternalSymbolAddress - Give the size of the emission of this external
02655 /// symbol
02656 ///
02657 static unsigned sizeExternalSymbolAddress(bool dword) {
02658   return dword ? 8 : 4;
02659 }
02660 
02661 /// sizeJumpTableAddress - Give the size of the emission of this jump
02662 /// table address
02663 ///
02664 static unsigned sizeJumpTableAddress(bool dword) {
02665   return dword ? 8 : 4;
02666 }
02667 
02668 static unsigned sizeConstant(unsigned Size) {
02669   return Size;
02670 }
02671 
02672 static unsigned sizeRegModRMByte(){
02673   return 1;
02674 }
02675 
02676 static unsigned sizeSIBByte(){
02677   return 1;
02678 }
02679 
02680 static unsigned getDisplacementFieldSize(const MachineOperand *RelocOp) {
02681   unsigned FinalSize = 0;
02682   // If this is a simple integer displacement that doesn't require a relocation.
02683   if (!RelocOp) {
02684     FinalSize += sizeConstant(4);
02685     return FinalSize;
02686   }
02687   
02688   // Otherwise, this is something that requires a relocation.
02689   if (RelocOp->isGlobal()) {
02690     FinalSize += sizeGlobalAddress(false);
02691   } else if (RelocOp->isCPI()) {
02692     FinalSize += sizeConstPoolAddress(false);
02693   } else if (RelocOp->isJTI()) {
02694     FinalSize += sizeJumpTableAddress(false);
02695   } else {
02696     assert(0 && "Unknown value to relocate!");
02697   }
02698   return FinalSize;
02699 }
02700 
02701 static unsigned getMemModRMByteSize(const MachineInstr &MI, unsigned Op,
02702                                     bool IsPIC, bool Is64BitMode) {
02703   const MachineOperand &Op3 = MI.getOperand(Op+3);
02704   int DispVal = 0;
02705   const MachineOperand *DispForReloc = 0;
02706   unsigned FinalSize = 0;
02707   
02708   // Figure out what sort of displacement we have to handle here.
02709   if (Op3.isGlobal()) {
02710     DispForReloc = &Op3;
02711   } else if (Op3.isCPI()) {
02712     if (Is64BitMode || IsPIC) {
02713       DispForReloc = &Op3;
02714     } else {
02715       DispVal = 1;
02716     }
02717   } else if (Op3.isJTI()) {
02718     if (Is64BitMode || IsPIC) {
02719       DispForReloc = &Op3;
02720     } else {
02721       DispVal = 1; 
02722     }
02723   } else {
02724     DispVal = 1;
02725   }
02726 
02727   const MachineOperand &Base     = MI.getOperand(Op);
02728   const MachineOperand &IndexReg = MI.getOperand(Op+2);
02729 
02730   unsigned BaseReg = Base.getReg();
02731 
02732   // Is a SIB byte needed?
02733   if (IndexReg.getReg() == 0 &&
02734       (BaseReg == 0 || X86RegisterInfo::getX86RegNum(BaseReg) != N86::ESP)) {
02735     if (BaseReg == 0) {  // Just a displacement?
02736       // Emit special case [disp32] encoding
02737       ++FinalSize; 
02738       FinalSize += getDisplacementFieldSize(DispForReloc);
02739     } else {
02740       unsigned BaseRegNo = X86RegisterInfo::getX86RegNum(BaseReg);
02741       if (!DispForReloc && DispVal == 0 && BaseRegNo != N86::EBP) {
02742         // Emit simple indirect register encoding... [EAX] f.e.
02743         ++FinalSize;
02744       // Be pessimistic and assume it's a disp32, not a disp8
02745       } else {
02746         // Emit the most general non-SIB encoding: [REG+disp32]
02747         ++FinalSize;
02748         FinalSize += getDisplacementFieldSize(DispForReloc);
02749       }
02750     }
02751 
02752   } else {  // We need a SIB byte, so start by outputting the ModR/M byte first
02753     assert(IndexReg.getReg() != X86::ESP &&
02754            IndexReg.getReg() != X86::RSP && "Cannot use ESP as index reg!");
02755 
02756     bool ForceDisp32 = false;
02757     if (BaseReg == 0 || DispForReloc) {
02758       // Emit the normal disp32 encoding.
02759       ++FinalSize;
02760       ForceDisp32 = true;
02761     } else {
02762       ++FinalSize;
02763     }
02764 
02765     FinalSize += sizeSIBByte();
02766 
02767     // Do we need to output a displacement?
02768     if (DispVal != 0 || ForceDisp32) {
02769       FinalSize += getDisplacementFieldSize(DispForReloc);
02770     }
02771   }
02772   return FinalSize;
02773 }
02774 
02775 
02776 static unsigned GetInstSizeWithDesc(const MachineInstr &MI,
02777                                     const TargetInstrDesc *Desc,
02778                                     bool IsPIC, bool Is64BitMode) {
02779   
02780   unsigned Opcode = Desc->Opcode;
02781   unsigned FinalSize = 0;
02782 
02783   // Emit the lock opcode prefix as needed.
02784   if (Desc->TSFlags & X86II::LOCK) ++FinalSize;
02785 
02786   // Emit segment overrid opcode prefix as needed.
02787   switch (Desc->TSFlags & X86II::SegOvrMask) {
02788   case X86II::FS:
02789   case X86II::GS:
02790    ++FinalSize;
02791    break;
02792   default: assert(0 && "Invalid segment!");
02793   case 0: break;  // No segment override!
02794   }
02795 
02796   // Emit the repeat opcode prefix as needed.
02797   if ((Desc->TSFlags & X86II::Op0Mask) == X86II::REP) ++FinalSize;
02798 
02799   // Emit the operand size opcode prefix as needed.
02800   if (Desc->TSFlags & X86II::OpSize) ++FinalSize;
02801 
02802   // Emit the address size opcode prefix as needed.
02803   if (Desc->TSFlags & X86II::AdSize) ++FinalSize;
02804 
02805   bool Need0FPrefix = false;
02806   switch (Desc->TSFlags & X86II::Op0Mask) {
02807   case X86II::TB:  // Two-byte opcode prefix
02808   case X86II::T8:  // 0F 38
02809   case X86II::TA:  // 0F 3A
02810     Need0FPrefix = true;
02811     break;
02812   case X86II::REP: break; // already handled.
02813   case X86II::XS:   // F3 0F
02814     ++FinalSize;
02815     Need0FPrefix = true;
02816     break;
02817   case X86II::XD:   // F2 0F
02818     ++FinalSize;
02819     Need0FPrefix = true;
02820     break;
02821   case X86II::D8: case X86II::D9: case X86II::DA: case X86II::DB:
02822   case X86II::DC: case X86II::DD: case X86II::DE: case X86II::DF:
02823     ++FinalSize;
02824     break; // Two-byte opcode prefix
02825   default: assert(0 && "Invalid prefix!");
02826   case 0: break;  // No prefix!
02827   }
02828 
02829   if (Is64BitMode) {
02830     // REX prefix
02831     unsigned REX = X86InstrInfo::determineREX(MI);
02832     if (REX)
02833       ++FinalSize;
02834   }
02835 
02836   // 0x0F escape code must be emitted just before the opcode.
02837   if (Need0FPrefix)
02838     ++FinalSize;
02839 
02840   switch (Desc->TSFlags & X86II::Op0Mask) {
02841   case X86II::T8:  // 0F 38
02842     ++FinalSize;
02843     break;
02844   case X86II::TA:    // 0F 3A
02845     ++FinalSize;
02846     break;
02847   }
02848 
02849   // If this is a two-address instruction, skip one of the register operands.
02850   unsigned NumOps = Desc->getNumOperands();
02851   unsigned CurOp = 0;
02852   if (NumOps > 1 && Desc->getOperandConstraint(1, TOI::TIED_TO) != -1)
02853     CurOp++;
02854 
02855   switch (Desc->TSFlags & X86II::FormMask) {
02856   default: assert(0 && "Unknown FormMask value in X86 MachineCodeEmitter!");
02857   case X86II::Pseudo:
02858     // Remember the current PC offset, this is the PIC relocation
02859     // base address.
02860     switch (Opcode) {
02861     default: 
02862       break;
02863     case TargetInstrInfo::INLINEASM: {
02864       const MachineFunction *MF = MI.getParent()->getParent();
02865       const char *AsmStr = MI.getOperand(0).getSymbolName();
02866       const TargetAsmInfo* AI = MF->getTarget().getTargetAsmInfo();
02867       FinalSize += AI->getInlineAsmLength(AsmStr);
02868       break;
02869     }
02870     case TargetInstrInfo::DBG_LABEL:
02871     case TargetInstrInfo::EH_LABEL:
02872       break;
02873     case TargetInstrInfo::IMPLICIT_DEF:
02874     case TargetInstrInfo::DECLARE:
02875     case X86::DWARF_LOC:
02876     case X86::FP_REG_KILL:
02877       break;
02878     case X86::MOVPC32r: {
02879       // This emits the "call" portion of this pseudo instruction.
02880       ++FinalSize;
02881       FinalSize += sizeConstant(X86InstrInfo::sizeOfImm(Desc));
02882       break;
02883     }
02884     case X86::TLS_tp:
02885     case X86::TLS_gs_ri:
02886       FinalSize += 2;
02887       FinalSize += sizeGlobalAddress(false);
02888       break;
02889     }
02890     CurOp = NumOps;
02891     break;
02892   case X86II::RawFrm:
02893     ++FinalSize;
02894 
02895     if (CurOp != NumOps) {
02896       const MachineOperand &MO = MI.getOperand(CurOp++);
02897       if (MO.isMBB()) {
02898         FinalSize += sizePCRelativeBlockAddress();
02899       } else if (MO.isGlobal()) {
02900         FinalSize += sizeGlobalAddress(false);
02901       } else if (MO.isSymbol()) {
02902         FinalSize += sizeExternalSymbolAddress(false);
02903       } else if (MO.isImm()) {
02904         FinalSize += sizeConstant(X86InstrInfo::sizeOfImm(Desc));
02905       } else {
02906         assert(0 && "Unknown RawFrm operand!");
02907       }
02908     }
02909     break;
02910 
02911   case X86II::AddRegFrm:
02912     ++FinalSize;
02913     ++CurOp;
02914     
02915     if (CurOp != NumOps) {
02916       const MachineOperand &MO1 = MI.getOperand(CurOp++);
02917       unsigned Size = X86InstrInfo::sizeOfImm(Desc);
02918       if (MO1.isImm())
02919         FinalSize += sizeConstant(Size);
02920       else {
02921         bool dword = false;
02922         if (Opcode == X86::MOV64ri)
02923           dword = true; 
02924         if (MO1.isGlobal()) {
02925           FinalSize += sizeGlobalAddress(dword);
02926         } else if (MO1.isSymbol())
02927           FinalSize += sizeExternalSymbolAddress(dword);
02928         else if (MO1.isCPI())
02929           FinalSize += sizeConstPoolAddress(dword);
02930         else if (MO1.isJTI())
02931           FinalSize += sizeJumpTableAddress(dword);
02932       }
02933     }
02934     break;
02935 
02936   case X86II::MRMDestReg: {
02937     ++FinalSize; 
02938     FinalSize += sizeRegModRMByte();
02939     CurOp += 2;
02940     if (CurOp != NumOps) {
02941       ++CurOp;
02942       FinalSize += sizeConstant(X86InstrInfo::sizeOfImm(Desc));
02943     }
02944     break;
02945   }
02946   case X86II::MRMDestMem: {
02947     ++FinalSize;
02948     FinalSize += getMemModRMByteSize(MI, CurOp, IsPIC, Is64BitMode);
02949     CurOp += 5;
02950     if (CurOp != NumOps) {
02951       ++CurOp;
02952       FinalSize += sizeConstant(X86InstrInfo::sizeOfImm(Desc));
02953     }
02954     break;
02955   }
02956 
02957   case X86II::MRMSrcReg:
02958     ++FinalSize;
02959     FinalSize += sizeRegModRMByte();
02960     CurOp += 2;
02961     if (CurOp != NumOps) {
02962       ++CurOp;
02963       FinalSize += sizeConstant(X86InstrInfo::sizeOfImm(Desc));
02964     }
02965     break;
02966 
02967   case X86II::MRMSrcMem: {
02968 
02969     ++FinalSize;
02970     FinalSize += getMemModRMByteSize(MI, CurOp+1, IsPIC, Is64BitMode);
02971     CurOp += 5;
02972     if (CurOp != NumOps) {
02973       ++CurOp;
02974       FinalSize += sizeConstant(X86InstrInfo::sizeOfImm(Desc));
02975     }
02976     break;
02977   }
02978 
02979   case X86II::MRM0r: case X86II::MRM1r:
02980   case X86II::MRM2r: case X86II::MRM3r:
02981   case X86II::MRM4r: case X86II::MRM5r:
02982   case X86II::MRM6r: case X86II::MRM7r:
02983     ++FinalSize;
02984     ++CurOp;
02985     FinalSize += sizeRegModRMByte();
02986 
02987     if (CurOp != NumOps) {
02988       const MachineOperand &MO1 = MI.getOperand(CurOp++);
02989       unsigned Size = X86InstrInfo::sizeOfImm(Desc);
02990       if (MO1.isImm())
02991         FinalSize += sizeConstant(Size);
02992       else {
02993         bool dword = false;
02994         if (Opcode == X86::MOV64ri32)
02995           dword = true;
02996         if (MO1.isGlobal()) {
02997           FinalSize += sizeGlobalAddress(dword);
02998         } else if (MO1.isSymbol())
02999           FinalSize += sizeExternalSymbolAddress(dword);
03000         else if (MO1.isCPI())
03001           FinalSize += sizeConstPoolAddress(dword);
03002         else if (MO1.isJTI())
03003           FinalSize += sizeJumpTableAddress(dword);
03004       }
03005     }
03006     break;
03007 
03008   case X86II::MRM0m: case X86II::MRM1m:
03009   case X86II::MRM2m: case X86II::MRM3m:
03010   case X86II::MRM4m: case X86II::MRM5m:
03011   case X86II::MRM6m: case X86II::MRM7m: {
03012     
03013     ++FinalSize;
03014     FinalSize += getMemModRMByteSize(MI, CurOp, IsPIC, Is64BitMode);
03015     CurOp += 4;
03016 
03017     if (CurOp != NumOps) {
03018       const MachineOperand &MO = MI.getOperand(CurOp++);
03019       unsigned Size = X86InstrInfo::sizeOfImm(Desc);
03020       if (MO.isImm())
03021         FinalSize += sizeConstant(Size);
03022       else {
03023         bool dword = false;
03024         if (Opcode == X86::MOV64mi32)
03025           dword = true;
03026         if (MO.isGlobal()) {
03027           FinalSize += sizeGlobalAddress(dword);
03028         } else if (MO.isSymbol())
03029           FinalSize += sizeExternalSymbolAddress(dword);
03030         else if (MO.isCPI())
03031           FinalSize += sizeConstPoolAddress(dword);
03032         else if (MO.isJTI())
03033           FinalSize += sizeJumpTableAddress(dword);
03034       }
03035     }
03036     break;
03037   }
03038 
03039   case X86II::MRMInitReg:
03040     ++FinalSize;
03041     // Duplicate register, used by things like MOV8r0 (aka xor reg,reg).
03042     FinalSize += sizeRegModRMByte();
03043     ++CurOp;
03044     break;
03045   }
03046 
03047   if (!Desc->isVariadic() && CurOp != NumOps) {
03048     cerr << "Cannot determine size: ";
03049     MI.dump();
03050     cerr << '\n';
03051     abort();
03052   }
03053   
03054 
03055   return FinalSize;
03056 }
03057 
03058 
03059 unsigned X86InstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
03060   const TargetInstrDesc &Desc = MI->getDesc();
03061   bool IsPIC = (TM.getRelocationModel() == Reloc::PIC_);
03062   bool Is64BitMode = TM.getSubtargetImpl()->is64Bit();
03063   unsigned Size = GetInstSizeWithDesc(*MI, &Desc, IsPIC, Is64BitMode);
03064   if (Desc.getOpcode() == X86::MOVPC32r) {
03065     Size += GetInstSizeWithDesc(*MI, &get(X86::POP32r), IsPIC, Is64BitMode);
03066   }
03067   return Size;
03068 }
03069 
03070 /// getGlobalBaseReg - Return a virtual register initialized with the
03071 /// the global base register value. Output instructions required to
03072 /// initialize the register in the function entry block, if necessary.
03073 ///
03074 unsigned X86InstrInfo::getGlobalBaseReg(MachineFunction *MF) const {
03075   assert(!TM.getSubtarget<X86Subtarget>().is64Bit() &&
03076          "X86-64 PIC uses RIP relative addressing");
03077 
03078   X86MachineFunctionInfo *X86FI = MF->getInfo<X86MachineFunctionInfo>();
03079   unsigned GlobalBaseReg = X86FI->getGlobalBaseReg();
03080   if (GlobalBaseReg != 0)
03081     return GlobalBaseReg;
03082 
03083   // Insert the set of GlobalBaseReg into the first MBB of the function
03084   MachineBasicBlock &FirstMBB = MF->front();
03085   MachineBasicBlock::iterator MBBI = FirstMBB.begin();
03086   MachineRegisterInfo &RegInfo = MF->getRegInfo();
03087   unsigned PC = RegInfo.createVirtualRegister(X86::GR32RegisterClass);
03088   
03089   const TargetInstrInfo *TII = TM.getInstrInfo();
03090   // Operand of MovePCtoStack is completely ignored by asm printer. It's
03091   // only used in JIT code emission as displacement to pc.
03092   BuildMI(FirstMBB, MBBI, TII->get(X86::MOVPC32r), PC).addImm(0);
03093   
03094   // If we're using vanilla 'GOT' PIC style, we should use relative addressing
03095   // not to pc, but to _GLOBAL_ADDRESS_TABLE_ external
03096   if (TM.getRelocationModel() == Reloc::PIC_ &&
03097       TM.getSubtarget<X86Subtarget>().isPICStyleGOT()) {
03098     GlobalBaseReg =
03099       RegInfo.createVirtualRegister(X86::GR32RegisterClass);
03100     BuildMI(FirstMBB, MBBI, TII->get(X86::ADD32ri), GlobalBaseReg)
03101       .addReg(PC).addExternalSymbol("_GLOBAL_OFFSET_TABLE_");
03102   } else {
03103     GlobalBaseReg = PC;
03104   }
03105 
03106   X86FI->setGlobalBaseReg(GlobalBaseReg);
03107   return GlobalBaseReg;
03108 }