Mips16ISelLowering.cpp revision f8b0a08b6a2e2f4eacdb05eae9a8dd704b692b55
1//===-- Mips16ISelLowering.h - Mips16 DAG Lowering Interface ----*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Subclass of MipsTargetLowering specialized for mips16. 11// 12//===----------------------------------------------------------------------===// 13#define DEBUG_TYPE "mips-lower" 14#include "Mips16ISelLowering.h" 15#include "MipsRegisterInfo.h" 16#include "MCTargetDesc/MipsBaseInfo.h" 17#include "llvm/CodeGen/MachineInstrBuilder.h" 18#include "llvm/Support/CommandLine.h" 19#include "llvm/Target/TargetInstrInfo.h" 20#include <set> 21 22using namespace llvm; 23 24static cl::opt<bool> 25Mips16HardFloat("mips16-hard-float", cl::NotHidden, 26 cl::desc("MIPS: mips16 hard float enable."), 27 cl::init(false)); 28 29static cl::opt<bool> DontExpandCondPseudos16( 30 "mips16-dont-expand-cond-pseudo", 31 cl::init(false), 32 cl::desc("Dont expand conditional move related " 33 "pseudos for Mips 16"), 34 cl::Hidden); 35 36namespace { 37 std::set<const char*, MipsTargetLowering::LTStr> NoHelperNeeded; 38} 39 40Mips16TargetLowering::Mips16TargetLowering(MipsTargetMachine &TM) 41 : MipsTargetLowering(TM) { 42 // 43 // set up as if mips32 and then revert so we can test the mechanism 44 // for switching 45 addRegisterClass(MVT::i32, &Mips::CPURegsRegClass); 46 addRegisterClass(MVT::f32, &Mips::FGR32RegClass); 47 computeRegisterProperties(); 48 clearRegisterClasses(); 49 50 // Set up the register classes 51 addRegisterClass(MVT::i32, &Mips::CPU16RegsRegClass); 52 53 if (Mips16HardFloat) 54 setMips16HardFloatLibCalls(); 55 56 setOperationAction(ISD::MEMBARRIER, MVT::Other, Expand); 57 setOperationAction(ISD::ATOMIC_FENCE, MVT::Other, Expand); 58 setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i32, Expand); 59 setOperationAction(ISD::ATOMIC_SWAP, MVT::i32, Expand); 60 setOperationAction(ISD::ATOMIC_LOAD_ADD, MVT::i32, Expand); 61 setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i32, Expand); 62 setOperationAction(ISD::ATOMIC_LOAD_AND, MVT::i32, Expand); 63 setOperationAction(ISD::ATOMIC_LOAD_OR, MVT::i32, Expand); 64 setOperationAction(ISD::ATOMIC_LOAD_XOR, MVT::i32, Expand); 65 setOperationAction(ISD::ATOMIC_LOAD_NAND, MVT::i32, Expand); 66 setOperationAction(ISD::ATOMIC_LOAD_MIN, MVT::i32, Expand); 67 setOperationAction(ISD::ATOMIC_LOAD_MAX, MVT::i32, Expand); 68 setOperationAction(ISD::ATOMIC_LOAD_UMIN, MVT::i32, Expand); 69 setOperationAction(ISD::ATOMIC_LOAD_UMAX, MVT::i32, Expand); 70 71 computeRegisterProperties(); 72} 73 74const MipsTargetLowering * 75llvm::createMips16TargetLowering(MipsTargetMachine &TM) { 76 return new Mips16TargetLowering(TM); 77} 78 79bool 80Mips16TargetLowering::allowsUnalignedMemoryAccesses(EVT VT, bool *Fast) const { 81 return false; 82} 83 84MachineBasicBlock * 85Mips16TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI, 86 MachineBasicBlock *BB) const { 87 switch (MI->getOpcode()) { 88 default: 89 return MipsTargetLowering::EmitInstrWithCustomInserter(MI, BB); 90 case Mips::SelBeqZ: 91 return emitSel16(Mips::BeqzRxImm16, MI, BB); 92 case Mips::SelBneZ: 93 return emitSel16(Mips::BnezRxImm16, MI, BB); 94 case Mips::SelTBteqZCmpi: 95 return emitSeliT16(Mips::BteqzX16, Mips::CmpiRxImmX16, MI, BB); 96 case Mips::SelTBteqZSlti: 97 return emitSeliT16(Mips::BteqzX16, Mips::SltiRxImmX16, MI, BB); 98 case Mips::SelTBteqZSltiu: 99 return emitSeliT16(Mips::BteqzX16, Mips::SltiuRxImmX16, MI, BB); 100 case Mips::SelTBtneZCmpi: 101 return emitSeliT16(Mips::BtnezX16, Mips::CmpiRxImmX16, MI, BB); 102 case Mips::SelTBtneZSlti: 103 return emitSeliT16(Mips::BtnezX16, Mips::SltiRxImmX16, MI, BB); 104 case Mips::SelTBtneZSltiu: 105 return emitSeliT16(Mips::BtnezX16, Mips::SltiuRxImmX16, MI, BB); 106 case Mips::SelTBteqZCmp: 107 return emitSelT16(Mips::BteqzX16, Mips::CmpRxRy16, MI, BB); 108 case Mips::SelTBteqZSlt: 109 return emitSelT16(Mips::BteqzX16, Mips::SltRxRy16, MI, BB); 110 case Mips::SelTBteqZSltu: 111 return emitSelT16(Mips::BteqzX16, Mips::SltuRxRy16, MI, BB); 112 case Mips::SelTBtneZCmp: 113 return emitSelT16(Mips::BtnezX16, Mips::CmpRxRy16, MI, BB); 114 case Mips::SelTBtneZSlt: 115 return emitSelT16(Mips::BtnezX16, Mips::SltRxRy16, MI, BB); 116 case Mips::SelTBtneZSltu: 117 return emitSelT16(Mips::BtnezX16, Mips::SltuRxRy16, MI, BB); 118 case Mips::BteqzT8CmpX16: 119 return emitFEXT_T8I816_ins(Mips::BteqzX16, Mips::CmpRxRy16, MI, BB); 120 case Mips::BteqzT8SltX16: 121 return emitFEXT_T8I816_ins(Mips::BteqzX16, Mips::SltRxRy16, MI, BB); 122 case Mips::BteqzT8SltuX16: 123 // TBD: figure out a way to get this or remove the instruction 124 // altogether. 125 return emitFEXT_T8I816_ins(Mips::BteqzX16, Mips::SltuRxRy16, MI, BB); 126 case Mips::BtnezT8CmpX16: 127 return emitFEXT_T8I816_ins(Mips::BtnezX16, Mips::CmpRxRy16, MI, BB); 128 case Mips::BtnezT8SltX16: 129 return emitFEXT_T8I816_ins(Mips::BtnezX16, Mips::SltRxRy16, MI, BB); 130 case Mips::BtnezT8SltuX16: 131 // TBD: figure out a way to get this or remove the instruction 132 // altogether. 133 return emitFEXT_T8I816_ins(Mips::BtnezX16, Mips::SltuRxRy16, MI, BB); 134 case Mips::BteqzT8CmpiX16: return emitFEXT_T8I8I16_ins( 135 Mips::BteqzX16, Mips::CmpiRxImm16, Mips::CmpiRxImmX16, MI, BB); 136 case Mips::BteqzT8SltiX16: return emitFEXT_T8I8I16_ins( 137 Mips::BteqzX16, Mips::SltiRxImm16, Mips::SltiRxImmX16, MI, BB); 138 case Mips::BteqzT8SltiuX16: return emitFEXT_T8I8I16_ins( 139 Mips::BteqzX16, Mips::SltiuRxImm16, Mips::SltiuRxImmX16, MI, BB); 140 case Mips::BtnezT8CmpiX16: return emitFEXT_T8I8I16_ins( 141 Mips::BtnezX16, Mips::CmpiRxImm16, Mips::CmpiRxImmX16, MI, BB); 142 case Mips::BtnezT8SltiX16: return emitFEXT_T8I8I16_ins( 143 Mips::BtnezX16, Mips::SltiRxImm16, Mips::SltiRxImmX16, MI, BB); 144 case Mips::BtnezT8SltiuX16: return emitFEXT_T8I8I16_ins( 145 Mips::BtnezX16, Mips::SltiuRxImm16, Mips::SltiuRxImmX16, MI, BB); 146 break; 147 case Mips::SltCCRxRy16: 148 return emitFEXT_CCRX16_ins(Mips::SltRxRy16, MI, BB); 149 break; 150 case Mips::SltiCCRxImmX16: 151 return emitFEXT_CCRXI16_ins 152 (Mips::SltiRxImm16, Mips::SltiRxImmX16, MI, BB); 153 case Mips::SltiuCCRxImmX16: 154 return emitFEXT_CCRXI16_ins 155 (Mips::SltiuRxImm16, Mips::SltiuRxImmX16, MI, BB); 156 case Mips::SltuCCRxRy16: 157 return emitFEXT_CCRX16_ins 158 (Mips::SltuRxRy16, MI, BB); 159 } 160} 161 162bool Mips16TargetLowering:: 163isEligibleForTailCallOptimization(const MipsCC &MipsCCInfo, 164 unsigned NextStackOffset, 165 const MipsFunctionInfo& FI) const { 166 // No tail call optimization for mips16. 167 return false; 168} 169 170void Mips16TargetLowering::setMips16LibcallName 171 (RTLIB::Libcall L, const char *Name) { 172 setLibcallName(L, Name); 173 NoHelperNeeded.insert(Name); 174} 175 176void Mips16TargetLowering::setMips16HardFloatLibCalls() { 177 setMips16LibcallName(RTLIB::ADD_F32, "__mips16_addsf3"); 178 setMips16LibcallName(RTLIB::ADD_F64, "__mips16_adddf3"); 179 setMips16LibcallName(RTLIB::SUB_F32, "__mips16_subsf3"); 180 setMips16LibcallName(RTLIB::SUB_F64, "__mips16_subdf3"); 181 setMips16LibcallName(RTLIB::MUL_F32, "__mips16_mulsf3"); 182 setMips16LibcallName(RTLIB::MUL_F64, "__mips16_muldf3"); 183 setMips16LibcallName(RTLIB::DIV_F32, "__mips16_divsf3"); 184 setMips16LibcallName(RTLIB::DIV_F64, "__mips16_divdf3"); 185 setMips16LibcallName(RTLIB::FPEXT_F32_F64, "__mips16_extendsfdf2"); 186 setMips16LibcallName(RTLIB::FPROUND_F64_F32, "__mips16_truncdfsf2"); 187 setMips16LibcallName(RTLIB::FPTOSINT_F32_I32, "__mips16_fix_truncsfsi"); 188 setMips16LibcallName(RTLIB::FPTOSINT_F64_I32, "__mips16_fix_truncdfsi"); 189 setMips16LibcallName(RTLIB::SINTTOFP_I32_F32, "__mips16_floatsisf"); 190 setMips16LibcallName(RTLIB::SINTTOFP_I32_F64, "__mips16_floatsidf"); 191 setMips16LibcallName(RTLIB::UINTTOFP_I32_F32, "__mips16_floatunsisf"); 192 setMips16LibcallName(RTLIB::UINTTOFP_I32_F64, "__mips16_floatunsidf"); 193 setMips16LibcallName(RTLIB::OEQ_F32, "__mips16_eqsf2"); 194 setMips16LibcallName(RTLIB::OEQ_F64, "__mips16_eqdf2"); 195 setMips16LibcallName(RTLIB::UNE_F32, "__mips16_nesf2"); 196 setMips16LibcallName(RTLIB::UNE_F64, "__mips16_nedf2"); 197 setMips16LibcallName(RTLIB::OGE_F32, "__mips16_gesf2"); 198 setMips16LibcallName(RTLIB::OGE_F64, "__mips16_gedf2"); 199 setMips16LibcallName(RTLIB::OLT_F32, "__mips16_ltsf2"); 200 setMips16LibcallName(RTLIB::OLT_F64, "__mips16_ltdf2"); 201 setMips16LibcallName(RTLIB::OLE_F32, "__mips16_lesf2"); 202 setMips16LibcallName(RTLIB::OLE_F64, "__mips16_ledf2"); 203 setMips16LibcallName(RTLIB::OGT_F32, "__mips16_gtsf2"); 204 setMips16LibcallName(RTLIB::OGT_F64, "__mips16_gtdf2"); 205 setMips16LibcallName(RTLIB::UO_F32, "__mips16_unordsf2"); 206 setMips16LibcallName(RTLIB::UO_F64, "__mips16_unorddf2"); 207 setMips16LibcallName(RTLIB::O_F32, "__mips16_unordsf2"); 208 setMips16LibcallName(RTLIB::O_F64, "__mips16_unorddf2"); 209} 210 211 212// 213// The Mips16 hard float is a crazy quilt inherited from gcc. I have a much 214// cleaner way to do all of this but it will have to wait until the traditional 215// gcc mechanism is completed. 216// 217// For Pic, in order for Mips16 code to call Mips32 code which according the abi 218// have either arguments or returned values placed in floating point registers, 219// we use a set of helper functions. (This includes functions which return type 220// complex which on Mips are returned in a pair of floating point registers). 221// 222// This is an encoding that we inherited from gcc. 223// In Mips traditional O32, N32 ABI, floating point numbers are passed in 224// floating point argument registers 1,2 only when the first and optionally 225// the second arguments are float (sf) or double (df). 226// For Mips16 we are only concerned with the situations where floating point 227// arguments are being passed in floating point registers by the ABI, because 228// Mips16 mode code cannot execute floating point instructions to load those 229// values and hence helper functions are needed. 230// The possibilities are (), (sf), (sf, sf), (sf, df), (df), (df, sf), (df, df) 231// the helper function suffixs for these are: 232// 0, 1, 5, 9, 2, 6, 10 233// this suffix can then be calculated as follows: 234// for a given argument Arg: 235// Arg1x, Arg2x = 1 : Arg is sf 236// 2 : Arg is df 237// 0: Arg is neither sf or df 238// So this stub is the string for number Arg1x + Arg2x*4. 239// However not all numbers between 0 and 10 are possible, we check anyway and 240// assert if the impossible exists. 241// 242 243unsigned int Mips16TargetLowering::getMips16HelperFunctionStubNumber 244 (ArgListTy &Args) const { 245 unsigned int resultNum = 0; 246 if (Args.size() >= 1) { 247 Type *t = Args[0].Ty; 248 if (t->isFloatTy()) { 249 resultNum = 1; 250 } 251 else if (t->isDoubleTy()) { 252 resultNum = 2; 253 } 254 } 255 if (resultNum) { 256 if (Args.size() >=2) { 257 Type *t = Args[1].Ty; 258 if (t->isFloatTy()) { 259 resultNum += 4; 260 } 261 else if (t->isDoubleTy()) { 262 resultNum += 8; 263 } 264 } 265 } 266 return resultNum; 267} 268 269// 270// prefixs are attached to stub numbers depending on the return type . 271// return type: float sf_ 272// double df_ 273// single complex sc_ 274// double complext dc_ 275// others NO PREFIX 276// 277// 278// The full name of a helper function is__mips16_call_stub + 279// return type dependent prefix + stub number 280// 281// 282// This is something that probably should be in a different source file and 283// perhaps done differently but my main purpose is to not waste runtime 284// on something that we can enumerate in the source. Another possibility is 285// to have a python script to generate these mapping tables. This will do 286// for now. There are a whole series of helper function mapping arrays, one 287// for each return type class as outlined above. There there are 11 possible 288// entries. Ones with 0 are ones which should never be selected 289// 290// All the arrays are similar except for ones which return neither 291// sf, df, sc, dc, in which only care about ones which have sf or df as a 292// first parameter. 293// 294#define P_ "__mips16_call_stub_" 295#define MAX_STUB_NUMBER 10 296#define T1 P "1", P "2", 0, 0, P "5", P "6", 0, 0, P "9", P "10" 297#define T P "0" , T1 298#define P P_ 299static char const * vMips16Helper[MAX_STUB_NUMBER+1] = 300 {0, T1 }; 301#undef P 302#define P P_ "sf_" 303static char const * sfMips16Helper[MAX_STUB_NUMBER+1] = 304 { T }; 305#undef P 306#define P P_ "df_" 307static char const * dfMips16Helper[MAX_STUB_NUMBER+1] = 308 { T }; 309#undef P 310#define P P_ "sc_" 311static char const * scMips16Helper[MAX_STUB_NUMBER+1] = 312 { T }; 313#undef P 314#define P P_ "dc_" 315static char const * dcMips16Helper[MAX_STUB_NUMBER+1] = 316 { T }; 317#undef P 318#undef P_ 319 320 321const char* Mips16TargetLowering:: 322 getMips16HelperFunction 323 (Type* RetTy, ArgListTy &Args, bool &needHelper) const { 324 const unsigned int stubNum = getMips16HelperFunctionStubNumber(Args); 325#ifndef NDEBUG 326 const unsigned int maxStubNum = 10; 327 assert(stubNum <= maxStubNum); 328 const bool validStubNum[maxStubNum+1] = 329 {true, true, true, false, false, true, true, false, false, true, true}; 330 assert(validStubNum[stubNum]); 331#endif 332 const char *result; 333 if (RetTy->isFloatTy()) { 334 result = sfMips16Helper[stubNum]; 335 } 336 else if (RetTy ->isDoubleTy()) { 337 result = dfMips16Helper[stubNum]; 338 } 339 else if (RetTy->isStructTy()) { 340 // check if it's complex 341 if (RetTy->getNumContainedTypes() == 2) { 342 if ((RetTy->getContainedType(0)->isFloatTy()) && 343 (RetTy->getContainedType(1)->isFloatTy())) { 344 result = scMips16Helper[stubNum]; 345 } 346 else if ((RetTy->getContainedType(0)->isDoubleTy()) && 347 (RetTy->getContainedType(1)->isDoubleTy())) { 348 result = dcMips16Helper[stubNum]; 349 } 350 else { 351 llvm_unreachable("Uncovered condition"); 352 } 353 } 354 else { 355 llvm_unreachable("Uncovered condition"); 356 } 357 } 358 else { 359 if (stubNum == 0) { 360 needHelper = false; 361 return ""; 362 } 363 result = vMips16Helper[stubNum]; 364 } 365 needHelper = true; 366 return result; 367} 368 369void Mips16TargetLowering:: 370getOpndList(SmallVectorImpl<SDValue> &Ops, 371 std::deque< std::pair<unsigned, SDValue> > &RegsToPass, 372 bool IsPICCall, bool GlobalOrExternal, bool InternalLinkage, 373 CallLoweringInfo &CLI, SDValue Callee, SDValue Chain) const { 374 SelectionDAG &DAG = CLI.DAG; 375 const char* Mips16HelperFunction = 0; 376 bool NeedMips16Helper = false; 377 378 if (getTargetMachine().Options.UseSoftFloat && Mips16HardFloat) { 379 // 380 // currently we don't have symbols tagged with the mips16 or mips32 381 // qualifier so we will assume that we don't know what kind it is. 382 // and generate the helper 383 // 384 bool LookupHelper = true; 385 if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(CLI.Callee)) { 386 if (NoHelperNeeded.find(S->getSymbol()) != NoHelperNeeded.end()) { 387 LookupHelper = false; 388 } 389 } 390 if (LookupHelper) Mips16HelperFunction = 391 getMips16HelperFunction(CLI.RetTy, CLI.Args, NeedMips16Helper); 392 393 } 394 395 SDValue JumpTarget = Callee; 396 397 // T9 should contain the address of the callee function if 398 // -reloction-model=pic or it is an indirect call. 399 if (IsPICCall || !GlobalOrExternal) { 400 unsigned V0Reg = Mips::V0; 401 if (NeedMips16Helper) { 402 RegsToPass.push_front(std::make_pair(V0Reg, Callee)); 403 JumpTarget = DAG.getExternalSymbol(Mips16HelperFunction, getPointerTy()); 404 JumpTarget = getAddrGlobal(JumpTarget, DAG, MipsII::MO_GOT); 405 } else 406 RegsToPass.push_front(std::make_pair((unsigned)Mips::T9, Callee)); 407 } 408 409 Ops.push_back(JumpTarget); 410 411 MipsTargetLowering::getOpndList(Ops, RegsToPass, IsPICCall, GlobalOrExternal, 412 InternalLinkage, CLI, Callee, Chain); 413} 414 415MachineBasicBlock *Mips16TargetLowering:: 416emitSel16(unsigned Opc, MachineInstr *MI, MachineBasicBlock *BB) const { 417 if (DontExpandCondPseudos16) 418 return BB; 419 const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); 420 DebugLoc DL = MI->getDebugLoc(); 421 // To "insert" a SELECT_CC instruction, we actually have to insert the 422 // diamond control-flow pattern. The incoming instruction knows the 423 // destination vreg to set, the condition code register to branch on, the 424 // true/false values to select between, and a branch opcode to use. 425 const BasicBlock *LLVM_BB = BB->getBasicBlock(); 426 MachineFunction::iterator It = BB; 427 ++It; 428 429 // thisMBB: 430 // ... 431 // TrueVal = ... 432 // setcc r1, r2, r3 433 // bNE r1, r0, copy1MBB 434 // fallthrough --> copy0MBB 435 MachineBasicBlock *thisMBB = BB; 436 MachineFunction *F = BB->getParent(); 437 MachineBasicBlock *copy0MBB = F->CreateMachineBasicBlock(LLVM_BB); 438 MachineBasicBlock *sinkMBB = F->CreateMachineBasicBlock(LLVM_BB); 439 F->insert(It, copy0MBB); 440 F->insert(It, sinkMBB); 441 442 // Transfer the remainder of BB and its successor edges to sinkMBB. 443 sinkMBB->splice(sinkMBB->begin(), BB, 444 llvm::next(MachineBasicBlock::iterator(MI)), 445 BB->end()); 446 sinkMBB->transferSuccessorsAndUpdatePHIs(BB); 447 448 // Next, add the true and fallthrough blocks as its successors. 449 BB->addSuccessor(copy0MBB); 450 BB->addSuccessor(sinkMBB); 451 452 BuildMI(BB, DL, TII->get(Opc)).addReg(MI->getOperand(3).getReg()) 453 .addMBB(sinkMBB); 454 455 // copy0MBB: 456 // %FalseValue = ... 457 // # fallthrough to sinkMBB 458 BB = copy0MBB; 459 460 // Update machine-CFG edges 461 BB->addSuccessor(sinkMBB); 462 463 // sinkMBB: 464 // %Result = phi [ %TrueValue, thisMBB ], [ %FalseValue, copy0MBB ] 465 // ... 466 BB = sinkMBB; 467 468 BuildMI(*BB, BB->begin(), DL, 469 TII->get(Mips::PHI), MI->getOperand(0).getReg()) 470 .addReg(MI->getOperand(1).getReg()).addMBB(thisMBB) 471 .addReg(MI->getOperand(2).getReg()).addMBB(copy0MBB); 472 473 MI->eraseFromParent(); // The pseudo instruction is gone now. 474 return BB; 475} 476 477MachineBasicBlock *Mips16TargetLowering::emitSelT16 478 (unsigned Opc1, unsigned Opc2, 479 MachineInstr *MI, MachineBasicBlock *BB) const { 480 if (DontExpandCondPseudos16) 481 return BB; 482 const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); 483 DebugLoc DL = MI->getDebugLoc(); 484 // To "insert" a SELECT_CC instruction, we actually have to insert the 485 // diamond control-flow pattern. The incoming instruction knows the 486 // destination vreg to set, the condition code register to branch on, the 487 // true/false values to select between, and a branch opcode to use. 488 const BasicBlock *LLVM_BB = BB->getBasicBlock(); 489 MachineFunction::iterator It = BB; 490 ++It; 491 492 // thisMBB: 493 // ... 494 // TrueVal = ... 495 // setcc r1, r2, r3 496 // bNE r1, r0, copy1MBB 497 // fallthrough --> copy0MBB 498 MachineBasicBlock *thisMBB = BB; 499 MachineFunction *F = BB->getParent(); 500 MachineBasicBlock *copy0MBB = F->CreateMachineBasicBlock(LLVM_BB); 501 MachineBasicBlock *sinkMBB = F->CreateMachineBasicBlock(LLVM_BB); 502 F->insert(It, copy0MBB); 503 F->insert(It, sinkMBB); 504 505 // Transfer the remainder of BB and its successor edges to sinkMBB. 506 sinkMBB->splice(sinkMBB->begin(), BB, 507 llvm::next(MachineBasicBlock::iterator(MI)), 508 BB->end()); 509 sinkMBB->transferSuccessorsAndUpdatePHIs(BB); 510 511 // Next, add the true and fallthrough blocks as its successors. 512 BB->addSuccessor(copy0MBB); 513 BB->addSuccessor(sinkMBB); 514 515 BuildMI(BB, DL, TII->get(Opc2)).addReg(MI->getOperand(3).getReg()) 516 .addReg(MI->getOperand(4).getReg()); 517 BuildMI(BB, DL, TII->get(Opc1)).addMBB(sinkMBB); 518 519 // copy0MBB: 520 // %FalseValue = ... 521 // # fallthrough to sinkMBB 522 BB = copy0MBB; 523 524 // Update machine-CFG edges 525 BB->addSuccessor(sinkMBB); 526 527 // sinkMBB: 528 // %Result = phi [ %TrueValue, thisMBB ], [ %FalseValue, copy0MBB ] 529 // ... 530 BB = sinkMBB; 531 532 BuildMI(*BB, BB->begin(), DL, 533 TII->get(Mips::PHI), MI->getOperand(0).getReg()) 534 .addReg(MI->getOperand(1).getReg()).addMBB(thisMBB) 535 .addReg(MI->getOperand(2).getReg()).addMBB(copy0MBB); 536 537 MI->eraseFromParent(); // The pseudo instruction is gone now. 538 return BB; 539 540} 541 542MachineBasicBlock *Mips16TargetLowering::emitSeliT16 543 (unsigned Opc1, unsigned Opc2, 544 MachineInstr *MI, MachineBasicBlock *BB) const { 545 if (DontExpandCondPseudos16) 546 return BB; 547 const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); 548 DebugLoc DL = MI->getDebugLoc(); 549 // To "insert" a SELECT_CC instruction, we actually have to insert the 550 // diamond control-flow pattern. The incoming instruction knows the 551 // destination vreg to set, the condition code register to branch on, the 552 // true/false values to select between, and a branch opcode to use. 553 const BasicBlock *LLVM_BB = BB->getBasicBlock(); 554 MachineFunction::iterator It = BB; 555 ++It; 556 557 // thisMBB: 558 // ... 559 // TrueVal = ... 560 // setcc r1, r2, r3 561 // bNE r1, r0, copy1MBB 562 // fallthrough --> copy0MBB 563 MachineBasicBlock *thisMBB = BB; 564 MachineFunction *F = BB->getParent(); 565 MachineBasicBlock *copy0MBB = F->CreateMachineBasicBlock(LLVM_BB); 566 MachineBasicBlock *sinkMBB = F->CreateMachineBasicBlock(LLVM_BB); 567 F->insert(It, copy0MBB); 568 F->insert(It, sinkMBB); 569 570 // Transfer the remainder of BB and its successor edges to sinkMBB. 571 sinkMBB->splice(sinkMBB->begin(), BB, 572 llvm::next(MachineBasicBlock::iterator(MI)), 573 BB->end()); 574 sinkMBB->transferSuccessorsAndUpdatePHIs(BB); 575 576 // Next, add the true and fallthrough blocks as its successors. 577 BB->addSuccessor(copy0MBB); 578 BB->addSuccessor(sinkMBB); 579 580 BuildMI(BB, DL, TII->get(Opc2)).addReg(MI->getOperand(3).getReg()) 581 .addImm(MI->getOperand(4).getImm()); 582 BuildMI(BB, DL, TII->get(Opc1)).addMBB(sinkMBB); 583 584 // copy0MBB: 585 // %FalseValue = ... 586 // # fallthrough to sinkMBB 587 BB = copy0MBB; 588 589 // Update machine-CFG edges 590 BB->addSuccessor(sinkMBB); 591 592 // sinkMBB: 593 // %Result = phi [ %TrueValue, thisMBB ], [ %FalseValue, copy0MBB ] 594 // ... 595 BB = sinkMBB; 596 597 BuildMI(*BB, BB->begin(), DL, 598 TII->get(Mips::PHI), MI->getOperand(0).getReg()) 599 .addReg(MI->getOperand(1).getReg()).addMBB(thisMBB) 600 .addReg(MI->getOperand(2).getReg()).addMBB(copy0MBB); 601 602 MI->eraseFromParent(); // The pseudo instruction is gone now. 603 return BB; 604 605} 606 607MachineBasicBlock 608 *Mips16TargetLowering::emitFEXT_T8I816_ins(unsigned BtOpc, unsigned CmpOpc, 609 MachineInstr *MI, 610 MachineBasicBlock *BB) const { 611 if (DontExpandCondPseudos16) 612 return BB; 613 const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); 614 unsigned regX = MI->getOperand(0).getReg(); 615 unsigned regY = MI->getOperand(1).getReg(); 616 MachineBasicBlock *target = MI->getOperand(2).getMBB(); 617 BuildMI(*BB, MI, MI->getDebugLoc(), TII->get(CmpOpc)).addReg(regX).addReg(regY); 618 BuildMI(*BB, MI, MI->getDebugLoc(), TII->get(BtOpc)).addMBB(target); 619 MI->eraseFromParent(); // The pseudo instruction is gone now. 620 return BB; 621} 622 623MachineBasicBlock *Mips16TargetLowering::emitFEXT_T8I8I16_ins( 624 unsigned BtOpc, unsigned CmpiOpc, unsigned CmpiXOpc, 625 MachineInstr *MI, MachineBasicBlock *BB) const { 626 if (DontExpandCondPseudos16) 627 return BB; 628 const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); 629 unsigned regX = MI->getOperand(0).getReg(); 630 int64_t imm = MI->getOperand(1).getImm(); 631 MachineBasicBlock *target = MI->getOperand(2).getMBB(); 632 unsigned CmpOpc; 633 if (isUInt<8>(imm)) 634 CmpOpc = CmpiOpc; 635 else if (isUInt<16>(imm)) 636 CmpOpc = CmpiXOpc; 637 else 638 llvm_unreachable("immediate field not usable"); 639 BuildMI(*BB, MI, MI->getDebugLoc(), TII->get(CmpOpc)).addReg(regX).addImm(imm); 640 BuildMI(*BB, MI, MI->getDebugLoc(), TII->get(BtOpc)).addMBB(target); 641 MI->eraseFromParent(); // The pseudo instruction is gone now. 642 return BB; 643} 644 645static unsigned Mips16WhichOp8uOr16simm 646 (unsigned shortOp, unsigned longOp, int64_t Imm) { 647 if (isUInt<8>(Imm)) 648 return shortOp; 649 else if (isInt<16>(Imm)) 650 return longOp; 651 else 652 llvm_unreachable("immediate field not usable"); 653} 654 655MachineBasicBlock *Mips16TargetLowering::emitFEXT_CCRX16_ins( 656 unsigned SltOpc, 657 MachineInstr *MI, MachineBasicBlock *BB) const { 658 if (DontExpandCondPseudos16) 659 return BB; 660 const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); 661 unsigned CC = MI->getOperand(0).getReg(); 662 unsigned regX = MI->getOperand(1).getReg(); 663 unsigned regY = MI->getOperand(2).getReg(); 664 BuildMI(*BB, MI, MI->getDebugLoc(), 665 TII->get(SltOpc)).addReg(regX).addReg(regY); 666 BuildMI(*BB, MI, MI->getDebugLoc(), 667 TII->get(Mips::MoveR3216), CC).addReg(Mips::T8); 668 MI->eraseFromParent(); // The pseudo instruction is gone now. 669 return BB; 670} 671 672MachineBasicBlock *Mips16TargetLowering::emitFEXT_CCRXI16_ins( 673 unsigned SltiOpc, unsigned SltiXOpc, 674 MachineInstr *MI, MachineBasicBlock *BB )const { 675 if (DontExpandCondPseudos16) 676 return BB; 677 const TargetInstrInfo *TII = getTargetMachine().getInstrInfo(); 678 unsigned CC = MI->getOperand(0).getReg(); 679 unsigned regX = MI->getOperand(1).getReg(); 680 int64_t Imm = MI->getOperand(2).getImm(); 681 unsigned SltOpc = Mips16WhichOp8uOr16simm(SltiOpc, SltiXOpc, Imm); 682 BuildMI(*BB, MI, MI->getDebugLoc(), 683 TII->get(SltOpc)).addReg(regX).addImm(Imm); 684 BuildMI(*BB, MI, MI->getDebugLoc(), 685 TII->get(Mips::MoveR3216), CC).addReg(Mips::T8); 686 MI->eraseFromParent(); // The pseudo instruction is gone now. 687 return BB; 688 689} 690