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