ARMISelDAGToDAG.cpp revision 198090
1//===-- ARMISelDAGToDAG.cpp - A dag to dag inst selector for ARM ----------===// 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// This file defines an instruction selector for the ARM target. 11// 12//===----------------------------------------------------------------------===// 13 14#include "ARM.h" 15#include "ARMAddressingModes.h" 16#include "ARMConstantPoolValue.h" 17#include "ARMISelLowering.h" 18#include "ARMTargetMachine.h" 19#include "llvm/CallingConv.h" 20#include "llvm/Constants.h" 21#include "llvm/DerivedTypes.h" 22#include "llvm/Function.h" 23#include "llvm/Intrinsics.h" 24#include "llvm/LLVMContext.h" 25#include "llvm/CodeGen/MachineFrameInfo.h" 26#include "llvm/CodeGen/MachineFunction.h" 27#include "llvm/CodeGen/MachineInstrBuilder.h" 28#include "llvm/CodeGen/SelectionDAG.h" 29#include "llvm/CodeGen/SelectionDAGISel.h" 30#include "llvm/Target/TargetLowering.h" 31#include "llvm/Target/TargetOptions.h" 32#include "llvm/Support/Compiler.h" 33#include "llvm/Support/Debug.h" 34#include "llvm/Support/ErrorHandling.h" 35#include "llvm/Support/raw_ostream.h" 36 37using namespace llvm; 38 39//===--------------------------------------------------------------------===// 40/// ARMDAGToDAGISel - ARM specific code to select ARM machine 41/// instructions for SelectionDAG operations. 42/// 43namespace { 44class ARMDAGToDAGISel : public SelectionDAGISel { 45 ARMBaseTargetMachine &TM; 46 47 /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can 48 /// make the right decision when generating code for different targets. 49 const ARMSubtarget *Subtarget; 50 51public: 52 explicit ARMDAGToDAGISel(ARMBaseTargetMachine &tm, 53 CodeGenOpt::Level OptLevel) 54 : SelectionDAGISel(tm, OptLevel), TM(tm), 55 Subtarget(&TM.getSubtarget<ARMSubtarget>()) { 56 } 57 58 virtual const char *getPassName() const { 59 return "ARM Instruction Selection"; 60 } 61 62 /// getI32Imm - Return a target constant of type i32 with the specified 63 /// value. 64 inline SDValue getI32Imm(unsigned Imm) { 65 return CurDAG->getTargetConstant(Imm, MVT::i32); 66 } 67 68 SDNode *Select(SDValue Op); 69 virtual void InstructionSelect(); 70 bool SelectShifterOperandReg(SDValue Op, SDValue N, SDValue &A, 71 SDValue &B, SDValue &C); 72 bool SelectAddrMode2(SDValue Op, SDValue N, SDValue &Base, 73 SDValue &Offset, SDValue &Opc); 74 bool SelectAddrMode2Offset(SDValue Op, SDValue N, 75 SDValue &Offset, SDValue &Opc); 76 bool SelectAddrMode3(SDValue Op, SDValue N, SDValue &Base, 77 SDValue &Offset, SDValue &Opc); 78 bool SelectAddrMode3Offset(SDValue Op, SDValue N, 79 SDValue &Offset, SDValue &Opc); 80 bool SelectAddrMode4(SDValue Op, SDValue N, SDValue &Addr, 81 SDValue &Mode); 82 bool SelectAddrMode5(SDValue Op, SDValue N, SDValue &Base, 83 SDValue &Offset); 84 bool SelectAddrMode6(SDValue Op, SDValue N, SDValue &Addr, SDValue &Update, 85 SDValue &Opc); 86 87 bool SelectAddrModePC(SDValue Op, SDValue N, SDValue &Offset, 88 SDValue &Label); 89 90 bool SelectThumbAddrModeRR(SDValue Op, SDValue N, SDValue &Base, 91 SDValue &Offset); 92 bool SelectThumbAddrModeRI5(SDValue Op, SDValue N, unsigned Scale, 93 SDValue &Base, SDValue &OffImm, 94 SDValue &Offset); 95 bool SelectThumbAddrModeS1(SDValue Op, SDValue N, SDValue &Base, 96 SDValue &OffImm, SDValue &Offset); 97 bool SelectThumbAddrModeS2(SDValue Op, SDValue N, SDValue &Base, 98 SDValue &OffImm, SDValue &Offset); 99 bool SelectThumbAddrModeS4(SDValue Op, SDValue N, SDValue &Base, 100 SDValue &OffImm, SDValue &Offset); 101 bool SelectThumbAddrModeSP(SDValue Op, SDValue N, SDValue &Base, 102 SDValue &OffImm); 103 104 bool SelectT2ShifterOperandReg(SDValue Op, SDValue N, 105 SDValue &BaseReg, SDValue &Opc); 106 bool SelectT2AddrModeImm12(SDValue Op, SDValue N, SDValue &Base, 107 SDValue &OffImm); 108 bool SelectT2AddrModeImm8(SDValue Op, SDValue N, SDValue &Base, 109 SDValue &OffImm); 110 bool SelectT2AddrModeImm8Offset(SDValue Op, SDValue N, 111 SDValue &OffImm); 112 bool SelectT2AddrModeImm8s4(SDValue Op, SDValue N, SDValue &Base, 113 SDValue &OffImm); 114 bool SelectT2AddrModeSoReg(SDValue Op, SDValue N, SDValue &Base, 115 SDValue &OffReg, SDValue &ShImm); 116 117 // Include the pieces autogenerated from the target description. 118#include "ARMGenDAGISel.inc" 119 120private: 121 /// SelectARMIndexedLoad - Indexed (pre/post inc/dec) load matching code for 122 /// ARM. 123 SDNode *SelectARMIndexedLoad(SDValue Op); 124 SDNode *SelectT2IndexedLoad(SDValue Op); 125 126 /// SelectDYN_ALLOC - Select dynamic alloc for Thumb. 127 SDNode *SelectDYN_ALLOC(SDValue Op); 128 129 /// SelectVLD - Select NEON load intrinsics. NumVecs should 130 /// be 2, 3 or 4. The opcode arrays specify the instructions used for 131 /// loads of D registers and even subregs and odd subregs of Q registers. 132 /// For NumVecs == 2, QOpcodes1 is not used. 133 SDNode *SelectVLD(SDValue Op, unsigned NumVecs, unsigned *DOpcodes, 134 unsigned *QOpcodes0, unsigned *QOpcodes1); 135 136 /// SelectVLDSTLane - Select NEON load/store lane intrinsics. NumVecs should 137 /// be 2, 3 or 4. The opcode arrays specify the instructions used for 138 /// load/store of D registers and even subregs and odd subregs of Q registers. 139 SDNode *SelectVLDSTLane(SDValue Op, bool IsLoad, unsigned NumVecs, 140 unsigned *DOpcodes, unsigned *QOpcodes0, 141 unsigned *QOpcodes1); 142 143 /// SelectV6T2BitfieldExtractOp - Select SBFX/UBFX instructions for ARM. 144 SDNode *SelectV6T2BitfieldExtractOp(SDValue Op, unsigned Opc); 145 146 /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for 147 /// inline asm expressions. 148 virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op, 149 char ConstraintCode, 150 std::vector<SDValue> &OutOps); 151 152 /// PairDRegs - Insert a pair of double registers into an implicit def to 153 /// form a quad register. 154 SDNode *PairDRegs(EVT VT, SDValue V0, SDValue V1); 155}; 156} 157 158/// isInt32Immediate - This method tests to see if the node is a 32-bit constant 159/// operand. If so Imm will receive the 32-bit value. 160static bool isInt32Immediate(SDNode *N, unsigned &Imm) { 161 if (N->getOpcode() == ISD::Constant && N->getValueType(0) == MVT::i32) { 162 Imm = cast<ConstantSDNode>(N)->getZExtValue(); 163 return true; 164 } 165 return false; 166} 167 168// isInt32Immediate - This method tests to see if a constant operand. 169// If so Imm will receive the 32 bit value. 170static bool isInt32Immediate(SDValue N, unsigned &Imm) { 171 return isInt32Immediate(N.getNode(), Imm); 172} 173 174// isOpcWithIntImmediate - This method tests to see if the node is a specific 175// opcode and that it has a immediate integer right operand. 176// If so Imm will receive the 32 bit value. 177static bool isOpcWithIntImmediate(SDNode *N, unsigned Opc, unsigned& Imm) { 178 return N->getOpcode() == Opc && 179 isInt32Immediate(N->getOperand(1).getNode(), Imm); 180} 181 182 183void ARMDAGToDAGISel::InstructionSelect() { 184 DEBUG(BB->dump()); 185 186 SelectRoot(*CurDAG); 187 CurDAG->RemoveDeadNodes(); 188} 189 190bool ARMDAGToDAGISel::SelectShifterOperandReg(SDValue Op, 191 SDValue N, 192 SDValue &BaseReg, 193 SDValue &ShReg, 194 SDValue &Opc) { 195 ARM_AM::ShiftOpc ShOpcVal = ARM_AM::getShiftOpcForNode(N); 196 197 // Don't match base register only case. That is matched to a separate 198 // lower complexity pattern with explicit register operand. 199 if (ShOpcVal == ARM_AM::no_shift) return false; 200 201 BaseReg = N.getOperand(0); 202 unsigned ShImmVal = 0; 203 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 204 ShReg = CurDAG->getRegister(0, MVT::i32); 205 ShImmVal = RHS->getZExtValue() & 31; 206 } else { 207 ShReg = N.getOperand(1); 208 } 209 Opc = CurDAG->getTargetConstant(ARM_AM::getSORegOpc(ShOpcVal, ShImmVal), 210 MVT::i32); 211 return true; 212} 213 214bool ARMDAGToDAGISel::SelectAddrMode2(SDValue Op, SDValue N, 215 SDValue &Base, SDValue &Offset, 216 SDValue &Opc) { 217 if (N.getOpcode() == ISD::MUL) { 218 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 219 // X * [3,5,9] -> X + X * [2,4,8] etc. 220 int RHSC = (int)RHS->getZExtValue(); 221 if (RHSC & 1) { 222 RHSC = RHSC & ~1; 223 ARM_AM::AddrOpc AddSub = ARM_AM::add; 224 if (RHSC < 0) { 225 AddSub = ARM_AM::sub; 226 RHSC = - RHSC; 227 } 228 if (isPowerOf2_32(RHSC)) { 229 unsigned ShAmt = Log2_32(RHSC); 230 Base = Offset = N.getOperand(0); 231 Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(AddSub, ShAmt, 232 ARM_AM::lsl), 233 MVT::i32); 234 return true; 235 } 236 } 237 } 238 } 239 240 if (N.getOpcode() != ISD::ADD && N.getOpcode() != ISD::SUB) { 241 Base = N; 242 if (N.getOpcode() == ISD::FrameIndex) { 243 int FI = cast<FrameIndexSDNode>(N)->getIndex(); 244 Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 245 } else if (N.getOpcode() == ARMISD::Wrapper) { 246 Base = N.getOperand(0); 247 } 248 Offset = CurDAG->getRegister(0, MVT::i32); 249 Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(ARM_AM::add, 0, 250 ARM_AM::no_shift), 251 MVT::i32); 252 return true; 253 } 254 255 // Match simple R +/- imm12 operands. 256 if (N.getOpcode() == ISD::ADD) 257 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 258 int RHSC = (int)RHS->getZExtValue(); 259 if ((RHSC >= 0 && RHSC < 0x1000) || 260 (RHSC < 0 && RHSC > -0x1000)) { // 12 bits. 261 Base = N.getOperand(0); 262 if (Base.getOpcode() == ISD::FrameIndex) { 263 int FI = cast<FrameIndexSDNode>(Base)->getIndex(); 264 Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 265 } 266 Offset = CurDAG->getRegister(0, MVT::i32); 267 268 ARM_AM::AddrOpc AddSub = ARM_AM::add; 269 if (RHSC < 0) { 270 AddSub = ARM_AM::sub; 271 RHSC = - RHSC; 272 } 273 Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(AddSub, RHSC, 274 ARM_AM::no_shift), 275 MVT::i32); 276 return true; 277 } 278 } 279 280 // Otherwise this is R +/- [possibly shifted] R 281 ARM_AM::AddrOpc AddSub = N.getOpcode() == ISD::ADD ? ARM_AM::add:ARM_AM::sub; 282 ARM_AM::ShiftOpc ShOpcVal = ARM_AM::getShiftOpcForNode(N.getOperand(1)); 283 unsigned ShAmt = 0; 284 285 Base = N.getOperand(0); 286 Offset = N.getOperand(1); 287 288 if (ShOpcVal != ARM_AM::no_shift) { 289 // Check to see if the RHS of the shift is a constant, if not, we can't fold 290 // it. 291 if (ConstantSDNode *Sh = 292 dyn_cast<ConstantSDNode>(N.getOperand(1).getOperand(1))) { 293 ShAmt = Sh->getZExtValue(); 294 Offset = N.getOperand(1).getOperand(0); 295 } else { 296 ShOpcVal = ARM_AM::no_shift; 297 } 298 } 299 300 // Try matching (R shl C) + (R). 301 if (N.getOpcode() == ISD::ADD && ShOpcVal == ARM_AM::no_shift) { 302 ShOpcVal = ARM_AM::getShiftOpcForNode(N.getOperand(0)); 303 if (ShOpcVal != ARM_AM::no_shift) { 304 // Check to see if the RHS of the shift is a constant, if not, we can't 305 // fold it. 306 if (ConstantSDNode *Sh = 307 dyn_cast<ConstantSDNode>(N.getOperand(0).getOperand(1))) { 308 ShAmt = Sh->getZExtValue(); 309 Offset = N.getOperand(0).getOperand(0); 310 Base = N.getOperand(1); 311 } else { 312 ShOpcVal = ARM_AM::no_shift; 313 } 314 } 315 } 316 317 Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(AddSub, ShAmt, ShOpcVal), 318 MVT::i32); 319 return true; 320} 321 322bool ARMDAGToDAGISel::SelectAddrMode2Offset(SDValue Op, SDValue N, 323 SDValue &Offset, SDValue &Opc) { 324 unsigned Opcode = Op.getOpcode(); 325 ISD::MemIndexedMode AM = (Opcode == ISD::LOAD) 326 ? cast<LoadSDNode>(Op)->getAddressingMode() 327 : cast<StoreSDNode>(Op)->getAddressingMode(); 328 ARM_AM::AddrOpc AddSub = (AM == ISD::PRE_INC || AM == ISD::POST_INC) 329 ? ARM_AM::add : ARM_AM::sub; 330 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N)) { 331 int Val = (int)C->getZExtValue(); 332 if (Val >= 0 && Val < 0x1000) { // 12 bits. 333 Offset = CurDAG->getRegister(0, MVT::i32); 334 Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(AddSub, Val, 335 ARM_AM::no_shift), 336 MVT::i32); 337 return true; 338 } 339 } 340 341 Offset = N; 342 ARM_AM::ShiftOpc ShOpcVal = ARM_AM::getShiftOpcForNode(N); 343 unsigned ShAmt = 0; 344 if (ShOpcVal != ARM_AM::no_shift) { 345 // Check to see if the RHS of the shift is a constant, if not, we can't fold 346 // it. 347 if (ConstantSDNode *Sh = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 348 ShAmt = Sh->getZExtValue(); 349 Offset = N.getOperand(0); 350 } else { 351 ShOpcVal = ARM_AM::no_shift; 352 } 353 } 354 355 Opc = CurDAG->getTargetConstant(ARM_AM::getAM2Opc(AddSub, ShAmt, ShOpcVal), 356 MVT::i32); 357 return true; 358} 359 360 361bool ARMDAGToDAGISel::SelectAddrMode3(SDValue Op, SDValue N, 362 SDValue &Base, SDValue &Offset, 363 SDValue &Opc) { 364 if (N.getOpcode() == ISD::SUB) { 365 // X - C is canonicalize to X + -C, no need to handle it here. 366 Base = N.getOperand(0); 367 Offset = N.getOperand(1); 368 Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(ARM_AM::sub, 0),MVT::i32); 369 return true; 370 } 371 372 if (N.getOpcode() != ISD::ADD) { 373 Base = N; 374 if (N.getOpcode() == ISD::FrameIndex) { 375 int FI = cast<FrameIndexSDNode>(N)->getIndex(); 376 Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 377 } 378 Offset = CurDAG->getRegister(0, MVT::i32); 379 Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(ARM_AM::add, 0),MVT::i32); 380 return true; 381 } 382 383 // If the RHS is +/- imm8, fold into addr mode. 384 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 385 int RHSC = (int)RHS->getZExtValue(); 386 if ((RHSC >= 0 && RHSC < 256) || 387 (RHSC < 0 && RHSC > -256)) { // note -256 itself isn't allowed. 388 Base = N.getOperand(0); 389 if (Base.getOpcode() == ISD::FrameIndex) { 390 int FI = cast<FrameIndexSDNode>(Base)->getIndex(); 391 Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 392 } 393 Offset = CurDAG->getRegister(0, MVT::i32); 394 395 ARM_AM::AddrOpc AddSub = ARM_AM::add; 396 if (RHSC < 0) { 397 AddSub = ARM_AM::sub; 398 RHSC = - RHSC; 399 } 400 Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(AddSub, RHSC),MVT::i32); 401 return true; 402 } 403 } 404 405 Base = N.getOperand(0); 406 Offset = N.getOperand(1); 407 Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(ARM_AM::add, 0), MVT::i32); 408 return true; 409} 410 411bool ARMDAGToDAGISel::SelectAddrMode3Offset(SDValue Op, SDValue N, 412 SDValue &Offset, SDValue &Opc) { 413 unsigned Opcode = Op.getOpcode(); 414 ISD::MemIndexedMode AM = (Opcode == ISD::LOAD) 415 ? cast<LoadSDNode>(Op)->getAddressingMode() 416 : cast<StoreSDNode>(Op)->getAddressingMode(); 417 ARM_AM::AddrOpc AddSub = (AM == ISD::PRE_INC || AM == ISD::POST_INC) 418 ? ARM_AM::add : ARM_AM::sub; 419 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(N)) { 420 int Val = (int)C->getZExtValue(); 421 if (Val >= 0 && Val < 256) { 422 Offset = CurDAG->getRegister(0, MVT::i32); 423 Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(AddSub, Val), MVT::i32); 424 return true; 425 } 426 } 427 428 Offset = N; 429 Opc = CurDAG->getTargetConstant(ARM_AM::getAM3Opc(AddSub, 0), MVT::i32); 430 return true; 431} 432 433bool ARMDAGToDAGISel::SelectAddrMode4(SDValue Op, SDValue N, 434 SDValue &Addr, SDValue &Mode) { 435 Addr = N; 436 Mode = CurDAG->getTargetConstant(0, MVT::i32); 437 return true; 438} 439 440bool ARMDAGToDAGISel::SelectAddrMode5(SDValue Op, SDValue N, 441 SDValue &Base, SDValue &Offset) { 442 if (N.getOpcode() != ISD::ADD) { 443 Base = N; 444 if (N.getOpcode() == ISD::FrameIndex) { 445 int FI = cast<FrameIndexSDNode>(N)->getIndex(); 446 Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 447 } else if (N.getOpcode() == ARMISD::Wrapper) { 448 Base = N.getOperand(0); 449 } 450 Offset = CurDAG->getTargetConstant(ARM_AM::getAM5Opc(ARM_AM::add, 0), 451 MVT::i32); 452 return true; 453 } 454 455 // If the RHS is +/- imm8, fold into addr mode. 456 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 457 int RHSC = (int)RHS->getZExtValue(); 458 if ((RHSC & 3) == 0) { // The constant is implicitly multiplied by 4. 459 RHSC >>= 2; 460 if ((RHSC >= 0 && RHSC < 256) || 461 (RHSC < 0 && RHSC > -256)) { // note -256 itself isn't allowed. 462 Base = N.getOperand(0); 463 if (Base.getOpcode() == ISD::FrameIndex) { 464 int FI = cast<FrameIndexSDNode>(Base)->getIndex(); 465 Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 466 } 467 468 ARM_AM::AddrOpc AddSub = ARM_AM::add; 469 if (RHSC < 0) { 470 AddSub = ARM_AM::sub; 471 RHSC = - RHSC; 472 } 473 Offset = CurDAG->getTargetConstant(ARM_AM::getAM5Opc(AddSub, RHSC), 474 MVT::i32); 475 return true; 476 } 477 } 478 } 479 480 Base = N; 481 Offset = CurDAG->getTargetConstant(ARM_AM::getAM5Opc(ARM_AM::add, 0), 482 MVT::i32); 483 return true; 484} 485 486bool ARMDAGToDAGISel::SelectAddrMode6(SDValue Op, SDValue N, 487 SDValue &Addr, SDValue &Update, 488 SDValue &Opc) { 489 Addr = N; 490 // Default to no writeback. 491 Update = CurDAG->getRegister(0, MVT::i32); 492 Opc = CurDAG->getTargetConstant(ARM_AM::getAM6Opc(false), MVT::i32); 493 return true; 494} 495 496bool ARMDAGToDAGISel::SelectAddrModePC(SDValue Op, SDValue N, 497 SDValue &Offset, SDValue &Label) { 498 if (N.getOpcode() == ARMISD::PIC_ADD && N.hasOneUse()) { 499 Offset = N.getOperand(0); 500 SDValue N1 = N.getOperand(1); 501 Label = CurDAG->getTargetConstant(cast<ConstantSDNode>(N1)->getZExtValue(), 502 MVT::i32); 503 return true; 504 } 505 return false; 506} 507 508bool ARMDAGToDAGISel::SelectThumbAddrModeRR(SDValue Op, SDValue N, 509 SDValue &Base, SDValue &Offset){ 510 // FIXME dl should come from the parent load or store, not the address 511 DebugLoc dl = Op.getDebugLoc(); 512 if (N.getOpcode() != ISD::ADD) { 513 ConstantSDNode *NC = dyn_cast<ConstantSDNode>(N); 514 if (!NC || NC->getZExtValue() != 0) 515 return false; 516 517 Base = Offset = N; 518 return true; 519 } 520 521 Base = N.getOperand(0); 522 Offset = N.getOperand(1); 523 return true; 524} 525 526bool 527ARMDAGToDAGISel::SelectThumbAddrModeRI5(SDValue Op, SDValue N, 528 unsigned Scale, SDValue &Base, 529 SDValue &OffImm, SDValue &Offset) { 530 if (Scale == 4) { 531 SDValue TmpBase, TmpOffImm; 532 if (SelectThumbAddrModeSP(Op, N, TmpBase, TmpOffImm)) 533 return false; // We want to select tLDRspi / tSTRspi instead. 534 if (N.getOpcode() == ARMISD::Wrapper && 535 N.getOperand(0).getOpcode() == ISD::TargetConstantPool) 536 return false; // We want to select tLDRpci instead. 537 } 538 539 if (N.getOpcode() != ISD::ADD) { 540 Base = (N.getOpcode() == ARMISD::Wrapper) ? N.getOperand(0) : N; 541 Offset = CurDAG->getRegister(0, MVT::i32); 542 OffImm = CurDAG->getTargetConstant(0, MVT::i32); 543 return true; 544 } 545 546 // Thumb does not have [sp, r] address mode. 547 RegisterSDNode *LHSR = dyn_cast<RegisterSDNode>(N.getOperand(0)); 548 RegisterSDNode *RHSR = dyn_cast<RegisterSDNode>(N.getOperand(1)); 549 if ((LHSR && LHSR->getReg() == ARM::SP) || 550 (RHSR && RHSR->getReg() == ARM::SP)) { 551 Base = N; 552 Offset = CurDAG->getRegister(0, MVT::i32); 553 OffImm = CurDAG->getTargetConstant(0, MVT::i32); 554 return true; 555 } 556 557 // If the RHS is + imm5 * scale, fold into addr mode. 558 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 559 int RHSC = (int)RHS->getZExtValue(); 560 if ((RHSC & (Scale-1)) == 0) { // The constant is implicitly multiplied. 561 RHSC /= Scale; 562 if (RHSC >= 0 && RHSC < 32) { 563 Base = N.getOperand(0); 564 Offset = CurDAG->getRegister(0, MVT::i32); 565 OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32); 566 return true; 567 } 568 } 569 } 570 571 Base = N.getOperand(0); 572 Offset = N.getOperand(1); 573 OffImm = CurDAG->getTargetConstant(0, MVT::i32); 574 return true; 575} 576 577bool ARMDAGToDAGISel::SelectThumbAddrModeS1(SDValue Op, SDValue N, 578 SDValue &Base, SDValue &OffImm, 579 SDValue &Offset) { 580 return SelectThumbAddrModeRI5(Op, N, 1, Base, OffImm, Offset); 581} 582 583bool ARMDAGToDAGISel::SelectThumbAddrModeS2(SDValue Op, SDValue N, 584 SDValue &Base, SDValue &OffImm, 585 SDValue &Offset) { 586 return SelectThumbAddrModeRI5(Op, N, 2, Base, OffImm, Offset); 587} 588 589bool ARMDAGToDAGISel::SelectThumbAddrModeS4(SDValue Op, SDValue N, 590 SDValue &Base, SDValue &OffImm, 591 SDValue &Offset) { 592 return SelectThumbAddrModeRI5(Op, N, 4, Base, OffImm, Offset); 593} 594 595bool ARMDAGToDAGISel::SelectThumbAddrModeSP(SDValue Op, SDValue N, 596 SDValue &Base, SDValue &OffImm) { 597 if (N.getOpcode() == ISD::FrameIndex) { 598 int FI = cast<FrameIndexSDNode>(N)->getIndex(); 599 Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 600 OffImm = CurDAG->getTargetConstant(0, MVT::i32); 601 return true; 602 } 603 604 if (N.getOpcode() != ISD::ADD) 605 return false; 606 607 RegisterSDNode *LHSR = dyn_cast<RegisterSDNode>(N.getOperand(0)); 608 if (N.getOperand(0).getOpcode() == ISD::FrameIndex || 609 (LHSR && LHSR->getReg() == ARM::SP)) { 610 // If the RHS is + imm8 * scale, fold into addr mode. 611 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 612 int RHSC = (int)RHS->getZExtValue(); 613 if ((RHSC & 3) == 0) { // The constant is implicitly multiplied. 614 RHSC >>= 2; 615 if (RHSC >= 0 && RHSC < 256) { 616 Base = N.getOperand(0); 617 if (Base.getOpcode() == ISD::FrameIndex) { 618 int FI = cast<FrameIndexSDNode>(Base)->getIndex(); 619 Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 620 } 621 OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32); 622 return true; 623 } 624 } 625 } 626 } 627 628 return false; 629} 630 631bool ARMDAGToDAGISel::SelectT2ShifterOperandReg(SDValue Op, SDValue N, 632 SDValue &BaseReg, 633 SDValue &Opc) { 634 ARM_AM::ShiftOpc ShOpcVal = ARM_AM::getShiftOpcForNode(N); 635 636 // Don't match base register only case. That is matched to a separate 637 // lower complexity pattern with explicit register operand. 638 if (ShOpcVal == ARM_AM::no_shift) return false; 639 640 BaseReg = N.getOperand(0); 641 unsigned ShImmVal = 0; 642 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 643 ShImmVal = RHS->getZExtValue() & 31; 644 Opc = getI32Imm(ARM_AM::getSORegOpc(ShOpcVal, ShImmVal)); 645 return true; 646 } 647 648 return false; 649} 650 651bool ARMDAGToDAGISel::SelectT2AddrModeImm12(SDValue Op, SDValue N, 652 SDValue &Base, SDValue &OffImm) { 653 // Match simple R + imm12 operands. 654 655 // Base only. 656 if (N.getOpcode() != ISD::ADD && N.getOpcode() != ISD::SUB) { 657 if (N.getOpcode() == ISD::FrameIndex) { 658 // Match frame index... 659 int FI = cast<FrameIndexSDNode>(N)->getIndex(); 660 Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 661 OffImm = CurDAG->getTargetConstant(0, MVT::i32); 662 return true; 663 } else if (N.getOpcode() == ARMISD::Wrapper) { 664 Base = N.getOperand(0); 665 if (Base.getOpcode() == ISD::TargetConstantPool) 666 return false; // We want to select t2LDRpci instead. 667 } else 668 Base = N; 669 OffImm = CurDAG->getTargetConstant(0, MVT::i32); 670 return true; 671 } 672 673 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 674 if (SelectT2AddrModeImm8(Op, N, Base, OffImm)) 675 // Let t2LDRi8 handle (R - imm8). 676 return false; 677 678 int RHSC = (int)RHS->getZExtValue(); 679 if (N.getOpcode() == ISD::SUB) 680 RHSC = -RHSC; 681 682 if (RHSC >= 0 && RHSC < 0x1000) { // 12 bits (unsigned) 683 Base = N.getOperand(0); 684 if (Base.getOpcode() == ISD::FrameIndex) { 685 int FI = cast<FrameIndexSDNode>(Base)->getIndex(); 686 Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 687 } 688 OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32); 689 return true; 690 } 691 } 692 693 // Base only. 694 Base = N; 695 OffImm = CurDAG->getTargetConstant(0, MVT::i32); 696 return true; 697} 698 699bool ARMDAGToDAGISel::SelectT2AddrModeImm8(SDValue Op, SDValue N, 700 SDValue &Base, SDValue &OffImm) { 701 // Match simple R - imm8 operands. 702 if (N.getOpcode() == ISD::ADD || N.getOpcode() == ISD::SUB) { 703 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 704 int RHSC = (int)RHS->getSExtValue(); 705 if (N.getOpcode() == ISD::SUB) 706 RHSC = -RHSC; 707 708 if ((RHSC >= -255) && (RHSC < 0)) { // 8 bits (always negative) 709 Base = N.getOperand(0); 710 if (Base.getOpcode() == ISD::FrameIndex) { 711 int FI = cast<FrameIndexSDNode>(Base)->getIndex(); 712 Base = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 713 } 714 OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32); 715 return true; 716 } 717 } 718 } 719 720 return false; 721} 722 723bool ARMDAGToDAGISel::SelectT2AddrModeImm8Offset(SDValue Op, SDValue N, 724 SDValue &OffImm){ 725 unsigned Opcode = Op.getOpcode(); 726 ISD::MemIndexedMode AM = (Opcode == ISD::LOAD) 727 ? cast<LoadSDNode>(Op)->getAddressingMode() 728 : cast<StoreSDNode>(Op)->getAddressingMode(); 729 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N)) { 730 int RHSC = (int)RHS->getZExtValue(); 731 if (RHSC >= 0 && RHSC < 0x100) { // 8 bits. 732 OffImm = ((AM == ISD::PRE_INC) || (AM == ISD::POST_INC)) 733 ? CurDAG->getTargetConstant(RHSC, MVT::i32) 734 : CurDAG->getTargetConstant(-RHSC, MVT::i32); 735 return true; 736 } 737 } 738 739 return false; 740} 741 742bool ARMDAGToDAGISel::SelectT2AddrModeImm8s4(SDValue Op, SDValue N, 743 SDValue &Base, SDValue &OffImm) { 744 if (N.getOpcode() == ISD::ADD) { 745 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 746 int RHSC = (int)RHS->getZExtValue(); 747 if (((RHSC & 0x3) == 0) && 748 ((RHSC >= 0 && RHSC < 0x400) || (RHSC < 0 && RHSC > -0x400))) { // 8 bits. 749 Base = N.getOperand(0); 750 OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32); 751 return true; 752 } 753 } 754 } else if (N.getOpcode() == ISD::SUB) { 755 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 756 int RHSC = (int)RHS->getZExtValue(); 757 if (((RHSC & 0x3) == 0) && (RHSC >= 0 && RHSC < 0x400)) { // 8 bits. 758 Base = N.getOperand(0); 759 OffImm = CurDAG->getTargetConstant(-RHSC, MVT::i32); 760 return true; 761 } 762 } 763 } 764 765 return false; 766} 767 768bool ARMDAGToDAGISel::SelectT2AddrModeSoReg(SDValue Op, SDValue N, 769 SDValue &Base, 770 SDValue &OffReg, SDValue &ShImm) { 771 // (R - imm8) should be handled by t2LDRi8. The rest are handled by t2LDRi12. 772 if (N.getOpcode() != ISD::ADD) 773 return false; 774 775 // Leave (R + imm12) for t2LDRi12, (R - imm8) for t2LDRi8. 776 if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 777 int RHSC = (int)RHS->getZExtValue(); 778 if (RHSC >= 0 && RHSC < 0x1000) // 12 bits (unsigned) 779 return false; 780 else if (RHSC < 0 && RHSC >= -255) // 8 bits 781 return false; 782 } 783 784 // Look for (R + R) or (R + (R << [1,2,3])). 785 unsigned ShAmt = 0; 786 Base = N.getOperand(0); 787 OffReg = N.getOperand(1); 788 789 // Swap if it is ((R << c) + R). 790 ARM_AM::ShiftOpc ShOpcVal = ARM_AM::getShiftOpcForNode(OffReg); 791 if (ShOpcVal != ARM_AM::lsl) { 792 ShOpcVal = ARM_AM::getShiftOpcForNode(Base); 793 if (ShOpcVal == ARM_AM::lsl) 794 std::swap(Base, OffReg); 795 } 796 797 if (ShOpcVal == ARM_AM::lsl) { 798 // Check to see if the RHS of the shift is a constant, if not, we can't fold 799 // it. 800 if (ConstantSDNode *Sh = dyn_cast<ConstantSDNode>(OffReg.getOperand(1))) { 801 ShAmt = Sh->getZExtValue(); 802 if (ShAmt >= 4) { 803 ShAmt = 0; 804 ShOpcVal = ARM_AM::no_shift; 805 } else 806 OffReg = OffReg.getOperand(0); 807 } else { 808 ShOpcVal = ARM_AM::no_shift; 809 } 810 } 811 812 ShImm = CurDAG->getTargetConstant(ShAmt, MVT::i32); 813 814 return true; 815} 816 817//===--------------------------------------------------------------------===// 818 819/// getAL - Returns a ARMCC::AL immediate node. 820static inline SDValue getAL(SelectionDAG *CurDAG) { 821 return CurDAG->getTargetConstant((uint64_t)ARMCC::AL, MVT::i32); 822} 823 824SDNode *ARMDAGToDAGISel::SelectARMIndexedLoad(SDValue Op) { 825 LoadSDNode *LD = cast<LoadSDNode>(Op); 826 ISD::MemIndexedMode AM = LD->getAddressingMode(); 827 if (AM == ISD::UNINDEXED) 828 return NULL; 829 830 EVT LoadedVT = LD->getMemoryVT(); 831 SDValue Offset, AMOpc; 832 bool isPre = (AM == ISD::PRE_INC) || (AM == ISD::PRE_DEC); 833 unsigned Opcode = 0; 834 bool Match = false; 835 if (LoadedVT == MVT::i32 && 836 SelectAddrMode2Offset(Op, LD->getOffset(), Offset, AMOpc)) { 837 Opcode = isPre ? ARM::LDR_PRE : ARM::LDR_POST; 838 Match = true; 839 } else if (LoadedVT == MVT::i16 && 840 SelectAddrMode3Offset(Op, LD->getOffset(), Offset, AMOpc)) { 841 Match = true; 842 Opcode = (LD->getExtensionType() == ISD::SEXTLOAD) 843 ? (isPre ? ARM::LDRSH_PRE : ARM::LDRSH_POST) 844 : (isPre ? ARM::LDRH_PRE : ARM::LDRH_POST); 845 } else if (LoadedVT == MVT::i8 || LoadedVT == MVT::i1) { 846 if (LD->getExtensionType() == ISD::SEXTLOAD) { 847 if (SelectAddrMode3Offset(Op, LD->getOffset(), Offset, AMOpc)) { 848 Match = true; 849 Opcode = isPre ? ARM::LDRSB_PRE : ARM::LDRSB_POST; 850 } 851 } else { 852 if (SelectAddrMode2Offset(Op, LD->getOffset(), Offset, AMOpc)) { 853 Match = true; 854 Opcode = isPre ? ARM::LDRB_PRE : ARM::LDRB_POST; 855 } 856 } 857 } 858 859 if (Match) { 860 SDValue Chain = LD->getChain(); 861 SDValue Base = LD->getBasePtr(); 862 SDValue Ops[]= { Base, Offset, AMOpc, getAL(CurDAG), 863 CurDAG->getRegister(0, MVT::i32), Chain }; 864 return CurDAG->getMachineNode(Opcode, Op.getDebugLoc(), MVT::i32, MVT::i32, 865 MVT::Other, Ops, 6); 866 } 867 868 return NULL; 869} 870 871SDNode *ARMDAGToDAGISel::SelectT2IndexedLoad(SDValue Op) { 872 LoadSDNode *LD = cast<LoadSDNode>(Op); 873 ISD::MemIndexedMode AM = LD->getAddressingMode(); 874 if (AM == ISD::UNINDEXED) 875 return NULL; 876 877 EVT LoadedVT = LD->getMemoryVT(); 878 bool isSExtLd = LD->getExtensionType() == ISD::SEXTLOAD; 879 SDValue Offset; 880 bool isPre = (AM == ISD::PRE_INC) || (AM == ISD::PRE_DEC); 881 unsigned Opcode = 0; 882 bool Match = false; 883 if (SelectT2AddrModeImm8Offset(Op, LD->getOffset(), Offset)) { 884 switch (LoadedVT.getSimpleVT().SimpleTy) { 885 case MVT::i32: 886 Opcode = isPre ? ARM::t2LDR_PRE : ARM::t2LDR_POST; 887 break; 888 case MVT::i16: 889 if (isSExtLd) 890 Opcode = isPre ? ARM::t2LDRSH_PRE : ARM::t2LDRSH_POST; 891 else 892 Opcode = isPre ? ARM::t2LDRH_PRE : ARM::t2LDRH_POST; 893 break; 894 case MVT::i8: 895 case MVT::i1: 896 if (isSExtLd) 897 Opcode = isPre ? ARM::t2LDRSB_PRE : ARM::t2LDRSB_POST; 898 else 899 Opcode = isPre ? ARM::t2LDRB_PRE : ARM::t2LDRB_POST; 900 break; 901 default: 902 return NULL; 903 } 904 Match = true; 905 } 906 907 if (Match) { 908 SDValue Chain = LD->getChain(); 909 SDValue Base = LD->getBasePtr(); 910 SDValue Ops[]= { Base, Offset, getAL(CurDAG), 911 CurDAG->getRegister(0, MVT::i32), Chain }; 912 return CurDAG->getMachineNode(Opcode, Op.getDebugLoc(), MVT::i32, MVT::i32, 913 MVT::Other, Ops, 5); 914 } 915 916 return NULL; 917} 918 919SDNode *ARMDAGToDAGISel::SelectDYN_ALLOC(SDValue Op) { 920 SDNode *N = Op.getNode(); 921 DebugLoc dl = N->getDebugLoc(); 922 EVT VT = Op.getValueType(); 923 SDValue Chain = Op.getOperand(0); 924 SDValue Size = Op.getOperand(1); 925 SDValue Align = Op.getOperand(2); 926 SDValue SP = CurDAG->getRegister(ARM::SP, MVT::i32); 927 int32_t AlignVal = cast<ConstantSDNode>(Align)->getSExtValue(); 928 if (AlignVal < 0) 929 // We need to align the stack. Use Thumb1 tAND which is the only thumb 930 // instruction that can read and write SP. This matches to a pseudo 931 // instruction that has a chain to ensure the result is written back to 932 // the stack pointer. 933 SP = SDValue(CurDAG->getMachineNode(ARM::tANDsp, dl, VT, SP, Align), 0); 934 935 bool isC = isa<ConstantSDNode>(Size); 936 uint32_t C = isC ? cast<ConstantSDNode>(Size)->getZExtValue() : ~0UL; 937 // Handle the most common case for both Thumb1 and Thumb2: 938 // tSUBspi - immediate is between 0 ... 508 inclusive. 939 if (C <= 508 && ((C & 3) == 0)) 940 // FIXME: tSUBspi encode scale 4 implicitly. 941 return CurDAG->SelectNodeTo(N, ARM::tSUBspi_, VT, MVT::Other, SP, 942 CurDAG->getTargetConstant(C/4, MVT::i32), 943 Chain); 944 945 if (Subtarget->isThumb1Only()) { 946 // Use tADDspr since Thumb1 does not have a sub r, sp, r. ARMISelLowering 947 // should have negated the size operand already. FIXME: We can't insert 948 // new target independent node at this stage so we are forced to negate 949 // it earlier. Is there a better solution? 950 return CurDAG->SelectNodeTo(N, ARM::tADDspr_, VT, MVT::Other, SP, Size, 951 Chain); 952 } else if (Subtarget->isThumb2()) { 953 if (isC && Predicate_t2_so_imm(Size.getNode())) { 954 // t2SUBrSPi 955 SDValue Ops[] = { SP, CurDAG->getTargetConstant(C, MVT::i32), Chain }; 956 return CurDAG->SelectNodeTo(N, ARM::t2SUBrSPi_, VT, MVT::Other, Ops, 3); 957 } else if (isC && Predicate_imm0_4095(Size.getNode())) { 958 // t2SUBrSPi12 959 SDValue Ops[] = { SP, CurDAG->getTargetConstant(C, MVT::i32), Chain }; 960 return CurDAG->SelectNodeTo(N, ARM::t2SUBrSPi12_, VT, MVT::Other, Ops, 3); 961 } else { 962 // t2SUBrSPs 963 SDValue Ops[] = { SP, Size, 964 getI32Imm(ARM_AM::getSORegOpc(ARM_AM::lsl,0)), Chain }; 965 return CurDAG->SelectNodeTo(N, ARM::t2SUBrSPs_, VT, MVT::Other, Ops, 4); 966 } 967 } 968 969 // FIXME: Add ADD / SUB sp instructions for ARM. 970 return 0; 971} 972 973/// PairDRegs - Insert a pair of double registers into an implicit def to 974/// form a quad register. 975SDNode *ARMDAGToDAGISel::PairDRegs(EVT VT, SDValue V0, SDValue V1) { 976 DebugLoc dl = V0.getNode()->getDebugLoc(); 977 SDValue Undef = 978 SDValue(CurDAG->getMachineNode(TargetInstrInfo::IMPLICIT_DEF, dl, VT), 0); 979 SDValue SubReg0 = CurDAG->getTargetConstant(ARM::DSUBREG_0, MVT::i32); 980 SDValue SubReg1 = CurDAG->getTargetConstant(ARM::DSUBREG_1, MVT::i32); 981 SDNode *Pair = CurDAG->getMachineNode(TargetInstrInfo::INSERT_SUBREG, dl, 982 VT, Undef, V0, SubReg0); 983 return CurDAG->getMachineNode(TargetInstrInfo::INSERT_SUBREG, dl, 984 VT, SDValue(Pair, 0), V1, SubReg1); 985} 986 987/// GetNEONSubregVT - Given a type for a 128-bit NEON vector, return the type 988/// for a 64-bit subregister of the vector. 989static EVT GetNEONSubregVT(EVT VT) { 990 switch (VT.getSimpleVT().SimpleTy) { 991 default: llvm_unreachable("unhandled NEON type"); 992 case MVT::v16i8: return MVT::v8i8; 993 case MVT::v8i16: return MVT::v4i16; 994 case MVT::v4f32: return MVT::v2f32; 995 case MVT::v4i32: return MVT::v2i32; 996 case MVT::v2i64: return MVT::v1i64; 997 } 998} 999 1000SDNode *ARMDAGToDAGISel::SelectVLD(SDValue Op, unsigned NumVecs, 1001 unsigned *DOpcodes, unsigned *QOpcodes0, 1002 unsigned *QOpcodes1) { 1003 assert(NumVecs >=2 && NumVecs <= 4 && "VLD NumVecs out-of-range"); 1004 SDNode *N = Op.getNode(); 1005 DebugLoc dl = N->getDebugLoc(); 1006 1007 SDValue MemAddr, MemUpdate, MemOpc; 1008 if (!SelectAddrMode6(Op, N->getOperand(2), MemAddr, MemUpdate, MemOpc)) 1009 return NULL; 1010 1011 SDValue Chain = N->getOperand(0); 1012 EVT VT = N->getValueType(0); 1013 bool is64BitVector = VT.is64BitVector(); 1014 1015 unsigned OpcodeIndex; 1016 switch (VT.getSimpleVT().SimpleTy) { 1017 default: llvm_unreachable("unhandled vld type"); 1018 // Double-register operations: 1019 case MVT::v8i8: OpcodeIndex = 0; break; 1020 case MVT::v4i16: OpcodeIndex = 1; break; 1021 case MVT::v2f32: 1022 case MVT::v2i32: OpcodeIndex = 2; break; 1023 case MVT::v1i64: OpcodeIndex = 3; break; 1024 // Quad-register operations: 1025 case MVT::v16i8: OpcodeIndex = 0; break; 1026 case MVT::v8i16: OpcodeIndex = 1; break; 1027 case MVT::v4f32: 1028 case MVT::v4i32: OpcodeIndex = 2; break; 1029 } 1030 1031 if (is64BitVector) { 1032 unsigned Opc = DOpcodes[OpcodeIndex]; 1033 const SDValue Ops[] = { MemAddr, MemUpdate, MemOpc, Chain }; 1034 std::vector<EVT> ResTys(NumVecs, VT); 1035 ResTys.push_back(MVT::Other); 1036 return CurDAG->getMachineNode(Opc, dl, ResTys, Ops, 4); 1037 } 1038 1039 EVT RegVT = GetNEONSubregVT(VT); 1040 if (NumVecs == 2) { 1041 // Quad registers are directly supported for VLD2, 1042 // loading 2 pairs of D regs. 1043 unsigned Opc = QOpcodes0[OpcodeIndex]; 1044 const SDValue Ops[] = { MemAddr, MemUpdate, MemOpc, Chain }; 1045 std::vector<EVT> ResTys(4, VT); 1046 ResTys.push_back(MVT::Other); 1047 SDNode *VLd = CurDAG->getMachineNode(Opc, dl, ResTys, Ops, 4); 1048 Chain = SDValue(VLd, 4); 1049 1050 // Combine the even and odd subregs to produce the result. 1051 for (unsigned Vec = 0; Vec < NumVecs; ++Vec) { 1052 SDNode *Q = PairDRegs(VT, SDValue(VLd, 2*Vec), SDValue(VLd, 2*Vec+1)); 1053 ReplaceUses(SDValue(N, Vec), SDValue(Q, 0)); 1054 } 1055 } else { 1056 // Otherwise, quad registers are loaded with two separate instructions, 1057 // where one loads the even registers and the other loads the odd registers. 1058 1059 // Enable writeback to the address register. 1060 MemOpc = CurDAG->getTargetConstant(ARM_AM::getAM6Opc(true), MVT::i32); 1061 1062 std::vector<EVT> ResTys(NumVecs, RegVT); 1063 ResTys.push_back(MemAddr.getValueType()); 1064 ResTys.push_back(MVT::Other); 1065 1066 // Load the even subreg. 1067 unsigned Opc = QOpcodes0[OpcodeIndex]; 1068 const SDValue OpsA[] = { MemAddr, MemUpdate, MemOpc, Chain }; 1069 SDNode *VLdA = CurDAG->getMachineNode(Opc, dl, ResTys, OpsA, 4); 1070 Chain = SDValue(VLdA, NumVecs+1); 1071 1072 // Load the odd subreg. 1073 Opc = QOpcodes1[OpcodeIndex]; 1074 const SDValue OpsB[] = { SDValue(VLdA, NumVecs), MemUpdate, MemOpc, Chain }; 1075 SDNode *VLdB = CurDAG->getMachineNode(Opc, dl, ResTys, OpsB, 4); 1076 Chain = SDValue(VLdB, NumVecs+1); 1077 1078 // Combine the even and odd subregs to produce the result. 1079 for (unsigned Vec = 0; Vec < NumVecs; ++Vec) { 1080 SDNode *Q = PairDRegs(VT, SDValue(VLdA, Vec), SDValue(VLdB, Vec)); 1081 ReplaceUses(SDValue(N, Vec), SDValue(Q, 0)); 1082 } 1083 } 1084 ReplaceUses(SDValue(N, NumVecs), Chain); 1085 return NULL; 1086} 1087 1088SDNode *ARMDAGToDAGISel::SelectVLDSTLane(SDValue Op, bool IsLoad, 1089 unsigned NumVecs, unsigned *DOpcodes, 1090 unsigned *QOpcodes0, 1091 unsigned *QOpcodes1) { 1092 assert(NumVecs >=2 && NumVecs <= 4 && "VLDSTLane NumVecs out-of-range"); 1093 SDNode *N = Op.getNode(); 1094 DebugLoc dl = N->getDebugLoc(); 1095 1096 SDValue MemAddr, MemUpdate, MemOpc; 1097 if (!SelectAddrMode6(Op, N->getOperand(2), MemAddr, MemUpdate, MemOpc)) 1098 return NULL; 1099 1100 SDValue Chain = N->getOperand(0); 1101 unsigned Lane = 1102 cast<ConstantSDNode>(N->getOperand(NumVecs+3))->getZExtValue(); 1103 EVT VT = IsLoad ? N->getValueType(0) : N->getOperand(3).getValueType(); 1104 bool is64BitVector = VT.is64BitVector(); 1105 1106 // Quad registers are handled by load/store of subregs. Find the subreg info. 1107 unsigned NumElts = 0; 1108 int SubregIdx = 0; 1109 EVT RegVT = VT; 1110 if (!is64BitVector) { 1111 RegVT = GetNEONSubregVT(VT); 1112 NumElts = RegVT.getVectorNumElements(); 1113 SubregIdx = (Lane < NumElts) ? ARM::DSUBREG_0 : ARM::DSUBREG_1; 1114 } 1115 1116 unsigned OpcodeIndex; 1117 switch (VT.getSimpleVT().SimpleTy) { 1118 default: llvm_unreachable("unhandled vld/vst lane type"); 1119 // Double-register operations: 1120 case MVT::v8i8: OpcodeIndex = 0; break; 1121 case MVT::v4i16: OpcodeIndex = 1; break; 1122 case MVT::v2f32: 1123 case MVT::v2i32: OpcodeIndex = 2; break; 1124 // Quad-register operations: 1125 case MVT::v8i16: OpcodeIndex = 0; break; 1126 case MVT::v4f32: 1127 case MVT::v4i32: OpcodeIndex = 1; break; 1128 } 1129 1130 SmallVector<SDValue, 9> Ops; 1131 Ops.push_back(MemAddr); 1132 Ops.push_back(MemUpdate); 1133 Ops.push_back(MemOpc); 1134 1135 unsigned Opc = 0; 1136 if (is64BitVector) { 1137 Opc = DOpcodes[OpcodeIndex]; 1138 for (unsigned Vec = 0; Vec < NumVecs; ++Vec) 1139 Ops.push_back(N->getOperand(Vec+3)); 1140 } else { 1141 // Check if this is loading the even or odd subreg of a Q register. 1142 if (Lane < NumElts) { 1143 Opc = QOpcodes0[OpcodeIndex]; 1144 } else { 1145 Lane -= NumElts; 1146 Opc = QOpcodes1[OpcodeIndex]; 1147 } 1148 // Extract the subregs of the input vector. 1149 for (unsigned Vec = 0; Vec < NumVecs; ++Vec) 1150 Ops.push_back(CurDAG->getTargetExtractSubreg(SubregIdx, dl, RegVT, 1151 N->getOperand(Vec+3))); 1152 } 1153 Ops.push_back(getI32Imm(Lane)); 1154 Ops.push_back(Chain); 1155 1156 if (!IsLoad) 1157 return CurDAG->getMachineNode(Opc, dl, MVT::Other, Ops.data(), NumVecs+5); 1158 1159 std::vector<EVT> ResTys(NumVecs, RegVT); 1160 ResTys.push_back(MVT::Other); 1161 SDNode *VLdLn = 1162 CurDAG->getMachineNode(Opc, dl, ResTys, Ops.data(), NumVecs+5); 1163 // For a 64-bit vector load to D registers, nothing more needs to be done. 1164 if (is64BitVector) 1165 return VLdLn; 1166 1167 // For 128-bit vectors, take the 64-bit results of the load and insert them 1168 // as subregs into the result. 1169 for (unsigned Vec = 0; Vec < NumVecs; ++Vec) { 1170 SDValue QuadVec = CurDAG->getTargetInsertSubreg(SubregIdx, dl, VT, 1171 N->getOperand(Vec+3), 1172 SDValue(VLdLn, Vec)); 1173 ReplaceUses(SDValue(N, Vec), QuadVec); 1174 } 1175 1176 Chain = SDValue(VLdLn, NumVecs); 1177 ReplaceUses(SDValue(N, NumVecs), Chain); 1178 return NULL; 1179} 1180 1181SDNode *ARMDAGToDAGISel::SelectV6T2BitfieldExtractOp(SDValue Op, 1182 unsigned Opc) { 1183 if (!Subtarget->hasV6T2Ops()) 1184 return NULL; 1185 1186 unsigned Shl_imm = 0; 1187 if (isOpcWithIntImmediate(Op.getOperand(0).getNode(), ISD::SHL, Shl_imm)){ 1188 assert(Shl_imm > 0 && Shl_imm < 32 && "bad amount in shift node!"); 1189 unsigned Srl_imm = 0; 1190 if (isInt32Immediate(Op.getOperand(1), Srl_imm)) { 1191 assert(Srl_imm > 0 && Srl_imm < 32 && "bad amount in shift node!"); 1192 unsigned Width = 32 - Srl_imm; 1193 int LSB = Srl_imm - Shl_imm; 1194 if ((LSB + Width) > 32) 1195 return NULL; 1196 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32); 1197 SDValue Ops[] = { Op.getOperand(0).getOperand(0), 1198 CurDAG->getTargetConstant(LSB, MVT::i32), 1199 CurDAG->getTargetConstant(Width, MVT::i32), 1200 getAL(CurDAG), Reg0 }; 1201 return CurDAG->SelectNodeTo(Op.getNode(), Opc, MVT::i32, Ops, 5); 1202 } 1203 } 1204 return NULL; 1205} 1206 1207SDNode *ARMDAGToDAGISel::Select(SDValue Op) { 1208 SDNode *N = Op.getNode(); 1209 DebugLoc dl = N->getDebugLoc(); 1210 1211 if (N->isMachineOpcode()) 1212 return NULL; // Already selected. 1213 1214 switch (N->getOpcode()) { 1215 default: break; 1216 case ISD::Constant: { 1217 unsigned Val = cast<ConstantSDNode>(N)->getZExtValue(); 1218 bool UseCP = true; 1219 if (Subtarget->hasThumb2()) 1220 // Thumb2-aware targets have the MOVT instruction, so all immediates can 1221 // be done with MOV + MOVT, at worst. 1222 UseCP = 0; 1223 else { 1224 if (Subtarget->isThumb()) { 1225 UseCP = (Val > 255 && // MOV 1226 ~Val > 255 && // MOV + MVN 1227 !ARM_AM::isThumbImmShiftedVal(Val)); // MOV + LSL 1228 } else 1229 UseCP = (ARM_AM::getSOImmVal(Val) == -1 && // MOV 1230 ARM_AM::getSOImmVal(~Val) == -1 && // MVN 1231 !ARM_AM::isSOImmTwoPartVal(Val)); // two instrs. 1232 } 1233 1234 if (UseCP) { 1235 SDValue CPIdx = 1236 CurDAG->getTargetConstantPool(ConstantInt::get( 1237 Type::getInt32Ty(*CurDAG->getContext()), Val), 1238 TLI.getPointerTy()); 1239 1240 SDNode *ResNode; 1241 if (Subtarget->isThumb1Only()) { 1242 SDValue Pred = CurDAG->getTargetConstant(0xEULL, MVT::i32); 1243 SDValue PredReg = CurDAG->getRegister(0, MVT::i32); 1244 SDValue Ops[] = { CPIdx, Pred, PredReg, CurDAG->getEntryNode() }; 1245 ResNode = CurDAG->getMachineNode(ARM::tLDRcp, dl, MVT::i32, MVT::Other, 1246 Ops, 4); 1247 } else { 1248 SDValue Ops[] = { 1249 CPIdx, 1250 CurDAG->getRegister(0, MVT::i32), 1251 CurDAG->getTargetConstant(0, MVT::i32), 1252 getAL(CurDAG), 1253 CurDAG->getRegister(0, MVT::i32), 1254 CurDAG->getEntryNode() 1255 }; 1256 ResNode=CurDAG->getMachineNode(ARM::LDRcp, dl, MVT::i32, MVT::Other, 1257 Ops, 6); 1258 } 1259 ReplaceUses(Op, SDValue(ResNode, 0)); 1260 return NULL; 1261 } 1262 1263 // Other cases are autogenerated. 1264 break; 1265 } 1266 case ISD::FrameIndex: { 1267 // Selects to ADDri FI, 0 which in turn will become ADDri SP, imm. 1268 int FI = cast<FrameIndexSDNode>(N)->getIndex(); 1269 SDValue TFI = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); 1270 if (Subtarget->isThumb1Only()) { 1271 return CurDAG->SelectNodeTo(N, ARM::tADDrSPi, MVT::i32, TFI, 1272 CurDAG->getTargetConstant(0, MVT::i32)); 1273 } else { 1274 unsigned Opc = ((Subtarget->isThumb() && Subtarget->hasThumb2()) ? 1275 ARM::t2ADDri : ARM::ADDri); 1276 SDValue Ops[] = { TFI, CurDAG->getTargetConstant(0, MVT::i32), 1277 getAL(CurDAG), CurDAG->getRegister(0, MVT::i32), 1278 CurDAG->getRegister(0, MVT::i32) }; 1279 return CurDAG->SelectNodeTo(N, Opc, MVT::i32, Ops, 5); 1280 } 1281 } 1282 case ARMISD::DYN_ALLOC: 1283 return SelectDYN_ALLOC(Op); 1284 case ISD::SRL: 1285 if (SDNode *I = SelectV6T2BitfieldExtractOp(Op, 1286 Subtarget->isThumb() ? ARM::t2UBFX : ARM::UBFX)) 1287 return I; 1288 break; 1289 case ISD::SRA: 1290 if (SDNode *I = SelectV6T2BitfieldExtractOp(Op, 1291 Subtarget->isThumb() ? ARM::t2SBFX : ARM::SBFX)) 1292 return I; 1293 break; 1294 case ISD::MUL: 1295 if (Subtarget->isThumb1Only()) 1296 break; 1297 if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1))) { 1298 unsigned RHSV = C->getZExtValue(); 1299 if (!RHSV) break; 1300 if (isPowerOf2_32(RHSV-1)) { // 2^n+1? 1301 unsigned ShImm = Log2_32(RHSV-1); 1302 if (ShImm >= 32) 1303 break; 1304 SDValue V = Op.getOperand(0); 1305 ShImm = ARM_AM::getSORegOpc(ARM_AM::lsl, ShImm); 1306 SDValue ShImmOp = CurDAG->getTargetConstant(ShImm, MVT::i32); 1307 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32); 1308 if (Subtarget->isThumb()) { 1309 SDValue Ops[] = { V, V, ShImmOp, getAL(CurDAG), Reg0, Reg0 }; 1310 return CurDAG->SelectNodeTo(N, ARM::t2ADDrs, MVT::i32, Ops, 6); 1311 } else { 1312 SDValue Ops[] = { V, V, Reg0, ShImmOp, getAL(CurDAG), Reg0, Reg0 }; 1313 return CurDAG->SelectNodeTo(N, ARM::ADDrs, MVT::i32, Ops, 7); 1314 } 1315 } 1316 if (isPowerOf2_32(RHSV+1)) { // 2^n-1? 1317 unsigned ShImm = Log2_32(RHSV+1); 1318 if (ShImm >= 32) 1319 break; 1320 SDValue V = Op.getOperand(0); 1321 ShImm = ARM_AM::getSORegOpc(ARM_AM::lsl, ShImm); 1322 SDValue ShImmOp = CurDAG->getTargetConstant(ShImm, MVT::i32); 1323 SDValue Reg0 = CurDAG->getRegister(0, MVT::i32); 1324 if (Subtarget->isThumb()) { 1325 SDValue Ops[] = { V, V, ShImmOp, getAL(CurDAG), Reg0 }; 1326 return CurDAG->SelectNodeTo(N, ARM::t2RSBrs, MVT::i32, Ops, 5); 1327 } else { 1328 SDValue Ops[] = { V, V, Reg0, ShImmOp, getAL(CurDAG), Reg0, Reg0 }; 1329 return CurDAG->SelectNodeTo(N, ARM::RSBrs, MVT::i32, Ops, 7); 1330 } 1331 } 1332 } 1333 break; 1334 case ARMISD::FMRRD: 1335 return CurDAG->getMachineNode(ARM::FMRRD, dl, MVT::i32, MVT::i32, 1336 Op.getOperand(0), getAL(CurDAG), 1337 CurDAG->getRegister(0, MVT::i32)); 1338 case ISD::UMUL_LOHI: { 1339 if (Subtarget->isThumb1Only()) 1340 break; 1341 if (Subtarget->isThumb()) { 1342 SDValue Ops[] = { Op.getOperand(0), Op.getOperand(1), 1343 getAL(CurDAG), CurDAG->getRegister(0, MVT::i32), 1344 CurDAG->getRegister(0, MVT::i32) }; 1345 return CurDAG->getMachineNode(ARM::t2UMULL, dl, MVT::i32, MVT::i32, Ops,4); 1346 } else { 1347 SDValue Ops[] = { Op.getOperand(0), Op.getOperand(1), 1348 getAL(CurDAG), CurDAG->getRegister(0, MVT::i32), 1349 CurDAG->getRegister(0, MVT::i32) }; 1350 return CurDAG->getMachineNode(ARM::UMULL, dl, MVT::i32, MVT::i32, Ops, 5); 1351 } 1352 } 1353 case ISD::SMUL_LOHI: { 1354 if (Subtarget->isThumb1Only()) 1355 break; 1356 if (Subtarget->isThumb()) { 1357 SDValue Ops[] = { Op.getOperand(0), Op.getOperand(1), 1358 getAL(CurDAG), CurDAG->getRegister(0, MVT::i32) }; 1359 return CurDAG->getMachineNode(ARM::t2SMULL, dl, MVT::i32, MVT::i32, Ops,4); 1360 } else { 1361 SDValue Ops[] = { Op.getOperand(0), Op.getOperand(1), 1362 getAL(CurDAG), CurDAG->getRegister(0, MVT::i32), 1363 CurDAG->getRegister(0, MVT::i32) }; 1364 return CurDAG->getMachineNode(ARM::SMULL, dl, MVT::i32, MVT::i32, Ops, 5); 1365 } 1366 } 1367 case ISD::LOAD: { 1368 SDNode *ResNode = 0; 1369 if (Subtarget->isThumb() && Subtarget->hasThumb2()) 1370 ResNode = SelectT2IndexedLoad(Op); 1371 else 1372 ResNode = SelectARMIndexedLoad(Op); 1373 if (ResNode) 1374 return ResNode; 1375 // Other cases are autogenerated. 1376 break; 1377 } 1378 case ARMISD::BRCOND: { 1379 // Pattern: (ARMbrcond:void (bb:Other):$dst, (imm:i32):$cc) 1380 // Emits: (Bcc:void (bb:Other):$dst, (imm:i32):$cc) 1381 // Pattern complexity = 6 cost = 1 size = 0 1382 1383 // Pattern: (ARMbrcond:void (bb:Other):$dst, (imm:i32):$cc) 1384 // Emits: (tBcc:void (bb:Other):$dst, (imm:i32):$cc) 1385 // Pattern complexity = 6 cost = 1 size = 0 1386 1387 // Pattern: (ARMbrcond:void (bb:Other):$dst, (imm:i32):$cc) 1388 // Emits: (t2Bcc:void (bb:Other):$dst, (imm:i32):$cc) 1389 // Pattern complexity = 6 cost = 1 size = 0 1390 1391 unsigned Opc = Subtarget->isThumb() ? 1392 ((Subtarget->hasThumb2()) ? ARM::t2Bcc : ARM::tBcc) : ARM::Bcc; 1393 SDValue Chain = Op.getOperand(0); 1394 SDValue N1 = Op.getOperand(1); 1395 SDValue N2 = Op.getOperand(2); 1396 SDValue N3 = Op.getOperand(3); 1397 SDValue InFlag = Op.getOperand(4); 1398 assert(N1.getOpcode() == ISD::BasicBlock); 1399 assert(N2.getOpcode() == ISD::Constant); 1400 assert(N3.getOpcode() == ISD::Register); 1401 1402 SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) 1403 cast<ConstantSDNode>(N2)->getZExtValue()), 1404 MVT::i32); 1405 SDValue Ops[] = { N1, Tmp2, N3, Chain, InFlag }; 1406 SDNode *ResNode = CurDAG->getMachineNode(Opc, dl, MVT::Other, 1407 MVT::Flag, Ops, 5); 1408 Chain = SDValue(ResNode, 0); 1409 if (Op.getNode()->getNumValues() == 2) { 1410 InFlag = SDValue(ResNode, 1); 1411 ReplaceUses(SDValue(Op.getNode(), 1), InFlag); 1412 } 1413 ReplaceUses(SDValue(Op.getNode(), 0), SDValue(Chain.getNode(), Chain.getResNo())); 1414 return NULL; 1415 } 1416 case ARMISD::CMOV: { 1417 EVT VT = Op.getValueType(); 1418 SDValue N0 = Op.getOperand(0); 1419 SDValue N1 = Op.getOperand(1); 1420 SDValue N2 = Op.getOperand(2); 1421 SDValue N3 = Op.getOperand(3); 1422 SDValue InFlag = Op.getOperand(4); 1423 assert(N2.getOpcode() == ISD::Constant); 1424 assert(N3.getOpcode() == ISD::Register); 1425 1426 if (!Subtarget->isThumb1Only() && VT == MVT::i32) { 1427 // Pattern: (ARMcmov:i32 GPR:i32:$false, so_reg:i32:$true, (imm:i32):$cc) 1428 // Emits: (MOVCCs:i32 GPR:i32:$false, so_reg:i32:$true, (imm:i32):$cc) 1429 // Pattern complexity = 18 cost = 1 size = 0 1430 SDValue CPTmp0; 1431 SDValue CPTmp1; 1432 SDValue CPTmp2; 1433 if (Subtarget->isThumb()) { 1434 if (SelectT2ShifterOperandReg(Op, N1, CPTmp0, CPTmp1)) { 1435 unsigned SOVal = cast<ConstantSDNode>(CPTmp1)->getZExtValue(); 1436 unsigned SOShOp = ARM_AM::getSORegShOp(SOVal); 1437 unsigned Opc = 0; 1438 switch (SOShOp) { 1439 case ARM_AM::lsl: Opc = ARM::t2MOVCClsl; break; 1440 case ARM_AM::lsr: Opc = ARM::t2MOVCClsr; break; 1441 case ARM_AM::asr: Opc = ARM::t2MOVCCasr; break; 1442 case ARM_AM::ror: Opc = ARM::t2MOVCCror; break; 1443 default: 1444 llvm_unreachable("Unknown so_reg opcode!"); 1445 break; 1446 } 1447 SDValue SOShImm = 1448 CurDAG->getTargetConstant(ARM_AM::getSORegOffset(SOVal), MVT::i32); 1449 SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) 1450 cast<ConstantSDNode>(N2)->getZExtValue()), 1451 MVT::i32); 1452 SDValue Ops[] = { N0, CPTmp0, SOShImm, Tmp2, N3, InFlag }; 1453 return CurDAG->SelectNodeTo(Op.getNode(), Opc, MVT::i32,Ops, 6); 1454 } 1455 } else { 1456 if (SelectShifterOperandReg(Op, N1, CPTmp0, CPTmp1, CPTmp2)) { 1457 SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) 1458 cast<ConstantSDNode>(N2)->getZExtValue()), 1459 MVT::i32); 1460 SDValue Ops[] = { N0, CPTmp0, CPTmp1, CPTmp2, Tmp2, N3, InFlag }; 1461 return CurDAG->SelectNodeTo(Op.getNode(), 1462 ARM::MOVCCs, MVT::i32, Ops, 7); 1463 } 1464 } 1465 1466 // Pattern: (ARMcmov:i32 GPR:i32:$false, 1467 // (imm:i32)<<P:Predicate_so_imm>>:$true, 1468 // (imm:i32):$cc) 1469 // Emits: (MOVCCi:i32 GPR:i32:$false, 1470 // (so_imm:i32 (imm:i32):$true), (imm:i32):$cc) 1471 // Pattern complexity = 10 cost = 1 size = 0 1472 if (N3.getOpcode() == ISD::Constant) { 1473 if (Subtarget->isThumb()) { 1474 if (Predicate_t2_so_imm(N3.getNode())) { 1475 SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) 1476 cast<ConstantSDNode>(N1)->getZExtValue()), 1477 MVT::i32); 1478 SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) 1479 cast<ConstantSDNode>(N2)->getZExtValue()), 1480 MVT::i32); 1481 SDValue Ops[] = { N0, Tmp1, Tmp2, N3, InFlag }; 1482 return CurDAG->SelectNodeTo(Op.getNode(), 1483 ARM::t2MOVCCi, MVT::i32, Ops, 5); 1484 } 1485 } else { 1486 if (Predicate_so_imm(N3.getNode())) { 1487 SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) 1488 cast<ConstantSDNode>(N1)->getZExtValue()), 1489 MVT::i32); 1490 SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) 1491 cast<ConstantSDNode>(N2)->getZExtValue()), 1492 MVT::i32); 1493 SDValue Ops[] = { N0, Tmp1, Tmp2, N3, InFlag }; 1494 return CurDAG->SelectNodeTo(Op.getNode(), 1495 ARM::MOVCCi, MVT::i32, Ops, 5); 1496 } 1497 } 1498 } 1499 } 1500 1501 // Pattern: (ARMcmov:i32 GPR:i32:$false, GPR:i32:$true, (imm:i32):$cc) 1502 // Emits: (MOVCCr:i32 GPR:i32:$false, GPR:i32:$true, (imm:i32):$cc) 1503 // Pattern complexity = 6 cost = 1 size = 0 1504 // 1505 // Pattern: (ARMcmov:i32 GPR:i32:$false, GPR:i32:$true, (imm:i32):$cc) 1506 // Emits: (tMOVCCr:i32 GPR:i32:$false, GPR:i32:$true, (imm:i32):$cc) 1507 // Pattern complexity = 6 cost = 11 size = 0 1508 // 1509 // Also FCPYScc and FCPYDcc. 1510 SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) 1511 cast<ConstantSDNode>(N2)->getZExtValue()), 1512 MVT::i32); 1513 SDValue Ops[] = { N0, N1, Tmp2, N3, InFlag }; 1514 unsigned Opc = 0; 1515 switch (VT.getSimpleVT().SimpleTy) { 1516 default: assert(false && "Illegal conditional move type!"); 1517 break; 1518 case MVT::i32: 1519 Opc = Subtarget->isThumb() 1520 ? (Subtarget->hasThumb2() ? ARM::t2MOVCCr : ARM::tMOVCCr_pseudo) 1521 : ARM::MOVCCr; 1522 break; 1523 case MVT::f32: 1524 Opc = ARM::FCPYScc; 1525 break; 1526 case MVT::f64: 1527 Opc = ARM::FCPYDcc; 1528 break; 1529 } 1530 return CurDAG->SelectNodeTo(Op.getNode(), Opc, VT, Ops, 5); 1531 } 1532 case ARMISD::CNEG: { 1533 EVT VT = Op.getValueType(); 1534 SDValue N0 = Op.getOperand(0); 1535 SDValue N1 = Op.getOperand(1); 1536 SDValue N2 = Op.getOperand(2); 1537 SDValue N3 = Op.getOperand(3); 1538 SDValue InFlag = Op.getOperand(4); 1539 assert(N2.getOpcode() == ISD::Constant); 1540 assert(N3.getOpcode() == ISD::Register); 1541 1542 SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) 1543 cast<ConstantSDNode>(N2)->getZExtValue()), 1544 MVT::i32); 1545 SDValue Ops[] = { N0, N1, Tmp2, N3, InFlag }; 1546 unsigned Opc = 0; 1547 switch (VT.getSimpleVT().SimpleTy) { 1548 default: assert(false && "Illegal conditional move type!"); 1549 break; 1550 case MVT::f32: 1551 Opc = ARM::FNEGScc; 1552 break; 1553 case MVT::f64: 1554 Opc = ARM::FNEGDcc; 1555 break; 1556 } 1557 return CurDAG->SelectNodeTo(Op.getNode(), Opc, VT, Ops, 5); 1558 } 1559 1560 case ARMISD::VZIP: { 1561 unsigned Opc = 0; 1562 EVT VT = N->getValueType(0); 1563 switch (VT.getSimpleVT().SimpleTy) { 1564 default: return NULL; 1565 case MVT::v8i8: Opc = ARM::VZIPd8; break; 1566 case MVT::v4i16: Opc = ARM::VZIPd16; break; 1567 case MVT::v2f32: 1568 case MVT::v2i32: Opc = ARM::VZIPd32; break; 1569 case MVT::v16i8: Opc = ARM::VZIPq8; break; 1570 case MVT::v8i16: Opc = ARM::VZIPq16; break; 1571 case MVT::v4f32: 1572 case MVT::v4i32: Opc = ARM::VZIPq32; break; 1573 } 1574 return CurDAG->getMachineNode(Opc, dl, VT, VT, 1575 N->getOperand(0), N->getOperand(1)); 1576 } 1577 case ARMISD::VUZP: { 1578 unsigned Opc = 0; 1579 EVT VT = N->getValueType(0); 1580 switch (VT.getSimpleVT().SimpleTy) { 1581 default: return NULL; 1582 case MVT::v8i8: Opc = ARM::VUZPd8; break; 1583 case MVT::v4i16: Opc = ARM::VUZPd16; break; 1584 case MVT::v2f32: 1585 case MVT::v2i32: Opc = ARM::VUZPd32; break; 1586 case MVT::v16i8: Opc = ARM::VUZPq8; break; 1587 case MVT::v8i16: Opc = ARM::VUZPq16; break; 1588 case MVT::v4f32: 1589 case MVT::v4i32: Opc = ARM::VUZPq32; break; 1590 } 1591 return CurDAG->getMachineNode(Opc, dl, VT, VT, 1592 N->getOperand(0), N->getOperand(1)); 1593 } 1594 case ARMISD::VTRN: { 1595 unsigned Opc = 0; 1596 EVT VT = N->getValueType(0); 1597 switch (VT.getSimpleVT().SimpleTy) { 1598 default: return NULL; 1599 case MVT::v8i8: Opc = ARM::VTRNd8; break; 1600 case MVT::v4i16: Opc = ARM::VTRNd16; break; 1601 case MVT::v2f32: 1602 case MVT::v2i32: Opc = ARM::VTRNd32; break; 1603 case MVT::v16i8: Opc = ARM::VTRNq8; break; 1604 case MVT::v8i16: Opc = ARM::VTRNq16; break; 1605 case MVT::v4f32: 1606 case MVT::v4i32: Opc = ARM::VTRNq32; break; 1607 } 1608 return CurDAG->getMachineNode(Opc, dl, VT, VT, 1609 N->getOperand(0), N->getOperand(1)); 1610 } 1611 1612 case ISD::INTRINSIC_VOID: 1613 case ISD::INTRINSIC_W_CHAIN: { 1614 unsigned IntNo = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue(); 1615 EVT VT = N->getValueType(0); 1616 unsigned Opc = 0; 1617 1618 switch (IntNo) { 1619 default: 1620 break; 1621 1622 case Intrinsic::arm_neon_vld2: { 1623 unsigned DOpcodes[] = { ARM::VLD2d8, ARM::VLD2d16, 1624 ARM::VLD2d32, ARM::VLD2d64 }; 1625 unsigned QOpcodes[] = { ARM::VLD2q8, ARM::VLD2q16, ARM::VLD2q32 }; 1626 return SelectVLD(Op, 2, DOpcodes, QOpcodes, 0); 1627 } 1628 1629 case Intrinsic::arm_neon_vld3: { 1630 unsigned DOpcodes[] = { ARM::VLD3d8, ARM::VLD3d16, 1631 ARM::VLD3d32, ARM::VLD3d64 }; 1632 unsigned QOpcodes0[] = { ARM::VLD3q8a, ARM::VLD3q16a, ARM::VLD3q32a }; 1633 unsigned QOpcodes1[] = { ARM::VLD3q8b, ARM::VLD3q16b, ARM::VLD3q32b }; 1634 return SelectVLD(Op, 3, DOpcodes, QOpcodes0, QOpcodes1); 1635 } 1636 1637 case Intrinsic::arm_neon_vld4: { 1638 unsigned DOpcodes[] = { ARM::VLD4d8, ARM::VLD4d16, 1639 ARM::VLD4d32, ARM::VLD4d64 }; 1640 unsigned QOpcodes0[] = { ARM::VLD4q8a, ARM::VLD4q16a, ARM::VLD4q32a }; 1641 unsigned QOpcodes1[] = { ARM::VLD4q8b, ARM::VLD4q16b, ARM::VLD4q32b }; 1642 return SelectVLD(Op, 4, DOpcodes, QOpcodes0, QOpcodes1); 1643 } 1644 1645 case Intrinsic::arm_neon_vld2lane: { 1646 unsigned DOpcodes[] = { ARM::VLD2LNd8, ARM::VLD2LNd16, ARM::VLD2LNd32 }; 1647 unsigned QOpcodes0[] = { ARM::VLD2LNq16a, ARM::VLD2LNq32a }; 1648 unsigned QOpcodes1[] = { ARM::VLD2LNq16b, ARM::VLD2LNq32b }; 1649 return SelectVLDSTLane(Op, true, 2, DOpcodes, QOpcodes0, QOpcodes1); 1650 } 1651 1652 case Intrinsic::arm_neon_vld3lane: { 1653 unsigned DOpcodes[] = { ARM::VLD3LNd8, ARM::VLD3LNd16, ARM::VLD3LNd32 }; 1654 unsigned QOpcodes0[] = { ARM::VLD3LNq16a, ARM::VLD3LNq32a }; 1655 unsigned QOpcodes1[] = { ARM::VLD3LNq16b, ARM::VLD3LNq32b }; 1656 return SelectVLDSTLane(Op, true, 3, DOpcodes, QOpcodes0, QOpcodes1); 1657 } 1658 1659 case Intrinsic::arm_neon_vld4lane: { 1660 unsigned DOpcodes[] = { ARM::VLD4LNd8, ARM::VLD4LNd16, ARM::VLD4LNd32 }; 1661 unsigned QOpcodes0[] = { ARM::VLD4LNq16a, ARM::VLD4LNq32a }; 1662 unsigned QOpcodes1[] = { ARM::VLD4LNq16b, ARM::VLD4LNq32b }; 1663 return SelectVLDSTLane(Op, true, 4, DOpcodes, QOpcodes0, QOpcodes1); 1664 } 1665 1666 case Intrinsic::arm_neon_vst2: { 1667 SDValue MemAddr, MemUpdate, MemOpc; 1668 if (!SelectAddrMode6(Op, N->getOperand(2), MemAddr, MemUpdate, MemOpc)) 1669 return NULL; 1670 SDValue Chain = N->getOperand(0); 1671 VT = N->getOperand(3).getValueType(); 1672 if (VT.is64BitVector()) { 1673 switch (VT.getSimpleVT().SimpleTy) { 1674 default: llvm_unreachable("unhandled vst2 type"); 1675 case MVT::v8i8: Opc = ARM::VST2d8; break; 1676 case MVT::v4i16: Opc = ARM::VST2d16; break; 1677 case MVT::v2f32: 1678 case MVT::v2i32: Opc = ARM::VST2d32; break; 1679 case MVT::v1i64: Opc = ARM::VST2d64; break; 1680 } 1681 const SDValue Ops[] = { MemAddr, MemUpdate, MemOpc, 1682 N->getOperand(3), N->getOperand(4), Chain }; 1683 return CurDAG->getMachineNode(Opc, dl, MVT::Other, Ops, 6); 1684 } 1685 // Quad registers are stored as pairs of double registers. 1686 EVT RegVT; 1687 switch (VT.getSimpleVT().SimpleTy) { 1688 default: llvm_unreachable("unhandled vst2 type"); 1689 case MVT::v16i8: Opc = ARM::VST2q8; RegVT = MVT::v8i8; break; 1690 case MVT::v8i16: Opc = ARM::VST2q16; RegVT = MVT::v4i16; break; 1691 case MVT::v4f32: Opc = ARM::VST2q32; RegVT = MVT::v2f32; break; 1692 case MVT::v4i32: Opc = ARM::VST2q32; RegVT = MVT::v2i32; break; 1693 } 1694 SDValue D0 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT, 1695 N->getOperand(3)); 1696 SDValue D1 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT, 1697 N->getOperand(3)); 1698 SDValue D2 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT, 1699 N->getOperand(4)); 1700 SDValue D3 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT, 1701 N->getOperand(4)); 1702 const SDValue Ops[] = { MemAddr, MemUpdate, MemOpc, 1703 D0, D1, D2, D3, Chain }; 1704 return CurDAG->getMachineNode(Opc, dl, MVT::Other, Ops, 8); 1705 } 1706 1707 case Intrinsic::arm_neon_vst3: { 1708 SDValue MemAddr, MemUpdate, MemOpc; 1709 if (!SelectAddrMode6(Op, N->getOperand(2), MemAddr, MemUpdate, MemOpc)) 1710 return NULL; 1711 SDValue Chain = N->getOperand(0); 1712 VT = N->getOperand(3).getValueType(); 1713 if (VT.is64BitVector()) { 1714 switch (VT.getSimpleVT().SimpleTy) { 1715 default: llvm_unreachable("unhandled vst3 type"); 1716 case MVT::v8i8: Opc = ARM::VST3d8; break; 1717 case MVT::v4i16: Opc = ARM::VST3d16; break; 1718 case MVT::v2f32: 1719 case MVT::v2i32: Opc = ARM::VST3d32; break; 1720 case MVT::v1i64: Opc = ARM::VST3d64; break; 1721 } 1722 const SDValue Ops[] = { MemAddr, MemUpdate, MemOpc, 1723 N->getOperand(3), N->getOperand(4), 1724 N->getOperand(5), Chain }; 1725 return CurDAG->getMachineNode(Opc, dl, MVT::Other, Ops, 7); 1726 } 1727 // Quad registers are stored with two separate instructions, where one 1728 // stores the even registers and the other stores the odd registers. 1729 EVT RegVT; 1730 unsigned Opc2 = 0; 1731 switch (VT.getSimpleVT().SimpleTy) { 1732 default: llvm_unreachable("unhandled vst3 type"); 1733 case MVT::v16i8: 1734 Opc = ARM::VST3q8a; Opc2 = ARM::VST3q8b; RegVT = MVT::v8i8; break; 1735 case MVT::v8i16: 1736 Opc = ARM::VST3q16a; Opc2 = ARM::VST3q16b; RegVT = MVT::v4i16; break; 1737 case MVT::v4f32: 1738 Opc = ARM::VST3q32a; Opc2 = ARM::VST3q32b; RegVT = MVT::v2f32; break; 1739 case MVT::v4i32: 1740 Opc = ARM::VST3q32a; Opc2 = ARM::VST3q32b; RegVT = MVT::v2i32; break; 1741 } 1742 // Enable writeback to the address register. 1743 MemOpc = CurDAG->getTargetConstant(ARM_AM::getAM6Opc(true), MVT::i32); 1744 1745 SDValue D0 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT, 1746 N->getOperand(3)); 1747 SDValue D2 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT, 1748 N->getOperand(4)); 1749 SDValue D4 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT, 1750 N->getOperand(5)); 1751 const SDValue OpsA[] = { MemAddr, MemUpdate, MemOpc, D0, D2, D4, Chain }; 1752 SDNode *VStA = CurDAG->getMachineNode(Opc, dl, MemAddr.getValueType(), 1753 MVT::Other, OpsA, 7); 1754 Chain = SDValue(VStA, 1); 1755 1756 SDValue D1 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT, 1757 N->getOperand(3)); 1758 SDValue D3 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT, 1759 N->getOperand(4)); 1760 SDValue D5 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT, 1761 N->getOperand(5)); 1762 MemAddr = SDValue(VStA, 0); 1763 const SDValue OpsB[] = { MemAddr, MemUpdate, MemOpc, D1, D3, D5, Chain }; 1764 SDNode *VStB = CurDAG->getMachineNode(Opc2, dl, MemAddr.getValueType(), 1765 MVT::Other, OpsB, 7); 1766 Chain = SDValue(VStB, 1); 1767 ReplaceUses(SDValue(N, 0), Chain); 1768 return NULL; 1769 } 1770 1771 case Intrinsic::arm_neon_vst4: { 1772 SDValue MemAddr, MemUpdate, MemOpc; 1773 if (!SelectAddrMode6(Op, N->getOperand(2), MemAddr, MemUpdate, MemOpc)) 1774 return NULL; 1775 SDValue Chain = N->getOperand(0); 1776 VT = N->getOperand(3).getValueType(); 1777 if (VT.is64BitVector()) { 1778 switch (VT.getSimpleVT().SimpleTy) { 1779 default: llvm_unreachable("unhandled vst4 type"); 1780 case MVT::v8i8: Opc = ARM::VST4d8; break; 1781 case MVT::v4i16: Opc = ARM::VST4d16; break; 1782 case MVT::v2f32: 1783 case MVT::v2i32: Opc = ARM::VST4d32; break; 1784 case MVT::v1i64: Opc = ARM::VST4d64; break; 1785 } 1786 const SDValue Ops[] = { MemAddr, MemUpdate, MemOpc, 1787 N->getOperand(3), N->getOperand(4), 1788 N->getOperand(5), N->getOperand(6), Chain }; 1789 return CurDAG->getMachineNode(Opc, dl, MVT::Other, Ops, 8); 1790 } 1791 // Quad registers are stored with two separate instructions, where one 1792 // stores the even registers and the other stores the odd registers. 1793 EVT RegVT; 1794 unsigned Opc2 = 0; 1795 switch (VT.getSimpleVT().SimpleTy) { 1796 default: llvm_unreachable("unhandled vst4 type"); 1797 case MVT::v16i8: 1798 Opc = ARM::VST4q8a; Opc2 = ARM::VST4q8b; RegVT = MVT::v8i8; break; 1799 case MVT::v8i16: 1800 Opc = ARM::VST4q16a; Opc2 = ARM::VST4q16b; RegVT = MVT::v4i16; break; 1801 case MVT::v4f32: 1802 Opc = ARM::VST4q32a; Opc2 = ARM::VST4q32b; RegVT = MVT::v2f32; break; 1803 case MVT::v4i32: 1804 Opc = ARM::VST4q32a; Opc2 = ARM::VST4q32b; RegVT = MVT::v2i32; break; 1805 } 1806 // Enable writeback to the address register. 1807 MemOpc = CurDAG->getTargetConstant(ARM_AM::getAM6Opc(true), MVT::i32); 1808 1809 SDValue D0 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT, 1810 N->getOperand(3)); 1811 SDValue D2 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT, 1812 N->getOperand(4)); 1813 SDValue D4 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT, 1814 N->getOperand(5)); 1815 SDValue D6 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0, dl, RegVT, 1816 N->getOperand(6)); 1817 const SDValue OpsA[] = { MemAddr, MemUpdate, MemOpc, 1818 D0, D2, D4, D6, Chain }; 1819 SDNode *VStA = CurDAG->getMachineNode(Opc, dl, MemAddr.getValueType(), 1820 MVT::Other, OpsA, 8); 1821 Chain = SDValue(VStA, 1); 1822 1823 SDValue D1 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT, 1824 N->getOperand(3)); 1825 SDValue D3 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT, 1826 N->getOperand(4)); 1827 SDValue D5 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT, 1828 N->getOperand(5)); 1829 SDValue D7 = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_1, dl, RegVT, 1830 N->getOperand(6)); 1831 MemAddr = SDValue(VStA, 0); 1832 const SDValue OpsB[] = { MemAddr, MemUpdate, MemOpc, 1833 D1, D3, D5, D7, Chain }; 1834 SDNode *VStB = CurDAG->getMachineNode(Opc2, dl, MemAddr.getValueType(), 1835 MVT::Other, OpsB, 8); 1836 Chain = SDValue(VStB, 1); 1837 ReplaceUses(SDValue(N, 0), Chain); 1838 return NULL; 1839 } 1840 1841 case Intrinsic::arm_neon_vst2lane: { 1842 unsigned DOpcodes[] = { ARM::VST2LNd8, ARM::VST2LNd16, ARM::VST2LNd32 }; 1843 unsigned QOpcodes0[] = { ARM::VST2LNq16a, ARM::VST2LNq32a }; 1844 unsigned QOpcodes1[] = { ARM::VST2LNq16b, ARM::VST2LNq32b }; 1845 return SelectVLDSTLane(Op, false, 2, DOpcodes, QOpcodes0, QOpcodes1); 1846 } 1847 1848 case Intrinsic::arm_neon_vst3lane: { 1849 unsigned DOpcodes[] = { ARM::VST3LNd8, ARM::VST3LNd16, ARM::VST3LNd32 }; 1850 unsigned QOpcodes0[] = { ARM::VST3LNq16a, ARM::VST3LNq32a }; 1851 unsigned QOpcodes1[] = { ARM::VST3LNq16b, ARM::VST3LNq32b }; 1852 return SelectVLDSTLane(Op, false, 3, DOpcodes, QOpcodes0, QOpcodes1); 1853 } 1854 1855 case Intrinsic::arm_neon_vst4lane: { 1856 unsigned DOpcodes[] = { ARM::VST4LNd8, ARM::VST4LNd16, ARM::VST4LNd32 }; 1857 unsigned QOpcodes0[] = { ARM::VST4LNq16a, ARM::VST4LNq32a }; 1858 unsigned QOpcodes1[] = { ARM::VST4LNq16b, ARM::VST4LNq32b }; 1859 return SelectVLDSTLane(Op, false, 4, DOpcodes, QOpcodes0, QOpcodes1); 1860 } 1861 } 1862 } 1863 } 1864 1865 return SelectCode(Op); 1866} 1867 1868bool ARMDAGToDAGISel:: 1869SelectInlineAsmMemoryOperand(const SDValue &Op, char ConstraintCode, 1870 std::vector<SDValue> &OutOps) { 1871 assert(ConstraintCode == 'm' && "unexpected asm memory constraint"); 1872 // Require the address to be in a register. That is safe for all ARM 1873 // variants and it is hard to do anything much smarter without knowing 1874 // how the operand is used. 1875 OutOps.push_back(Op); 1876 return false; 1877} 1878 1879/// createARMISelDag - This pass converts a legalized DAG into a 1880/// ARM-specific DAG, ready for instruction scheduling. 1881/// 1882FunctionPass *llvm::createARMISelDag(ARMBaseTargetMachine &TM, 1883 CodeGenOpt::Level OptLevel) { 1884 return new ARMDAGToDAGISel(TM, OptLevel); 1885} 1886