LLVM API Documentation
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 }