15 #define DEBUG_TYPE "ppc-codegen"
54 PPCLowering(*
TM.getTargetLowering()),
55 PPCSubTarget(*
TM.getSubtargetImpl()) {
64 if (!PPCSubTarget.isSVR4ABI())
70 virtual void PostprocessISelDAG();
74 inline SDValue getI32Imm(
unsigned Imm) {
75 return CurDAG->getTargetConstant(Imm,
MVT::i32);
80 inline SDValue getI64Imm(uint64_t Imm) {
81 return CurDAG->getTargetConstant(Imm,
MVT::i64);
85 inline SDValue getSmallIPtrImm(
unsigned Imm) {
86 return CurDAG->getTargetConstant(Imm, PPCLowering.getPointerTy());
93 static bool isRunOfOnes(
unsigned Val,
unsigned &MB,
unsigned &ME);
98 static bool isRotateAndMask(
SDNode *
N,
unsigned Mask,
bool isShiftMask,
99 unsigned &SH,
unsigned &MB,
unsigned &ME);
103 SDNode *getGlobalBaseReg();
119 return PPCLowering.SelectAddressRegImm(N, Disp, Base, *CurDAG,
false);
139 return PPCLowering.SelectAddressRegReg(N, Base, Index, *CurDAG);
145 return PPCLowering.SelectAddressRegRegOnly(N, Base, Index, *CurDAG);
152 return PPCLowering.SelectAddressRegImm(N, Disp, Base, *CurDAG,
true);
166 virtual bool SelectInlineAsmMemoryOperand(
const SDValue &Op,
168 std::vector<SDValue> &OutOps) {
169 OutOps.push_back(Op);
175 virtual const char *getPassName()
const {
176 return "PowerPC DAG->DAG Pattern Instruction Selection";
180 #include "PPCGenDAGISel.inc"
196 bool HasVectorVReg =
false;
197 for (
unsigned i = 0, e = RegInfo->getNumVirtRegs(); i != e; ++i) {
199 if (RegInfo->getRegClass(Reg) == &PPC::VRRCRegClass) {
200 HasVectorVReg =
true;
204 if (!HasVectorVReg)
return;
218 unsigned InVRSAVE = RegInfo->createVirtualRegister(&PPC::GPRCRegClass);
219 unsigned UpdatedVRSAVE = RegInfo->createVirtualRegister(&PPC::GPRCRegClass);
229 BuildMI(EntryBB, IP, dl, TII.
get(PPC::MFVRSAVE), InVRSAVE);
230 BuildMI(EntryBB, IP, dl, TII.
get(PPC::UPDATE_VRSAVE),
231 UpdatedVRSAVE).addReg(InVRSAVE);
232 BuildMI(EntryBB, IP, dl, TII.
get(PPC::MTVRSAVE)).addReg(UpdatedVRSAVE);
236 if (!BB->empty() && BB->back().isReturn()) {
237 IP = BB->end(); --IP;
242 while (I2 != BB->begin() && (--I2)->isTerminator())
246 BuildMI(*BB, IP, dl, TII.
get(PPC::MTVRSAVE)).addReg(InVRSAVE);
255 SDNode *PPCDAGToDAGISel::getGlobalBaseReg() {
263 if (PPCLowering.getPointerTy() ==
MVT::i32) {
264 GlobalBaseReg = RegInfo->createVirtualRegister(&PPC::GPRCRegClass);
265 BuildMI(FirstMBB, MBBI, dl, TII.
get(PPC::MovePCtoLR));
268 GlobalBaseReg = RegInfo->createVirtualRegister(&PPC::G8RCRegClass);
269 BuildMI(FirstMBB, MBBI, dl, TII.
get(PPC::MovePCtoLR8));
274 PPCLowering.getPointerTy()).getNode();
285 Imm = (short)cast<ConstantSDNode>(N)->getZExtValue();
287 return Imm == (int32_t)cast<ConstantSDNode>(
N)->getZExtValue();
289 return Imm == (int64_t)cast<ConstantSDNode>(N)->getZExtValue();
301 Imm = cast<ConstantSDNode>(
N)->getZExtValue();
311 Imm = cast<ConstantSDNode>(
N)->getZExtValue();
356 bool PPCDAGToDAGISel::isRotateAndMask(
SDNode *N,
unsigned Mask,
357 bool isShiftMask,
unsigned &SH,
358 unsigned &MB,
unsigned &ME) {
365 unsigned Indeterminant = ~0;
373 if (isShiftMask) Mask = Mask << Shift;
375 Indeterminant = ~(0xFFFFFFFFu << Shift);
378 if (isShiftMask) Mask = Mask >> Shift;
380 Indeterminant = ~(0xFFFFFFFFu >> Shift);
390 if (Mask && !(Mask & Indeterminant)) {
400 SDNode *PPCDAGToDAGISel::SelectBitfieldInsert(
SDNode *N) {
405 APInt LKZ, LKO, RKZ, RKO;
406 CurDAG->ComputeMaskedBits(Op0, LKZ, LKO);
407 CurDAG->ComputeMaskedBits(Op1, RKZ, RKO);
412 if ((TargetMask | InsertMask) == 0xFFFFFFFF) {
415 unsigned Value, SH = 0;
416 TargetMask = ~TargetMask;
417 InsertMask = ~InsertMask;
447 SH = (Op1Opc ==
ISD::SHL) ? Value : 32 - Value;
456 SH = (SHOpc ==
ISD::SHL) ? Value : 32 - Value;
461 SDValue Ops[] = { Op0, Op1, getI32Imm(SH), getI32Imm(MB),
463 return CurDAG->getMachineNode(PPC::RLWIMI, dl,
MVT::i32, Ops);
483 getI32Imm(Imm & 0xFFFF)), 0);
487 getI32Imm(Imm & 0xFFFF)), 0);
499 getI32Imm(Imm >> 16)), 0);
501 getI32Imm(Imm & 0xFFFF)), 0);
507 getI32Imm(Imm & 0xFFFF)), 0);
513 getI32Imm((
int)SImm & 0xFFFF)),
524 getI32Imm(Imm & 0xFFFF)), 0);
528 getI32Imm(Imm & 0xFFFF)), 0);
541 getI64Imm(Imm >> 16)), 0);
543 getI64Imm(Imm & 0xFFFF)), 0);
550 getI64Imm(Imm & 0xFFFF)), 0);
556 getI64Imm(SImm & 0xFFFF)),
566 return SDValue(CurDAG->getMachineNode(Opc, dl,
MVT::i32, LHS, RHS), 0);
639 return PPC::VCMPEQUB;
641 return PPC::VCMPEQUH;
643 return PPC::VCMPEQUW;
646 return PPC::VCMPEQFP;
653 return PPC::VCMPGTSB;
655 return PPC::VCMPGTSH;
657 return PPC::VCMPGTSW;
659 return PPC::VCMPGTFP;
666 return PPC::VCMPGTUB;
668 return PPC::VCMPGTUH;
670 return PPC::VCMPGTUW;
674 return PPC::VCMPEQFP;
680 return PPC::VCMPGTFP;
684 return PPC::VCMPGEFP;
698 return PPC::VCMPEQUB;
700 return PPC::VCMPEQUH;
702 return PPC::VCMPEQUW;
704 return PPC::VCMPEQFP;
715 EVT PtrVT = CurDAG->getTargetLoweringInfo().getPointerTy();
727 Op =
SDValue(CurDAG->getMachineNode(PPC::CNTLZW, dl,
MVT::i32, Op), 0);
728 SDValue Ops[] = { Op, getI32Imm(27), getI32Imm(5), getI32Imm(31) };
729 return CurDAG->SelectNodeTo(N, PPC::RLWINM,
MVT::i32, Ops, 4);
735 Op, getI32Imm(~0U)), 0);
736 return CurDAG->SelectNodeTo(N, PPC::SUBFE,
MVT::i32, AD, Op,
740 SDValue Ops[] = { Op, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
741 return CurDAG->SelectNodeTo(N, PPC::RLWINM,
MVT::i32, Ops, 4);
746 T =
SDValue(CurDAG->getMachineNode(PPC::ANDC, dl,
MVT::i32, T, Op), 0);
747 SDValue Ops[] = {
T, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
748 return CurDAG->SelectNodeTo(N, PPC::RLWINM,
MVT::i32, Ops, 4);
751 }
else if (Imm == ~0U) {
758 Op, getI32Imm(1)), 0);
759 return CurDAG->SelectNodeTo(N, PPC::ADDZE,
MVT::i32,
766 Op =
SDValue(CurDAG->getMachineNode(PPC::NOR, dl,
MVT::i32, Op, Op), 0);
777 SDValue Ops[] = { AN, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
778 return CurDAG->SelectNodeTo(N, PPC::RLWINM,
MVT::i32, Ops, 4);
781 SDValue Ops[] = { Op, getI32Imm(1), getI32Imm(31), getI32Imm(31) };
784 return CurDAG->SelectNodeTo(N, PPC::XORI,
MVT::i32, Op,
805 return CurDAG->SelectNodeTo(N, VCmpInst, VecVT, LHS, RHS);
809 SDValue VCmp(CurDAG->getMachineNode(VCmpInst, dl, VecVT, LHS, RHS), 0);
810 return CurDAG->SelectNodeTo(N,
PPC::VNOR, VecVT, VCmp, VCmp);
815 return CurDAG->SelectNodeTo(N, VCmpInst, VecVT, RHS, LHS);
819 return CurDAG->SelectNodeTo(N, VCmpInst, VecVT, LHS, RHS);
827 return CurDAG->SelectNodeTo(N, VCmpInst, VecVT, LHS, RHS);
829 SDValue VCmpGT(CurDAG->getMachineNode(VCmpInst, dl, VecVT, LHS, RHS), 0);
831 SDValue VCmpEQ(CurDAG->getMachineNode(VCmpEQInst, dl, VecVT, LHS, RHS), 0);
832 return CurDAG->SelectNodeTo(N, PPC::VOR, VecVT, VCmpGT, VCmpEQ);
838 SDValue VCmpLE(CurDAG->getMachineNode(VCmpInst, dl, VecVT, RHS, LHS), 0);
840 SDValue VCmpEQ(CurDAG->getMachineNode(VCmpEQInst, dl, VecVT, LHS, RHS), 0);
841 return CurDAG->SelectNodeTo(N, PPC::VOR, VecVT, VCmpLE, VCmpEQ);
844 llvm_unreachable(
"Invalid vector compare type: should be expanded by legalize");
850 SDValue CCReg = SelectCC(LHS, RHS, CC, dl);
857 CCReg = CurDAG->getCopyToReg(CurDAG->getEntryNode(), dl, CR7Reg, CCReg,
863 SDValue Ops[] = { IntCR, getI32Imm((32-(3-Idx)) & 31),
864 getI32Imm(31), getI32Imm(31) };
866 return CurDAG->SelectNodeTo(N, PPC::RLWINM,
MVT::i32, Ops, 4);
871 return CurDAG->SelectNodeTo(N, PPC::XORI,
MVT::i32, Tmp, getI32Imm(1));
890 int64_t Imm = cast<ConstantSDNode>(
N)->getZExtValue();
892 unsigned Remainder = 0;
898 Shift = countTrailingZeros<uint64_t>(Imm);
899 int64_t ImmSh =
static_cast<uint64_t
>(Imm) >> Shift;
917 unsigned Lo = Imm & 0xFFFF;
918 unsigned Hi = (Imm >> 16) & 0xFFFF;
923 Result = CurDAG->getMachineNode(PPC::LI8, dl,
MVT::i64, getI32Imm(Lo));
926 unsigned OpC = Hi ? PPC::LIS8 : PPC::LI8;
927 Result = CurDAG->getMachineNode(OpC, dl,
MVT::i64, getI32Imm(Hi));
929 Result = CurDAG->getMachineNode(PPC::ORI8, dl,
MVT::i64,
930 SDValue(Result, 0), getI32Imm(Lo));
933 Result = CurDAG->getMachineNode(PPC::LIS8, dl,
MVT::i64, getI32Imm(Hi));
937 if (!Shift)
return Result;
941 Result = CurDAG->getMachineNode(PPC::RLDICR, dl,
MVT::i64,
944 getI32Imm(63 - Shift));
948 if ((Hi = (Remainder >> 16) & 0xFFFF)) {
949 Result = CurDAG->getMachineNode(PPC::ORIS8, dl,
MVT::i64,
950 SDValue(Result, 0), getI32Imm(Hi));
952 if ((Lo = Remainder & 0xFFFF)) {
953 Result = CurDAG->getMachineNode(PPC::ORI8, dl,
MVT::i64,
954 SDValue(Result, 0), getI32Imm(Lo));
963 return SelectSETCC(N);
965 return getGlobalBaseReg();
968 int FI = cast<FrameIndexSDNode>(
N)->getIndex();
972 return CurDAG->SelectNodeTo(N, Opc, N->
getValueType(0), TFI,
974 return CurDAG->getMachineNode(Opc, dl, N->
getValueType(0), TFI,
997 return CurDAG->SelectNodeTo(N, PPC::ADDZE,
MVT::i32,
1002 N0, getI32Imm(
Log2_32(-Imm)));
1007 return CurDAG->SelectNodeTo(N, PPC::NEG,
MVT::i32, PT);
1032 assert((!isSExt || LoadedVT ==
MVT::i16) &&
"Invalid sext update load");
1033 switch (LoadedVT.getSimpleVT().SimpleTy) {
1035 case MVT::f64: Opcode = PPC::LFDU;
break;
1036 case MVT::f32: Opcode = PPC::LFSU;
break;
1037 case MVT::i32: Opcode = PPC::LWZU;
break;
1038 case MVT::i16: Opcode = isSExt ? PPC::LHAU : PPC::LHZU;
break;
1040 case MVT::i8: Opcode = PPC::LBZU;
break;
1044 assert((!isSExt || LoadedVT ==
MVT::i16) &&
"Invalid sext update load");
1045 switch (LoadedVT.getSimpleVT().SimpleTy) {
1047 case MVT::i64: Opcode = PPC::LDU;
break;
1048 case MVT::i32: Opcode = PPC::LWZU8;
break;
1049 case MVT::i16: Opcode = isSExt ? PPC::LHAU8 : PPC::LHZU8;
break;
1051 case MVT::i8: Opcode = PPC::LBZU8;
break;
1057 SDValue Ops[] = { Offset, Base, Chain };
1058 return CurDAG->getMachineNode(Opcode, dl, LD->
getValueType(0),
1059 PPCLowering.getPointerTy(),
1066 assert((!isSExt || LoadedVT ==
MVT::i16) &&
"Invalid sext update load");
1067 switch (LoadedVT.getSimpleVT().SimpleTy) {
1069 case MVT::f64: Opcode = PPC::LFDUX;
break;
1070 case MVT::f32: Opcode = PPC::LFSUX;
break;
1071 case MVT::i32: Opcode = PPC::LWZUX;
break;
1072 case MVT::i16: Opcode = isSExt ? PPC::LHAUX : PPC::LHZUX;
break;
1074 case MVT::i8: Opcode = PPC::LBZUX;
break;
1079 "Invalid sext update load");
1080 switch (LoadedVT.getSimpleVT().SimpleTy) {
1082 case MVT::i64: Opcode = PPC::LDUX;
break;
1083 case MVT::i32: Opcode = isSExt ? PPC::LWAUX : PPC::LWZUX8;
break;
1084 case MVT::i16: Opcode = isSExt ? PPC::LHAUX8 : PPC::LHZUX8;
break;
1086 case MVT::i8: Opcode = PPC::LBZUX8;
break;
1092 SDValue Ops[] = { Base, Offset, Chain };
1093 return CurDAG->getMachineNode(Opcode, dl, LD->
getValueType(0),
1094 PPCLowering.getPointerTy(),
1100 unsigned Imm, Imm2, SH, MB, ME;
1108 SDValue Ops[] = { Val, getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) };
1109 return CurDAG->SelectNodeTo(N, PPC::RLWINM,
MVT::i32, Ops, 4);
1117 SDValue Ops[] = { Val, getI32Imm(0), getI32Imm(MB), getI32Imm(ME) };
1118 return CurDAG->SelectNodeTo(N, PPC::RLWINM,
MVT::i32, Ops, 4);
1125 SDValue Ops[] = { Val, getI32Imm(0), getI32Imm(MB) };
1126 return CurDAG->SelectNodeTo(N, PPC::RLDICL,
MVT::i64, Ops, 3);
1143 getI32Imm(0), getI32Imm(MB),getI32Imm(ME) };
1144 return CurDAG->getMachineNode(PPC::RLWIMI, dl,
MVT::i32, Ops);
1153 if (
SDNode *
I = SelectBitfieldInsert(N))
1159 unsigned Imm, SH, MB, ME;
1161 isRotateAndMask(N, Imm,
true, SH, MB, ME)) {
1163 getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) };
1164 return CurDAG->SelectNodeTo(N, PPC::RLWINM,
MVT::i32, Ops, 4);
1171 unsigned Imm, SH, MB, ME;
1173 isRotateAndMask(N, Imm,
true, SH, MB, ME)) {
1175 getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) };
1176 return CurDAG->SelectNodeTo(N, PPC::RLWINM,
MVT::i32, Ops, 4);
1184 EVT PtrVT = CurDAG->getTargetLoweringInfo().getPointerTy();
1185 bool isPPC64 = (PtrVT ==
MVT::i64);
1192 if (N1C->isNullValue() && N3C->isNullValue() &&
1193 N2C->getZExtValue() == 1ULL && CC ==
ISD::SETNE &&
1199 return CurDAG->SelectNodeTo(N, PPC::SUBFE,
MVT::i32,
1207 unsigned SelectCCOp;
1209 SelectCCOp = PPC::SELECT_CC_I4;
1211 SelectCCOp = PPC::SELECT_CC_I8;
1213 SelectCCOp = PPC::SELECT_CC_F4;
1215 SelectCCOp = PPC::SELECT_CC_F8;
1217 SelectCCOp = PPC::SELECT_CC_VRRC;
1221 return CurDAG->SelectNodeTo(N, SelectCCOp, N->
getValueType(0), Ops, 4);
1225 bool IsPPC64 = PPCSubTarget.isPPC64();
1240 getI32Imm(cast<ConstantSDNode>(N->
getOperand(1))->getZExtValue());
1243 return CurDAG->SelectNodeTo(N, PPC::BCC,
MVT::Other, Ops, 5);
1250 return CurDAG->SelectNodeTo(N, PPC::BCC,
MVT::Other, Ops, 4);
1260 return CurDAG->SelectNodeTo(N, Reg,
MVT::Other, Chain);
1263 assert (PPCSubTarget.isPPC64() &&
"Only supported for 64-bit ABI");
1281 SDNode *Tmp = CurDAG->getMachineNode(PPC::ADDIStocHA, dl,
MVT::i64,
1285 return CurDAG->getMachineNode(PPC::LDtocL, dl,
MVT::i64, GA,
1294 assert((GVar || isa<Function>(RealGValue)) &&
1295 "Unexpected global value subclass!");
1300 if (!GVar || !GVar->
hasInitializer() || RealGValue->hasCommonLinkage() ||
1301 RealGValue->hasAvailableExternallyLinkage())
1302 return CurDAG->getMachineNode(PPC::LDtocL, dl,
MVT::i64, GA,
1306 return CurDAG->getMachineNode(PPC::ADDItocL, dl,
MVT::i64,
1312 assert(isa<ConstantSDNode>(N->
getOperand(0)) &&
1314 "Invalid operand on VADD_SPLAT!");
1318 unsigned Opc1, Opc2, Opc3;
1322 Opc1 = PPC::VSPLTISB;
1323 Opc2 = PPC::VADDUBM;
1324 Opc3 = PPC::VSUBUBM;
1326 }
else if (EltSize == 2) {
1327 Opc1 = PPC::VSPLTISH;
1328 Opc2 = PPC::VADDUHM;
1329 Opc3 = PPC::VSUBUHM;
1332 assert(EltSize == 4 &&
"Invalid element size on VADD_SPLAT!");
1333 Opc1 = PPC::VSPLTISW;
1334 Opc2 = PPC::VADDUWM;
1335 Opc3 = PPC::VSUBUWM;
1339 if ((Elt & 1) == 0) {
1346 SDValue EltVal = getI32Imm(Elt >> 1);
1347 SDNode *Tmp = CurDAG->getMachineNode(Opc1, dl, VT, EltVal);
1349 return CurDAG->getMachineNode(Opc2, dl, VT, TmpVal, TmpVal);
1351 }
else if (Elt > 0) {
1358 SDValue EltVal = getI32Imm(Elt - 16);
1359 SDNode *Tmp1 = CurDAG->getMachineNode(Opc1, dl, VT, EltVal);
1360 EltVal = getI32Imm(-16);
1361 SDNode *Tmp2 = CurDAG->getMachineNode(Opc1, dl, VT, EltVal);
1362 return CurDAG->getMachineNode(Opc3, dl, VT,
SDValue(Tmp1, 0),
1372 SDValue EltVal = getI32Imm(Elt + 16);
1373 SDNode *Tmp1 = CurDAG->getMachineNode(Opc1, dl, VT, EltVal);
1374 EltVal = getI32Imm(-16);
1375 SDNode *Tmp2 = CurDAG->getMachineNode(Opc1, dl, VT, EltVal);
1376 return CurDAG->getMachineNode(Opc2, dl, VT,
SDValue(Tmp1, 0),
1382 return SelectCode(N);
1387 void PPCDAGToDAGISel::PostprocessISelDAG() {
1394 if (PPCSubTarget.isDarwin() || !PPCSubTarget.isPPC64())
1400 while (Position != CurDAG->allnodes_begin()) {
1409 switch (StorageOpcode) {
1442 if (!isa<ConstantSDNode>(N->
getOperand(FirstOp)) ||
1451 bool ReplaceFlags =
true;
1471 ReplaceFlags =
false;
1475 if ((StorageOpcode == PPC::LWA ||
1477 StorageOpcode == PPC::STD) &&
1482 case PPC::ADDIdtprelL:
1485 case PPC::ADDItlsldL:
1497 DEBUG(
dbgs() <<
"Folding add-immediate into mem-op:\nBase: ");
1514 (StorageOpcode ==
PPC::LD || StorageOpcode == PPC::STD ||
1515 StorageOpcode == PPC::LWA)) {
1516 DEBUG(
dbgs() <<
"Rejected this candidate for alignment.\n\n");
1519 ImmOpnd = CurDAG->getTargetGlobalAddress(GV, dl,
MVT::i64, 0, Flags);
1521 dyn_cast<ConstantPoolSDNode>(ImmOpnd)) {
1523 ImmOpnd = CurDAG->getTargetConstantPool(C,
MVT::i64,
1530 (void)CurDAG->UpdateNodeOperands(N, N->
getOperand(0), ImmOpnd,
1533 (void)CurDAG->UpdateNodeOperands(N, ImmOpnd, Base.
getOperand(0),
1538 CurDAG->RemoveDeadNode(Base.
getNode());
1547 return new PPCDAGToDAGISel(TM);
1551 const char *
Name =
"PowerPC DAG->DAG Pattern Instruction Selection";
bool isInt< 32 >(int64_t x)
SDValue getValue(unsigned R) const
static PassRegistry * getPassRegistry()
uint64_t getZExtValue() const
Get zero extended value.
void dump() const
dump - Dump this node, for debugging.
static unsigned index2VirtReg(unsigned Index)
unsigned getAlignment() const
enable_if_c<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
unsigned getOpcode() const
unsigned getNumOperands() const
static unsigned int getVCmpInst(MVT::SimpleValueType VecVT, ISD::CondCode CC)
static bool isInt32Immediate(SDNode *N, unsigned &Imm)
const SDValue & getOperand(unsigned Num) const
void setNodeId(int Id)
setNodeId - Set unique node id.
static bool isOpcWithIntImmediate(SDNode *N, unsigned Opc, unsigned &Imm)
const SDValue & getBasePtr() const
bool isUnsignedIntSetCC(CondCode Code)
LoopInfoBase< BlockT, LoopT > * LI
bool isShiftedMask_32(uint32_t Value)
bool isVector() const
isVector - Return true if this is a vector value type.
unsigned CountTrailingOnes_64(uint64_t Value)
const HexagonInstrInfo * TII
#define llvm_unreachable(msg)
EVT getValueType(unsigned ResNo) const
unsigned getMachineOpcode() const
enable_if_c< std::numeric_limits< T >::is_integer &&!std::numeric_limits< T >::is_signed, std::size_t >::type countLeadingZeros(T Val, ZeroBehavior ZB=ZB_Width)
Count number of 0's from the most significant bit to the least stopping at the first 1...
virtual bool runOnMachineFunction(MachineFunction &MF)
const MachineBasicBlock & front() const
static bool isRunOfOnes(ConstantInt *Val, uint32_t &MB, uint32_t &ME)
bool isMask_64(uint64_t Value)
GlobalValue * resolveAliasedGlobal(bool stopOnWeak=true)
EVT getMemoryVT() const
getMemoryVT - Return the type of the in-memory value.
SDNode * getNode() const
get the SDNode which holds the desired result
bundle_iterator< MachineInstr, instr_iterator > iterator
static bool isIntS16Immediate(SDNode *N, short &Imm)
const SDValue & getOperand(unsigned i) const
LLVM Constant Representation.
static PPC::Predicate getPredicateForSetCC(ISD::CondCode CC)
bool isFloatingPoint() const
isFloatingPoint - Return true if this is a FP, or a vector FP type.
APInt Xor(const APInt &LHS, const APInt &RHS)
Bitwise XOR function for APInt.
static bool isInt64Immediate(SDNode *N, uint64_t &Imm)
unsigned getOpcode() const
void initializePPCDAGToDAGISelPass(PassRegistry &)
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
ISD::MemIndexedMode getAddressingMode() const
uint64_t getConstantOperandVal(unsigned Num) const
static unsigned int getVCmpEQInst(MVT::SimpleValueType VecVT)
const MCInstrDesc & get(unsigned Opcode) const
const SDValue & getOffset() const
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
const SDValue & getChain() const
bool isMachineOpcode() const
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
unsigned Log2_32(uint32_t Value)
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
ISD::LoadExtType getExtensionType() const
bool hasInitializer() const
Class for arbitrary precision integers.
bool isUInt< 32 >(uint64_t x)
uint64_t getConstantOperandVal(unsigned i) const
Bitwise operators - logical and, logical or, logical xor.
bool isInt< 16 >(int64_t x)
LLVM Value Representation.
#define CALL_ONCE_INITIALIZATION(function)
bool isUInt< 16 >(uint64_t x)
static unsigned getCRIdxForSetCC(ISD::CondCode CC, bool &Invert)
BasicBlockListType::iterator iterator
bool isPowerOf2_32(uint32_t Value)
FunctionPass * createPPCISelDag(PPCTargetMachine &TM)
static void initializePassOnce(PassRegistry &Registry)
void registerPass(const PassInfo &PI, bool ShouldFree=false)
bool isMachineOpcode() const
unsigned getMachineOpcode() const