141 assert(DstIdx != -1);
155 case AMDGPU::CLAMP_R600: {
164 case AMDGPU::FABS_R600: {
173 case AMDGPU::FNEG_R600: {
182 case AMDGPU::MASK_WRITE: {
190 case AMDGPU::MOV_IMM_F32:
195 case AMDGPU::MOV_IMM_I32:
199 case AMDGPU::CONST_COPY: {
207 case AMDGPU::RAT_WRITE_CACHELESS_32_eg:
208 case AMDGPU::RAT_WRITE_CACHELESS_64_eg:
209 case AMDGPU::RAT_WRITE_CACHELESS_128_eg: {
225 unsigned SrcX = 0, SrcY = 1, SrcZ = 2, SrcW = 3;
226 unsigned CTX = 1, CTY = 1, CTZ = 1, CTW = 1;
320 case AMDGPU::TXD_SHADOW: {
326 unsigned SrcX = 0, SrcY = 1, SrcZ = 2, SrcW = 3;
327 unsigned CTX = 1, CTY = 1, CTZ = 1, CTW = 1;
427 case AMDGPU::BRANCH_COND_f32: {
430 AMDGPU::PREDICATE_BIT)
441 case AMDGPU::BRANCH_COND_i32: {
444 AMDGPU::PREDICATE_BIT)
455 case AMDGPU::EG_ExportSwz:
456 case AMDGPU::R600_ExportSwz: {
458 bool isLastInstructionOfItsType =
true;
461 EndBlock = BB->
end(); NextExportInst != EndBlock;
462 NextExportInst =
llvm::next(NextExportInst)) {
463 if (NextExportInst->getOpcode() == AMDGPU::EG_ExportSwz ||
464 NextExportInst->getOpcode() == AMDGPU::R600_ExportSwz) {
465 unsigned CurrentInstExportType = NextExportInst->getOperand(1)
467 if (CurrentInstExportType == InstExportType) {
468 isLastInstructionOfItsType =
false;
474 if (!EOP && !isLastInstructionOfItsType)
476 unsigned CfInst = (MI->
getOpcode() == AMDGPU::EG_ExportSwz)? 84 : 40;
494 for (
unsigned i = 0, e = MFI->
LiveOuts.
size(); i != e; ++i)
514 case ISD::FSIN:
return LowerTrig(Op, DAG);
517 case ISD::LOAD:
return LowerLOAD(Op, DAG);
521 unsigned IntrinsicID =
522 cast<ConstantSDNode>(Op.
getOperand(1))->getZExtValue();
523 switch (IntrinsicID) {
524 case AMDGPUIntrinsic::AMDGPU_store_output: {
525 int64_t RegIndex = cast<ConstantSDNode>(Op.
getOperand(3))->getZExtValue();
526 unsigned Reg = AMDGPU::R600_TReg32RegClass.getRegister(RegIndex);
530 case AMDGPUIntrinsic::R600_store_swizzle: {
552 unsigned IntrinsicID =
553 cast<ConstantSDNode>(Op.
getOperand(0))->getZExtValue();
556 switch(IntrinsicID) {
558 case AMDGPUIntrinsic::R600_load_input: {
559 int64_t RegIndex = cast<ConstantSDNode>(Op.
getOperand(1))->getZExtValue();
560 unsigned Reg = AMDGPU::R600_TReg32RegClass.getRegister(RegIndex);
568 case AMDGPUIntrinsic::R600_interp_input: {
569 int slot = cast<ConstantSDNode>(Op.
getOperand(1))->getZExtValue();
570 int ijb = cast<ConstantSDNode>(Op.
getOperand(2))->getSExtValue();
584 unsigned RegisterI = AMDGPU::R600_TReg32RegClass.getRegister(2 * ijb);
585 unsigned RegisterJ = AMDGPU::R600_TReg32RegClass.getRegister(2 * ijb + 1);
596 RegisterJNode, RegisterINode);
600 RegisterJNode, RegisterINode);
601 return SDValue(interp, slot % 2);
603 case AMDGPUIntrinsic::R600_interp_xy:
604 case AMDGPUIntrinsic::R600_interp_zw: {
605 int slot = cast<ConstantSDNode>(Op.
getOperand(1))->getZExtValue();
610 if (IntrinsicID == AMDGPUIntrinsic::R600_interp_xy)
613 RegisterJNode, RegisterINode);
617 RegisterJNode, RegisterINode);
621 case AMDGPUIntrinsic::R600_tex:
622 case AMDGPUIntrinsic::R600_texc:
623 case AMDGPUIntrinsic::R600_txl:
624 case AMDGPUIntrinsic::R600_txlc:
625 case AMDGPUIntrinsic::R600_txb:
626 case AMDGPUIntrinsic::R600_txbc:
627 case AMDGPUIntrinsic::R600_txf:
628 case AMDGPUIntrinsic::R600_txq:
629 case AMDGPUIntrinsic::R600_ddx:
630 case AMDGPUIntrinsic::R600_ddy:
631 case AMDGPUIntrinsic::R600_ldptr: {
633 switch (IntrinsicID) {
634 case AMDGPUIntrinsic::R600_tex:
637 case AMDGPUIntrinsic::R600_texc:
640 case AMDGPUIntrinsic::R600_txl:
643 case AMDGPUIntrinsic::R600_txlc:
646 case AMDGPUIntrinsic::R600_txb:
649 case AMDGPUIntrinsic::R600_txbc:
652 case AMDGPUIntrinsic::R600_txf:
655 case AMDGPUIntrinsic::R600_txq:
658 case AMDGPUIntrinsic::R600_ddx:
661 case AMDGPUIntrinsic::R600_ddy:
664 case AMDGPUIntrinsic::R600_ldptr:
694 case AMDGPUIntrinsic::AMDGPU_dp4: {
717 return LowerImplicitParameter(DAG, VT, DL, 0);
719 return LowerImplicitParameter(DAG, VT, DL, 1);
721 return LowerImplicitParameter(DAG, VT, DL, 2);
723 return LowerImplicitParameter(DAG, VT, DL, 3);
725 return LowerImplicitParameter(DAG, VT, DL, 4);
727 return LowerImplicitParameter(DAG, VT, DL, 5);
729 return LowerImplicitParameter(DAG, VT, DL, 6);
731 return LowerImplicitParameter(DAG, VT, DL, 7);
733 return LowerImplicitParameter(DAG, VT, DL, 8);
827 unsigned DwordOffset)
const {
828 unsigned ByteOffset = DwordOffset * 4;
838 false,
false,
false, 0);
841 bool R600TargetLowering::isZero(
SDValue Op)
const {
843 return Cst->isNullValue();
845 return CstFP->isZero();
895 (CompareVT == VT || VT ==
MVT::i32)) {
933 if (CompareVT != VT) {
980 assert(!
"Unhandled value type in LowerSELECT_CC");
1002 switch(StackWidth) {
1019 void R600TargetLowering::getStackAddress(
unsigned StackWidth,
1022 unsigned &PtrIncr)
const {
1023 switch (StackWidth) {
1034 Channel = ElemIdx % 2;
1090 SDValue Args[3] = { Chain, Input, DWordAddr };
1102 assert(!
"Truncated and indexed stores not supported yet");
1123 Ptr = stackPtrToRegIndex(Ptr, StackWidth, DAG);
1130 assert(NumElemVT >= StackWidth &&
"Stack width cannot be greater than "
1131 "vector width in load");
1133 for (
unsigned i = 0; i < NumElemVT; ++i) {
1134 unsigned Channel, PtrIncr;
1135 getStackAddress(StackWidth, i, Channel, PtrIncr);
1160 switch (AddressSpace) {
1166 return 512 + 4096 * 2;
1168 return 512 + 4096 * 3;
1170 return 512 + 4096 * 4;
1172 return 512 + 4096 * 5;
1174 return 512 + 4096 * 6;
1176 return 512 + 4096 * 7;
1178 return 512 + 4096 * 8;
1180 return 512 + 4096 * 9;
1182 return 512 + 4096 * 10;
1184 return 512 + 4096 * 11;
1186 return 512 + 4096 * 12;
1188 return 512 + 4096 * 13;
1190 return 512 + 4096 * 14;
1192 return 512 + 4096 * 15;
1216 if (ConstantBlock > -1 &&
1222 isa<ConstantSDNode>(Ptr)) {
1224 for (
unsigned i = 0; i < 4; i++) {
1235 unsigned NumElements = 4;
1282 SDValue MergedValues[2] = { Sra, Chain };
1296 Ptr = stackPtrToRegIndex(Ptr, StackWidth, DAG);
1303 assert(NumElemVT >= StackWidth &&
"Stack width cannot be greater than "
1304 "vector width in load");
1306 for (
unsigned i = 0; i < NumElemVT; ++i) {
1307 unsigned Channel, PtrIncr;
1308 getStackAddress(StackWidth, i, Channel, PtrIncr);
1316 for (
unsigned i = NumElemVT; i < 4; ++i) {
1329 Ops[0] = LoweredLoad;
1358 for (
unsigned i = 0, e = Ins.
size(); i < e; ++i) {
1361 EVT MemVT = LocalIns[i].VT;
1364 unsigned Reg = MF.addLiveIn(VA.
getLocReg(), &AMDGPU::R600_Reg128RegClass);
1378 MemVT,
false,
false, 4);
1395 assert(RemapSwizzle.
empty());
1403 for (
unsigned i = 0; i < 4; i++) {
1408 RemapSwizzle[i] = 7;
1411 RemapSwizzle[i] = 4;
1413 }
else if (
C->isExactlyValue(1.0)) {
1414 RemapSwizzle[i] = 5;
1421 for (
unsigned j = 0; j < i; j++) {
1422 if (NewBldVec[i] == NewBldVec[j]) {
1424 RemapSwizzle[i] = j;
1437 assert(RemapSwizzle.
empty());
1444 bool isUnmovable[4] = {
false,
false,
false,
false };
1445 for (
unsigned i = 0; i < 4; i++)
1446 RemapSwizzle[i] = i;
1448 for (
unsigned i = 0; i < 4; i++) {
1453 isUnmovable[Idx] =
true;
1456 if (isUnmovable[Idx])
1459 std::swap(NewBldVec[Idx], NewBldVec[i]);
1460 std::swap(RemapSwizzle[i], RemapSwizzle[Idx]);
1477 for (
unsigned i = 0; i < 4; i++) {
1479 if (SwizzleRemap.find(Idx) != SwizzleRemap.end())
1483 SwizzleRemap.clear();
1485 for (
unsigned i = 0; i < 4; i++) {
1487 if (SwizzleRemap.find(Idx) != SwizzleRemap.end())
1562 if (!isa<ConstantSDNode>(EltNo))
1564 unsigned Elt = cast<ConstantSDNode>(EltNo)->getZExtValue();
1581 if (Elt < Ops.
size()) {
1584 EVT OpVT = Ops[0].getValueType();
1594 VT, &Ops[0], Ops.
size());
1603 unsigned Element = Const->getZExtValue();
1610 unsigned Element = Const->getZExtValue();
1676 NewArgs[1] = OptimizeSwizzle(N->
getOperand(1), &NewArgs[4], DAG);
1705 NewArgs[1] = OptimizeSwizzle(N->
getOperand(1), &NewArgs[2], DAG);
1721 case AMDGPU::FNEG_R600:
1727 case AMDGPU::FABS_R600:
1733 case AMDGPU::CONST_COPY: {
1735 bool HasDst = TII->
getOperandIdx(Opcode, AMDGPU::OpName::dst) > -1;
1745 int SrcIndices[] = {
1758 std::vector<unsigned> Consts;
1759 for (
unsigned i = 0; i <
sizeof(SrcIndices) /
sizeof(
int); i++) {
1760 int OtherSrcIdx = SrcIndices[i];
1761 int OtherSelIdx = TII->
getSelIdx(Opcode, OtherSrcIdx);
1762 if (OtherSrcIdx < 0 || OtherSelIdx < 0)
1769 dyn_cast<RegisterSDNode>(ParentNode->
getOperand(OtherSrcIdx))) {
1770 if (
Reg->getReg() == AMDGPU::ALU_CONST) {
1788 case AMDGPU::MOV_IMM_I32:
1789 case AMDGPU::MOV_IMM_F32: {
1790 unsigned ImmReg = AMDGPU::ALU_LITERAL_X;
1791 uint64_t ImmValue = 0;
1797 if (FloatValue == 0.0) {
1798 ImmReg = AMDGPU::ZERO;
1799 }
else if (FloatValue == 0.5) {
1800 ImmReg = AMDGPU::HALF;
1801 }
else if (FloatValue == 1.0) {
1802 ImmReg = AMDGPU::ONE;
1810 ImmReg = AMDGPU::ZERO;
1811 }
else if (Value == 1) {
1812 ImmReg = AMDGPU::ONE_INT;
1821 if (ImmReg == AMDGPU::ALU_LITERAL_X) {
1849 std::vector<SDValue> Ops;
1854 if (Opcode == AMDGPU::DOT_4) {
1855 int OperandIdx[] = {
1885 for (
unsigned i = 0; i < 8; i++) {
1886 if (OperandIdx[i] < 0)
1888 SDValue &Src = Ops[OperandIdx[i] - 1];
1889 SDValue &Neg = Ops[NegIdx[i] - 1];
1891 bool HasDst = TII->
getOperandIdx(Opcode, AMDGPU::OpName::dst) > -1;
1892 int SelIdx = TII->
getSelIdx(Opcode, OperandIdx[i]);
1895 SDValue &Sel = (SelIdx > -1) ? Ops[SelIdx] : FakeOp;
1896 if (
FoldOperand(Node, i, Src, Neg, Abs, Sel, FakeOp, DAG))
1900 for (
unsigned i = 1, e = Node->
getNumOperands(); i < e; i += 2) {
1902 if (
FoldOperand(Node, i, Src, FakeOp, FakeOp, FakeOp, FakeOp, DAG))
1905 }
else if (Opcode == AMDGPU::CLAMP_R600) {
1911 AMDGPU::OpName::clamp);
1914 std::vector<SDValue> Ops;
1916 for(
unsigned i = 0; i < NumOp; ++i)
1924 int OperandIdx[] = {
1939 for (
unsigned i = 0; i < 3; i++) {
1940 if (OperandIdx[i] < 0)
1942 SDValue &Src = Ops[OperandIdx[i] - 1];
1943 SDValue &Neg = Ops[NegIdx[i] - 1];
1945 SDValue &Abs = (AbsIdx[i] > -1) ? Ops[AbsIdx[i] - 1] : FakeAbs;
1946 bool HasDst = TII->
getOperandIdx(Opcode, AMDGPU::OpName::dst) > -1;
1947 int SelIdx = TII->
getSelIdx(Opcode, OperandIdx[i]);
1948 int ImmIdx = TII->
getOperandIdx(Opcode, AMDGPU::OpName::literal);
1953 SDValue &Sel = (SelIdx > -1) ? Ops[SelIdx] : FakeOp;
1955 if (
FoldOperand(Node, i, Src, Neg, Abs, Sel, Imm, DAG))
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
static SDValue CompactSwizzlableVector(SelectionDAG &DAG, SDValue VectorEntry, DenseMap< unsigned, unsigned > &RemapSwizzle)
void push_back(const T &Elt)
const MachineFunction * getParent() const
SDValue getConstant(uint64_t Val, EVT VT, bool isTarget=false)
void setImmOperand(MachineInstr *MI, unsigned Op, int64_t Imm) const
Helper function for setting instruction flag values.
LLVMContext * getContext() const
SDValue getCopyToReg(SDValue Chain, SDLoc dl, unsigned Reg, SDValue N)
uint64_t getZExtValue() const
Get zero extended value.
Interface definition for R600InstrInfo.
const ConstantFP * getFPImm() const
SmallVector< unsigned, 4 > LiveOuts
Address space for local memory.
void AnalyzeFormalArguments(CCState &State, const SmallVectorImpl< ISD::InputArg > &Ins) const
const TargetMachine & getTargetMachine() const
SDVTList getVTList() const
unsigned createVirtualRegister(const TargetRegisterClass *RegClass)
void addLiveIn(unsigned Reg, unsigned vreg=0)
SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op, SelectionDAG &DAG) const
enable_if_c<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
const TargetMachine & getTarget() const
virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const
static bool isVirtualRegister(unsigned Reg)
static PointerType * get(Type *ElementType, unsigned AddressSpace)
unsigned getOpcode() const
SDValue getSelectCC(SDLoc DL, SDValue LHS, SDValue RHS, SDValue True, SDValue False, ISD::CondCode Cond)
Type * getTypeForEVT(LLVMContext &Context) const
unsigned getNumOperands() const
void setBooleanVectorContents(BooleanContent Ty)
unsigned getNumOperands() const
#define OPCODE_IS_NOT_ZERO_INT
const SDValue & getOperand(unsigned Num) const
const Function * getFunction() const
virtual EVT getSetCCResultType(LLVMContext &, EVT VT) const
void setTruncStoreAction(MVT ValVT, MVT MemVT, LegalizeAction Action)
EVT getValueType(Type *Ty, bool AllowUnknown=false) const
SDValue getLoad(EVT VT, SDLoc dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, bool isVolatile, bool isNonTemporal, bool isInvariant, unsigned Alignment, const MDNode *TBAAInfo=0, const MDNode *Ranges=0)
bool isVector() const
isVector - Return true if this is a vector value type.
SDValue getStore(SDValue Chain, SDLoc dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, bool isVolatile, bool isNonTemporal, unsigned Alignment, const MDNode *TBAAInfo=0)
Address space for global memory (RAT0, VTX0).
const HexagonInstrInfo * TII
R600TargetLowering(TargetMachine &TM)
#define llvm_unreachable(msg)
EVT getValueType(unsigned ResNo) const
MachineFunction & getMachineFunction() const
int getLDSNoRetOp(uint16_t Opcode)
virtual SDValue CreateLiveInRegister(SelectionDAG &DAG, const TargetRegisterClass *RC, unsigned Reg, EVT VT) const
Helper function that adds Reg to the LiveIn list of the DAG's MachineFunction.
void setCondCodeAction(ISD::CondCode CC, MVT VT, LegalizeAction Action)
MachineInstr * buildMovImm(MachineBasicBlock &BB, MachineBasicBlock::iterator I, unsigned DstReg, uint64_t Imm) const
void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action)
unsigned getMachineOpcode() const
bool bitsGE(EVT VT) const
bitsGE - Return true if this has no less bits than VT.
ID
LLVM Calling Convention Representation.
virtual SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, SDLoc DL, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals) const
const MachineInstrBuilder & addImm(int64_t Val) const
bool isInteger() const
isInteger - Return true if this is an integer, or a vector integer type.
unsigned getNumOperands() const
SDValue getConstantFP(double Val, EVT VT, bool isTarget=false)
bool hasInstrModifiers(unsigned Opcode) const
EVT getVectorElementType() const
unsigned getLocReg() const
#define OPCODE_IS_NOT_ZERO
Simple integer binary arithmetic operators.
SDValue getUNDEF(EVT VT)
getUNDEF - Return an UNDEF node. UNDEF does not have a useful SDLoc.
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const
EVT getMemoryVT() const
getMemoryVT - Return the type of the in-memory value.
bool bitsLE(EVT VT) const
bitsLE - Return true if this has no more bits than VT.
bool isHWTrueValue(SDValue Op) const
UNDEF - An undefined node.
SDNode * getNode() const
get the SDNode which holds the desired result
bundle_iterator< MachineInstr, instr_iterator > iterator
static ConstantPointerNull * get(PointerType *T)
get() - Static factory methods - Return objects of the specified value
const SDValue & getOperand(unsigned i) const
void addRegisterClass(MVT VT, const TargetRegisterClass *RC)
Simple binary floating point operators.
void setTargetDAGCombine(ISD::NodeType NT)
bool isNonTemporal() const
static int ConstantAddressBlock(unsigned AddressSpace)
const MachineOperand & getOperand(unsigned i) const
unsigned getSubRegFromChannel(unsigned Channel) const
bool isBeforeLegalizeOps() const
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
void setBooleanContents(BooleanContent Ty)
const R600RegisterInfo & getRegisterInfo() const
ItTy next(ItTy it, Dist n)
SDValue getCopyFromReg(SDValue Chain, SDLoc dl, unsigned Reg, EVT VT)
unsigned getOpcode() const
int getOperandIdx(const MachineInstr &MI, unsigned Op) const
Get the index of Op in the MachineInstr.
CondCode getSetCCSwappedOperands(CondCode Operation)
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
void append(in_iter in_start, in_iter in_end)
virtual const TargetFrameLowering * getFrameLowering() const
static UndefValue * get(Type *T)
const APFloat & getValueAPF() const
bool isHWFalseValue(SDValue Op) const
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements)
static SDValue ReorganizeVector(SelectionDAG &DAG, SDValue VectorEntry, DenseMap< unsigned, unsigned > &RemapSwizzle)
const MachinePointerInfo & getPointerInfo() const
static bool FoldOperand(SDNode *ParentNode, unsigned SrcIdx, SDValue &Src, SDValue &Neg, SDValue &Abs, SDValue &Sel, SDValue &Imm, SelectionDAG &DAG)
DebugLoc findDebugLoc(instr_iterator MBBI)
bool bitsGT(EVT VT) const
bitsGT - Return true if this has more bits than VT.
void setLoadExtAction(unsigned ExtType, MVT VT, LegalizeAction Action)
virtual const TargetInstrInfo * getInstrInfo() const
virtual MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr *MI, MachineBasicBlock *MBB) const
SDValue getExtLoad(ISD::LoadExtType ExtType, SDLoc dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, bool isVolatile, bool isNonTemporal, unsigned Alignment, const MDNode *TBAAInfo=0)
CCValAssign - Represent assignment of one arg/retval to a location.
Promote Memory to Register
MachineMemOperand * getMemOperand() const
SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const
bool isMachineOpcode() const
virtual unsigned getStackWidth(const MachineFunction &MF) const
CondCode getSetCCInverse(CondCode Operation, bool isInteger)
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
ISD::LoadExtType getExtensionType() const
SDValue getMemIntrinsicNode(unsigned Opcode, SDLoc dl, const EVT *VTs, unsigned NumVTs, const SDValue *Ops, unsigned NumOps, EVT MemVT, MachinePointerInfo PtrInfo, unsigned Align=0, bool Vol=false, bool ReadMem=true, bool WriteMem=true)
void computeRegisterProperties()
op_iterator op_begin() const
ZERO_EXTEND - Used for integer types, zeroing the new bits.
APInt bitcastToAPInt() const
SDValue getNode(unsigned Opcode, SDLoc DL, EVT VT)
ANY_EXTEND - Used for integer types. The high bits are undefined.
Address space for private memory.
int getSelIdx(unsigned Opcode, unsigned SrcIdx) const
unsigned getAddressSpace() const
getAddressSpace - Return the address space for the associated pointer
void ReplaceNodeResults(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const
void addFlag(MachineInstr *MI, unsigned Operand, unsigned Flag) const
Add one of the MO_FLAG* flags to the specified Operand.
MachineInstrBuilder buildDefaultInstruction(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, unsigned Opcode, unsigned DstReg, unsigned Src0Reg, unsigned Src1Reg=0) const
Bitwise operators - logical and, logical or, logical xor.
MachineRegisterInfo & getRegInfo()
R600 DAG Lowering interface definition.
Information about the stack frame layout on the AMDGPU targets.
unsigned getSizeInBits() const
getSizeInBits - Return the size of the specified value type in bits.
bool isIndexed() const
isIndexed - Return true if this is a pre/post inc/dec load/store.
float convertToFloat() const
op_iterator op_end() const
const TargetMachine & getTarget() const
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
MachineSDNode * getMachineNode(unsigned Opcode, SDLoc dl, EVT VT)
const Value * getSrcValue() const
Returns the SrcValue and offset that describes the location of the access.
bool isInt< 16 >(int64_t x)
SDValue SplitVectorLoad(const SDValue &Op, SelectionDAG &DAG) const
Split a vector load into multiple scalar loads.
MachineInstr * getVRegDef(unsigned Reg) const
SDValue getCondCode(ISD::CondCode Cond)
const APFloat & getValueAPF() const
void getOriginalFunctionArgs(SelectionDAG &DAG, const Function *F, const SmallVectorImpl< ISD::InputArg > &Ins, SmallVectorImpl< ISD::InputArg > &OrigIns) const
unsigned getReg() const
getReg - Returns the register number.
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const
void setSchedulingPreference(Sched::Preference Pref)
Specify the target scheduling preference.
virtual MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr *MI, MachineBasicBlock *BB) const
SDValue getTargetExtractSubreg(int SRIdx, SDLoc DL, EVT VT, SDValue Operand)
LLVM Value Representation.
SDValue getRegister(unsigned Reg, EVT VT)
bool isTruncatingStore() const
const MachineInstrBuilder & addOperand(const MachineOperand &MO) const
void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
SDValue getMergeValues(const SDValue *Ops, unsigned NumOps, SDLoc dl)
getMergeValues - Create a MERGE_VALUES node from the given operands.
const MCRegisterInfo & MRI
SDValue getTargetConstant(uint64_t Val, EVT VT)
unsigned getLocMemOffset() const
bool fitsConstReadLimitations(const std::vector< MachineInstr * > &) const
SDValue getEntryNode() const
bool isLDSRetInstr(unsigned Opcode) const
TRUNCATE - Completely drop the high bits.
unsigned getAlignment() const
bool isCondCodeLegal(ISD::CondCode CC, MVT VT) const
Return true if the specified condition code is legal on this target.
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
EVT changeVectorElementTypeToInteger() const
SDValue LowerMinMax(SDValue Op, SelectionDAG &DAG) const
Generate Min/Max node.
bool isMachineOpcode() const
unsigned getMachineOpcode() const
bool use_empty(unsigned RegNo) const
uint64_t getZExtValue() const
unsigned getVectorNumElements() const