//===-- llvm/CodeGen/SelectionDAGNodes.h - SelectionDAG Nodes ---*- C++ -*-===//
-//
+//
// The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
-//
+//
//===----------------------------------------------------------------------===//
-//
+//
// This file declares the SDNode class and derived classes, which are used to
// represent the nodes and operations present in a SelectionDAG. These nodes
// and operations are machine code level operations, with some similarities to
// single token result. This is used to represent the fact that the operand
// operators are independent of each other.
TokenFactor,
-
+
// Various leaf nodes.
Constant, ConstantFP, GlobalAddress, FrameIndex, ConstantPool,
BasicBlock, ExternalSymbol,
SINT_TO_FP,
UINT_TO_FP,
- // SIGN_EXTEND_INREG/ZERO_EXTEND_INREG - These operators atomically performs
- // a SHL/(SRA|SHL) pair to (sign|zero) extend a small value in a large
- // integer register (e.g. sign extending the low 8 bits of a 32-bit register
- // to fill the top 24 bits with the 7th bit). The size of the smaller type
- // is indicated by the ExtraValueType in the MVTSDNode for the operator.
+ // SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to
+ // sign extend a small value in a large integer register (e.g. sign
+ // extending the low 8 bits of a 32-bit register to fill the top 24 bits
+ // with the 7th bit). The size of the smaller type is indicated by the
+ // ExtraValueType in the MVTSDNode for the operator.
SIGN_EXTEND_INREG,
- ZERO_EXTEND_INREG,
// FP_TO_[US]INT - Convert a floating point value to a signed or unsigned
// integer.
// integer result type.
// ZEXTLOAD loads the integer operand and zero extends it to a larger
// integer result type.
- // EXTLOAD is used for two things: floating point extending loads, and
+ // EXTLOAD is used for two things: floating point extending loads, and
// integer extending loads where it doesn't matter what the high
// bits are set to. The code generator is allowed to codegen this
// into whichever operation is more efficient.
DYNAMIC_STACKALLOC,
// Control flow instructions. These all have token chains.
-
+
// BR - Unconditional branch. The first operand is the chain
// operand, the second is the MBB to branch to.
BR,
// to if the condition is true.
BRCOND,
+ // BRCONDTWOWAY - Two-way conditional branch. The first operand is the
+ // chain, the second is the condition, the third is the block to branch to
+ // if true, and the forth is the block to branch to if false. Targets
+ // usually do not implement this, preferring to have legalize demote the
+ // operation to BRCOND/BR pairs when necessary.
+ BRCONDTWOWAY,
+
// 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.
MEMSET,
MEMMOVE,
MEMCPY,
-
+
// ADJCALLSTACKDOWN/ADJCALLSTACKUP - These operators mark the beginning and
// end of a call sequence and indicate how much the stack pointer needs to
// be adjusted for that particular call. The first operand is a chain, the
SETUGT, // 1 0 1 0 True if unordered or greater than
SETUGE, // 1 0 1 1 True if unordered, greater than, or equal
SETULT, // 1 1 0 0 True if unordered or less than
- SETULE, // 1 1 0 1 True if unordered, less than, or equal
+ SETULE, // 1 1 0 1 True if unordered, less than, or equal
SETUNE, // 1 1 1 0 True if unordered or not equal
SETTRUE, // 1 1 1 1 Always true (always folded)
// Don't care operations: undefined if the input is a nan.
SETGT, // 1 X 0 1 0 True if greater than
SETGE, // 1 X 0 1 1 True if greater than or equal
SETLT, // 1 X 1 0 0 True if less than
- SETLE, // 1 X 1 0 1 True if less than or equal
+ SETLE, // 1 X 1 0 1 True if less than or equal
SETNE, // 1 X 1 1 0 True if not equal
SETTRUE2, // 1 X 1 1 1 Always true (always folded)
/// getValueType - Return the ValueType of the referenced return value.
///
inline MVT::ValueType getValueType() const;
-
+
// Forwarding methods - These forward to the corresponding methods in SDNode.
inline unsigned getOpcode() const;
inline unsigned getNodeDepth() const;
static bool classof(const MVTSDNode *) { return true; }
static bool classof(const SDNode *N) {
- return
+ return
N->getOpcode() == ISD::SIGN_EXTEND_INREG ||
- N->getOpcode() == ISD::ZERO_EXTEND_INREG ||
N->getOpcode() == ISD::FP_ROUND_INREG ||
N->getOpcode() == ISD::EXTLOAD ||
- N->getOpcode() == ISD::SEXTLOAD ||
+ N->getOpcode() == ISD::SEXTLOAD ||
N->getOpcode() == ISD::ZEXTLOAD ||
N->getOpcode() == ISD::TRUNCSTORE;
}
class SDNodeIterator : public forward_iterator<SDNode, ptrdiff_t> {
SDNode *Node;
unsigned Operand;
-
+
SDNodeIterator(SDNode *N, unsigned Op) : Node(N), Operand(Op) {}
public:
bool operator==(const SDNodeIterator& x) const {
Operand = I.Operand;
return *this;
}
-
+
pointer operator*() const {
return Node->getOperand(Operand).Val;
}
pointer operator->() const { return operator*(); }
-
+
SDNodeIterator& operator++() { // Preincrement
++Operand;
return *this;
}
SDNodeIterator operator++(int) { // Postincrement
- SDNodeIterator tmp = *this; ++*this; return tmp;
+ SDNodeIterator tmp = *this; ++*this; return tmp;
}
static SDNodeIterator begin(SDNode *N) { return SDNodeIterator(N, 0); }
typedef SDNode NodeType;
typedef SDNodeIterator ChildIteratorType;
static inline NodeType *getEntryNode(SDNode *N) { return N; }
- static inline ChildIteratorType child_begin(NodeType *N) {
+ static inline ChildIteratorType child_begin(NodeType *N) {
return SDNodeIterator::begin(N);
}
- static inline ChildIteratorType child_end(NodeType *N) {
+ static inline ChildIteratorType child_end(NodeType *N) {
return SDNodeIterator::end(N);
}
};