FastISel.cpp revision 474d3b3f40e117a66946e9fb9d2016b4c05caef0
1b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman///===-- FastISel.cpp - Implementation of the FastISel class --------------===// 2b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// 3b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// The LLVM Compiler Infrastructure 4b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// 5b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// This file is distributed under the University of Illinois Open Source 6b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// License. See LICENSE.TXT for details. 7b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// 8b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//===----------------------------------------------------------------------===// 9b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// 10b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// This file contains the implementation of the FastISel class. 11b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// 125ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// "Fast" instruction selection is designed to emit very poor code quickly. 135ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// Also, it is not designed to be able to do much lowering, so most illegal 1444d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// types (e.g. i64 on 32-bit targets) and operations are not supported. It is 1544d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// also not intended to be able to do much optimization, except in a few cases 1644d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// where doing optimizations reduces overall compile time. For example, folding 1744d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// constants into immediate fields is often done, because it's cheap and it 1844d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// reduces the number of instructions later phases have to examine. 195ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// 205ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// "Fast" instruction selection is able to fail gracefully and transfer 215ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// control to the SelectionDAG selector for operations that it doesn't 2244d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// support. In many cases, this allows us to avoid duplicating a lot of 235ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// the complicated lowering logic that SelectionDAG currently has. 245ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// 255ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// The intended use for "fast" instruction selection is "-O0" mode 265ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// compilation, where the quality of the generated code is irrelevant when 2744d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// weighed against the speed at which the code can be generated. Also, 285ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// at -O0, the LLVM optimizers are not running, and this makes the 295ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// compile time of codegen a much higher portion of the overall compile 3044d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// time. Despite its limitations, "fast" instruction selection is able to 315ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// handle enough code on its own to provide noticeable overall speedups 325ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// in -O0 compiles. 335ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// 345ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// Basic operations are supported in a target-independent way, by reading 355ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// the same instruction descriptions that the SelectionDAG selector reads, 365ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// and identifying simple arithmetic operations that can be directly selected 3744d2a983b76a2a923e34f3162c960443425cb296Chris Lattner// from simple operators. More complicated operations currently require 385ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// target-specific code. 395ec9efd61bc4214c787287409498e8b78f28c922Dan Gohman// 40b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//===----------------------------------------------------------------------===// 41b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 4233134c4a75558288d663267c8991f6bd37a530afDan Gohman#include "llvm/Function.h" 4333134c4a75558288d663267c8991f6bd37a530afDan Gohman#include "llvm/GlobalVariable.h" 446f2766d59744bb3d48867f3151643eac7111e773Dan Gohman#include "llvm/Instructions.h" 4533134c4a75558288d663267c8991f6bd37a530afDan Gohman#include "llvm/IntrinsicInst.h" 46b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/CodeGen/FastISel.h" 47b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/CodeGen/MachineInstrBuilder.h" 4833134c4a75558288d663267c8991f6bd37a530afDan Gohman#include "llvm/CodeGen/MachineModuleInfo.h" 49b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/CodeGen/MachineRegisterInfo.h" 5083489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel#include "llvm/CodeGen/DwarfWriter.h" 5183489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel#include "llvm/Analysis/DebugInfo.h" 5283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng#include "llvm/Target/TargetData.h" 53b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/Target/TargetInstrInfo.h" 5483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng#include "llvm/Target/TargetLowering.h" 55bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman#include "llvm/Target/TargetMachine.h" 56dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#include "SelectionDAGBuild.h" 57b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanusing namespace llvm; 58b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 593df24e667f04a7003342b534310919abc9c87418Dan Gohmanunsigned FastISel::getRegForValue(Value *V) { 60ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman MVT::SimpleValueType VT = TLI.getValueType(V->getType()).getSimpleVT(); 61821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman 62c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // Ignore illegal types. We must do this before looking up the value 63c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // in ValueMap because Arguments are given virtual registers regardless 64c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // of whether FastISel can handle them. 65821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman if (!TLI.isTypeLegal(VT)) { 66821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman // Promote MVT::i1 to a legal type though, because it's common and easy. 67821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman if (VT == MVT::i1) 68821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman VT = TLI.getTypeToTransformTo(VT).getSimpleVT(); 69821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman else 70821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman return 0; 71821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman } 72821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman 73c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // Look up the value to see if we already have a register for it. We 74c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // cache values defined by Instructions across blocks, and other values 75c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // only locally. This is because Instructions already have the SSA 76c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // def-dominatess-use requirement enforced. 77c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman if (ValueMap.count(V)) 78c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman return ValueMap[V]; 79c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman unsigned Reg = LocalValueMap[V]; 80c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman if (Reg != 0) 81c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman return Reg; 82c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman 83ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) { 842ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman if (CI->getValue().getActiveBits() <= 64) 852ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman Reg = FastEmit_i(VT, VT, ISD::Constant, CI->getZExtValue()); 860586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman } else if (isa<AllocaInst>(V)) { 872ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman Reg = TargetMaterializeAlloca(cast<AllocaInst>(V)); 88205d92589bc8c59d4bba9ddf89e0eb3c4d548cdaDan Gohman } else if (isa<ConstantPointerNull>(V)) { 891e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman // Translate this as an integer zero so that it can be 901e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman // local-CSE'd with actual integer zeros. 911e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman Reg = getRegForValue(Constant::getNullValue(TD.getIntPtrType())); 92ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } else if (ConstantFP *CF = dyn_cast<ConstantFP>(V)) { 93104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman Reg = FastEmit_f(VT, VT, ISD::ConstantFP, CF); 94ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 95ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (!Reg) { 96ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman const APFloat &Flt = CF->getValueAPF(); 97ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman MVT IntVT = TLI.getPointerTy(); 98ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 99ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman uint64_t x[2]; 100ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman uint32_t IntBitWidth = IntVT.getSizeInBits(); 10123a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen bool isExact; 10223a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen (void) Flt.convertToInteger(x, IntBitWidth, /*isSigned=*/true, 10323a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen APFloat::rmTowardZero, &isExact); 10423a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen if (isExact) { 1052ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman APInt IntVal(IntBitWidth, 2, x); 106ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 1071e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman unsigned IntegerReg = getRegForValue(ConstantInt::get(IntVal)); 1082ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman if (IntegerReg != 0) 1092ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman Reg = FastEmit_r(IntVT.getSimpleVT(), VT, ISD::SINT_TO_FP, IntegerReg); 1102ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman } 111ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 11240b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { 11340b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman if (!SelectOperator(CE, CE->getOpcode())) return 0; 11440b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman Reg = LocalValueMap[CE]; 115205d92589bc8c59d4bba9ddf89e0eb3c4d548cdaDan Gohman } else if (isa<UndefValue>(V)) { 116104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman Reg = createResultReg(TLI.getRegClassFor(VT)); 1179bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, TII.get(TargetInstrInfo::IMPLICIT_DEF), Reg); 118ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 119d5d81a457b5ff758b3fcc527af38827490bc68a5Owen Anderson 120dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman // If target-independent code couldn't handle the value, give target-specific 121dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman // code a try. 1226e6074508c2f781c3e52dfe0e301cb1c7f395a91Owen Anderson if (!Reg && isa<Constant>(V)) 1232ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman Reg = TargetMaterializeConstant(cast<Constant>(V)); 1246e6074508c2f781c3e52dfe0e301cb1c7f395a91Owen Anderson 1252ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman // Don't cache constant materializations in the general ValueMap. 1262ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman // To do so would require tracking what uses they dominate. 127dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman if (Reg != 0) 128dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman LocalValueMap[V] = Reg; 129104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman return Reg; 130ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman} 131ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 13259fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Chengunsigned FastISel::lookUpRegForValue(Value *V) { 13359fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng // Look up the value to see if we already have a register for it. We 13459fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng // cache values defined by Instructions across blocks, and other values 13559fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng // only locally. This is because Instructions already have the SSA 13659fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng // def-dominatess-use requirement enforced. 13759fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng if (ValueMap.count(V)) 13859fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng return ValueMap[V]; 13959fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng return LocalValueMap[V]; 14059fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng} 14159fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng 142cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// UpdateValueMap - Update the value map to include the new mapping for this 143cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// instruction, or insert an extra copy to get the result in a previous 144cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// determined register. 145cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// NOTE: This is only necessary because we might select a block that uses 146cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// a value before we select the block that defines the value. It might be 147cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// possible to fix this by selecting blocks in reverse postorder. 14895267a1e671efc3c14e916b6978bbb15973b4cdcOwen Andersonvoid FastISel::UpdateValueMap(Value* I, unsigned Reg) { 14940b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman if (!isa<Instruction>(I)) { 15040b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman LocalValueMap[I] = Reg; 15140b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman return; 15240b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman } 153cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson if (!ValueMap.count(I)) 154cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson ValueMap[I] = Reg; 155cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson else 156f09917847bb082829feba34d1818eb97764839d9Evan Cheng TII.copyRegToReg(*MBB, MBB->end(), ValueMap[I], 157f09917847bb082829feba34d1818eb97764839d9Evan Cheng Reg, MRI.getRegClass(Reg), MRI.getRegClass(Reg)); 158cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson} 159cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson 160c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohmanunsigned FastISel::getRegForGEPIndex(Value *Idx) { 161c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman unsigned IdxN = getRegForValue(Idx); 162c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman if (IdxN == 0) 163c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // Unhandled operand. Halt "fast" selection and bail. 164c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman return 0; 165c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman 166c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // If the index is smaller or larger than intptr_t, truncate or extend it. 167c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman MVT PtrVT = TLI.getPointerTy(); 168c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman MVT IdxVT = MVT::getMVT(Idx->getType(), /*HandleUnknown=*/false); 169c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman if (IdxVT.bitsLT(PtrVT)) 170c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman IdxN = FastEmit_r(IdxVT.getSimpleVT(), PtrVT.getSimpleVT(), 171c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman ISD::SIGN_EXTEND, IdxN); 172c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman else if (IdxVT.bitsGT(PtrVT)) 173c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman IdxN = FastEmit_r(IdxVT.getSimpleVT(), PtrVT.getSimpleVT(), 174c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman ISD::TRUNCATE, IdxN); 175c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman return IdxN; 176c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman} 177c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman 178bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman/// SelectBinaryOp - Select and emit code for a binary operator instruction, 179bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman/// which has an opcode which directly corresponds to the given ISD opcode. 180bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman/// 18140b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool FastISel::SelectBinaryOp(User *I, ISD::NodeType ISDOpcode) { 182d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman MVT VT = MVT::getMVT(I->getType(), /*HandleUnknown=*/true); 183d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (VT == MVT::Other || !VT.isSimple()) 184d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // Unhandled type. Halt "fast" selection and bail. 185d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return false; 186638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman 187b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman // We only handle legal types. For example, on x86-32 the instruction 188b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman // selector contains all of the 64-bit instructions from x86-64, 189b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman // under the assumption that i64 won't be used if the target doesn't 190b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman // support it. 191638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman if (!TLI.isTypeLegal(VT)) { 1925dd9c2e9aea7294c184609aff7f2fe82eaea4eb0Dan Gohman // MVT::i1 is special. Allow AND, OR, or XOR because they 193638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman // don't require additional zeroing, which makes them easy. 194638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman if (VT == MVT::i1 && 1955dd9c2e9aea7294c184609aff7f2fe82eaea4eb0Dan Gohman (ISDOpcode == ISD::AND || ISDOpcode == ISD::OR || 1965dd9c2e9aea7294c184609aff7f2fe82eaea4eb0Dan Gohman ISDOpcode == ISD::XOR)) 197638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman VT = TLI.getTypeToTransformTo(VT); 198638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman else 199638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman return false; 200638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman } 201d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 2023df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned Op0 = getRegForValue(I->getOperand(0)); 203d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (Op0 == 0) 204a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman // Unhandled operand. Halt "fast" selection and bail. 205a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman return false; 206a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman 207d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // Check if the second operand is a constant and handle it appropriately. 208d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) { 209ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman unsigned ResultReg = FastEmit_ri(VT.getSimpleVT(), VT.getSimpleVT(), 210ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ISDOpcode, Op0, CI->getZExtValue()); 211ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (ResultReg != 0) { 212ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // We successfully emitted code for the given LLVM Instruction. 2133df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, ResultReg); 214ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman return true; 215ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 216d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman } 217d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 21810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman // Check if the second operand is a constant float. 21910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman if (ConstantFP *CF = dyn_cast<ConstantFP>(I->getOperand(1))) { 220ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman unsigned ResultReg = FastEmit_rf(VT.getSimpleVT(), VT.getSimpleVT(), 221ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ISDOpcode, Op0, CF); 222ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (ResultReg != 0) { 223ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // We successfully emitted code for the given LLVM Instruction. 2243df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, ResultReg); 225ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman return true; 226ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 22710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman } 22810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 2293df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned Op1 = getRegForValue(I->getOperand(1)); 230d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (Op1 == 0) 231d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // Unhandled operand. Halt "fast" selection and bail. 232bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman return false; 233bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 234ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // Now we have both operands in registers. Emit the instruction. 2350f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson unsigned ResultReg = FastEmit_rr(VT.getSimpleVT(), VT.getSimpleVT(), 2360f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISDOpcode, Op0, Op1); 237bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (ResultReg == 0) 238bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman // Target-specific code wasn't able to find a machine opcode for 239bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman // the given ISD opcode and type. Halt "fast" selection and bail. 240bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman return false; 241bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 2428014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman // We successfully emitted code for the given LLVM Instruction. 2433df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, ResultReg); 244bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman return true; 245bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman} 246bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 24740b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool FastISel::SelectGetElementPtr(User *I) { 2483df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned N = getRegForValue(I->getOperand(0)); 24983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 25083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 25183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 25283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 25383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng const Type *Ty = I->getOperand(0)->getType(); 2547a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman MVT::SimpleValueType VT = TLI.getPointerTy().getSimpleVT(); 25583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng for (GetElementPtrInst::op_iterator OI = I->op_begin()+1, E = I->op_end(); 25683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng OI != E; ++OI) { 25783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng Value *Idx = *OI; 25883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (const StructType *StTy = dyn_cast<StructType>(Ty)) { 25983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng unsigned Field = cast<ConstantInt>(Idx)->getZExtValue(); 26083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (Field) { 26183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // N = N + Offset 26283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng uint64_t Offs = TD.getStructLayout(StTy)->getElementOffset(Field); 26383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // FIXME: This can be optimized by combining the add with a 26483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // subsequent one. 2657a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT); 26683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 26783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 26883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 26983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 27083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng Ty = StTy->getElementType(Field); 27183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } else { 27283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng Ty = cast<SequentialType>(Ty)->getElementType(); 27383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 27483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // If this is a constant subscript, handle it quickly. 27583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (ConstantInt *CI = dyn_cast<ConstantInt>(Idx)) { 27683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (CI->getZExtValue() == 0) continue; 27783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng uint64_t Offs = 278ceb4d1aecb9deffe59b3dcdc9a783ffde8477be9Duncan Sands TD.getTypePaddedSize(Ty)*cast<ConstantInt>(CI)->getSExtValue(); 2797a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT); 28083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 28183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 28283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 28383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng continue; 28483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 28583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 28683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // N = N + Idx * ElementSize; 287ceb4d1aecb9deffe59b3dcdc9a783ffde8477be9Duncan Sands uint64_t ElementSize = TD.getTypePaddedSize(Ty); 288c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman unsigned IdxN = getRegForGEPIndex(Idx); 28983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (IdxN == 0) 29083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 29183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 29283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 29380bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman if (ElementSize != 1) { 294f93cf79505f07cb97597fbc5955462ad7670ca5cDan Gohman IdxN = FastEmit_ri_(VT, ISD::MUL, IdxN, ElementSize, VT); 29580bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman if (IdxN == 0) 29680bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman // Unhandled operand. Halt "fast" selection and bail. 29780bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman return false; 29880bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman } 2990f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson N = FastEmit_rr(VT, VT, ISD::ADD, N, IdxN); 30083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 30183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 30283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 30383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 30483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 30583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 30683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // We successfully emitted code for the given LLVM Instruction. 3073df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, N); 30883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return true; 309bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman} 310bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 31133134c4a75558288d663267c8991f6bd37a530afDan Gohmanbool FastISel::SelectCall(User *I) { 31233134c4a75558288d663267c8991f6bd37a530afDan Gohman Function *F = cast<CallInst>(I)->getCalledFunction(); 31333134c4a75558288d663267c8991f6bd37a530afDan Gohman if (!F) return false; 31433134c4a75558288d663267c8991f6bd37a530afDan Gohman 31533134c4a75558288d663267c8991f6bd37a530afDan Gohman unsigned IID = F->getIntrinsicID(); 31633134c4a75558288d663267c8991f6bd37a530afDan Gohman switch (IID) { 31733134c4a75558288d663267c8991f6bd37a530afDan Gohman default: break; 31833134c4a75558288d663267c8991f6bd37a530afDan Gohman case Intrinsic::dbg_stoppoint: { 31933134c4a75558288d663267c8991f6bd37a530afDan Gohman DbgStopPointInst *SPI = cast<DbgStopPointInst>(I); 320b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel if (DW && DW->ValidDebugInfo(SPI->getContext())) { 32183489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DICompileUnit CU(cast<GlobalVariable>(SPI->getContext())); 3220582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling std::string Dir, FN; 3230582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir), 3240582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling CU.getFilename(FN)); 32533134c4a75558288d663267c8991f6bd37a530afDan Gohman unsigned Line = SPI->getLine(); 32633134c4a75558288d663267c8991f6bd37a530afDan Gohman unsigned Col = SPI->getColumn(); 32792c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling unsigned ID = DW->RecordSourceLine(Line, Col, SrcFile); 3289bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned Idx = MF.getOrCreateDebugLocID(SrcFile, Line, Col); 3299bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling setCurDebugLoc(DebugLoc::get(Idx)); 33092c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); 33192c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling BuildMI(MBB, DL, II).addImm(ID); 33233134c4a75558288d663267c8991f6bd37a530afDan Gohman } 33333134c4a75558288d663267c8991f6bd37a530afDan Gohman return true; 33433134c4a75558288d663267c8991f6bd37a530afDan Gohman } 33533134c4a75558288d663267c8991f6bd37a530afDan Gohman case Intrinsic::dbg_region_start: { 33633134c4a75558288d663267c8991f6bd37a530afDan Gohman DbgRegionStartInst *RSI = cast<DbgRegionStartInst>(I); 33792c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (DW && DW->ValidDebugInfo(RSI->getContext())) { 33892c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling unsigned ID = 33992c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling DW->RecordRegionStart(cast<GlobalVariable>(RSI->getContext())); 34092c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); 34192c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling BuildMI(MBB, DL, II).addImm(ID); 34292c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling } 34333134c4a75558288d663267c8991f6bd37a530afDan Gohman return true; 34433134c4a75558288d663267c8991f6bd37a530afDan Gohman } 34533134c4a75558288d663267c8991f6bd37a530afDan Gohman case Intrinsic::dbg_region_end: { 34633134c4a75558288d663267c8991f6bd37a530afDan Gohman DbgRegionEndInst *REI = cast<DbgRegionEndInst>(I); 34792c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (DW && DW->ValidDebugInfo(REI->getContext())) { 34892c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling unsigned ID = 34992c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling DW->RecordRegionEnd(cast<GlobalVariable>(REI->getContext())); 35092c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); 35192c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling BuildMI(MBB, DL, II).addImm(ID); 35292c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling } 35333134c4a75558288d663267c8991f6bd37a530afDan Gohman return true; 35433134c4a75558288d663267c8991f6bd37a530afDan Gohman } 35533134c4a75558288d663267c8991f6bd37a530afDan Gohman case Intrinsic::dbg_func_start: { 35683489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel if (!DW) return true; 35733134c4a75558288d663267c8991f6bd37a530afDan Gohman DbgFuncStartInst *FSI = cast<DbgFuncStartInst>(I); 35833134c4a75558288d663267c8991f6bd37a530afDan Gohman Value *SP = FSI->getSubprogram(); 3599bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling 360b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel if (DW->ValidDebugInfo(SP)) { 3619bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling // llvm.dbg.func.start implicitly defines a dbg_stoppoint which is what 3629bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling // (most?) gdb expects. 36383489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DISubprogram Subprogram(cast<GlobalVariable>(SP)); 36483489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DICompileUnit CompileUnit = Subprogram.getCompileUnit(); 3650582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling std::string Dir, FN; 3660582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir), 3670582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling CompileUnit.getFilename(FN)); 3689bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling 369e75808cf3d92d14c5659a15d0d17bd21a54fd8ccDevang Patel // Record the source line but does not create a label for the normal 370e75808cf3d92d14c5659a15d0d17bd21a54fd8ccDevang Patel // function start. It will be emitted at asm emission time. However, 371e75808cf3d92d14c5659a15d0d17bd21a54fd8ccDevang Patel // create a label if this is a beginning of inlined function. 3729bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned Line = Subprogram.getLineNumber(); 37392c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile); 3749bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0))); 37592c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling 37692c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (DW->getRecordSourceLineCount() != 1) { 37792c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); 37892c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling BuildMI(MBB, DL, II).addImm(LabelID); 37992c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling } 38033134c4a75558288d663267c8991f6bd37a530afDan Gohman } 3819bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling 38233134c4a75558288d663267c8991f6bd37a530afDan Gohman return true; 38333134c4a75558288d663267c8991f6bd37a530afDan Gohman } 38492c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling case Intrinsic::dbg_declare: { 38592c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling DbgDeclareInst *DI = cast<DbgDeclareInst>(I); 38692c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling Value *Variable = DI->getVariable(); 38792c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (DW && DW->ValidDebugInfo(Variable)) { 38892c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling // Determine the address of the declared object. 38992c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling Value *Address = DI->getAddress(); 39092c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (BitCastInst *BCI = dyn_cast<BitCastInst>(Address)) 39192c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling Address = BCI->getOperand(0); 39292c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling AllocaInst *AI = dyn_cast<AllocaInst>(Address); 39392c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling // Don't handle byval struct arguments or VLAs, for example. 39492c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (!AI) break; 39592c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling DenseMap<const AllocaInst*, int>::iterator SI = 39692c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling StaticAllocaMap.find(AI); 39792c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (SI == StaticAllocaMap.end()) break; // VLAs. 39892c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling int FI = SI->second; 39992c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling 40092c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling // Determine the debug globalvariable. 40192c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling GlobalValue *GV = cast<GlobalVariable>(Variable); 40292c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling 40392c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling // Build the DECLARE instruction. 40492c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling const TargetInstrDesc &II = TII.get(TargetInstrInfo::DECLARE); 40592c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling BuildMI(MBB, DL, II).addFrameIndex(FI).addGlobalAddress(GV); 40692c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling } 40733134c4a75558288d663267c8991f6bd37a530afDan Gohman return true; 40892c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling } 409dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman case Intrinsic::eh_exception: { 410dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman MVT VT = TLI.getValueType(I->getType()); 411dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman switch (TLI.getOperationAction(ISD::EXCEPTIONADDR, VT)) { 412dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman default: break; 413dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman case TargetLowering::Expand: { 414dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman if (!MBB->isLandingPad()) { 415dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman // FIXME: Mark exception register as live in. Hack for PR1508. 416dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned Reg = TLI.getExceptionAddressRegister(); 417dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman if (Reg) MBB->addLiveIn(Reg); 418dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 419dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned Reg = TLI.getExceptionAddressRegister(); 420dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman const TargetRegisterClass *RC = TLI.getRegClassFor(VT); 421dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned ResultReg = createResultReg(RC); 422dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 423dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman Reg, RC, RC); 424dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman assert(InsertedCopy && "Can't copy address registers!"); 42524ac408ce891321d1a5d62beaf3487efce6f2b22Evan Cheng InsertedCopy = InsertedCopy; 426dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman UpdateValueMap(I, ResultReg); 427dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman return true; 428dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 429dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 430dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman break; 431dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 432dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman case Intrinsic::eh_selector_i32: 433dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman case Intrinsic::eh_selector_i64: { 434dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman MVT VT = TLI.getValueType(I->getType()); 435dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman switch (TLI.getOperationAction(ISD::EHSELECTION, VT)) { 436dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman default: break; 437dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman case TargetLowering::Expand: { 438dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman MVT VT = (IID == Intrinsic::eh_selector_i32 ? 439dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman MVT::i32 : MVT::i64); 440dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman 441dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman if (MMI) { 442dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman if (MBB->isLandingPad()) 443dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman AddCatchInfo(*cast<CallInst>(I), MMI, MBB); 444dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman else { 445dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG 446dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman CatchInfoLost.insert(cast<CallInst>(I)); 447dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif 448dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman // FIXME: Mark exception selector register as live in. Hack for PR1508. 449dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned Reg = TLI.getExceptionSelectorRegister(); 450dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman if (Reg) MBB->addLiveIn(Reg); 451dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 452dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman 453dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned Reg = TLI.getExceptionSelectorRegister(); 454dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman const TargetRegisterClass *RC = TLI.getRegClassFor(VT); 455dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned ResultReg = createResultReg(RC); 456dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 457dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman Reg, RC, RC); 458dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman assert(InsertedCopy && "Can't copy address registers!"); 45924ac408ce891321d1a5d62beaf3487efce6f2b22Evan Cheng InsertedCopy = InsertedCopy; 460dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman UpdateValueMap(I, ResultReg); 461dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } else { 462dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned ResultReg = 463dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman getRegForValue(Constant::getNullValue(I->getType())); 464dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman UpdateValueMap(I, ResultReg); 465dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 466dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman return true; 467dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 468dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 469dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman break; 470dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 47133134c4a75558288d663267c8991f6bd37a530afDan Gohman } 47233134c4a75558288d663267c8991f6bd37a530afDan Gohman return false; 47333134c4a75558288d663267c8991f6bd37a530afDan Gohman} 47433134c4a75558288d663267c8991f6bd37a530afDan Gohman 47540b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool FastISel::SelectCast(User *I, ISD::NodeType Opcode) { 4766336b70541204d1a8377ec1f33748a7260e0a31dOwen Anderson MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType()); 4776336b70541204d1a8377ec1f33748a7260e0a31dOwen Anderson MVT DstVT = TLI.getValueType(I->getType()); 478d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 479d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson if (SrcVT == MVT::Other || !SrcVT.isSimple() || 480474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman DstVT == MVT::Other || !DstVT.isSimple()) 481d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson // Unhandled type. Halt "fast" selection and bail. 482d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 483d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 484474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // Check if the destination type is legal. Or as a special case, 485474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // it may be i1 if we're doing a truncate because that's 486474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // easy and somewhat common. 487474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (!TLI.isTypeLegal(DstVT)) 488474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (DstVT != MVT::i1 || Opcode != ISD::TRUNCATE) 489474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // Unhandled type. Halt "fast" selection and bail. 490474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman return false; 491474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman 49291b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman // Check if the source operand is legal. Or as a special case, 49391b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman // it may be i1 if we're doing zero-extension because that's 494474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // easy and somewhat common. 495474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (!TLI.isTypeLegal(SrcVT)) 496474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (SrcVT != MVT::i1 || Opcode != ISD::ZERO_EXTEND) 49791b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman // Unhandled type. Halt "fast" selection and bail. 49891b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman return false; 499474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman 5003df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned InputReg = getRegForValue(I->getOperand(0)); 501d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson if (!InputReg) 502d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson // Unhandled operand. Halt "fast" selection and bail. 503d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 50414ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman 50514ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman // If the operand is i1, arrange for the high bits in the register to be zero. 506474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (SrcVT == MVT::i1) { 507474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman SrcVT = TLI.getTypeToTransformTo(SrcVT); 50814ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman InputReg = FastEmitZExtFromI1(SrcVT.getSimpleVT(), InputReg); 50914ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman if (!InputReg) 51014ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman return false; 51114ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman } 512474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // If the result is i1, truncate to the target's type for i1 first. 513474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (DstVT == MVT::i1) 514474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman DstVT = TLI.getTypeToTransformTo(DstVT); 51514ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman 516d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson unsigned ResultReg = FastEmit_r(SrcVT.getSimpleVT(), 517d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson DstVT.getSimpleVT(), 518d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson Opcode, 519d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson InputReg); 520d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson if (!ResultReg) 521d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 522d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 5233df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, ResultReg); 524d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return true; 525d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson} 526d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 52740b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool FastISel::SelectBitCast(User *I) { 528ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // If the bitcast doesn't change the type, just use the operand value. 529ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (I->getType() == I->getOperand(0)->getType()) { 5303df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned Reg = getRegForValue(I->getOperand(0)); 531a318dabc0edbcc7a2b54d99b026a093361ec14fcDan Gohman if (Reg == 0) 532a318dabc0edbcc7a2b54d99b026a093361ec14fcDan Gohman return false; 5333df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, Reg); 534ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman return true; 535ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 536ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 537ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // Bitcasts of other values become reg-reg copies or BIT_CONVERT operators. 5386336b70541204d1a8377ec1f33748a7260e0a31dOwen Anderson MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType()); 5396336b70541204d1a8377ec1f33748a7260e0a31dOwen Anderson MVT DstVT = TLI.getValueType(I->getType()); 540d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 541d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson if (SrcVT == MVT::Other || !SrcVT.isSimple() || 542d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson DstVT == MVT::Other || !DstVT.isSimple() || 543d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson !TLI.isTypeLegal(SrcVT) || !TLI.isTypeLegal(DstVT)) 544d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson // Unhandled type. Halt "fast" selection and bail. 545d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 546d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 5473df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned Op0 = getRegForValue(I->getOperand(0)); 548ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (Op0 == 0) 549ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // Unhandled operand. Halt "fast" selection and bail. 550d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 551d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 552ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // First, try to perform the bitcast by inserting a reg-reg copy. 553ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman unsigned ResultReg = 0; 554ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (SrcVT.getSimpleVT() == DstVT.getSimpleVT()) { 555ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman TargetRegisterClass* SrcClass = TLI.getRegClassFor(SrcVT); 556ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman TargetRegisterClass* DstClass = TLI.getRegClassFor(DstVT); 557ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ResultReg = createResultReg(DstClass); 558ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 559ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 560ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman Op0, DstClass, SrcClass); 561ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (!InsertedCopy) 562ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ResultReg = 0; 563ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 564ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 565ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // If the reg-reg copy failed, select a BIT_CONVERT opcode. 566ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (!ResultReg) 567ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ResultReg = FastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(), 568ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ISD::BIT_CONVERT, Op0); 569ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 570ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (!ResultReg) 571d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 572d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 5733df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, ResultReg); 574d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return true; 575d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson} 576d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 5773df24e667f04a7003342b534310919abc9c87418Dan Gohmanbool 5783df24e667f04a7003342b534310919abc9c87418Dan GohmanFastISel::SelectInstruction(Instruction *I) { 57940b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman return SelectOperator(I, I->getOpcode()); 58040b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman} 58140b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman 582d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// FastEmitBranch - Emit an unconditional branch to the given block, 583d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// unless it is the immediate (fall-through) successor, and update 584d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// the CFG. 585d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohmanvoid 586d98d6203e429b2d7208b6687931e9079e85e95ecDan GohmanFastISel::FastEmitBranch(MachineBasicBlock *MSucc) { 587d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman MachineFunction::iterator NextMBB = 588d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman next(MachineFunction::iterator(MBB)); 589d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman 590d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman if (MBB->isLayoutSuccessor(MSucc)) { 591d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman // The unconditional fall-through case, which needs no instructions. 592d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman } else { 593d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman // The unconditional branch case. 594d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman TII.InsertBranch(*MBB, MSucc, NULL, SmallVector<MachineOperand, 0>()); 595d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman } 596d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman MBB->addSuccessor(MSucc); 597d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman} 598d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman 59940b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool 60040b189e4e257924d90aaf63bf2e12bc7bbca961aDan GohmanFastISel::SelectOperator(User *I, unsigned Opcode) { 60140b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman switch (Opcode) { 6023df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Add: { 6033df24e667f04a7003342b534310919abc9c87418Dan Gohman ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FADD : ISD::ADD; 6043df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, Opc); 6053df24e667f04a7003342b534310919abc9c87418Dan Gohman } 6063df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Sub: { 6073df24e667f04a7003342b534310919abc9c87418Dan Gohman ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FSUB : ISD::SUB; 6083df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, Opc); 6093df24e667f04a7003342b534310919abc9c87418Dan Gohman } 6103df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Mul: { 6113df24e667f04a7003342b534310919abc9c87418Dan Gohman ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FMUL : ISD::MUL; 6123df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, Opc); 6133df24e667f04a7003342b534310919abc9c87418Dan Gohman } 6143df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::SDiv: 6153df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::SDIV); 6163df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::UDiv: 6173df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::UDIV); 6183df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::FDiv: 6193df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::FDIV); 6203df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::SRem: 6213df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::SREM); 6223df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::URem: 6233df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::UREM); 6243df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::FRem: 6253df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::FREM); 6263df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Shl: 6273df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::SHL); 6283df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::LShr: 6293df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::SRL); 6303df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::AShr: 6313df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::SRA); 6323df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::And: 6333df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::AND); 6343df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Or: 6353df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::OR); 6363df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Xor: 6373df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::XOR); 6383df24e667f04a7003342b534310919abc9c87418Dan Gohman 6393df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::GetElementPtr: 6403df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectGetElementPtr(I); 6413df24e667f04a7003342b534310919abc9c87418Dan Gohman 6423df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Br: { 6433df24e667f04a7003342b534310919abc9c87418Dan Gohman BranchInst *BI = cast<BranchInst>(I); 6443df24e667f04a7003342b534310919abc9c87418Dan Gohman 6453df24e667f04a7003342b534310919abc9c87418Dan Gohman if (BI->isUnconditional()) { 6463df24e667f04a7003342b534310919abc9c87418Dan Gohman BasicBlock *LLVMSucc = BI->getSuccessor(0); 6473df24e667f04a7003342b534310919abc9c87418Dan Gohman MachineBasicBlock *MSucc = MBBMap[LLVMSucc]; 648d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman FastEmitBranch(MSucc); 6493df24e667f04a7003342b534310919abc9c87418Dan Gohman return true; 6509d5b41624003daf259b33fc953aa471049700353Owen Anderson } 6513df24e667f04a7003342b534310919abc9c87418Dan Gohman 6523df24e667f04a7003342b534310919abc9c87418Dan Gohman // Conditional branches are not handed yet. 6533df24e667f04a7003342b534310919abc9c87418Dan Gohman // Halt "fast" selection and bail. 6543df24e667f04a7003342b534310919abc9c87418Dan Gohman return false; 655b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman } 656b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 657087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman case Instruction::Unreachable: 658087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman // Nothing to emit. 659087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman return true; 660087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman 6613df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::PHI: 6623df24e667f04a7003342b534310919abc9c87418Dan Gohman // PHI nodes are already emitted. 6633df24e667f04a7003342b534310919abc9c87418Dan Gohman return true; 6640586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman 6650586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman case Instruction::Alloca: 6660586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman // FunctionLowering has the static-sized case covered. 6670586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman if (StaticAllocaMap.count(cast<AllocaInst>(I))) 6680586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman return true; 6690586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman 6700586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman // Dynamic-sized alloca is not handled yet. 6710586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman return false; 6723df24e667f04a7003342b534310919abc9c87418Dan Gohman 67333134c4a75558288d663267c8991f6bd37a530afDan Gohman case Instruction::Call: 67433134c4a75558288d663267c8991f6bd37a530afDan Gohman return SelectCall(I); 67533134c4a75558288d663267c8991f6bd37a530afDan Gohman 6763df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::BitCast: 6773df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBitCast(I); 6783df24e667f04a7003342b534310919abc9c87418Dan Gohman 6793df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::FPToSI: 6803df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::FP_TO_SINT); 6813df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::ZExt: 6823df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::ZERO_EXTEND); 6833df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::SExt: 6843df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::SIGN_EXTEND); 6853df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Trunc: 6863df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::TRUNCATE); 6873df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::SIToFP: 6883df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::SINT_TO_FP); 6893df24e667f04a7003342b534310919abc9c87418Dan Gohman 6903df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::IntToPtr: // Deliberate fall-through. 6913df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::PtrToInt: { 6923df24e667f04a7003342b534310919abc9c87418Dan Gohman MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType()); 6933df24e667f04a7003342b534310919abc9c87418Dan Gohman MVT DstVT = TLI.getValueType(I->getType()); 6943df24e667f04a7003342b534310919abc9c87418Dan Gohman if (DstVT.bitsGT(SrcVT)) 6953df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::ZERO_EXTEND); 6963df24e667f04a7003342b534310919abc9c87418Dan Gohman if (DstVT.bitsLT(SrcVT)) 6973df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::TRUNCATE); 6983df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned Reg = getRegForValue(I->getOperand(0)); 6993df24e667f04a7003342b534310919abc9c87418Dan Gohman if (Reg == 0) return false; 7003df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, Reg); 7013df24e667f04a7003342b534310919abc9c87418Dan Gohman return true; 7023df24e667f04a7003342b534310919abc9c87418Dan Gohman } 703d57dd5f4e6740520820bc0fca42a540e31c27a73Dan Gohman 7043df24e667f04a7003342b534310919abc9c87418Dan Gohman default: 7053df24e667f04a7003342b534310919abc9c87418Dan Gohman // Unhandled instruction. Halt "fast" selection and bail. 7063df24e667f04a7003342b534310919abc9c87418Dan Gohman return false; 7073df24e667f04a7003342b534310919abc9c87418Dan Gohman } 708b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 709b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 7103df24e667f04a7003342b534310919abc9c87418Dan GohmanFastISel::FastISel(MachineFunction &mf, 711d57dd5f4e6740520820bc0fca42a540e31c27a73Dan Gohman MachineModuleInfo *mmi, 71283489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DwarfWriter *dw, 7133df24e667f04a7003342b534310919abc9c87418Dan Gohman DenseMap<const Value *, unsigned> &vm, 7140586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman DenseMap<const BasicBlock *, MachineBasicBlock *> &bm, 715dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman DenseMap<const AllocaInst *, int> &am 716dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG 717dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman , SmallSet<Instruction*, 8> &cil 718dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif 719dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman ) 7203df24e667f04a7003342b534310919abc9c87418Dan Gohman : MBB(0), 7213df24e667f04a7003342b534310919abc9c87418Dan Gohman ValueMap(vm), 7223df24e667f04a7003342b534310919abc9c87418Dan Gohman MBBMap(bm), 7230586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman StaticAllocaMap(am), 724dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG 725dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman CatchInfoLost(cil), 726dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif 7273df24e667f04a7003342b534310919abc9c87418Dan Gohman MF(mf), 728d57dd5f4e6740520820bc0fca42a540e31c27a73Dan Gohman MMI(mmi), 72983489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DW(dw), 7303df24e667f04a7003342b534310919abc9c87418Dan Gohman MRI(MF.getRegInfo()), 7310586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman MFI(*MF.getFrameInfo()), 7320586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman MCP(*MF.getConstantPool()), 7333df24e667f04a7003342b534310919abc9c87418Dan Gohman TM(MF.getTarget()), 73422bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman TD(*TM.getTargetData()), 73522bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman TII(*TM.getInstrInfo()), 73622bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman TLI(*TM.getTargetLowering()) { 737bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman} 738bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman 739e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan GohmanFastISel::~FastISel() {} 740e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan Gohman 74136fd941fc029c6ea50ed08d26a2bfe4932b9789cEvan Chengunsigned FastISel::FastEmit_(MVT::SimpleValueType, MVT::SimpleValueType, 74236fd941fc029c6ea50ed08d26a2bfe4932b9789cEvan Cheng ISD::NodeType) { 743b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 744b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 745b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 7460f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Andersonunsigned FastISel::FastEmit_r(MVT::SimpleValueType, MVT::SimpleValueType, 7470f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISD::NodeType, unsigned /*Op0*/) { 748b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 749b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 750b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 7510f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Andersonunsigned FastISel::FastEmit_rr(MVT::SimpleValueType, MVT::SimpleValueType, 7520f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISD::NodeType, unsigned /*Op0*/, 7530f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson unsigned /*Op0*/) { 754b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 755b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 756b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 7570f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Andersonunsigned FastISel::FastEmit_i(MVT::SimpleValueType, MVT::SimpleValueType, 7580f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISD::NodeType, uint64_t /*Imm*/) { 75983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return 0; 76083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 76183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 76210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohmanunsigned FastISel::FastEmit_f(MVT::SimpleValueType, MVT::SimpleValueType, 76310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman ISD::NodeType, ConstantFP * /*FPImm*/) { 76410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return 0; 76510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman} 76610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 7670f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Andersonunsigned FastISel::FastEmit_ri(MVT::SimpleValueType, MVT::SimpleValueType, 7680f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISD::NodeType, unsigned /*Op0*/, 7690f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson uint64_t /*Imm*/) { 770d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return 0; 771d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 772d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 77310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohmanunsigned FastISel::FastEmit_rf(MVT::SimpleValueType, MVT::SimpleValueType, 77410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman ISD::NodeType, unsigned /*Op0*/, 77510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman ConstantFP * /*FPImm*/) { 77610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return 0; 77710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman} 77810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 7790f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Andersonunsigned FastISel::FastEmit_rri(MVT::SimpleValueType, MVT::SimpleValueType, 7800f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISD::NodeType, 781d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned /*Op0*/, unsigned /*Op1*/, 782d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman uint64_t /*Imm*/) { 78383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return 0; 78483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 78583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 78683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries 78783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// to emit an instruction with an immediate operand using FastEmit_ri. 78883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// If that fails, it materializes the immediate into a register and try 78983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_rr instead. 79083785c80968165b30fcdd111ceb2c28d38bcff86Evan Chengunsigned FastISel::FastEmit_ri_(MVT::SimpleValueType VT, ISD::NodeType Opcode, 791d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, uint64_t Imm, 792d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman MVT::SimpleValueType ImmType) { 79383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // First check if immediate type is legal. If not, we can't use the ri form. 794151ed61a2f9c3482d35a54d502e7cd147f22a21bDan Gohman unsigned ResultReg = FastEmit_ri(VT, VT, Opcode, Op0, Imm); 79583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (ResultReg != 0) 79683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return ResultReg; 7970f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson unsigned MaterialReg = FastEmit_i(ImmType, ImmType, ISD::Constant, Imm); 798d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (MaterialReg == 0) 799d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return 0; 8000f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg); 801d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 802d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 80310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// FastEmit_rf_ - This method is a wrapper of FastEmit_ri. It first tries 80410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// to emit an instruction with a floating-point immediate operand using 80510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// FastEmit_rf. If that fails, it materializes the immediate into a register 80610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// and try FastEmit_rr instead. 80710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohmanunsigned FastISel::FastEmit_rf_(MVT::SimpleValueType VT, ISD::NodeType Opcode, 80810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman unsigned Op0, ConstantFP *FPImm, 80910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman MVT::SimpleValueType ImmType) { 81010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman // First check if immediate type is legal. If not, we can't use the rf form. 811151ed61a2f9c3482d35a54d502e7cd147f22a21bDan Gohman unsigned ResultReg = FastEmit_rf(VT, VT, Opcode, Op0, FPImm); 81210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman if (ResultReg != 0) 81310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return ResultReg; 81410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 81510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman // Materialize the constant in a register. 81610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman unsigned MaterialReg = FastEmit_f(ImmType, ImmType, ISD::ConstantFP, FPImm); 81710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman if (MaterialReg == 0) { 81896a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // If the target doesn't have a way to directly enter a floating-point 81996a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // value into a register, use an alternate approach. 82096a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // TODO: The current approach only supports floating-point constants 82196a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // that can be constructed by conversion from integer values. This should 82296a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // be replaced by code that creates a load from a constant-pool entry, 82396a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // which will require some target-specific work. 82410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman const APFloat &Flt = FPImm->getValueAPF(); 82510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman MVT IntVT = TLI.getPointerTy(); 82610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 82710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman uint64_t x[2]; 82810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman uint32_t IntBitWidth = IntVT.getSizeInBits(); 82923a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen bool isExact; 83023a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen (void) Flt.convertToInteger(x, IntBitWidth, /*isSigned=*/true, 83123a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen APFloat::rmTowardZero, &isExact); 83223a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen if (!isExact) 83310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return 0; 83410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman APInt IntVal(IntBitWidth, 2, x); 83510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 83610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman unsigned IntegerReg = FastEmit_i(IntVT.getSimpleVT(), IntVT.getSimpleVT(), 83710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman ISD::Constant, IntVal.getZExtValue()); 83810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman if (IntegerReg == 0) 83910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return 0; 84010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman MaterialReg = FastEmit_r(IntVT.getSimpleVT(), VT, 84110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman ISD::SINT_TO_FP, IntegerReg); 84210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman if (MaterialReg == 0) 84310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return 0; 84410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman } 84510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg); 84610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman} 84710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 848d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::createResultReg(const TargetRegisterClass* RC) { 849d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return MRI.createVirtualRegister(RC); 85083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 85183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 852b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode, 85377ad79689d755c49146f534107421cb3d9703fedDan Gohman const TargetRegisterClass* RC) { 854d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 855bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 856b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 8579bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg); 858b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 859b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 860b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 861b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode, 862b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman const TargetRegisterClass *RC, 863b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned Op0) { 864d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 865bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 866b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 8675960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 8689bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0); 8695960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 8709bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0); 8715960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 8725960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 8735960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 8745960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 8755960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 8765960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng 877b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 878b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 879b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 880b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode, 881b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman const TargetRegisterClass *RC, 882b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned Op0, unsigned Op1) { 883d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 884bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 885b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 8865960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 8879bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addReg(Op1); 8885960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 8899bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0).addReg(Op1); 8905960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 8915960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 8925960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 8935960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 8945960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 895b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 896b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 897d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 898d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_ri(unsigned MachineInstOpcode, 899d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetRegisterClass *RC, 900d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, uint64_t Imm) { 901d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 902d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 903d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 9045960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 9059bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addImm(Imm); 9065960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 9079bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0).addImm(Imm); 9085960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 9095960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 9105960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 9115960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 9125960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 913d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return ResultReg; 914d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 915d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 91610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohmanunsigned FastISel::FastEmitInst_rf(unsigned MachineInstOpcode, 91710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman const TargetRegisterClass *RC, 91810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman unsigned Op0, ConstantFP *FPImm) { 91910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman unsigned ResultReg = createResultReg(RC); 92010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 92110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 9225960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 9239bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addFPImm(FPImm); 9245960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 9259bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0).addFPImm(FPImm); 9265960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 9275960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 9285960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 9295960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 9305960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 93110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return ResultReg; 93210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman} 93310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 934d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_rri(unsigned MachineInstOpcode, 935d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetRegisterClass *RC, 936d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, unsigned Op1, uint64_t Imm) { 937d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 938d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 939d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 9405960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 9419bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addReg(Op1).addImm(Imm); 9425960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 9439bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0).addReg(Op1).addImm(Imm); 9445960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 9455960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 9465960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 9475960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 9485960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 949d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return ResultReg; 950d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 9516d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson 9526d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Andersonunsigned FastISel::FastEmitInst_i(unsigned MachineInstOpcode, 9536d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson const TargetRegisterClass *RC, 9546d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson uint64_t Imm) { 9556d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson unsigned ResultReg = createResultReg(RC); 9566d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson const TargetInstrDesc &II = TII.get(MachineInstOpcode); 9576d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson 9585960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 9599bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addImm(Imm); 9605960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 9619bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addImm(Imm); 9625960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 9635960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 9645960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 9655960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 9665960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 9676d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson return ResultReg; 968b41aec54767a825ac54c8822e787700bb08a3460Evan Cheng} 9698970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson 970536ab130ec95cbb7bf30530251dafa7dfecc8471Evan Chengunsigned FastISel::FastEmitInst_extractsubreg(MVT::SimpleValueType RetVT, 971536ab130ec95cbb7bf30530251dafa7dfecc8471Evan Cheng unsigned Op0, uint32_t Idx) { 97240a468f24909792f000e3ccc1dda7a27b9c34b69Owen Anderson const TargetRegisterClass* RC = MRI.getRegClass(Op0); 9738970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson 974536ab130ec95cbb7bf30530251dafa7dfecc8471Evan Cheng unsigned ResultReg = createResultReg(TLI.getRegClassFor(RetVT)); 9758970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson const TargetInstrDesc &II = TII.get(TargetInstrInfo::EXTRACT_SUBREG); 9768970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson 9775960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 9789bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addImm(Idx); 9795960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 9809bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0).addImm(Idx); 9815960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 9825960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 9835960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 9845960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 9855960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 9868970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson return ResultReg; 9878970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson} 98814ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman 98914ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman/// FastEmitZExtFromI1 - Emit MachineInstrs to compute the value of Op 99014ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman/// with all but the least significant bit set to zero. 99114ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohmanunsigned FastISel::FastEmitZExtFromI1(MVT::SimpleValueType VT, unsigned Op) { 99214ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman return FastEmit_ri(VT, VT, ISD::AND, Op, 1); 99314ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman} 994