FastISel.cpp revision 4fd552880c9f42f117bd79929ea0179f99bd6bb7
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) { 604fd552880c9f42f117bd79929ea0179f99bd6bb7Dan Gohman MVT RealVT = TLI.getValueType(V->getType(), /*AllowUnknown=*/true); 614fd552880c9f42f117bd79929ea0179f99bd6bb7Dan Gohman // Don't handle non-simple values in FastISel. 624fd552880c9f42f117bd79929ea0179f99bd6bb7Dan Gohman if (!RealVT.isSimple()) 634fd552880c9f42f117bd79929ea0179f99bd6bb7Dan Gohman return 0; 64821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman 65c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // Ignore illegal types. We must do this before looking up the value 66c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // in ValueMap because Arguments are given virtual registers regardless 67c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // of whether FastISel can handle them. 684fd552880c9f42f117bd79929ea0179f99bd6bb7Dan Gohman MVT::SimpleValueType VT = RealVT.getSimpleVT(); 69821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman if (!TLI.isTypeLegal(VT)) { 70821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman // Promote MVT::i1 to a legal type though, because it's common and easy. 71821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman if (VT == MVT::i1) 72821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman VT = TLI.getTypeToTransformTo(VT).getSimpleVT(); 73821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman else 74821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman return 0; 75821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman } 76821164875706dd28e48c6cc3cea5c8ffa6e658d1Dan Gohman 77c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // Look up the value to see if we already have a register for it. We 78c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // cache values defined by Instructions across blocks, and other values 79c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // only locally. This is because Instructions already have the SSA 80c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // def-dominatess-use requirement enforced. 81c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman if (ValueMap.count(V)) 82c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman return ValueMap[V]; 83c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman unsigned Reg = LocalValueMap[V]; 84c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman if (Reg != 0) 85c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman return Reg; 86c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman 87ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) { 882ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman if (CI->getValue().getActiveBits() <= 64) 892ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman Reg = FastEmit_i(VT, VT, ISD::Constant, CI->getZExtValue()); 900586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman } else if (isa<AllocaInst>(V)) { 912ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman Reg = TargetMaterializeAlloca(cast<AllocaInst>(V)); 92205d92589bc8c59d4bba9ddf89e0eb3c4d548cdaDan Gohman } else if (isa<ConstantPointerNull>(V)) { 931e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman // Translate this as an integer zero so that it can be 941e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman // local-CSE'd with actual integer zeros. 951e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman Reg = getRegForValue(Constant::getNullValue(TD.getIntPtrType())); 96ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } else if (ConstantFP *CF = dyn_cast<ConstantFP>(V)) { 97104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman Reg = FastEmit_f(VT, VT, ISD::ConstantFP, CF); 98ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 99ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (!Reg) { 100ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman const APFloat &Flt = CF->getValueAPF(); 101ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman MVT IntVT = TLI.getPointerTy(); 102ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 103ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman uint64_t x[2]; 104ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman uint32_t IntBitWidth = IntVT.getSizeInBits(); 10523a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen bool isExact; 10623a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen (void) Flt.convertToInteger(x, IntBitWidth, /*isSigned=*/true, 10723a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen APFloat::rmTowardZero, &isExact); 10823a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen if (isExact) { 1092ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman APInt IntVal(IntBitWidth, 2, x); 110ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 1111e9e8c3bd5ac018296bddb21a2acb8c643303b39Dan Gohman unsigned IntegerReg = getRegForValue(ConstantInt::get(IntVal)); 1122ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman if (IntegerReg != 0) 1132ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman Reg = FastEmit_r(IntVT.getSimpleVT(), VT, ISD::SINT_TO_FP, IntegerReg); 1142ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman } 115ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 11640b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { 11740b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman if (!SelectOperator(CE, CE->getOpcode())) return 0; 11840b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman Reg = LocalValueMap[CE]; 119205d92589bc8c59d4bba9ddf89e0eb3c4d548cdaDan Gohman } else if (isa<UndefValue>(V)) { 120104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman Reg = createResultReg(TLI.getRegClassFor(VT)); 1219bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, TII.get(TargetInstrInfo::IMPLICIT_DEF), Reg); 122ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 123d5d81a457b5ff758b3fcc527af38827490bc68a5Owen Anderson 124dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman // If target-independent code couldn't handle the value, give target-specific 125dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman // code a try. 1266e6074508c2f781c3e52dfe0e301cb1c7f395a91Owen Anderson if (!Reg && isa<Constant>(V)) 1272ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman Reg = TargetMaterializeConstant(cast<Constant>(V)); 1286e6074508c2f781c3e52dfe0e301cb1c7f395a91Owen Anderson 1292ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman // Don't cache constant materializations in the general ValueMap. 1302ff7fd146159d97abe94391a33b4385abb06bbb0Dan Gohman // To do so would require tracking what uses they dominate. 131dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman if (Reg != 0) 132dceffe66b9e73ce372ea11c0fc6975504eb8c31dDan Gohman LocalValueMap[V] = Reg; 133104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman return Reg; 134ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman} 135ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 13659fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Chengunsigned FastISel::lookUpRegForValue(Value *V) { 13759fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng // Look up the value to see if we already have a register for it. We 13859fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng // cache values defined by Instructions across blocks, and other values 13959fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng // only locally. This is because Instructions already have the SSA 14059fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng // def-dominatess-use requirement enforced. 14159fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng if (ValueMap.count(V)) 14259fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng return ValueMap[V]; 14359fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng return LocalValueMap[V]; 14459fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng} 14559fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng 146cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// UpdateValueMap - Update the value map to include the new mapping for this 147cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// instruction, or insert an extra copy to get the result in a previous 148cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// determined register. 149cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// NOTE: This is only necessary because we might select a block that uses 150cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// a value before we select the block that defines the value. It might be 151cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson/// possible to fix this by selecting blocks in reverse postorder. 15295267a1e671efc3c14e916b6978bbb15973b4cdcOwen Andersonvoid FastISel::UpdateValueMap(Value* I, unsigned Reg) { 15340b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman if (!isa<Instruction>(I)) { 15440b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman LocalValueMap[I] = Reg; 15540b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman return; 15640b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman } 157cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson if (!ValueMap.count(I)) 158cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson ValueMap[I] = Reg; 159cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson else 160f09917847bb082829feba34d1818eb97764839d9Evan Cheng TII.copyRegToReg(*MBB, MBB->end(), ValueMap[I], 161f09917847bb082829feba34d1818eb97764839d9Evan Cheng Reg, MRI.getRegClass(Reg), MRI.getRegClass(Reg)); 162cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson} 163cc54e76cc67bbc9badc024ab29053602769bd255Owen Anderson 164c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohmanunsigned FastISel::getRegForGEPIndex(Value *Idx) { 165c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman unsigned IdxN = getRegForValue(Idx); 166c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman if (IdxN == 0) 167c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // Unhandled operand. Halt "fast" selection and bail. 168c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman return 0; 169c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman 170c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman // If the index is smaller or larger than intptr_t, truncate or extend it. 171c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman MVT PtrVT = TLI.getPointerTy(); 172c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman MVT IdxVT = MVT::getMVT(Idx->getType(), /*HandleUnknown=*/false); 173c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman if (IdxVT.bitsLT(PtrVT)) 174c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman IdxN = FastEmit_r(IdxVT.getSimpleVT(), PtrVT.getSimpleVT(), 175c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman ISD::SIGN_EXTEND, IdxN); 176c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman else if (IdxVT.bitsGT(PtrVT)) 177c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman IdxN = FastEmit_r(IdxVT.getSimpleVT(), PtrVT.getSimpleVT(), 178c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman ISD::TRUNCATE, IdxN); 179c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman return IdxN; 180c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman} 181c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman 182bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman/// SelectBinaryOp - Select and emit code for a binary operator instruction, 183bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman/// which has an opcode which directly corresponds to the given ISD opcode. 184bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman/// 18540b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool FastISel::SelectBinaryOp(User *I, ISD::NodeType ISDOpcode) { 186d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman MVT VT = MVT::getMVT(I->getType(), /*HandleUnknown=*/true); 187d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (VT == MVT::Other || !VT.isSimple()) 188d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // Unhandled type. Halt "fast" selection and bail. 189d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return false; 190638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman 191b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman // We only handle legal types. For example, on x86-32 the instruction 192b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman // selector contains all of the 64-bit instructions from x86-64, 193b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman // under the assumption that i64 won't be used if the target doesn't 194b71fea248fd7cf9ab2c5737997a3dc5682948dc4Dan Gohman // support it. 195638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman if (!TLI.isTypeLegal(VT)) { 1965dd9c2e9aea7294c184609aff7f2fe82eaea4eb0Dan Gohman // MVT::i1 is special. Allow AND, OR, or XOR because they 197638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman // don't require additional zeroing, which makes them easy. 198638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman if (VT == MVT::i1 && 1995dd9c2e9aea7294c184609aff7f2fe82eaea4eb0Dan Gohman (ISDOpcode == ISD::AND || ISDOpcode == ISD::OR || 2005dd9c2e9aea7294c184609aff7f2fe82eaea4eb0Dan Gohman ISDOpcode == ISD::XOR)) 201638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman VT = TLI.getTypeToTransformTo(VT); 202638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman else 203638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman return false; 204638c6830c6d0d6871065d2b00178ee4aa7d4d044Dan Gohman } 205d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 2063df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned Op0 = getRegForValue(I->getOperand(0)); 207d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (Op0 == 0) 208a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman // Unhandled operand. Halt "fast" selection and bail. 209a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman return false; 210a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman 211d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // Check if the second operand is a constant and handle it appropriately. 212d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) { 213ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman unsigned ResultReg = FastEmit_ri(VT.getSimpleVT(), VT.getSimpleVT(), 214ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ISDOpcode, Op0, CI->getZExtValue()); 215ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (ResultReg != 0) { 216ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // We successfully emitted code for the given LLVM Instruction. 2173df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, ResultReg); 218ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman return true; 219ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 220d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman } 221d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 22210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman // Check if the second operand is a constant float. 22310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman if (ConstantFP *CF = dyn_cast<ConstantFP>(I->getOperand(1))) { 224ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman unsigned ResultReg = FastEmit_rf(VT.getSimpleVT(), VT.getSimpleVT(), 225ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ISDOpcode, Op0, CF); 226ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (ResultReg != 0) { 227ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // We successfully emitted code for the given LLVM Instruction. 2283df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, ResultReg); 229ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman return true; 230ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 23110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman } 23210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 2333df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned Op1 = getRegForValue(I->getOperand(1)); 234d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (Op1 == 0) 235d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // Unhandled operand. Halt "fast" selection and bail. 236bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman return false; 237bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 238ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // Now we have both operands in registers. Emit the instruction. 2390f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson unsigned ResultReg = FastEmit_rr(VT.getSimpleVT(), VT.getSimpleVT(), 2400f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISDOpcode, Op0, Op1); 241bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (ResultReg == 0) 242bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman // Target-specific code wasn't able to find a machine opcode for 243bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman // the given ISD opcode and type. Halt "fast" selection and bail. 244bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman return false; 245bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 2468014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman // We successfully emitted code for the given LLVM Instruction. 2473df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, ResultReg); 248bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman return true; 249bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman} 250bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 25140b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool FastISel::SelectGetElementPtr(User *I) { 2523df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned N = getRegForValue(I->getOperand(0)); 25383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 25483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 25583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 25683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 25783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng const Type *Ty = I->getOperand(0)->getType(); 2587a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman MVT::SimpleValueType VT = TLI.getPointerTy().getSimpleVT(); 25983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng for (GetElementPtrInst::op_iterator OI = I->op_begin()+1, E = I->op_end(); 26083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng OI != E; ++OI) { 26183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng Value *Idx = *OI; 26283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (const StructType *StTy = dyn_cast<StructType>(Ty)) { 26383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng unsigned Field = cast<ConstantInt>(Idx)->getZExtValue(); 26483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (Field) { 26583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // N = N + Offset 26683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng uint64_t Offs = TD.getStructLayout(StTy)->getElementOffset(Field); 26783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // FIXME: This can be optimized by combining the add with a 26883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // subsequent one. 2697a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT); 27083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 27183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 27283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 27383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 27483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng Ty = StTy->getElementType(Field); 27583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } else { 27683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng Ty = cast<SequentialType>(Ty)->getElementType(); 27783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 27883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // If this is a constant subscript, handle it quickly. 27983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (ConstantInt *CI = dyn_cast<ConstantInt>(Idx)) { 28083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (CI->getZExtValue() == 0) continue; 28183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng uint64_t Offs = 282ceb4d1aecb9deffe59b3dcdc9a783ffde8477be9Duncan Sands TD.getTypePaddedSize(Ty)*cast<ConstantInt>(CI)->getSExtValue(); 2837a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT); 28483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 28583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 28683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 28783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng continue; 28883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 28983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 29083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // N = N + Idx * ElementSize; 291ceb4d1aecb9deffe59b3dcdc9a783ffde8477be9Duncan Sands uint64_t ElementSize = TD.getTypePaddedSize(Ty); 292c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman unsigned IdxN = getRegForGEPIndex(Idx); 29383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (IdxN == 0) 29483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 29583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 29683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 29780bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman if (ElementSize != 1) { 298f93cf79505f07cb97597fbc5955462ad7670ca5cDan Gohman IdxN = FastEmit_ri_(VT, ISD::MUL, IdxN, ElementSize, VT); 29980bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman if (IdxN == 0) 30080bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman // Unhandled operand. Halt "fast" selection and bail. 30180bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman return false; 30280bc6e2243b7ae99da42bf2e61df4ebccf8d8821Dan Gohman } 3030f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson N = FastEmit_rr(VT, VT, ISD::ADD, N, IdxN); 30483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 30583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 30683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 30783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 30883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 30983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 31083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // We successfully emitted code for the given LLVM Instruction. 3113df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, N); 31283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return true; 313bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman} 314bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 31533134c4a75558288d663267c8991f6bd37a530afDan Gohmanbool FastISel::SelectCall(User *I) { 31633134c4a75558288d663267c8991f6bd37a530afDan Gohman Function *F = cast<CallInst>(I)->getCalledFunction(); 31733134c4a75558288d663267c8991f6bd37a530afDan Gohman if (!F) return false; 31833134c4a75558288d663267c8991f6bd37a530afDan Gohman 31933134c4a75558288d663267c8991f6bd37a530afDan Gohman unsigned IID = F->getIntrinsicID(); 32033134c4a75558288d663267c8991f6bd37a530afDan Gohman switch (IID) { 32133134c4a75558288d663267c8991f6bd37a530afDan Gohman default: break; 32233134c4a75558288d663267c8991f6bd37a530afDan Gohman case Intrinsic::dbg_stoppoint: { 32333134c4a75558288d663267c8991f6bd37a530afDan Gohman DbgStopPointInst *SPI = cast<DbgStopPointInst>(I); 324b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel if (DW && DW->ValidDebugInfo(SPI->getContext())) { 32583489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DICompileUnit CU(cast<GlobalVariable>(SPI->getContext())); 3260582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling std::string Dir, FN; 3270582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir), 3280582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling CU.getFilename(FN)); 32933134c4a75558288d663267c8991f6bd37a530afDan Gohman unsigned Line = SPI->getLine(); 33033134c4a75558288d663267c8991f6bd37a530afDan Gohman unsigned Col = SPI->getColumn(); 33192c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling unsigned ID = DW->RecordSourceLine(Line, Col, SrcFile); 3329bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned Idx = MF.getOrCreateDebugLocID(SrcFile, Line, Col); 3339bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling setCurDebugLoc(DebugLoc::get(Idx)); 33492c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); 33592c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling BuildMI(MBB, DL, II).addImm(ID); 33633134c4a75558288d663267c8991f6bd37a530afDan Gohman } 33733134c4a75558288d663267c8991f6bd37a530afDan Gohman return true; 33833134c4a75558288d663267c8991f6bd37a530afDan Gohman } 33933134c4a75558288d663267c8991f6bd37a530afDan Gohman case Intrinsic::dbg_region_start: { 34033134c4a75558288d663267c8991f6bd37a530afDan Gohman DbgRegionStartInst *RSI = cast<DbgRegionStartInst>(I); 34192c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (DW && DW->ValidDebugInfo(RSI->getContext())) { 34292c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling unsigned ID = 34392c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling DW->RecordRegionStart(cast<GlobalVariable>(RSI->getContext())); 34492c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); 34592c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling BuildMI(MBB, DL, II).addImm(ID); 34692c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling } 34733134c4a75558288d663267c8991f6bd37a530afDan Gohman return true; 34833134c4a75558288d663267c8991f6bd37a530afDan Gohman } 34933134c4a75558288d663267c8991f6bd37a530afDan Gohman case Intrinsic::dbg_region_end: { 35033134c4a75558288d663267c8991f6bd37a530afDan Gohman DbgRegionEndInst *REI = cast<DbgRegionEndInst>(I); 35192c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (DW && DW->ValidDebugInfo(REI->getContext())) { 35292c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling unsigned ID = 35392c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling DW->RecordRegionEnd(cast<GlobalVariable>(REI->getContext())); 35492c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); 35592c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling BuildMI(MBB, DL, II).addImm(ID); 35692c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling } 35733134c4a75558288d663267c8991f6bd37a530afDan Gohman return true; 35833134c4a75558288d663267c8991f6bd37a530afDan Gohman } 35933134c4a75558288d663267c8991f6bd37a530afDan Gohman case Intrinsic::dbg_func_start: { 36083489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel if (!DW) return true; 36133134c4a75558288d663267c8991f6bd37a530afDan Gohman DbgFuncStartInst *FSI = cast<DbgFuncStartInst>(I); 36233134c4a75558288d663267c8991f6bd37a530afDan Gohman Value *SP = FSI->getSubprogram(); 3639bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling 364b79b5359fbe44bc82bedff2c081ed1db787f8d49Devang Patel if (DW->ValidDebugInfo(SP)) { 3659bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling // llvm.dbg.func.start implicitly defines a dbg_stoppoint which is what 3669bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling // (most?) gdb expects. 36783489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DISubprogram Subprogram(cast<GlobalVariable>(SP)); 36883489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DICompileUnit CompileUnit = Subprogram.getCompileUnit(); 3690582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling std::string Dir, FN; 3700582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir), 3710582ae99ba75a556d6ff63b254da327d32ba036fBill Wendling CompileUnit.getFilename(FN)); 3729bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling 373e75808cf3d92d14c5659a15d0d17bd21a54fd8ccDevang Patel // Record the source line but does not create a label for the normal 374e75808cf3d92d14c5659a15d0d17bd21a54fd8ccDevang Patel // function start. It will be emitted at asm emission time. However, 375e75808cf3d92d14c5659a15d0d17bd21a54fd8ccDevang Patel // create a label if this is a beginning of inlined function. 3769bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned Line = Subprogram.getLineNumber(); 37792c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile); 3789bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0))); 37992c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling 38092c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (DW->getRecordSourceLineCount() != 1) { 38192c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); 38292c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling BuildMI(MBB, DL, II).addImm(LabelID); 38392c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling } 38433134c4a75558288d663267c8991f6bd37a530afDan Gohman } 3859bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling 38633134c4a75558288d663267c8991f6bd37a530afDan Gohman return true; 38733134c4a75558288d663267c8991f6bd37a530afDan Gohman } 38892c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling case Intrinsic::dbg_declare: { 38992c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling DbgDeclareInst *DI = cast<DbgDeclareInst>(I); 39092c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling Value *Variable = DI->getVariable(); 39192c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (DW && DW->ValidDebugInfo(Variable)) { 39292c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling // Determine the address of the declared object. 39392c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling Value *Address = DI->getAddress(); 39492c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (BitCastInst *BCI = dyn_cast<BitCastInst>(Address)) 39592c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling Address = BCI->getOperand(0); 39692c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling AllocaInst *AI = dyn_cast<AllocaInst>(Address); 39792c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling // Don't handle byval struct arguments or VLAs, for example. 39892c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (!AI) break; 39992c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling DenseMap<const AllocaInst*, int>::iterator SI = 40092c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling StaticAllocaMap.find(AI); 40192c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling if (SI == StaticAllocaMap.end()) break; // VLAs. 40292c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling int FI = SI->second; 40392c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling 40492c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling // Determine the debug globalvariable. 40592c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling GlobalValue *GV = cast<GlobalVariable>(Variable); 40692c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling 40792c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling // Build the DECLARE instruction. 40892c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling const TargetInstrDesc &II = TII.get(TargetInstrInfo::DECLARE); 40992c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling BuildMI(MBB, DL, II).addFrameIndex(FI).addGlobalAddress(GV); 41092c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling } 41133134c4a75558288d663267c8991f6bd37a530afDan Gohman return true; 41292c1e126473dfa93eeb4c9a124af4fedb40f0d5bBill Wendling } 413dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman case Intrinsic::eh_exception: { 414dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman MVT VT = TLI.getValueType(I->getType()); 415dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman switch (TLI.getOperationAction(ISD::EXCEPTIONADDR, VT)) { 416dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman default: break; 417dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman case TargetLowering::Expand: { 418dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman if (!MBB->isLandingPad()) { 419dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman // FIXME: Mark exception register as live in. Hack for PR1508. 420dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned Reg = TLI.getExceptionAddressRegister(); 421dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman if (Reg) MBB->addLiveIn(Reg); 422dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 423dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned Reg = TLI.getExceptionAddressRegister(); 424dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman const TargetRegisterClass *RC = TLI.getRegClassFor(VT); 425dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned ResultReg = createResultReg(RC); 426dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 427dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman Reg, RC, RC); 428dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman assert(InsertedCopy && "Can't copy address registers!"); 42924ac408ce891321d1a5d62beaf3487efce6f2b22Evan Cheng InsertedCopy = InsertedCopy; 430dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman UpdateValueMap(I, ResultReg); 431dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman return true; 432dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 433dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 434dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman break; 435dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 436dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman case Intrinsic::eh_selector_i32: 437dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman case Intrinsic::eh_selector_i64: { 438dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman MVT VT = TLI.getValueType(I->getType()); 439dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman switch (TLI.getOperationAction(ISD::EHSELECTION, VT)) { 440dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman default: break; 441dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman case TargetLowering::Expand: { 442dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman MVT VT = (IID == Intrinsic::eh_selector_i32 ? 443dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman MVT::i32 : MVT::i64); 444dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman 445dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman if (MMI) { 446dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman if (MBB->isLandingPad()) 447dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman AddCatchInfo(*cast<CallInst>(I), MMI, MBB); 448dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman else { 449dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG 450dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman CatchInfoLost.insert(cast<CallInst>(I)); 451dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif 452dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman // FIXME: Mark exception selector register as live in. Hack for PR1508. 453dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned Reg = TLI.getExceptionSelectorRegister(); 454dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman if (Reg) MBB->addLiveIn(Reg); 455dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 456dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman 457dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned Reg = TLI.getExceptionSelectorRegister(); 458dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman const TargetRegisterClass *RC = TLI.getRegClassFor(VT); 459dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned ResultReg = createResultReg(RC); 460dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 461dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman Reg, RC, RC); 462dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman assert(InsertedCopy && "Can't copy address registers!"); 46324ac408ce891321d1a5d62beaf3487efce6f2b22Evan Cheng InsertedCopy = InsertedCopy; 464dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman UpdateValueMap(I, ResultReg); 465dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } else { 466dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman unsigned ResultReg = 467dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman getRegForValue(Constant::getNullValue(I->getType())); 468dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman UpdateValueMap(I, ResultReg); 469dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 470dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman return true; 471dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 472dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 473dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman break; 474dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman } 47533134c4a75558288d663267c8991f6bd37a530afDan Gohman } 47633134c4a75558288d663267c8991f6bd37a530afDan Gohman return false; 47733134c4a75558288d663267c8991f6bd37a530afDan Gohman} 47833134c4a75558288d663267c8991f6bd37a530afDan Gohman 47940b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool FastISel::SelectCast(User *I, ISD::NodeType Opcode) { 4806336b70541204d1a8377ec1f33748a7260e0a31dOwen Anderson MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType()); 4816336b70541204d1a8377ec1f33748a7260e0a31dOwen Anderson MVT DstVT = TLI.getValueType(I->getType()); 482d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 483d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson if (SrcVT == MVT::Other || !SrcVT.isSimple() || 484474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman DstVT == MVT::Other || !DstVT.isSimple()) 485d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson // Unhandled type. Halt "fast" selection and bail. 486d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 487d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 488474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // Check if the destination type is legal. Or as a special case, 489474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // it may be i1 if we're doing a truncate because that's 490474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // easy and somewhat common. 491474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (!TLI.isTypeLegal(DstVT)) 492474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (DstVT != MVT::i1 || Opcode != ISD::TRUNCATE) 493474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // Unhandled type. Halt "fast" selection and bail. 494474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman return false; 495474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman 49691b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman // Check if the source operand is legal. Or as a special case, 49791b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman // it may be i1 if we're doing zero-extension because that's 498474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // easy and somewhat common. 499474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (!TLI.isTypeLegal(SrcVT)) 500474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (SrcVT != MVT::i1 || Opcode != ISD::ZERO_EXTEND) 50191b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman // Unhandled type. Halt "fast" selection and bail. 50291b6f97ce4273fee5516692e3f27cd76d67986fcDan Gohman return false; 503474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman 5043df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned InputReg = getRegForValue(I->getOperand(0)); 505d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson if (!InputReg) 506d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson // Unhandled operand. Halt "fast" selection and bail. 507d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 50814ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman 50914ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman // If the operand is i1, arrange for the high bits in the register to be zero. 510474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (SrcVT == MVT::i1) { 511474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman SrcVT = TLI.getTypeToTransformTo(SrcVT); 51214ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman InputReg = FastEmitZExtFromI1(SrcVT.getSimpleVT(), InputReg); 51314ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman if (!InputReg) 51414ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman return false; 51514ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman } 516474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman // If the result is i1, truncate to the target's type for i1 first. 517474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman if (DstVT == MVT::i1) 518474d3b3f40e117a66946e9fb9d2016b4c05caef0Dan Gohman DstVT = TLI.getTypeToTransformTo(DstVT); 51914ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman 520d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson unsigned ResultReg = FastEmit_r(SrcVT.getSimpleVT(), 521d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson DstVT.getSimpleVT(), 522d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson Opcode, 523d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson InputReg); 524d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson if (!ResultReg) 525d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 526d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 5273df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, ResultReg); 528d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return true; 529d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson} 530d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 53140b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool FastISel::SelectBitCast(User *I) { 532ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // If the bitcast doesn't change the type, just use the operand value. 533ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (I->getType() == I->getOperand(0)->getType()) { 5343df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned Reg = getRegForValue(I->getOperand(0)); 535a318dabc0edbcc7a2b54d99b026a093361ec14fcDan Gohman if (Reg == 0) 536a318dabc0edbcc7a2b54d99b026a093361ec14fcDan Gohman return false; 5373df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, Reg); 538ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman return true; 539ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 540ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 541ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // Bitcasts of other values become reg-reg copies or BIT_CONVERT operators. 5426336b70541204d1a8377ec1f33748a7260e0a31dOwen Anderson MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType()); 5436336b70541204d1a8377ec1f33748a7260e0a31dOwen Anderson MVT DstVT = TLI.getValueType(I->getType()); 544d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 545d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson if (SrcVT == MVT::Other || !SrcVT.isSimple() || 546d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson DstVT == MVT::Other || !DstVT.isSimple() || 547d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson !TLI.isTypeLegal(SrcVT) || !TLI.isTypeLegal(DstVT)) 548d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson // Unhandled type. Halt "fast" selection and bail. 549d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 550d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 5513df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned Op0 = getRegForValue(I->getOperand(0)); 552ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (Op0 == 0) 553ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // Unhandled operand. Halt "fast" selection and bail. 554d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 555d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 556ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // First, try to perform the bitcast by inserting a reg-reg copy. 557ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman unsigned ResultReg = 0; 558ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (SrcVT.getSimpleVT() == DstVT.getSimpleVT()) { 559ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman TargetRegisterClass* SrcClass = TLI.getRegClassFor(SrcVT); 560ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman TargetRegisterClass* DstClass = TLI.getRegClassFor(DstVT); 561ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ResultReg = createResultReg(DstClass); 562ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 563ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 564ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman Op0, DstClass, SrcClass); 565ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (!InsertedCopy) 566ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ResultReg = 0; 567ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman } 568ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 569ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman // If the reg-reg copy failed, select a BIT_CONVERT opcode. 570ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (!ResultReg) 571ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ResultReg = FastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(), 572ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman ISD::BIT_CONVERT, Op0); 573ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman 574ad368ac2b5f303050e9aaa357e2b806fae38f81bDan Gohman if (!ResultReg) 575d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return false; 576d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 5773df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, ResultReg); 578d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson return true; 579d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson} 580d0533c9998d3baf41848ba559a9b2f2c65296d14Owen Anderson 5813df24e667f04a7003342b534310919abc9c87418Dan Gohmanbool 5823df24e667f04a7003342b534310919abc9c87418Dan GohmanFastISel::SelectInstruction(Instruction *I) { 58340b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman return SelectOperator(I, I->getOpcode()); 58440b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman} 58540b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman 586d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// FastEmitBranch - Emit an unconditional branch to the given block, 587d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// unless it is the immediate (fall-through) successor, and update 588d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman/// the CFG. 589d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohmanvoid 590d98d6203e429b2d7208b6687931e9079e85e95ecDan GohmanFastISel::FastEmitBranch(MachineBasicBlock *MSucc) { 591d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman MachineFunction::iterator NextMBB = 592d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman next(MachineFunction::iterator(MBB)); 593d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman 594d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman if (MBB->isLayoutSuccessor(MSucc)) { 595d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman // The unconditional fall-through case, which needs no instructions. 596d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman } else { 597d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman // The unconditional branch case. 598d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman TII.InsertBranch(*MBB, MSucc, NULL, SmallVector<MachineOperand, 0>()); 599d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman } 600d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman MBB->addSuccessor(MSucc); 601d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman} 602d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman 60340b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohmanbool 60440b189e4e257924d90aaf63bf2e12bc7bbca961aDan GohmanFastISel::SelectOperator(User *I, unsigned Opcode) { 60540b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman switch (Opcode) { 6063df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Add: { 6073df24e667f04a7003342b534310919abc9c87418Dan Gohman ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FADD : ISD::ADD; 6083df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, Opc); 6093df24e667f04a7003342b534310919abc9c87418Dan Gohman } 6103df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Sub: { 6113df24e667f04a7003342b534310919abc9c87418Dan Gohman ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FSUB : ISD::SUB; 6123df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, Opc); 6133df24e667f04a7003342b534310919abc9c87418Dan Gohman } 6143df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Mul: { 6153df24e667f04a7003342b534310919abc9c87418Dan Gohman ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FMUL : ISD::MUL; 6163df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, Opc); 6173df24e667f04a7003342b534310919abc9c87418Dan Gohman } 6183df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::SDiv: 6193df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::SDIV); 6203df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::UDiv: 6213df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::UDIV); 6223df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::FDiv: 6233df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::FDIV); 6243df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::SRem: 6253df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::SREM); 6263df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::URem: 6273df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::UREM); 6283df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::FRem: 6293df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::FREM); 6303df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Shl: 6313df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::SHL); 6323df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::LShr: 6333df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::SRL); 6343df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::AShr: 6353df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::SRA); 6363df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::And: 6373df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::AND); 6383df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Or: 6393df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::OR); 6403df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Xor: 6413df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBinaryOp(I, ISD::XOR); 6423df24e667f04a7003342b534310919abc9c87418Dan Gohman 6433df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::GetElementPtr: 6443df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectGetElementPtr(I); 6453df24e667f04a7003342b534310919abc9c87418Dan Gohman 6463df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Br: { 6473df24e667f04a7003342b534310919abc9c87418Dan Gohman BranchInst *BI = cast<BranchInst>(I); 6483df24e667f04a7003342b534310919abc9c87418Dan Gohman 6493df24e667f04a7003342b534310919abc9c87418Dan Gohman if (BI->isUnconditional()) { 6503df24e667f04a7003342b534310919abc9c87418Dan Gohman BasicBlock *LLVMSucc = BI->getSuccessor(0); 6513df24e667f04a7003342b534310919abc9c87418Dan Gohman MachineBasicBlock *MSucc = MBBMap[LLVMSucc]; 652d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman FastEmitBranch(MSucc); 6533df24e667f04a7003342b534310919abc9c87418Dan Gohman return true; 6549d5b41624003daf259b33fc953aa471049700353Owen Anderson } 6553df24e667f04a7003342b534310919abc9c87418Dan Gohman 6563df24e667f04a7003342b534310919abc9c87418Dan Gohman // Conditional branches are not handed yet. 6573df24e667f04a7003342b534310919abc9c87418Dan Gohman // Halt "fast" selection and bail. 6583df24e667f04a7003342b534310919abc9c87418Dan Gohman return false; 659b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman } 660b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 661087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman case Instruction::Unreachable: 662087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman // Nothing to emit. 663087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman return true; 664087c8507e592bbbede1746f07bd44b28559e3684Dan Gohman 6653df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::PHI: 6663df24e667f04a7003342b534310919abc9c87418Dan Gohman // PHI nodes are already emitted. 6673df24e667f04a7003342b534310919abc9c87418Dan Gohman return true; 6680586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman 6690586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman case Instruction::Alloca: 6700586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman // FunctionLowering has the static-sized case covered. 6710586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman if (StaticAllocaMap.count(cast<AllocaInst>(I))) 6720586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman return true; 6730586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman 6740586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman // Dynamic-sized alloca is not handled yet. 6750586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman return false; 6763df24e667f04a7003342b534310919abc9c87418Dan Gohman 67733134c4a75558288d663267c8991f6bd37a530afDan Gohman case Instruction::Call: 67833134c4a75558288d663267c8991f6bd37a530afDan Gohman return SelectCall(I); 67933134c4a75558288d663267c8991f6bd37a530afDan Gohman 6803df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::BitCast: 6813df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectBitCast(I); 6823df24e667f04a7003342b534310919abc9c87418Dan Gohman 6833df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::FPToSI: 6843df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::FP_TO_SINT); 6853df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::ZExt: 6863df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::ZERO_EXTEND); 6873df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::SExt: 6883df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::SIGN_EXTEND); 6893df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::Trunc: 6903df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::TRUNCATE); 6913df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::SIToFP: 6923df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::SINT_TO_FP); 6933df24e667f04a7003342b534310919abc9c87418Dan Gohman 6943df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::IntToPtr: // Deliberate fall-through. 6953df24e667f04a7003342b534310919abc9c87418Dan Gohman case Instruction::PtrToInt: { 6963df24e667f04a7003342b534310919abc9c87418Dan Gohman MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType()); 6973df24e667f04a7003342b534310919abc9c87418Dan Gohman MVT DstVT = TLI.getValueType(I->getType()); 6983df24e667f04a7003342b534310919abc9c87418Dan Gohman if (DstVT.bitsGT(SrcVT)) 6993df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::ZERO_EXTEND); 7003df24e667f04a7003342b534310919abc9c87418Dan Gohman if (DstVT.bitsLT(SrcVT)) 7013df24e667f04a7003342b534310919abc9c87418Dan Gohman return SelectCast(I, ISD::TRUNCATE); 7023df24e667f04a7003342b534310919abc9c87418Dan Gohman unsigned Reg = getRegForValue(I->getOperand(0)); 7033df24e667f04a7003342b534310919abc9c87418Dan Gohman if (Reg == 0) return false; 7043df24e667f04a7003342b534310919abc9c87418Dan Gohman UpdateValueMap(I, Reg); 7053df24e667f04a7003342b534310919abc9c87418Dan Gohman return true; 7063df24e667f04a7003342b534310919abc9c87418Dan Gohman } 707d57dd5f4e6740520820bc0fca42a540e31c27a73Dan Gohman 7083df24e667f04a7003342b534310919abc9c87418Dan Gohman default: 7093df24e667f04a7003342b534310919abc9c87418Dan Gohman // Unhandled instruction. Halt "fast" selection and bail. 7103df24e667f04a7003342b534310919abc9c87418Dan Gohman return false; 7113df24e667f04a7003342b534310919abc9c87418Dan Gohman } 712b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 713b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 7143df24e667f04a7003342b534310919abc9c87418Dan GohmanFastISel::FastISel(MachineFunction &mf, 715d57dd5f4e6740520820bc0fca42a540e31c27a73Dan Gohman MachineModuleInfo *mmi, 71683489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DwarfWriter *dw, 7173df24e667f04a7003342b534310919abc9c87418Dan Gohman DenseMap<const Value *, unsigned> &vm, 7180586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman DenseMap<const BasicBlock *, MachineBasicBlock *> &bm, 719dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman DenseMap<const AllocaInst *, int> &am 720dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG 721dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman , SmallSet<Instruction*, 8> &cil 722dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif 723dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman ) 7243df24e667f04a7003342b534310919abc9c87418Dan Gohman : MBB(0), 7253df24e667f04a7003342b534310919abc9c87418Dan Gohman ValueMap(vm), 7263df24e667f04a7003342b534310919abc9c87418Dan Gohman MBBMap(bm), 7270586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman StaticAllocaMap(am), 728dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#ifndef NDEBUG 729dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman CatchInfoLost(cil), 730dd5b58ad7be78be90390074f0df138778af5c895Dan Gohman#endif 7313df24e667f04a7003342b534310919abc9c87418Dan Gohman MF(mf), 732d57dd5f4e6740520820bc0fca42a540e31c27a73Dan Gohman MMI(mmi), 73383489bb7700c69b7a4a8da59365c42d3f5c8129bDevang Patel DW(dw), 7343df24e667f04a7003342b534310919abc9c87418Dan Gohman MRI(MF.getRegInfo()), 7350586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman MFI(*MF.getFrameInfo()), 7360586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman MCP(*MF.getConstantPool()), 7373df24e667f04a7003342b534310919abc9c87418Dan Gohman TM(MF.getTarget()), 73822bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman TD(*TM.getTargetData()), 73922bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman TII(*TM.getInstrInfo()), 74022bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman TLI(*TM.getTargetLowering()) { 741bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman} 742bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman 743e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan GohmanFastISel::~FastISel() {} 744e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan Gohman 74536fd941fc029c6ea50ed08d26a2bfe4932b9789cEvan Chengunsigned FastISel::FastEmit_(MVT::SimpleValueType, MVT::SimpleValueType, 74636fd941fc029c6ea50ed08d26a2bfe4932b9789cEvan Cheng ISD::NodeType) { 747b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 748b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 749b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 7500f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Andersonunsigned FastISel::FastEmit_r(MVT::SimpleValueType, MVT::SimpleValueType, 7510f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISD::NodeType, unsigned /*Op0*/) { 752b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 753b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 754b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 7550f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Andersonunsigned FastISel::FastEmit_rr(MVT::SimpleValueType, MVT::SimpleValueType, 7560f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISD::NodeType, unsigned /*Op0*/, 7570f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson unsigned /*Op0*/) { 758b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 759b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 760b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 7610f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Andersonunsigned FastISel::FastEmit_i(MVT::SimpleValueType, MVT::SimpleValueType, 7620f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISD::NodeType, uint64_t /*Imm*/) { 76383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return 0; 76483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 76583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 76610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohmanunsigned FastISel::FastEmit_f(MVT::SimpleValueType, MVT::SimpleValueType, 76710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman ISD::NodeType, ConstantFP * /*FPImm*/) { 76810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return 0; 76910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman} 77010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 7710f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Andersonunsigned FastISel::FastEmit_ri(MVT::SimpleValueType, MVT::SimpleValueType, 7720f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISD::NodeType, unsigned /*Op0*/, 7730f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson uint64_t /*Imm*/) { 774d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return 0; 775d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 776d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 77710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohmanunsigned FastISel::FastEmit_rf(MVT::SimpleValueType, MVT::SimpleValueType, 77810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman ISD::NodeType, unsigned /*Op0*/, 77910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman ConstantFP * /*FPImm*/) { 78010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return 0; 78110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman} 78210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 7830f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Andersonunsigned FastISel::FastEmit_rri(MVT::SimpleValueType, MVT::SimpleValueType, 7840f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson ISD::NodeType, 785d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned /*Op0*/, unsigned /*Op1*/, 786d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman uint64_t /*Imm*/) { 78783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return 0; 78883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 78983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 79083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries 79183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// to emit an instruction with an immediate operand using FastEmit_ri. 79283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// If that fails, it materializes the immediate into a register and try 79383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_rr instead. 79483785c80968165b30fcdd111ceb2c28d38bcff86Evan Chengunsigned FastISel::FastEmit_ri_(MVT::SimpleValueType VT, ISD::NodeType Opcode, 795d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, uint64_t Imm, 796d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman MVT::SimpleValueType ImmType) { 79783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // First check if immediate type is legal. If not, we can't use the ri form. 798151ed61a2f9c3482d35a54d502e7cd147f22a21bDan Gohman unsigned ResultReg = FastEmit_ri(VT, VT, Opcode, Op0, Imm); 79983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (ResultReg != 0) 80083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return ResultReg; 8010f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson unsigned MaterialReg = FastEmit_i(ImmType, ImmType, ISD::Constant, Imm); 802d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (MaterialReg == 0) 803d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return 0; 8040f84e4e31009eecf2dfcbe6113b65d0919f30254Owen Anderson return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg); 805d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 806d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 80710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// FastEmit_rf_ - This method is a wrapper of FastEmit_ri. It first tries 80810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// to emit an instruction with a floating-point immediate operand using 80910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// FastEmit_rf. If that fails, it materializes the immediate into a register 81010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman/// and try FastEmit_rr instead. 81110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohmanunsigned FastISel::FastEmit_rf_(MVT::SimpleValueType VT, ISD::NodeType Opcode, 81210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman unsigned Op0, ConstantFP *FPImm, 81310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman MVT::SimpleValueType ImmType) { 81410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman // First check if immediate type is legal. If not, we can't use the rf form. 815151ed61a2f9c3482d35a54d502e7cd147f22a21bDan Gohman unsigned ResultReg = FastEmit_rf(VT, VT, Opcode, Op0, FPImm); 81610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman if (ResultReg != 0) 81710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return ResultReg; 81810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 81910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman // Materialize the constant in a register. 82010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman unsigned MaterialReg = FastEmit_f(ImmType, ImmType, ISD::ConstantFP, FPImm); 82110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman if (MaterialReg == 0) { 82296a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // If the target doesn't have a way to directly enter a floating-point 82396a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // value into a register, use an alternate approach. 82496a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // TODO: The current approach only supports floating-point constants 82596a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // that can be constructed by conversion from integer values. This should 82696a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // be replaced by code that creates a load from a constant-pool entry, 82796a9999d79345fa7bc7e2f2a3f28edef4c69e6b5Dan Gohman // which will require some target-specific work. 82810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman const APFloat &Flt = FPImm->getValueAPF(); 82910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman MVT IntVT = TLI.getPointerTy(); 83010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 83110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman uint64_t x[2]; 83210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman uint32_t IntBitWidth = IntVT.getSizeInBits(); 83323a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen bool isExact; 83423a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen (void) Flt.convertToInteger(x, IntBitWidth, /*isSigned=*/true, 83523a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen APFloat::rmTowardZero, &isExact); 83623a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen if (!isExact) 83710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return 0; 83810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman APInt IntVal(IntBitWidth, 2, x); 83910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 84010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman unsigned IntegerReg = FastEmit_i(IntVT.getSimpleVT(), IntVT.getSimpleVT(), 84110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman ISD::Constant, IntVal.getZExtValue()); 84210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman if (IntegerReg == 0) 84310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return 0; 84410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman MaterialReg = FastEmit_r(IntVT.getSimpleVT(), VT, 84510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman ISD::SINT_TO_FP, IntegerReg); 84610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman if (MaterialReg == 0) 84710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return 0; 84810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman } 84910df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg); 85010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman} 85110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 852d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::createResultReg(const TargetRegisterClass* RC) { 853d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return MRI.createVirtualRegister(RC); 85483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 85583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 856b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode, 85777ad79689d755c49146f534107421cb3d9703fedDan Gohman const TargetRegisterClass* RC) { 858d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 859bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 860b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 8619bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg); 862b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 863b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 864b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 865b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode, 866b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman const TargetRegisterClass *RC, 867b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned Op0) { 868d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 869bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 870b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 8715960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 8729bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0); 8735960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 8749bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0); 8755960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 8765960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 8775960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 8785960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 8795960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 8805960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng 881b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 882b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 883b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 884b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode, 885b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman const TargetRegisterClass *RC, 886b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned Op0, unsigned Op1) { 887d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 888bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 889b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 8905960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 8919bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addReg(Op1); 8925960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 8939bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0).addReg(Op1); 8945960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 8955960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 8965960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 8975960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 8985960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 899b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 900b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 901d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 902d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_ri(unsigned MachineInstOpcode, 903d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetRegisterClass *RC, 904d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, uint64_t Imm) { 905d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 906d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 907d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 9085960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 9099bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addImm(Imm); 9105960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 9119bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0).addImm(Imm); 9125960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 9135960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 9145960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 9155960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 9165960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 917d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return ResultReg; 918d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 919d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 92010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohmanunsigned FastISel::FastEmitInst_rf(unsigned MachineInstOpcode, 92110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman const TargetRegisterClass *RC, 92210df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman unsigned Op0, ConstantFP *FPImm) { 92310df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman unsigned ResultReg = createResultReg(RC); 92410df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 92510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 9265960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 9279bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addFPImm(FPImm); 9285960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 9299bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0).addFPImm(FPImm); 9305960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 9315960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 9325960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 9335960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 9345960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 93510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman return ResultReg; 93610df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman} 93710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman 938d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_rri(unsigned MachineInstOpcode, 939d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetRegisterClass *RC, 940d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, unsigned Op1, uint64_t Imm) { 941d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 942d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 943d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 9445960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 9459bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addReg(Op1).addImm(Imm); 9465960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 9479bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0).addReg(Op1).addImm(Imm); 9485960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 9495960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 9505960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 9515960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 9525960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 953d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return ResultReg; 954d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 9556d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson 9566d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Andersonunsigned FastISel::FastEmitInst_i(unsigned MachineInstOpcode, 9576d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson const TargetRegisterClass *RC, 9586d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson uint64_t Imm) { 9596d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson unsigned ResultReg = createResultReg(RC); 9606d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson const TargetInstrDesc &II = TII.get(MachineInstOpcode); 9616d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson 9625960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 9639bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addImm(Imm); 9645960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 9659bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addImm(Imm); 9665960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 9675960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 9685960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 9695960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 9705960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 9716d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson return ResultReg; 972b41aec54767a825ac54c8822e787700bb08a3460Evan Cheng} 9738970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson 974536ab130ec95cbb7bf30530251dafa7dfecc8471Evan Chengunsigned FastISel::FastEmitInst_extractsubreg(MVT::SimpleValueType RetVT, 975536ab130ec95cbb7bf30530251dafa7dfecc8471Evan Cheng unsigned Op0, uint32_t Idx) { 97640a468f24909792f000e3ccc1dda7a27b9c34b69Owen Anderson const TargetRegisterClass* RC = MRI.getRegClass(Op0); 9778970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson 978536ab130ec95cbb7bf30530251dafa7dfecc8471Evan Cheng unsigned ResultReg = createResultReg(TLI.getRegClassFor(RetVT)); 9798970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson const TargetInstrDesc &II = TII.get(TargetInstrInfo::EXTRACT_SUBREG); 9808970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson 9815960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (II.getNumDefs() >= 1) 9829bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II, ResultReg).addReg(Op0).addImm(Idx); 9835960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng else { 9849bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling BuildMI(MBB, DL, II).addReg(Op0).addImm(Idx); 9855960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 9865960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng II.ImplicitDefs[0], RC, RC); 9875960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng if (!InsertedCopy) 9885960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng ResultReg = 0; 9895960e4eb68be6b3bca6369f6a95d7de5ed8a9eadEvan Cheng } 9908970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson return ResultReg; 9918970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson} 99214ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman 99314ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman/// FastEmitZExtFromI1 - Emit MachineInstrs to compute the value of Op 99414ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman/// with all but the least significant bit set to zero. 99514ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohmanunsigned FastISel::FastEmitZExtFromI1(MVT::SimpleValueType VT, unsigned Op) { 99614ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman return FastEmit_ri(VT, VT, ISD::AND, Op, 1); 99714ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman} 998