ARMISelDAGToDAG.cpp revision 0505be03adf561afbd8307516125da10dba8f0c4
1//===-- ARMISelDAGToDAG.cpp - A dag to dag inst selector for ARM ----------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by Chris Lattner and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines an instruction selector for the ARM target. 11// 12//===----------------------------------------------------------------------===// 13 14#include "ARM.h" 15#include "ARMTargetMachine.h" 16#include "llvm/CallingConv.h" 17#include "llvm/DerivedTypes.h" 18#include "llvm/Function.h" 19#include "llvm/Constants.h" 20#include "llvm/Intrinsics.h" 21#include "llvm/CodeGen/MachineFrameInfo.h" 22#include "llvm/CodeGen/MachineFunction.h" 23#include "llvm/CodeGen/MachineInstrBuilder.h" 24#include "llvm/CodeGen/SelectionDAG.h" 25#include "llvm/CodeGen/SelectionDAGISel.h" 26#include "llvm/CodeGen/SSARegMap.h" 27#include "llvm/Target/TargetLowering.h" 28#include "llvm/Support/Debug.h" 29#include <iostream> 30#include <vector> 31using namespace llvm; 32 33namespace { 34 class ARMTargetLowering : public TargetLowering { 35 int VarArgsFrameIndex; // FrameIndex for start of varargs area. 36 public: 37 ARMTargetLowering(TargetMachine &TM); 38 virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG); 39 virtual const char *getTargetNodeName(unsigned Opcode) const; 40 }; 41 42} 43 44ARMTargetLowering::ARMTargetLowering(TargetMachine &TM) 45 : TargetLowering(TM) { 46 addRegisterClass(MVT::i32, ARM::IntRegsRegisterClass); 47 addRegisterClass(MVT::f32, ARM::FPRegsRegisterClass); 48 addRegisterClass(MVT::f64, ARM::DFPRegsRegisterClass); 49 50 setLoadXAction(ISD::EXTLOAD, MVT::f32, Expand); 51 52 setOperationAction(ISD::FP_TO_SINT, MVT::i32, Custom); 53 setOperationAction(ISD::SINT_TO_FP, MVT::i32, Custom); 54 55 setOperationAction(ISD::FP_TO_UINT, MVT::i32, Custom); 56 setOperationAction(ISD::UINT_TO_FP, MVT::i32, Custom); 57 58 setOperationAction(ISD::RET, MVT::Other, Custom); 59 setOperationAction(ISD::GlobalAddress, MVT::i32, Custom); 60 setOperationAction(ISD::ConstantPool, MVT::i32, Custom); 61 62 setOperationAction(ISD::SELECT, MVT::i32, Expand); 63 64 setOperationAction(ISD::SETCC, MVT::i32, Expand); 65 setOperationAction(ISD::SETCC, MVT::f32, Expand); 66 setOperationAction(ISD::SETCC, MVT::f64, Expand); 67 68 setOperationAction(ISD::SELECT_CC, MVT::i32, Custom); 69 setOperationAction(ISD::BR_CC, MVT::i32, Custom); 70 setOperationAction(ISD::BR_CC, MVT::f32, Custom); 71 setOperationAction(ISD::BR_CC, MVT::f64, Custom); 72 73 setOperationAction(ISD::BRCOND, MVT::Other, Expand); 74 75 setOperationAction(ISD::SHL_PARTS, MVT::i32, Expand); 76 setOperationAction(ISD::SRA_PARTS, MVT::i32, Expand); 77 setOperationAction(ISD::SRL_PARTS, MVT::i32, Expand); 78 79 setOperationAction(ISD::VASTART, MVT::Other, Custom); 80 setOperationAction(ISD::VAEND, MVT::Other, Expand); 81 82 setOperationAction(ISD::ConstantFP, MVT::f64, Expand); 83 setOperationAction(ISD::ConstantFP, MVT::f32, Expand); 84 85 setSchedulingPreference(SchedulingForRegPressure); 86 computeRegisterProperties(); 87} 88 89namespace llvm { 90 namespace ARMISD { 91 enum NodeType { 92 // Start the numbering where the builting ops and target ops leave off. 93 FIRST_NUMBER = ISD::BUILTIN_OP_END+ARM::INSTRUCTION_LIST_END, 94 /// CALL - A direct function call. 95 CALL, 96 97 /// Return with a flag operand. 98 RET_FLAG, 99 100 CMP, 101 102 SELECT, 103 104 BR, 105 106 FSITOS, 107 FTOSIS, 108 109 FSITOD, 110 FTOSID, 111 112 FUITOS, 113 FTOUIS, 114 115 FUITOD, 116 FTOUID, 117 118 FMRRD, 119 120 FMDRR, 121 122 FMSTAT 123 }; 124 } 125} 126 127/// DAGFPCCToARMCC - Convert a DAG fp condition code to an ARM CC 128// Unordered = !N & !Z & C & V = V 129// Ordered = N | Z | !C | !V = N | Z | !V 130static ARMCC::CondCodes DAGFPCCToARMCC(ISD::CondCode CC) { 131 switch (CC) { 132 default: 133 assert(0 && "Unknown fp condition code!"); 134// SETOEQ = (N | Z | !V) & Z = Z = EQ 135 case ISD::SETEQ: 136 case ISD::SETOEQ: return ARMCC::EQ; 137// SETOGT = (N | Z | !V) & !N & !Z = !V &!N &!Z = (N = V) & !Z = GT 138 case ISD::SETGT: 139 case ISD::SETOGT: return ARMCC::GT; 140// SETOGE = (N | Z | !V) & !N = (Z | !V) & !N = !V & !N = GE 141 case ISD::SETGE: 142 case ISD::SETOGE: return ARMCC::GE; 143// SETOLT = (N | Z | !V) & N = N = MI 144 case ISD::SETLT: 145 case ISD::SETOLT: return ARMCC::MI; 146// SETOLE = (N | Z | !V) & (N | Z) = N | Z = !C | Z = LS 147 case ISD::SETLE: 148 case ISD::SETOLE: return ARMCC::LS; 149// SETONE = (N | Z | !V) & !Z = (N | !V) & Z = !V & Z = Z = NE 150 case ISD::SETNE: 151 case ISD::SETONE: return ARMCC::NE; 152// SETO = N | Z | !V = Z | !V = !V = VC 153 case ISD::SETO: return ARMCC::VC; 154// SETUO = V = VS 155 case ISD::SETUO: return ARMCC::VS; 156// SETUEQ = V | Z = ?? 157// SETUGT = V | (!Z & !N) = !Z & !N = !Z & C = HI 158 case ISD::SETUGT: return ARMCC::HI; 159// SETUGE = V | !N = !N = PL 160 case ISD::SETUGE: return ARMCC::PL; 161// SETULT = V | N = ?? 162// SETULE = V | Z | N = ?? 163// SETUNE = V | !Z = !Z = NE 164 case ISD::SETUNE: return ARMCC::NE; 165 } 166} 167 168/// DAGIntCCToARMCC - Convert a DAG integer condition code to an ARM CC 169static ARMCC::CondCodes DAGIntCCToARMCC(ISD::CondCode CC) { 170 switch (CC) { 171 default: 172 assert(0 && "Unknown integer condition code!"); 173 case ISD::SETEQ: return ARMCC::EQ; 174 case ISD::SETNE: return ARMCC::NE; 175 case ISD::SETLT: return ARMCC::LT; 176 case ISD::SETLE: return ARMCC::LE; 177 case ISD::SETGT: return ARMCC::GT; 178 case ISD::SETGE: return ARMCC::GE; 179 case ISD::SETULT: return ARMCC::CC; 180 case ISD::SETULE: return ARMCC::LS; 181 case ISD::SETUGT: return ARMCC::HI; 182 case ISD::SETUGE: return ARMCC::CS; 183 } 184} 185 186const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const { 187 switch (Opcode) { 188 default: return 0; 189 case ARMISD::CALL: return "ARMISD::CALL"; 190 case ARMISD::RET_FLAG: return "ARMISD::RET_FLAG"; 191 case ARMISD::SELECT: return "ARMISD::SELECT"; 192 case ARMISD::CMP: return "ARMISD::CMP"; 193 case ARMISD::BR: return "ARMISD::BR"; 194 case ARMISD::FSITOS: return "ARMISD::FSITOS"; 195 case ARMISD::FTOSIS: return "ARMISD::FTOSIS"; 196 case ARMISD::FSITOD: return "ARMISD::FSITOD"; 197 case ARMISD::FTOSID: return "ARMISD::FTOSID"; 198 case ARMISD::FUITOS: return "ARMISD::FUITOS"; 199 case ARMISD::FTOUIS: return "ARMISD::FTOUIS"; 200 case ARMISD::FUITOD: return "ARMISD::FUITOD"; 201 case ARMISD::FTOUID: return "ARMISD::FTOUID"; 202 case ARMISD::FMRRD: return "ARMISD::FMRRD"; 203 case ARMISD::FMDRR: return "ARMISD::FMDRR"; 204 case ARMISD::FMSTAT: return "ARMISD::FMSTAT"; 205 } 206} 207 208class ArgumentLayout { 209 std::vector<bool> is_reg; 210 std::vector<unsigned> pos; 211 std::vector<MVT::ValueType> types; 212public: 213 ArgumentLayout(const std::vector<MVT::ValueType> &Types) { 214 types = Types; 215 216 unsigned RegNum = 0; 217 unsigned StackOffset = 0; 218 for(std::vector<MVT::ValueType>::const_iterator I = Types.begin(); 219 I != Types.end(); 220 ++I) { 221 MVT::ValueType VT = *I; 222 assert(VT == MVT::i32 || VT == MVT::f32 || VT == MVT::f64); 223 unsigned size = MVT::getSizeInBits(VT)/32; 224 225 RegNum = ((RegNum + size - 1) / size) * size; 226 if (RegNum < 4) { 227 pos.push_back(RegNum); 228 is_reg.push_back(true); 229 RegNum += size; 230 } else { 231 unsigned bytes = size * 32/8; 232 StackOffset = ((StackOffset + bytes - 1) / bytes) * bytes; 233 pos.push_back(StackOffset); 234 is_reg.push_back(false); 235 StackOffset += bytes; 236 } 237 } 238 } 239 unsigned getRegisterNum(unsigned argNum) { 240 assert(isRegister(argNum)); 241 return pos[argNum]; 242 } 243 unsigned getOffset(unsigned argNum) { 244 assert(isOffset(argNum)); 245 return pos[argNum]; 246 } 247 unsigned isRegister(unsigned argNum) { 248 assert(argNum < is_reg.size()); 249 return is_reg[argNum]; 250 } 251 unsigned isOffset(unsigned argNum) { 252 return !isRegister(argNum); 253 } 254 MVT::ValueType getType(unsigned argNum) { 255 assert(argNum < types.size()); 256 return types[argNum]; 257 } 258 unsigned getStackSize(void) { 259 int last = is_reg.size() - 1; 260 if (last < 0) 261 return 0; 262 if (isRegister(last)) 263 return 0; 264 return getOffset(last) + MVT::getSizeInBits(getType(last))/8; 265 } 266 int lastRegArg(void) { 267 int size = is_reg.size(); 268 int last = 0; 269 while(last < size && isRegister(last)) 270 last++; 271 last--; 272 return last; 273 } 274 int lastRegNum(void) { 275 int l = lastRegArg(); 276 if (l < 0) 277 return -1; 278 unsigned r = getRegisterNum(l); 279 MVT::ValueType t = getType(l); 280 assert(t == MVT::i32 || t == MVT::f32 || t == MVT::f64); 281 if (t == MVT::f64) 282 return r + 1; 283 return r; 284 } 285}; 286 287// This transforms a ISD::CALL node into a 288// callseq_star <- ARMISD:CALL <- callseq_end 289// chain 290static SDOperand LowerCALL(SDOperand Op, SelectionDAG &DAG) { 291 SDOperand Chain = Op.getOperand(0); 292 unsigned CallConv = cast<ConstantSDNode>(Op.getOperand(1))->getValue(); 293 assert(CallConv == CallingConv::C && "unknown calling convention"); 294 bool isVarArg = cast<ConstantSDNode>(Op.getOperand(2))->getValue() != 0; 295 bool isTailCall = cast<ConstantSDNode>(Op.getOperand(3))->getValue() != 0; 296 SDOperand Callee = Op.getOperand(4); 297 unsigned NumOps = (Op.getNumOperands() - 5) / 2; 298 SDOperand StackPtr = DAG.getRegister(ARM::R13, MVT::i32); 299 static const unsigned regs[] = { 300 ARM::R0, ARM::R1, ARM::R2, ARM::R3 301 }; 302 303 std::vector<MVT::ValueType> Types; 304 for (unsigned i = 0; i < NumOps; ++i) { 305 MVT::ValueType VT = Op.getOperand(5+2*i).getValueType(); 306 Types.push_back(VT); 307 } 308 ArgumentLayout Layout(Types); 309 310 unsigned NumBytes = Layout.getStackSize(); 311 312 Chain = DAG.getCALLSEQ_START(Chain, 313 DAG.getConstant(NumBytes, MVT::i32)); 314 315 //Build a sequence of stores 316 std::vector<SDOperand> MemOpChains; 317 for (unsigned i = Layout.lastRegArg() + 1; i < NumOps; ++i) { 318 SDOperand Arg = Op.getOperand(5+2*i); 319 unsigned ArgOffset = Layout.getOffset(i); 320 SDOperand PtrOff = DAG.getConstant(ArgOffset, StackPtr.getValueType()); 321 PtrOff = DAG.getNode(ISD::ADD, MVT::i32, StackPtr, PtrOff); 322 MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0)); 323 } 324 if (!MemOpChains.empty()) 325 Chain = DAG.getNode(ISD::TokenFactor, MVT::Other, 326 &MemOpChains[0], MemOpChains.size()); 327 328 // If the callee is a GlobalAddress node (quite common, every direct call is) 329 // turn it into a TargetGlobalAddress node so that legalize doesn't hack it. 330 // Likewise ExternalSymbol -> TargetExternalSymbol. 331 assert(Callee.getValueType() == MVT::i32); 332 if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) 333 Callee = DAG.getTargetGlobalAddress(G->getGlobal(), MVT::i32); 334 else if (ExternalSymbolSDNode *E = dyn_cast<ExternalSymbolSDNode>(Callee)) 335 Callee = DAG.getTargetExternalSymbol(E->getSymbol(), MVT::i32); 336 337 // If this is a direct call, pass the chain and the callee. 338 assert (Callee.Val); 339 std::vector<SDOperand> Ops; 340 Ops.push_back(Chain); 341 Ops.push_back(Callee); 342 343 // Build a sequence of copy-to-reg nodes chained together with token chain 344 // and flag operands which copy the outgoing args into the appropriate regs. 345 SDOperand InFlag; 346 for (int i = 0, e = Layout.lastRegArg(); i <= e; ++i) { 347 SDOperand Arg = Op.getOperand(5+2*i); 348 unsigned RegNum = Layout.getRegisterNum(i); 349 unsigned Reg1 = regs[RegNum]; 350 MVT::ValueType VT = Layout.getType(i); 351 assert(VT == Arg.getValueType()); 352 assert(VT == MVT::i32 || VT == MVT::f32 || VT == MVT::f64); 353 354 // Add argument register to the end of the list so that it is known live 355 // into the call. 356 Ops.push_back(DAG.getRegister(Reg1, MVT::i32)); 357 if (VT == MVT::f64) { 358 unsigned Reg2 = regs[RegNum + 1]; 359 SDOperand SDReg1 = DAG.getRegister(Reg1, MVT::i32); 360 SDOperand SDReg2 = DAG.getRegister(Reg2, MVT::i32); 361 362 Ops.push_back(DAG.getRegister(Reg2, MVT::i32)); 363 SDVTList VTs = DAG.getVTList(MVT::Other, MVT::Flag); 364 SDOperand Ops[] = {Chain, SDReg1, SDReg2, Arg, InFlag}; 365 Chain = DAG.getNode(ARMISD::FMRRD, VTs, Ops, InFlag.Val ? 5 : 4); 366 } else { 367 if (VT == MVT::f32) 368 Arg = DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Arg); 369 Chain = DAG.getCopyToReg(Chain, Reg1, Arg, InFlag); 370 } 371 InFlag = Chain.getValue(1); 372 } 373 374 std::vector<MVT::ValueType> NodeTys; 375 NodeTys.push_back(MVT::Other); // Returns a chain 376 NodeTys.push_back(MVT::Flag); // Returns a flag for retval copy to use. 377 378 unsigned CallOpc = ARMISD::CALL; 379 if (InFlag.Val) 380 Ops.push_back(InFlag); 381 Chain = DAG.getNode(CallOpc, NodeTys, &Ops[0], Ops.size()); 382 InFlag = Chain.getValue(1); 383 384 std::vector<SDOperand> ResultVals; 385 NodeTys.clear(); 386 387 // If the call has results, copy the values out of the ret val registers. 388 MVT::ValueType VT = Op.Val->getValueType(0); 389 if (VT != MVT::Other) { 390 assert(VT == MVT::i32 || VT == MVT::f32 || VT == MVT::f64); 391 392 SDOperand Value1 = DAG.getCopyFromReg(Chain, ARM::R0, MVT::i32, InFlag); 393 Chain = Value1.getValue(1); 394 InFlag = Value1.getValue(2); 395 NodeTys.push_back(VT); 396 if (VT == MVT::i32) { 397 ResultVals.push_back(Value1); 398 if (Op.Val->getValueType(1) == MVT::i32) { 399 SDOperand Value2 = DAG.getCopyFromReg(Chain, ARM::R1, MVT::i32, InFlag); 400 Chain = Value2.getValue(1); 401 ResultVals.push_back(Value2); 402 NodeTys.push_back(VT); 403 } 404 } 405 if (VT == MVT::f32) { 406 SDOperand Value = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, Value1); 407 ResultVals.push_back(Value); 408 } 409 if (VT == MVT::f64) { 410 SDOperand Value2 = DAG.getCopyFromReg(Chain, ARM::R1, MVT::i32, InFlag); 411 Chain = Value2.getValue(1); 412 SDOperand Value = DAG.getNode(ARMISD::FMDRR, MVT::f64, Value1, Value2); 413 ResultVals.push_back(Value); 414 } 415 } 416 417 Chain = DAG.getNode(ISD::CALLSEQ_END, MVT::Other, Chain, 418 DAG.getConstant(NumBytes, MVT::i32)); 419 NodeTys.push_back(MVT::Other); 420 421 if (ResultVals.empty()) 422 return Chain; 423 424 ResultVals.push_back(Chain); 425 SDOperand Res = DAG.getNode(ISD::MERGE_VALUES, NodeTys, &ResultVals[0], 426 ResultVals.size()); 427 return Res.getValue(Op.ResNo); 428} 429 430static SDOperand LowerRET(SDOperand Op, SelectionDAG &DAG) { 431 SDOperand Copy; 432 SDOperand Chain = Op.getOperand(0); 433 SDOperand R0 = DAG.getRegister(ARM::R0, MVT::i32); 434 SDOperand R1 = DAG.getRegister(ARM::R1, MVT::i32); 435 436 switch(Op.getNumOperands()) { 437 default: 438 assert(0 && "Do not know how to return this many arguments!"); 439 abort(); 440 case 1: { 441 SDOperand LR = DAG.getRegister(ARM::R14, MVT::i32); 442 return DAG.getNode(ARMISD::RET_FLAG, MVT::Other, Chain); 443 } 444 case 3: { 445 SDOperand Val = Op.getOperand(1); 446 assert(Val.getValueType() == MVT::i32 || 447 Val.getValueType() == MVT::f32 || 448 Val.getValueType() == MVT::f64); 449 450 if (Val.getValueType() == MVT::f64) { 451 SDVTList VTs = DAG.getVTList(MVT::Other, MVT::Flag); 452 SDOperand Ops[] = {Chain, R0, R1, Val}; 453 Copy = DAG.getNode(ARMISD::FMRRD, VTs, Ops, 4); 454 } else { 455 if (Val.getValueType() == MVT::f32) 456 Val = DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Val); 457 Copy = DAG.getCopyToReg(Chain, R0, Val, SDOperand()); 458 } 459 460 if (DAG.getMachineFunction().liveout_empty()) { 461 DAG.getMachineFunction().addLiveOut(ARM::R0); 462 if (Val.getValueType() == MVT::f64) 463 DAG.getMachineFunction().addLiveOut(ARM::R1); 464 } 465 break; 466 } 467 case 5: 468 Copy = DAG.getCopyToReg(Chain, ARM::R1, Op.getOperand(3), SDOperand()); 469 Copy = DAG.getCopyToReg(Copy, ARM::R0, Op.getOperand(1), Copy.getValue(1)); 470 // If we haven't noted the R0+R1 are live out, do so now. 471 if (DAG.getMachineFunction().liveout_empty()) { 472 DAG.getMachineFunction().addLiveOut(ARM::R0); 473 DAG.getMachineFunction().addLiveOut(ARM::R1); 474 } 475 break; 476 } 477 478 //We must use RET_FLAG instead of BRIND because BRIND doesn't have a flag 479 return DAG.getNode(ARMISD::RET_FLAG, MVT::Other, Copy, Copy.getValue(1)); 480} 481 482static SDOperand LowerConstantPool(SDOperand Op, SelectionDAG &DAG) { 483 MVT::ValueType PtrVT = Op.getValueType(); 484 ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op); 485 Constant *C = CP->getConstVal(); 486 SDOperand CPI = DAG.getTargetConstantPool(C, PtrVT, CP->getAlignment()); 487 488 return CPI; 489} 490 491static SDOperand LowerGlobalAddress(SDOperand Op, 492 SelectionDAG &DAG) { 493 GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal(); 494 int alignment = 2; 495 SDOperand CPAddr = DAG.getConstantPool(GV, MVT::i32, alignment); 496 return DAG.getLoad(MVT::i32, DAG.getEntryNode(), CPAddr, NULL, 0); 497} 498 499static SDOperand LowerVASTART(SDOperand Op, SelectionDAG &DAG, 500 unsigned VarArgsFrameIndex) { 501 // vastart just stores the address of the VarArgsFrameIndex slot into the 502 // memory location argument. 503 MVT::ValueType PtrVT = DAG.getTargetLoweringInfo().getPointerTy(); 504 SDOperand FR = DAG.getFrameIndex(VarArgsFrameIndex, PtrVT); 505 SrcValueSDNode *SV = cast<SrcValueSDNode>(Op.getOperand(2)); 506 return DAG.getStore(Op.getOperand(0), FR, Op.getOperand(1), SV->getValue(), 507 SV->getOffset()); 508} 509 510static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG, 511 int &VarArgsFrameIndex) { 512 MachineFunction &MF = DAG.getMachineFunction(); 513 MachineFrameInfo *MFI = MF.getFrameInfo(); 514 SSARegMap *RegMap = MF.getSSARegMap(); 515 unsigned NumArgs = Op.Val->getNumValues()-1; 516 SDOperand Root = Op.getOperand(0); 517 bool isVarArg = cast<ConstantSDNode>(Op.getOperand(2))->getValue() != 0; 518 static const unsigned REGS[] = { 519 ARM::R0, ARM::R1, ARM::R2, ARM::R3 520 }; 521 522 std::vector<MVT::ValueType> Types(Op.Val->value_begin(), Op.Val->value_end() - 1); 523 ArgumentLayout Layout(Types); 524 525 std::vector<SDOperand> ArgValues; 526 for (unsigned ArgNo = 0; ArgNo < NumArgs; ++ArgNo) { 527 MVT::ValueType VT = Types[ArgNo]; 528 529 SDOperand Value; 530 if (Layout.isRegister(ArgNo)) { 531 assert(VT == MVT::i32 || VT == MVT::f32 || VT == MVT::f64); 532 unsigned RegNum = Layout.getRegisterNum(ArgNo); 533 unsigned Reg1 = REGS[RegNum]; 534 unsigned VReg1 = RegMap->createVirtualRegister(&ARM::IntRegsRegClass); 535 SDOperand Value1 = DAG.getCopyFromReg(Root, VReg1, MVT::i32); 536 MF.addLiveIn(Reg1, VReg1); 537 if (VT == MVT::f64) { 538 unsigned Reg2 = REGS[RegNum + 1]; 539 unsigned VReg2 = RegMap->createVirtualRegister(&ARM::IntRegsRegClass); 540 SDOperand Value2 = DAG.getCopyFromReg(Root, VReg2, MVT::i32); 541 MF.addLiveIn(Reg2, VReg2); 542 Value = DAG.getNode(ARMISD::FMDRR, MVT::f64, Value1, Value2); 543 } else { 544 Value = Value1; 545 if (VT == MVT::f32) 546 Value = DAG.getNode(ISD::BIT_CONVERT, VT, Value); 547 } 548 } else { 549 // If the argument is actually used, emit a load from the right stack 550 // slot. 551 if (!Op.Val->hasNUsesOfValue(0, ArgNo)) { 552 unsigned Offset = Layout.getOffset(ArgNo); 553 unsigned Size = MVT::getSizeInBits(VT)/8; 554 int FI = MFI->CreateFixedObject(Size, Offset); 555 SDOperand FIN = DAG.getFrameIndex(FI, VT); 556 Value = DAG.getLoad(VT, Root, FIN, NULL, 0); 557 } else { 558 Value = DAG.getNode(ISD::UNDEF, VT); 559 } 560 } 561 ArgValues.push_back(Value); 562 } 563 564 unsigned NextRegNum = Layout.lastRegNum() + 1; 565 566 if (isVarArg) { 567 //If this function is vararg we must store the remaing 568 //registers so that they can be acessed with va_start 569 VarArgsFrameIndex = MFI->CreateFixedObject(MVT::getSizeInBits(MVT::i32)/8, 570 -16 + NextRegNum * 4); 571 572 SmallVector<SDOperand, 4> MemOps; 573 for (unsigned RegNo = NextRegNum; RegNo < 4; ++RegNo) { 574 int RegOffset = - (4 - RegNo) * 4; 575 int FI = MFI->CreateFixedObject(MVT::getSizeInBits(MVT::i32)/8, 576 RegOffset); 577 SDOperand FIN = DAG.getFrameIndex(FI, MVT::i32); 578 579 unsigned VReg = RegMap->createVirtualRegister(&ARM::IntRegsRegClass); 580 MF.addLiveIn(REGS[RegNo], VReg); 581 582 SDOperand Val = DAG.getCopyFromReg(Root, VReg, MVT::i32); 583 SDOperand Store = DAG.getStore(Val.getValue(1), Val, FIN, NULL, 0); 584 MemOps.push_back(Store); 585 } 586 Root = DAG.getNode(ISD::TokenFactor, MVT::Other,&MemOps[0],MemOps.size()); 587 } 588 589 ArgValues.push_back(Root); 590 591 // Return the new list of results. 592 std::vector<MVT::ValueType> RetVT(Op.Val->value_begin(), 593 Op.Val->value_end()); 594 return DAG.getNode(ISD::MERGE_VALUES, RetVT, &ArgValues[0], ArgValues.size()); 595} 596 597static SDOperand GetCMP(ISD::CondCode CC, SDOperand LHS, SDOperand RHS, 598 SelectionDAG &DAG) { 599 MVT::ValueType vt = LHS.getValueType(); 600 assert(vt == MVT::i32 || vt == MVT::f32 || vt == MVT::f64); 601 602 SDOperand Cmp = DAG.getNode(ARMISD::CMP, MVT::Flag, LHS, RHS); 603 604 if (vt != MVT::i32) 605 Cmp = DAG.getNode(ARMISD::FMSTAT, MVT::Flag, Cmp); 606 return Cmp; 607} 608 609static SDOperand GetARMCC(ISD::CondCode CC, MVT::ValueType vt, 610 SelectionDAG &DAG) { 611 assert(vt == MVT::i32 || vt == MVT::f32 || vt == MVT::f64); 612 if (vt == MVT::i32) 613 return DAG.getConstant(DAGIntCCToARMCC(CC), MVT::i32); 614 else 615 return DAG.getConstant(DAGFPCCToARMCC(CC), MVT::i32); 616} 617 618static SDOperand LowerSELECT_CC(SDOperand Op, SelectionDAG &DAG) { 619 SDOperand LHS = Op.getOperand(0); 620 SDOperand RHS = Op.getOperand(1); 621 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(4))->get(); 622 SDOperand TrueVal = Op.getOperand(2); 623 SDOperand FalseVal = Op.getOperand(3); 624 SDOperand Cmp = GetCMP(CC, LHS, RHS, DAG); 625 SDOperand ARMCC = GetARMCC(CC, LHS.getValueType(), DAG); 626 return DAG.getNode(ARMISD::SELECT, MVT::i32, TrueVal, FalseVal, ARMCC, Cmp); 627} 628 629static SDOperand LowerBR_CC(SDOperand Op, SelectionDAG &DAG) { 630 SDOperand Chain = Op.getOperand(0); 631 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(1))->get(); 632 SDOperand LHS = Op.getOperand(2); 633 SDOperand RHS = Op.getOperand(3); 634 SDOperand Dest = Op.getOperand(4); 635 SDOperand Cmp = GetCMP(CC, LHS, RHS, DAG); 636 SDOperand ARMCC = GetARMCC(CC, LHS.getValueType(), DAG); 637 return DAG.getNode(ARMISD::BR, MVT::Other, Chain, Dest, ARMCC, Cmp); 638} 639 640static SDOperand LowerSINT_TO_FP(SDOperand Op, SelectionDAG &DAG) { 641 SDOperand IntVal = Op.getOperand(0); 642 assert(IntVal.getValueType() == MVT::i32); 643 MVT::ValueType vt = Op.getValueType(); 644 assert(vt == MVT::f32 || 645 vt == MVT::f64); 646 647 SDOperand Tmp = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, IntVal); 648 ARMISD::NodeType op = vt == MVT::f32 ? ARMISD::FSITOS : ARMISD::FSITOD; 649 return DAG.getNode(op, vt, Tmp); 650} 651 652static SDOperand LowerFP_TO_SINT(SDOperand Op, SelectionDAG &DAG) { 653 assert(Op.getValueType() == MVT::i32); 654 SDOperand FloatVal = Op.getOperand(0); 655 MVT::ValueType vt = FloatVal.getValueType(); 656 assert(vt == MVT::f32 || vt == MVT::f64); 657 658 ARMISD::NodeType op = vt == MVT::f32 ? ARMISD::FTOSIS : ARMISD::FTOSID; 659 SDOperand Tmp = DAG.getNode(op, MVT::f32, FloatVal); 660 return DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Tmp); 661} 662 663static SDOperand LowerUINT_TO_FP(SDOperand Op, SelectionDAG &DAG) { 664 SDOperand IntVal = Op.getOperand(0); 665 assert(IntVal.getValueType() == MVT::i32); 666 MVT::ValueType vt = Op.getValueType(); 667 assert(vt == MVT::f32 || 668 vt == MVT::f64); 669 670 SDOperand Tmp = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, IntVal); 671 ARMISD::NodeType op = vt == MVT::f32 ? ARMISD::FUITOS : ARMISD::FUITOD; 672 return DAG.getNode(op, vt, Tmp); 673} 674 675static SDOperand LowerFP_TO_UINT(SDOperand Op, SelectionDAG &DAG) { 676 assert(Op.getValueType() == MVT::i32); 677 SDOperand FloatVal = Op.getOperand(0); 678 MVT::ValueType vt = FloatVal.getValueType(); 679 assert(vt == MVT::f32 || vt == MVT::f64); 680 681 ARMISD::NodeType op = vt == MVT::f32 ? ARMISD::FTOUIS : ARMISD::FTOUID; 682 SDOperand Tmp = DAG.getNode(op, MVT::f32, FloatVal); 683 return DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Tmp); 684} 685 686SDOperand ARMTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) { 687 switch (Op.getOpcode()) { 688 default: 689 assert(0 && "Should not custom lower this!"); 690 abort(); 691 case ISD::ConstantPool: 692 return LowerConstantPool(Op, DAG); 693 case ISD::GlobalAddress: 694 return LowerGlobalAddress(Op, DAG); 695 case ISD::FP_TO_SINT: 696 return LowerFP_TO_SINT(Op, DAG); 697 case ISD::SINT_TO_FP: 698 return LowerSINT_TO_FP(Op, DAG); 699 case ISD::FP_TO_UINT: 700 return LowerFP_TO_UINT(Op, DAG); 701 case ISD::UINT_TO_FP: 702 return LowerUINT_TO_FP(Op, DAG); 703 case ISD::FORMAL_ARGUMENTS: 704 return LowerFORMAL_ARGUMENTS(Op, DAG, VarArgsFrameIndex); 705 case ISD::CALL: 706 return LowerCALL(Op, DAG); 707 case ISD::RET: 708 return LowerRET(Op, DAG); 709 case ISD::SELECT_CC: 710 return LowerSELECT_CC(Op, DAG); 711 case ISD::BR_CC: 712 return LowerBR_CC(Op, DAG); 713 case ISD::VASTART: 714 return LowerVASTART(Op, DAG, VarArgsFrameIndex); 715 } 716} 717 718//===----------------------------------------------------------------------===// 719// Instruction Selector Implementation 720//===----------------------------------------------------------------------===// 721 722//===--------------------------------------------------------------------===// 723/// ARMDAGToDAGISel - ARM specific code to select ARM machine 724/// instructions for SelectionDAG operations. 725/// 726namespace { 727class ARMDAGToDAGISel : public SelectionDAGISel { 728 ARMTargetLowering Lowering; 729 730public: 731 ARMDAGToDAGISel(TargetMachine &TM) 732 : SelectionDAGISel(Lowering), Lowering(TM) { 733 } 734 735 SDNode *Select(SDOperand Op); 736 virtual void InstructionSelectBasicBlock(SelectionDAG &DAG); 737 bool SelectAddrRegImm(SDOperand N, SDOperand &Offset, SDOperand &Base); 738 bool SelectAddrMode1(SDOperand N, SDOperand &Arg, SDOperand &Shift, 739 SDOperand &ShiftType); 740 741 // Include the pieces autogenerated from the target description. 742#include "ARMGenDAGISel.inc" 743}; 744 745void ARMDAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) { 746 DEBUG(BB->dump()); 747 748 DAG.setRoot(SelectRoot(DAG.getRoot())); 749 DAG.RemoveDeadNodes(); 750 751 ScheduleAndEmitDAG(DAG); 752} 753 754static bool isInt12Immediate(SDNode *N, short &Imm) { 755 if (N->getOpcode() != ISD::Constant) 756 return false; 757 758 int32_t t = cast<ConstantSDNode>(N)->getValue(); 759 int max = 1<<12; 760 int min = -max; 761 if (t > min && t < max) { 762 Imm = t; 763 return true; 764 } 765 else 766 return false; 767} 768 769static bool isInt12Immediate(SDOperand Op, short &Imm) { 770 return isInt12Immediate(Op.Val, Imm); 771} 772 773static uint32_t rotateL(uint32_t x) { 774 uint32_t bit31 = (x & (1 << 31)) >> 31; 775 uint32_t t = x << 1; 776 return t | bit31; 777} 778 779static bool isUInt8Immediate(uint32_t x) { 780 return x < (1 << 8); 781} 782 783static bool isRotInt8Immediate(uint32_t x) { 784 int r; 785 for (r = 0; r < 16; r++) { 786 if (isUInt8Immediate(x)) 787 return true; 788 x = rotateL(rotateL(x)); 789 } 790 return false; 791} 792 793bool ARMDAGToDAGISel::SelectAddrMode1(SDOperand N, 794 SDOperand &Arg, 795 SDOperand &Shift, 796 SDOperand &ShiftType) { 797 switch(N.getOpcode()) { 798 case ISD::Constant: { 799 uint32_t val = cast<ConstantSDNode>(N)->getValue(); 800 if(!isRotInt8Immediate(val)) { 801 const Type *t = MVT::getTypeForValueType(MVT::i32); 802 Constant *C = ConstantUInt::get(t, val); 803 int alignment = 2; 804 SDOperand Addr = CurDAG->getTargetConstantPool(C, MVT::i32, alignment); 805 SDOperand Z = CurDAG->getTargetConstant(0, MVT::i32); 806 SDNode *n = CurDAG->getTargetNode(ARM::ldr, MVT::i32, Z, Addr); 807 Arg = SDOperand(n, 0); 808 } else 809 Arg = CurDAG->getTargetConstant(val, MVT::i32); 810 811 Shift = CurDAG->getTargetConstant(0, MVT::i32); 812 ShiftType = CurDAG->getTargetConstant(ARMShift::LSL, MVT::i32); 813 return true; 814 } 815 case ISD::SRA: 816 Arg = N.getOperand(0); 817 Shift = N.getOperand(1); 818 ShiftType = CurDAG->getTargetConstant(ARMShift::ASR, MVT::i32); 819 return true; 820 case ISD::SRL: 821 Arg = N.getOperand(0); 822 Shift = N.getOperand(1); 823 ShiftType = CurDAG->getTargetConstant(ARMShift::LSR, MVT::i32); 824 return true; 825 case ISD::SHL: 826 Arg = N.getOperand(0); 827 Shift = N.getOperand(1); 828 ShiftType = CurDAG->getTargetConstant(ARMShift::LSL, MVT::i32); 829 return true; 830 } 831 832 Arg = N; 833 Shift = CurDAG->getTargetConstant(0, MVT::i32); 834 ShiftType = CurDAG->getTargetConstant(ARMShift::LSL, MVT::i32); 835 return true; 836} 837 838//register plus/minus 12 bit offset 839bool ARMDAGToDAGISel::SelectAddrRegImm(SDOperand N, SDOperand &Offset, 840 SDOperand &Base) { 841 if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(N)) { 842 Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32); 843 Offset = CurDAG->getTargetConstant(0, MVT::i32); 844 return true; 845 } 846 if (N.getOpcode() == ISD::ADD) { 847 short imm = 0; 848 if (isInt12Immediate(N.getOperand(1), imm)) { 849 Offset = CurDAG->getTargetConstant(imm, MVT::i32); 850 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N.getOperand(0))) { 851 Base = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType()); 852 } else { 853 Base = N.getOperand(0); 854 } 855 return true; // [r+i] 856 } 857 } 858 859 Offset = CurDAG->getTargetConstant(0, MVT::i32); 860 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N)) { 861 Base = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType()); 862 } 863 else 864 Base = N; 865 return true; //any address fits in a register 866} 867 868SDNode *ARMDAGToDAGISel::Select(SDOperand Op) { 869 SDNode *N = Op.Val; 870 871 switch (N->getOpcode()) { 872 default: 873 return SelectCode(Op); 874 break; 875 } 876 return NULL; 877} 878 879} // end anonymous namespace 880 881/// createARMISelDag - This pass converts a legalized DAG into a 882/// ARM-specific DAG, ready for instruction scheduling. 883/// 884FunctionPass *llvm::createARMISelDag(TargetMachine &TM) { 885 return new ARMDAGToDAGISel(TM); 886} 887