/// SelectionDAG.
///
enum NodeType {
+ // DELETED_NODE - This is an illegal flag value that is used to catch
+ // errors. This opcode is not a legal opcode for any node.
+ DELETED_NODE,
+
// EntryToken - This is the marker used to indicate the start of the region.
EntryToken,
// Various leaf nodes.
STRING, BasicBlock, VALUETYPE, CONDCODE, Register,
Constant, ConstantFP,
- GlobalAddress, FrameIndex, ConstantPool, ExternalSymbol,
+ GlobalAddress, FrameIndex, JumpTable, ConstantPool, ExternalSymbol,
// TargetConstant* - Like Constant*, but the DAG does not do any folding or
// simplification of the constant.
// dag, turning into a GlobalAddress operand.
TargetGlobalAddress,
TargetFrameIndex,
+ TargetJumpTable,
TargetConstantPool,
TargetExternalSymbol,
-
+
+ /// RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...)
+ /// This node represents a target intrinsic function with no side effects.
+ /// The first operand is the ID number of the intrinsic from the
+ /// llvm::Intrinsic namespace. The operands to the intrinsic follow. The
+ /// node has returns the result of the intrinsic.
+ INTRINSIC_WO_CHAIN,
+
+ /// RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...)
+ /// This node represents a target intrinsic function with side effects that
+ /// returns a result. The first operand is a chain pointer. The second is
+ /// the ID number of the intrinsic from the llvm::Intrinsic namespace. The
+ /// operands to the intrinsic follow. The node has two results, the result
+ /// of the intrinsic and an output chain.
+ INTRINSIC_W_CHAIN,
+
+ /// OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...)
+ /// This node represents a target intrinsic function with side effects that
+ /// does not return a result. The first operand is a chain pointer. The
+ /// second is the ID number of the intrinsic from the llvm::Intrinsic
+ /// namespace. The operands to the intrinsic follow.
+ INTRINSIC_VOID,
+
// CopyToReg - This node has three operands: a chain, a register number to
// set to this value, and a value.
CopyToReg,
// UNDEF - An undefined node
UNDEF,
+
+ /// FORMAL_ARGUMENTS(CHAIN, CC#, ISVARARG) - This node represents the formal
+ /// arguments for a function. CC# is a Constant value indicating the
+ /// calling convention of the function, and ISVARARG is a flag that
+ /// indicates whether the function is varargs or not. This node has one
+ /// result value for each incoming argument, plus one for the output chain.
+ /// It must be custom legalized.
+ ///
+ FORMAL_ARGUMENTS,
+
+ /// RV1, RV2...RVn, CHAIN = CALL(CHAIN, CC#, ISVARARG, ISTAILCALL, CALLEE,
+ /// ARG0, SIGN0, ARG1, SIGN1, ... ARGn, SIGNn)
+ /// This node represents a fully general function call, before the legalizer
+ /// runs. This has one result value for each argument / signness pair, plus
+ /// a chain result. It must be custom legalized.
+ CALL,
// EXTRACT_ELEMENT - This is used to get the first or second (determined by
// a Constant, which is required to be operand #1), element of the aggregate
/// INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR (a legal packed
/// type) with the element at IDX replaced with VAL.
INSERT_VECTOR_ELT,
+
+ /// VEXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR
+ /// (an MVT::Vector value) identified by the (potentially variable) element
+ /// number IDX.
+ VEXTRACT_VECTOR_ELT,
+
+ /// EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR
+ /// (a legal packed type vector) identified by the (potentially variable)
+ /// element number IDX.
+ EXTRACT_VECTOR_ELT,
+
+ /// VVECTOR_SHUFFLE(VEC1, VEC2, SHUFFLEVEC, COUNT,TYPE) - Returns a vector,
+ /// of the same type as VEC1/VEC2. SHUFFLEVEC is a VBUILD_VECTOR of
+ /// constant int values that indicate which value each result element will
+ /// get. The elements of VEC1/VEC2 are enumerated in order. This is quite
+ /// similar to the Altivec 'vperm' instruction, except that the indices must
+ /// be constants and are in terms of the element size of VEC1/VEC2, not in
+ /// terms of bytes.
+ VVECTOR_SHUFFLE,
+
+ /// VECTOR_SHUFFLE(VEC1, VEC2, SHUFFLEVEC) - Returns a vector, of the same
+ /// type as VEC1/VEC2. SHUFFLEVEC is a BUILD_VECTOR of constant int values
+ /// (regardless of whether its datatype is legal or not) that indicate
+ /// which value each result element will get. The elements of VEC1/VEC2 are
+ /// enumerated in order. This is quite similar to the Altivec 'vperm'
+ /// instruction, except that the indices must be constants and are in terms
+ /// of the element size of VEC1/VEC2, not in terms of bytes.
+ VECTOR_SHUFFLE,
+
+ /// X = VBIT_CONVERT(Y) and X = VBIT_CONVERT(Y, COUNT,TYPE) - This node
+ /// represents a conversion from or to an ISD::Vector type.
+ ///
+ /// This is lowered to a BIT_CONVERT of the appropriate input/output types.
+ /// The input and output are required to have the same size and at least one
+ /// is required to be a vector (if neither is a vector, just use
+ /// BIT_CONVERT).
+ ///
+ /// If the result is a vector, this takes three operands (like any other
+ /// vector producer) which indicate the size and type of the vector result.
+ /// Otherwise it takes one input.
+ VBIT_CONVERT,
/// BINOP(LHS, RHS, COUNT,TYPE)
/// Simple abstract vector operators. Unlike the integer and floating point
VADD, VSUB, VMUL, VSDIV, VUDIV,
VAND, VOR, VXOR,
+ /// VSELECT(COND,LHS,RHS, COUNT,TYPE) - Select for MVT::Vector values.
+ /// COND is a boolean value. This node return LHS if COND is true, RHS if
+ /// COND is false.
+ VSELECT,
+
/// SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a
/// scalar value into the low element of the resultant vector type. The top
/// elements of the vector are undefined.
// operand, the second is the MBB to branch to.
BR,
+ // BRIND - Indirect branch. The first operand is the chain, the second
+ // is the value to branch to, which must be of the same type as the target's
+ // pointer type.
+ BRIND,
+
// BRCOND - Conditional branch. The first operand is the chain,
// the second is the condition, the third is the block to branch
// to if the condition is true.
BR_CC,
// RET - Return from function. The first operand is the chain,
- // and any subsequent operands are the return values for the
- // function. This operation can have variable number of operands.
+ // and any subsequent operands are pairs of return value and return value
+ // signness for the function. This operation can have variable number of
+ // operands.
RET,
// INLINEASM - Represents an inline asm block. This node always has two
BUILTIN_OP_END
};
+ /// Node predicates
+
+ /// isBuildVectorAllOnes - Return true if the specified node is a
+ /// BUILD_VECTOR where all of the elements are ~0 or undef.
+ bool isBuildVectorAllOnes(const SDNode *N);
+
+ /// isBuildVectorAllZeros - Return true if the specified node is a
+ /// BUILD_VECTOR where all of the elements are 0 or undef.
+ bool isBuildVectorAllZeros(const SDNode *N);
+
//===--------------------------------------------------------------------===//
/// ISD::CondCode enum - These are ordered carefully to make the bitfields
/// below work out, when considering SETFALSE (something that never exists
SDNode *Val; // The node defining the value we are using.
unsigned ResNo; // Which return value of the node we are using.
- SDOperand() : Val(0) {}
+ SDOperand() : Val(0), ResNo(0) {}
SDOperand(SDNode *val, unsigned resno) : Val(val), ResNo(resno) {}
bool operator==(const SDOperand &O) const {
public:
virtual ~SDNode() {
assert(NumOperands == 0 && "Operand list not cleared before deletion");
+ NodeType = ISD::DELETED_NODE;
}
//===--------------------------------------------------------------------===//
bool isNullValue() const { return Value == 0; }
bool isAllOnesValue() const {
- int NumBits = MVT::getSizeInBits(getValueType(0));
- if (NumBits == 64) return Value+1 == 0;
- return Value == (1ULL << NumBits)-1;
+ return Value == MVT::getIntVTBitMask(getValueType(0));
}
static bool classof(const ConstantSDNode *) { return true; }
}
};
+class JumpTableSDNode : public SDNode {
+ int JTI;
+protected:
+ friend class SelectionDAG;
+ JumpTableSDNode(int jti, MVT::ValueType VT, bool isTarg)
+ : SDNode(isTarg ? ISD::TargetJumpTable : ISD::JumpTable, VT),
+ JTI(jti) {}
+public:
+
+ int getIndex() const { return JTI; }
+
+ static bool classof(const JumpTableSDNode *) { return true; }
+ static bool classof(const SDNode *N) {
+ return N->getOpcode() == ISD::JumpTable ||
+ N->getOpcode() == ISD::TargetJumpTable;
+ }
+};
+
class ConstantPoolSDNode : public SDNode {
Constant *C;
int Offset;