SelectionDAGNodes.h revision b467f8af4125471361468ab91dbedba2abf2e09a
163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===-- llvm/CodeGen/SelectionDAGNodes.h - SelectionDAG Nodes ---*- C++ -*-===// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// The LLVM Compiler Infrastructure 463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// 563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// This file was developed by the LLVM research group and is distributed under 663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details. 7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===// 9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 1063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// This file declares the SDNode class and derived classes, which are used to 1163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// represent the nodes and operations present in a SelectionDAG. These nodes 1263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// and operations are machine code level operations, with some similarities to 1363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// the GCC RTL representation. 1463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// 1563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// Clients should include the SelectionDAG.h file instead of this file directly. 1663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// 1763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===// 1863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#ifndef LLVM_CODEGEN_SELECTIONDAGNODES_H 2063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#define LLVM_CODEGEN_SELECTIONDAGNODES_H 2163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 2263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#include "llvm/CodeGen/ValueTypes.h" 232d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth#include "llvm/Value.h" 241080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "llvm/ADT/GraphTraits.h" 251080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "llvm/ADT/GraphTraits.h" 261080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner#include "llvm/ADT/iterator" 2739931a3dbac1aa2fe2ec14f26001c8c29102940cJeff Cohen#include "llvm/Support/DataTypes.h" 2863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#include <cassert> 2963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#include <vector> 3063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 3163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnernamespace llvm { 3263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 3363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SelectionDAG; 3463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass GlobalValue; 3563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass MachineBasicBlock; 3663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SDNode; 3763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate <typename T> struct simplify_type; 3863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 3963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// ISD namespace - This namespace contains an enum which represents all of the 4063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SelectionDAG node types and value types. 4163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 4263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnernamespace ISD { 4363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner //===--------------------------------------------------------------------===// 4463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// ISD::NodeType enum - This enum defines all of the operators valid in a 4563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// SelectionDAG. 4663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 4763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner enum NodeType { 488a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // EntryToken - This is the marker used to indicate the start of the region. 498a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner EntryToken, 508a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner 518a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // Token factor - This node is takes multiple tokens as input and produces a 528a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // single token result. This is used to represent the fact that the operand 538a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // operators are independent of each other. 548a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner TokenFactor, 55ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 568a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner // Various leaf nodes. 578a496fcffdcba757412fc5cc6c772260ccfde000Chris Lattner Constant, ConstantFP, GlobalAddress, FrameIndex, ConstantPool, 58d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner BasicBlock, ExternalSymbol, VALUETYPE, CONDCODE, Register, 59056f9f61d071c6c583951678f2bf543a1316efccChris Lattner 60056f9f61d071c6c583951678f2bf543a1316efccChris Lattner // TargetConstant - Like Constant, but the DAG does not do any folding or 61056f9f61d071c6c583951678f2bf543a1316efccChris Lattner // simplification of the constant. This is used by the DAG->DAG selector. 62056f9f61d071c6c583951678f2bf543a1316efccChris Lattner TargetConstant, 6363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 64d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner // CopyToReg - This node has three operands: a chain, a register number to 65d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner // set to this value, and a value. 6663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CopyToReg, 6763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 6863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // CopyFromReg - This node indicates that the input value is a virtual or 6963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // physical register that is defined outside of the scope of this 7018c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // SelectionDAG. The register is available from the RegSDNode object. 7163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CopyFromReg, 7263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 7318c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner // ImplicitDef - This node indicates that the specified register is 74d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner // implicitly defined by some operation (e.g. its a live-in argument). The 75d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner // two operands to this are the token chain coming in and the register. 76d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner // The only result is the token chain going out. 7718c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner ImplicitDef, 7818c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner 79fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman // UNDEF - An undefined node 80fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman UNDEF, 81fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman 8263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // EXTRACT_ELEMENT - This is used to get the first or second (determined by 8363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // a Constant, which is required to be operand #1), element of the aggregate 8463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // value specified as operand #0. This is only for use before legalization, 8563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // for values that will be broken into multiple registers. 8663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner EXTRACT_ELEMENT, 8763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways. Given 8963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // two values of the same integer value type, this produces a value twice as 9063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // big. Like EXTRACT_ELEMENT, this can only be used before legalization. 9163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BUILD_PAIR, 9263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 9363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 9463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Simple binary arithmetic operators. 95bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner ADD, SUB, MUL, SDIV, UDIV, SREM, UREM, 96bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner 97bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner // MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing 98bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner // an unsigned/signed value of type i[2*n], then return the top part. 99bede0b7dd7c70792b09f6d38f6f2dfe7c1feb1d1Chris Lattner MULHU, MULHS, 10063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 10163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Bitwise operators. 10263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner AND, OR, XOR, SHL, SRA, SRL, 10363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 104691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth // Counting operators 105691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth CTTZ, CTLZ, CTPOP, 106691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth 1079373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman // Select 1089373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman SELECT, 1099373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman 1109373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman // Select with condition operator - This selects between a true value and 1119373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman // a false value (ops #2 and #3) based on the boolean result of comparing 1129373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman // the lhs and rhs (ops #0 and #1) of a conditional expression with the 1139373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman // condition code in op #4, a CondCodeSDNode. 1149373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman SELECT_CC, 11563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 11663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // SetCC operator - This evaluates to a boolean (i1) true value if the 1177cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner // condition is true. The operands to this are the left and right operands 1187cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner // to compare (ops #0, and #1) and the condition code to compare them with 1197cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner // (op #2) as a CondCodeSDNode. 12063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETCC, 12163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1225880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // ADD_PARTS/SUB_PARTS - These operators take two logical operands which are 1235880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // broken into a multiple pieces each, and return the resulting pieces of 1245880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // doing an atomic add/sub operation. This is used to handle add/sub of 1255880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // expanded types. The operation ordering is: 1265880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner // [Lo,Hi] = op [LoLHS,HiLHS], [LoRHS,HiRHS] 1275880b9fa3e964efdb5465fe740f1c7aaf054766aChris Lattner ADD_PARTS, SUB_PARTS, 12863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 12914c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner // SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded 13014c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner // integer shift operations, just like ADD/SUB_PARTS. The operation 13114c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner // ordering is: 1326b8f2d649c1e96e0222be9de1e5d6c79e3eef021Chris Lattner // [Lo,Hi] = op [LoLHS,HiLHS], Amt 13314c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner SHL_PARTS, SRA_PARTS, SRL_PARTS, 13414c5b53c037a6a175118ed1a7d7e0e74153d56c4Chris Lattner 13563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Conversion operators. These are all single input single output 13663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // operations. For all of these, the result type must be strictly 13763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // wider or narrower (depending on the operation) than the source 13863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // type. 13963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 14063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // SIGN_EXTEND - Used for integer types, replicating the sign bit 14163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // into new bits. 14263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SIGN_EXTEND, 14363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 14463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // ZERO_EXTEND - Used for integer types, zeroing the new bits. 14563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ZERO_EXTEND, 14663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 14763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // TRUNCATE - Completely drop the high bits. 14863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner TRUNCATE, 14963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1501645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // [SU]INT_TO_FP - These operators convert integers (whose interpreted sign 1511645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // depends on the first letter) to floating point. 1521645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner SINT_TO_FP, 1531645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner UINT_TO_FP, 1541645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner 155ea5761068956b157832d67bcc9d5e8ba706f545cChris Lattner // SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to 156ea5761068956b157832d67bcc9d5e8ba706f545cChris Lattner // sign extend a small value in a large integer register (e.g. sign 157ea5761068956b157832d67bcc9d5e8ba706f545cChris Lattner // extending the low 8 bits of a 32-bit register to fill the top 24 bits 15815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // with the 7th bit). The size of the smaller type is indicated by the 1th 15915e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // operand, a ValueType node. 160859157daee6a4b49e99921832e1dde065167b317Chris Lattner SIGN_EXTEND_INREG, 161859157daee6a4b49e99921832e1dde065167b317Chris Lattner 1621645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // FP_TO_[US]INT - Convert a floating point value to a signed or unsigned 1631645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner // integer. 1641645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner FP_TO_SINT, 1651645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner FP_TO_UINT, 1661645ed0b93901ec678cd54024c8b09bca632b296Chris Lattner 16763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // FP_ROUND - Perform a rounding operation from the current 168859157daee6a4b49e99921832e1dde065167b317Chris Lattner // precision down to the specified precision (currently always 64->32). 16963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FP_ROUND, 17063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 171859157daee6a4b49e99921832e1dde065167b317Chris Lattner // FP_ROUND_INREG - This operator takes a floating point register, and 172859157daee6a4b49e99921832e1dde065167b317Chris Lattner // rounds it to a floating point value. It then promotes it and returns it 173859157daee6a4b49e99921832e1dde065167b317Chris Lattner // in a register of the same size. This operation effectively just discards 17415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // excess precision. The type to round down to is specified by the 1th 17515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner // operation, a VTSDNode (currently always 64->32->64). 176859157daee6a4b49e99921832e1dde065167b317Chris Lattner FP_ROUND_INREG, 177859157daee6a4b49e99921832e1dde065167b317Chris Lattner 17863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // FP_EXTEND - Extend a smaller FP type into a larger FP type. 17963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FP_EXTEND, 18063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1817f64464ff100bcb7661b65c74c13dc88e83eb65bChris Lattner // FNEG, FABS, FSQRT, FSIN, FCOS - Perform unary floating point negation, 1827f64464ff100bcb7661b65c74c13dc88e83eb65bChris Lattner // absolute value, square root, sine and cosine operations. 1837f64464ff100bcb7661b65c74c13dc88e83eb65bChris Lattner FNEG, FABS, FSQRT, FSIN, FCOS, 1847366fd39727180a3261dd99e3797f89979d74e66Chris Lattner 1851cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // Other operators. LOAD and STORE have token chains as their first 186f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // operand, then the same operands as an LLVM load/store instruction, then a 187f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // SRCVALUE node that provides alias analysis information. 18863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner LOAD, STORE, 18963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 1905f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner // EXTLOAD, SEXTLOAD, ZEXTLOAD - These three operators all load a value from 1915f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner // memory and extend them to a larger value (e.g. load a byte into a word 1925f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner // register). All three of these have four operands, a token chain, a 1935f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner // pointer to load from, a SRCVALUE for alias analysis, and a VALUETYPE node 1945f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner // indicating the type to load. 1951cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // 1961cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // SEXTLOAD loads the integer operand and sign extends it to a larger 1971cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer result type. 1981cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // ZEXTLOAD loads the integer operand and zero extends it to a larger 1991cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer result type. 200ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman // EXTLOAD is used for two things: floating point extending loads, and 2011cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // integer extending loads where it doesn't matter what the high 2021cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // bits are set to. The code generator is allowed to codegen this 2031cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // into whichever operation is more efficient. 2041cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner EXTLOAD, SEXTLOAD, ZEXTLOAD, 2051cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 2061cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // TRUNCSTORE - This operators truncates (for integer) or rounds (for FP) a 2071cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner // value and stores it to memory in one operation. This can be used for 208f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // either integer or floating point operands. The first four operands of 209f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // this are the same as a standard store. The fifth is the ValueType to 210f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner // store it as (which will be smaller than the source value). 2111cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner TRUNCSTORE, 2121cff05c7c216eea0e9173738c2a60b70c2b3c013Chris Lattner 21363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned 21463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // to a specified boundary. The first operand is the token chain, the 21563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // second is the number of bytes to allocate, and the third is the alignment 21663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // boundary. 21763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner DYNAMIC_STACKALLOC, 21863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 21963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Control flow instructions. These all have token chains. 220ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 22163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BR - Unconditional branch. The first operand is the chain 22263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // operand, the second is the MBB to branch to. 22363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BR, 22463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 22563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BRCOND - Conditional branch. The first operand is the chain, 22663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // the second is the condition, the third is the block to branch 22763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // to if the condition is true. 22863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BRCOND, 22963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 2301df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // BRCONDTWOWAY - Two-way conditional branch. The first operand is the 2311df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // chain, the second is the condition, the third is the block to branch to 2321df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // if true, and the forth is the block to branch to if false. Targets 2331df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // usually do not implement this, preferring to have legalize demote the 2341df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner // operation to BRCOND/BR pairs when necessary. 2351df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner BRCONDTWOWAY, 2361df633821b9994a132ea329e5b04a9a2d0580de3Chris Lattner 2377cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // BR_CC - Conditional branch. The behavior is like that of SELECT_CC, in 2387cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // that the condition is represented as condition code, and two nodes to 2397cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // compare, rather than as a combined SetCC node. The operands in order are 2407cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // chain, cc, lhs, rhs, block to branch to if condition is true. 2417cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman BR_CC, 2427cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman 2437cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // BRTWOWAY_CC - Two-way conditional branch. The operands in order are 2447cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // chain, cc, lhs, rhs, block to branch to if condition is true, block to 2457cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // branch to if condition is false. Targets usually do not implement this, 2467cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman // preferring to have legalize demote the operation to BRCOND/BR pairs. 2477cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman BRTWOWAY_CC, 2487cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman 24963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // RET - Return from function. The first operand is the chain, 25063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // and any subsequent operands are the return values for the 25163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // function. This operation can have variable number of operands. 25263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner RET, 25363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 25463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // CALL - Call to a function pointer. The first operand is the chain, the 25563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // second is the destination function pointer (a GlobalAddress for a direct 25663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // call). Arguments have already been lowered to explicit DAGs according to 2574c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner // the calling convention in effect here. TAILCALL is the same as CALL, but 2584c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner // the callee is known not to access the stack of the caller. 25963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CALL, 2604c1eae9fb329e0e371d453957c56426294de24e9Chris Lattner TAILCALL, 261ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner 262ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // MEMSET/MEMCPY/MEMMOVE - The first operand is the chain, and the rest 263ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // correspond to the operands of the LLVM intrinsic functions. The only 264ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // result is a token chain. The alignment argument is guaranteed to be a 265ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner // Constant node. 266ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMSET, 267ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMMOVE, 268ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner MEMCPY, 269ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 27016cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // CALLSEQ_START/CALLSEQ_END - These operators mark the beginning and end of 27116cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // a call sequence, and carry arbitrary information that target might want 27216cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // to know. The first operand is a chain, the rest are specified by the 27316cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner // target and not touched by the DAG optimizers. 27416cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner CALLSEQ_START, // Beginning of a call sequence 27516cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner CALLSEQ_END, // End of a call sequence 27663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 27721074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // SRCVALUE - This corresponds to a Value*, and is used to associate memory 27821074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // locations with their value. This allows one use alias analysis 27921074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // information in the backend. 28021074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner SRCVALUE, 28121074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner 282e3f570c3f9048bc71a9f5841343eae63719e439bMisha Brukman // PCMARKER - This corresponds to the pcmarker intrinsic. 28395762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth PCMARKER, 28463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 28521074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // READPORT, WRITEPORT, READIO, WRITEIO - These correspond to the LLVM 28621074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // intrinsics of the same name. The first operand is a token chain, the 28721074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // other operands match the intrinsic. These produce a token chain in 28821074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner // addition to a value (if any). 28921074f43ed5165828717ea3606eb2bd222a39b26Chris Lattner READPORT, WRITEPORT, READIO, WRITEIO, 2902d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 29163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // BUILTIN_OP_END - This must be the last enum value in this list. 29263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BUILTIN_OP_END, 29363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner }; 29463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 29563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner //===--------------------------------------------------------------------===// 29663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// ISD::CondCode enum - These are ordered carefully to make the bitfields 29763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// below work out, when considering SETFALSE (something that never exists 29863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// dynamically) as 0. "U" -> Unsigned (for integer operands) or Unordered 29963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// (for floating point), "L" -> Less than, "G" -> Greater than, "E" -> Equal 30063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// to. If the "N" column is 1, the result of the comparison is undefined if 30163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// the input is a NAN. 30263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 30363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// All of these (except for the 'always folded ops') should be handled for 30463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// floating point. For integer, only the SETEQ,SETNE,SETLT,SETLE,SETGT, 30563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// SETGE,SETULT,SETULE,SETUGT, and SETUGE opcodes are used. 30663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 30763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Note that these are laid out in a specific order to allow bit-twiddling 30863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// to transform conditions. 30963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner enum CondCode { 31063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Opcode N U L G E Intuitive operation 31163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETFALSE, // 0 0 0 0 Always false (always folded) 31263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOEQ, // 0 0 0 1 True if ordered and equal 31363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOGT, // 0 0 1 0 True if ordered and greater than 31463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOGE, // 0 0 1 1 True if ordered and greater than or equal 31563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOLT, // 0 1 0 0 True if ordered and less than 31663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETOLE, // 0 1 0 1 True if ordered and less than or equal 31763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETONE, // 0 1 1 0 True if ordered and operands are unequal 31863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETO, // 0 1 1 1 True if ordered (no nans) 31963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUO, // 1 0 0 0 True if unordered: isnan(X) | isnan(Y) 32063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUEQ, // 1 0 0 1 True if unordered or equal 32163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUGT, // 1 0 1 0 True if unordered or greater than 32263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUGE, // 1 0 1 1 True if unordered, greater than, or equal 32363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETULT, // 1 1 0 0 True if unordered or less than 324ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman SETULE, // 1 1 0 1 True if unordered, less than, or equal 32563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETUNE, // 1 1 1 0 True if unordered or not equal 32663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETTRUE, // 1 1 1 1 Always true (always folded) 32763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Don't care operations: undefined if the input is a nan. 32863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETFALSE2, // 1 X 0 0 0 Always false (always folded) 32963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETEQ, // 1 X 0 0 1 True if equal 33063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETGT, // 1 X 0 1 0 True if greater than 33163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETGE, // 1 X 0 1 1 True if greater than or equal 33263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETLT, // 1 X 1 0 0 True if less than 333ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman SETLE, // 1 X 1 0 1 True if less than or equal 33463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETNE, // 1 X 1 1 0 True if not equal 33563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETTRUE2, // 1 X 1 1 1 Always true (always folded) 33663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 33763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SETCC_INVALID, // Marker value. 33863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner }; 33963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 34063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isSignedIntSetCC - Return true if this is a setcc instruction that 34163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// performs a signed comparison when used with integer operands. 34263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isSignedIntSetCC(CondCode Code) { 34363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Code == SETGT || Code == SETGE || Code == SETLT || Code == SETLE; 34463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 34563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 34663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isUnsignedIntSetCC - Return true if this is a setcc instruction that 34763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// performs an unsigned comparison when used with integer operands. 34863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isUnsignedIntSetCC(CondCode Code) { 34963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Code == SETUGT || Code == SETUGE || Code == SETULT || Code == SETULE; 35063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 35163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 35263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isTrueWhenEqual - Return true if the specified condition returns true if 35363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// the two operands to the condition are equal. Note that if one of the two 35463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operands is a NaN, this value is meaningless. 35563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline bool isTrueWhenEqual(CondCode Cond) { 35663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return ((int)Cond & 1) != 0; 35763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 35863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 35963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getUnorderedFlavor - This function returns 0 if the condition is always 36063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// false if an operand is a NaN, 1 if the condition is always true if the 36163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operand is a NaN, and 2 if the condition is undefined if the operand is a 36263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// NaN. 36363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getUnorderedFlavor(CondCode Cond) { 36463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return ((int)Cond >> 3) & 3; 36563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 36663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 36763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCInverse - Return the operation corresponding to !(X op Y), where 36863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 'op' is a valid SetCC operation. 36963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCInverse(CondCode Operation, bool isInteger); 37063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 37163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCSwappedOperands - Return the operation corresponding to (Y op X) 37263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// when given the operation for (X op Y). 37363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCSwappedOperands(CondCode Operation); 37463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 37563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCOrOperation - Return the result of a logical OR between different 37663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// comparisons of identical values: ((X op1 Y) | (X op2 Y)). This 37763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// function returns SETCC_INVALID if it is not possible to represent the 37863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// resultant comparison. 37963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCOrOperation(CondCode Op1, CondCode Op2, bool isInteger); 38063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 38163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getSetCCAndOperation - Return the result of a logical AND between 38263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// different comparisons of identical values: ((X op1 Y) & (X op2 Y)). This 38363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// function returns SETCC_INVALID if it is not possible to represent the 38463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// resultant comparison. 38563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, bool isInteger); 38663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} // end llvm::ISD namespace 38763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 38863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 38963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner//===----------------------------------------------------------------------===// 39063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDOperand - Unlike LLVM values, Selection DAG nodes may return multiple 39163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// values as the result of a computation. Many nodes return multiple values, 39263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// from loads (which define a token and a return value) to ADDC (which returns 39363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// a result and a carry value), to calls (which may return an arbitrary number 39463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// of values). 39563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 39663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// As such, each use of a SelectionDAG computation must indicate the node that 39763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// computes it as well as which return value to use from that node. This pair 39863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// of information is represented with the SDOperand value type. 39963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 400f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattnerclass SDOperand { 401f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattnerpublic: 40263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode *Val; // The node defining the value we are using. 40363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned ResNo; // Which return value of the node we are using. 40463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 40563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand() : Val(0) {} 40663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand(SDNode *val, unsigned resno) : Val(val), ResNo(resno) {} 40763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 40863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator==(const SDOperand &O) const { 40963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val == O.Val && ResNo == O.ResNo; 41063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 41163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator!=(const SDOperand &O) const { 41263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return !operator==(O); 41363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 41463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool operator<(const SDOperand &O) const { 41563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val < O.Val || (Val == O.Val && ResNo < O.ResNo); 41663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 41763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 41863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDOperand getValue(unsigned R) const { 41963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return SDOperand(Val, R); 42063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 42163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 42263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getValueType - Return the ValueType of the referenced return value. 42363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 42463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline MVT::ValueType getValueType() const; 425ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 42663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Forwarding methods - These forward to the corresponding methods in SDNode. 42763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getOpcode() const; 4280442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner inline unsigned getNodeDepth() const; 42963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline unsigned getNumOperands() const; 43063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner inline const SDOperand &getOperand(unsigned i) const; 431a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner 432a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner /// hasOneUse - Return true if there is exactly one operation using this 433a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner /// result value of the defining operator. 434a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner inline bool hasOneUse() const; 43563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 43663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 43763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 43863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// simplify_type specializations - Allow casting operators to work directly on 43963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDOperands as if they were SDNode*'s. 44063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate<> struct simplify_type<SDOperand> { 44163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner typedef SDNode* SimpleType; 44263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static SimpleType getSimplifiedValue(const SDOperand &Val) { 44363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return static_cast<SimpleType>(Val.Val); 44463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 44563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 44663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnertemplate<> struct simplify_type<const SDOperand> { 44763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner typedef SDNode* SimpleType; 44863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static SimpleType getSimplifiedValue(const SDOperand &Val) { 44963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return static_cast<SimpleType>(Val.Val); 45063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 45163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 45263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 45363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 45463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// SDNode - Represents one node in the SelectionDAG. 45563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner/// 45663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass SDNode { 4570442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// NodeType - The operation that this node performs. 4580442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// 4590442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned short NodeType; 4600442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4610442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// NodeDepth - Node depth is defined as MAX(Node depth of children)+1. This 4620442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// means that leaves have a depth of 1, things that use only leaves have a 4630442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// depth of 2, etc. 4640442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned short NodeDepth; 4650442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4660442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// Operands - The values that are used by this operation. 4670442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// 46863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<SDOperand> Operands; 46963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 47063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Values - The types of the values this node defines. SDNode's may define 47163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// multiple values simultaneously. 47263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<MVT::ValueType> Values; 47363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 47463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Uses - These are all of the SDNode's that use a value produced by this 47563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// node. 47663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::vector<SDNode*> Uses; 47763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 47863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 47963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner //===--------------------------------------------------------------------===// 48063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // Accessors 48163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner // 48263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getOpcode() const { return NodeType; } 48363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 48463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner size_t use_size() const { return Uses.size(); } 48563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool use_empty() const { return Uses.empty(); } 48663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool hasOneUse() const { return Uses.size() == 1; } 48763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 4880442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// getNodeDepth - Return the distance from this node to the leaves in the 4890442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner /// graph. The leaves have a depth of 1. 4900442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned getNodeDepth() const { return NodeDepth; } 4910442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 4927ece380440238ad0630a225b85a09a2dbed1165aChris Lattner typedef std::vector<SDNode*>::const_iterator use_iterator; 4937ece380440238ad0630a225b85a09a2dbed1165aChris Lattner use_iterator use_begin() const { return Uses.begin(); } 4947ece380440238ad0630a225b85a09a2dbed1165aChris Lattner use_iterator use_end() const { return Uses.end(); } 4957ece380440238ad0630a225b85a09a2dbed1165aChris Lattner 496b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the 497b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// indicated value. This method ignores uses of other values defined by this 498b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner /// operation. 499b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner bool hasNUsesOfValue(unsigned NUses, unsigned Value); 500b18a2f816cc9d1351ca8e380a6db5c5ef981943eChris Lattner 50163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getNumOperands - Return the number of values used by this operation. 50263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 50363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getNumOperands() const { return Operands.size(); } 50463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 50563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const SDOperand &getOperand(unsigned Num) { 50663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(Num < Operands.size() && "Invalid child # of SDNode!"); 50763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Operands[Num]; 50863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 50963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 51063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const SDOperand &getOperand(unsigned Num) const { 51163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(Num < Operands.size() && "Invalid child # of SDNode!"); 51263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Operands[Num]; 51363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 51450f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner typedef std::vector<SDOperand>::const_iterator op_iterator; 51550f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner op_iterator op_begin() const { return Operands.begin(); } 51650f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner op_iterator op_end() const { return Operands.end(); } 51750f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner 51863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 51963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getNumValues - Return the number of values defined/returned by this 52063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// operator. 52163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 52263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getNumValues() const { return Values.size(); } 52363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 52463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// getValueType - Return the type of a specified result. 52563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// 52663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MVT::ValueType getValueType(unsigned ResNo) const { 52763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner assert(ResNo < Values.size() && "Illegal result number!"); 52863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Values[ResNo]; 52963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 5309eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen 53150f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner typedef std::vector<MVT::ValueType>::const_iterator value_iterator; 53250f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner value_iterator value_begin() const { return Values.begin(); } 53350f5a51f41d36c519de68ff11fbf7c7c76f45416Chris Lattner value_iterator value_end() const { return Values.end(); } 53463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 5356e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner /// getOperationName - Return the opcode of this operation for printing. 5366e6e3ceb080e5a8bdfd3258d883a06ebbd8a1965Chris Lattner /// 537efe58694050e48b61584b8454434dcd1ad886a71Chris Lattner const char* getOperationName(const SelectionDAG *G = 0) const; 53863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void dump() const; 539efe58694050e48b61584b8454434dcd1ad886a71Chris Lattner void dump(const SelectionDAG *G) const; 54063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 54163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *) { return true; } 54263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 54373b35371bf3c21304086299f0282d6b7a163bc12Chris Lattner 54473b35371bf3c21304086299f0282d6b7a163bc12Chris Lattner /// setAdjCallChain - This method should only be used by the legalizer. 54573b35371bf3c21304086299f0282d6b7a163bc12Chris Lattner void setAdjCallChain(SDOperand N); 5469eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen 54763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 54863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 54963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 5500442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner SDNode(unsigned NT, MVT::ValueType VT) : NodeType(NT), NodeDepth(1) { 55163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(1); 55263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT); 55363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 55463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand Op) 5550442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner : NodeType(NT), NodeDepth(Op.Val->getNodeDepth()+1) { 55663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(1); Operands.push_back(Op); 55763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Op.Val->Uses.push_back(this); 55863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 55963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand N1, SDOperand N2) 56063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : NodeType(NT) { 5610442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (N1.Val->getNodeDepth() > N2.Val->getNodeDepth()) 5620442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = N1.Val->getNodeDepth()+1; 5630442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner else 5640442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = N2.Val->getNodeDepth()+1; 56563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(2); Operands.push_back(N1); Operands.push_back(N2); 56663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N1.Val->Uses.push_back(this); N2.Val->Uses.push_back(this); 56763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 56863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, SDOperand N1, SDOperand N2, SDOperand N3) 56963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : NodeType(NT) { 5700442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned ND = N1.Val->getNodeDepth(); 5710442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < N2.Val->getNodeDepth()) 5720442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = N2.Val->getNodeDepth(); 5730442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < N3.Val->getNodeDepth()) 5740442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = N3.Val->getNodeDepth(); 5750442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = ND+1; 5760442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner 57763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.reserve(3); Operands.push_back(N1); Operands.push_back(N2); 57863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.push_back(N3); 57963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N1.Val->Uses.push_back(this); N2.Val->Uses.push_back(this); 58063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner N3.Val->Uses.push_back(this); 58163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 5822d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth SDNode(unsigned NT, SDOperand N1, SDOperand N2, SDOperand N3, SDOperand N4) 5832d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth : NodeType(NT) { 5842d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth unsigned ND = N1.Val->getNodeDepth(); 5852d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth if (ND < N2.Val->getNodeDepth()) 5862d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth ND = N2.Val->getNodeDepth(); 5872d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth if (ND < N3.Val->getNodeDepth()) 5882d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth ND = N3.Val->getNodeDepth(); 5892d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth if (ND < N4.Val->getNodeDepth()) 5902d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth ND = N4.Val->getNodeDepth(); 5912d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth NodeDepth = ND+1; 5922d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 593691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth Operands.reserve(4); Operands.push_back(N1); Operands.push_back(N2); 5942d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth Operands.push_back(N3); Operands.push_back(N4); 5952d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth N1.Val->Uses.push_back(this); N2.Val->Uses.push_back(this); 5962d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth N3.Val->Uses.push_back(this); N4.Val->Uses.push_back(this); 5972d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth } 59863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner SDNode(unsigned NT, std::vector<SDOperand> &Nodes) : NodeType(NT) { 59963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Operands.swap(Nodes); 6000442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner unsigned ND = 0; 6010442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner for (unsigned i = 0, e = Operands.size(); i != e; ++i) { 602ef36aa75d7df2bb67e8bfb0da7c43c1b331611e4Chris Lattner Operands[i].Val->Uses.push_back(this); 6030442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner if (ND < Operands[i].Val->getNodeDepth()) 6040442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner ND = Operands[i].Val->getNodeDepth(); 6050442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner } 6060442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner NodeDepth = ND+1; 60763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 60863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 6091b95095857b78e12138c22e76c7936611c51355bChris Lattner virtual ~SDNode() {} 6101b95095857b78e12138c22e76c7936611c51355bChris Lattner 6111b95095857b78e12138c22e76c7936611c51355bChris Lattner /// MorphNodeTo - This clears the return value and operands list, and sets the 6121b95095857b78e12138c22e76c7936611c51355bChris Lattner /// opcode of the node to the specified value. This should only be used by 6131b95095857b78e12138c22e76c7936611c51355bChris Lattner /// the SelectionDAG class. 6141b95095857b78e12138c22e76c7936611c51355bChris Lattner void MorphNodeTo(unsigned Opc) { 6151b95095857b78e12138c22e76c7936611c51355bChris Lattner NodeType = Opc; 6161b95095857b78e12138c22e76c7936611c51355bChris Lattner Values.clear(); 617b467f8af4125471361468ab91dbedba2abf2e09aChris Lattner 618b467f8af4125471361468ab91dbedba2abf2e09aChris Lattner // Clear the operands list, updating used nodes to remove this from their 619b467f8af4125471361468ab91dbedba2abf2e09aChris Lattner // use list. 620b467f8af4125471361468ab91dbedba2abf2e09aChris Lattner while (!Operands.empty()) { 621b467f8af4125471361468ab91dbedba2abf2e09aChris Lattner SDNode *O = Operands.back().Val; 622b467f8af4125471361468ab91dbedba2abf2e09aChris Lattner Operands.pop_back(); 623b467f8af4125471361468ab91dbedba2abf2e09aChris Lattner O->removeUser(this); 624b467f8af4125471361468ab91dbedba2abf2e09aChris Lattner } 62563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 6261b95095857b78e12138c22e76c7936611c51355bChris Lattner 62763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(MVT::ValueType VT) { 62863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(1); 62963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT); 63063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 63163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(MVT::ValueType VT1, MVT::ValueType VT2) { 63263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.reserve(2); 63363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT1); 63463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner Values.push_back(VT2); 63563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 63663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// Note: this method destroys the vector passed in. 63763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner void setValueTypes(std::vector<MVT::ValueType> &VTs) { 63863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner std::swap(Values, VTs); 63963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 6401b95095857b78e12138c22e76c7936611c51355bChris Lattner 6411b95095857b78e12138c22e76c7936611c51355bChris Lattner void setOperands(SDOperand Op0) { 6421b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.reserve(1); 6431b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op0); 6441b95095857b78e12138c22e76c7936611c51355bChris Lattner } 6451b95095857b78e12138c22e76c7936611c51355bChris Lattner void setOperands(SDOperand Op0, SDOperand Op1) { 6461b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.reserve(2); 6471b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op0); 6481b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op1); 6491b95095857b78e12138c22e76c7936611c51355bChris Lattner } 6501b95095857b78e12138c22e76c7936611c51355bChris Lattner void setOperands(SDOperand Op0, SDOperand Op1, SDOperand Op2) { 6511b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.reserve(3); 6521b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op0); 6531b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op1); 6541b95095857b78e12138c22e76c7936611c51355bChris Lattner Operands.push_back(Op2); 6551b95095857b78e12138c22e76c7936611c51355bChris Lattner } 656d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner void removeUser(SDNode *User) { 657d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner // Remove this user from the operand's use list. 658d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner for (unsigned i = Uses.size(); ; --i) { 659d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner assert(i != 0 && "Didn't find user!"); 660d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner if (Uses[i-1] == User) { 661d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner Uses.erase(Uses.begin()+i-1); 662d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner break; 663d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 664d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 665d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner } 66663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 66763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 66863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 66963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner// Define inline functions from the SDOperand class. 67063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 67163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline unsigned SDOperand::getOpcode() const { 67263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getOpcode(); 67363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 6740442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattnerinline unsigned SDOperand::getNodeDepth() const { 6750442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner return Val->getNodeDepth(); 6760442fbfadbeea21eee9df88dc466d95e040dde6bChris Lattner} 67763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline MVT::ValueType SDOperand::getValueType() const { 67863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getValueType(ResNo); 67963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 68063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline unsigned SDOperand::getNumOperands() const { 68163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getNumOperands(); 68263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 68363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerinline const SDOperand &SDOperand::getOperand(unsigned i) const { 68463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return Val->getOperand(i); 68563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} 686a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattnerinline bool SDOperand::hasOneUse() const { 687a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner return Val->hasNUsesOfValue(1, ResNo); 688a44f4aeca77c6c1627568fe68e92af9c7e33dc7eChris Lattner} 68963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 69063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 69163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantSDNode : public SDNode { 69263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t Value; 69363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 69463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 695056f9f61d071c6c583951678f2bf543a1316efccChris Lattner ConstantSDNode(bool isTarget, uint64_t val, MVT::ValueType VT) 696056f9f61d071c6c583951678f2bf543a1316efccChris Lattner : SDNode(isTarget ? ISD::TargetConstant : ISD::Constant, VT), Value(val) { 69763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 69863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 69963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 70063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t getValue() const { return Value; } 70163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 70263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int64_t getSignExtended() const { 70363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned Bits = MVT::getSizeInBits(getValueType(0)); 704f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattner return ((int64_t)Value << (64-Bits)) >> (64-Bits); 70563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 70663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 70763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isNullValue() const { return Value == 0; } 70863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isAllOnesValue() const { 7092bffad3eebff7997599d12c17248ae580ba17cb8Chris Lattner int NumBits = MVT::getSizeInBits(getValueType(0)); 7102bffad3eebff7997599d12c17248ae580ba17cb8Chris Lattner if (NumBits == 64) return Value+1 == 0; 7112bffad3eebff7997599d12c17248ae580ba17cb8Chris Lattner return Value == (1ULL << NumBits)-1; 71263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 71363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 71463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantSDNode *) { return true; } 71563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 716056f9f61d071c6c583951678f2bf543a1316efccChris Lattner return N->getOpcode() == ISD::Constant || 717056f9f61d071c6c583951678f2bf543a1316efccChris Lattner N->getOpcode() == ISD::TargetConstant; 71863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 71963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 72063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 72163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantFPSDNode : public SDNode { 72263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double Value; 72363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 72463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 72563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ConstantFPSDNode(double val, MVT::ValueType VT) 72663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ConstantFP, VT), Value(val) { 72763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 72863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 72963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 73063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double getValue() const { return Value; } 73163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 73263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// isExactlyValue - We don't rely on operator== working on double values, as 73363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// it returns true for things that are clearly not equal, like -0.0 and 0.0. 73463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// As such, this method can be used to do an exact bit-for-bit comparison of 73563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner /// two floating point values. 73663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner bool isExactlyValue(double V) const { 73763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner union { 73863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double V; 73963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t I; 74063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } T1; 74163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner T1.V = Value; 74263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner union { 74363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner double V; 74463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner uint64_t I; 74563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } T2; 74663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner T2.V = V; 74763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return T1.I == T2.I; 74863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 74963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 75063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantFPSDNode *) { return true; } 75163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 75263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ConstantFP; 75363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 75463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 75563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 75663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass GlobalAddressSDNode : public SDNode { 75763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalValue *TheGlobal; 75863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 75963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 76063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalAddressSDNode(const GlobalValue *GA, MVT::ValueType VT) 76163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::GlobalAddress, VT) { 76263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner TheGlobal = const_cast<GlobalValue*>(GA); 76363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 76463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 76563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 76663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner GlobalValue *getGlobal() const { return TheGlobal; } 76763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 76863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const GlobalAddressSDNode *) { return true; } 76963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 77063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::GlobalAddress; 77163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 77263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 77363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 77463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 77563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass FrameIndexSDNode : public SDNode { 77663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int FI; 77763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 77863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 77963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner FrameIndexSDNode(int fi, MVT::ValueType VT) 78063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::FrameIndex, VT), FI(fi) {} 78163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 78263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 78363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner int getIndex() const { return FI; } 78463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 78563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const FrameIndexSDNode *) { return true; } 78663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 78763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::FrameIndex; 78863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 78963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 79063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 79163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ConstantPoolSDNode : public SDNode { 79263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned CPI; 79363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 79463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 79563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ConstantPoolSDNode(unsigned cpi, MVT::ValueType VT) 79663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ConstantPool, VT), CPI(cpi) {} 79763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 79863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 79963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getIndex() const { return CPI; } 80063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 80163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ConstantPoolSDNode *) { return true; } 80263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 80363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ConstantPool; 80463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 80563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 80663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 80763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass BasicBlockSDNode : public SDNode { 80863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MachineBasicBlock *MBB; 80963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 81063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 81163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner BasicBlockSDNode(MachineBasicBlock *mbb) 81263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::BasicBlock, MVT::Other), MBB(mbb) {} 81363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 81463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 81563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner MachineBasicBlock *getBasicBlock() const { return MBB; } 81663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 81763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const BasicBlockSDNode *) { return true; } 81863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 81963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::BasicBlock; 82063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 82163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 82263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8232d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharthclass SrcValueSDNode : public SDNode { 8242d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth const Value *V; 825691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth int offset; 8262d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharthprotected: 8272d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth friend class SelectionDAG; 828691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth SrcValueSDNode(const Value* v, int o) 829691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth : SDNode(ISD::SRCVALUE, MVT::Other), V(v), offset(o) {} 8302d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 8312d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharthpublic: 8322d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth const Value *getValue() const { return V; } 833691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth int getOffset() const { return offset; } 8342d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 8352d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth static bool classof(const SrcValueSDNode *) { return true; } 8362d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth static bool classof(const SDNode *N) { 8372d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth return N->getOpcode() == ISD::SRCVALUE; 8382d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth } 8392d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth}; 8402d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth 84163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 842d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattnerclass RegisterSDNode : public SDNode { 84363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned Reg; 84463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 84563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 846d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner RegisterSDNode(unsigned reg, MVT::ValueType VT) 847d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner : SDNode(ISD::Register, VT), Reg(reg) {} 84863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 84963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 85063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner unsigned getReg() const { return Reg; } 85163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 852d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner static bool classof(const RegisterSDNode *) { return true; } 85363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 854d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner return N->getOpcode() == ISD::Register; 85563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 85663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 85763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 85863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerclass ExternalSymbolSDNode : public SDNode { 85963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const char *Symbol; 86063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 86163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 86263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ExternalSymbolSDNode(const char *Sym, MVT::ValueType VT) 86363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner : SDNode(ISD::ExternalSymbol, VT), Symbol(Sym) { 86463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 86563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 86663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 86763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner const char *getSymbol() const { return Symbol; } 86863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 86963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const ExternalSymbolSDNode *) { return true; } 87063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 87163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner return N->getOpcode() == ISD::ExternalSymbol; 87263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 87363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 87463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8757cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattnerclass CondCodeSDNode : public SDNode { 87663b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner ISD::CondCode Condition; 87763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerprotected: 87863b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner friend class SelectionDAG; 8797cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner CondCodeSDNode(ISD::CondCode Cond) 8807cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner : SDNode(ISD::CONDCODE, MVT::Other), Condition(Cond) { 88163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 88263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattnerpublic: 88363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8847cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner ISD::CondCode get() const { return Condition; } 88563b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 8867cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner static bool classof(const CondCodeSDNode *) { return true; } 88763b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner static bool classof(const SDNode *N) { 8887cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner return N->getOpcode() == ISD::CONDCODE; 88963b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner } 89063b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner}; 89163b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 89215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner/// VTSDNode - This class is used to represent MVT::ValueType's, which are used 89315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner/// to parameterize some operations. 89415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattnerclass VTSDNode : public SDNode { 89515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner MVT::ValueType ValueType; 89615e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattnerprotected: 89715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner friend class SelectionDAG; 89815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner VTSDNode(MVT::ValueType VT) 89915e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner : SDNode(ISD::VALUETYPE, MVT::Other), ValueType(VT) {} 90015e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattnerpublic: 90115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 90215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner MVT::ValueType getVT() const { return ValueType; } 90315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 90415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner static bool classof(const VTSDNode *) { return true; } 90515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner static bool classof(const SDNode *N) { 90615e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner return N->getOpcode() == ISD::VALUETYPE; 90715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner } 90815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner}; 90915e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 91015e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner 9111080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnerclass SDNodeIterator : public forward_iterator<SDNode, ptrdiff_t> { 9121080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNode *Node; 9131080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner unsigned Operand; 914ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 9151080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator(SDNode *N, unsigned Op) : Node(N), Operand(Op) {} 9161080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnerpublic: 9171080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner bool operator==(const SDNodeIterator& x) const { 9181080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return Operand == x.Operand; 9191080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9201080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner bool operator!=(const SDNodeIterator& x) const { return !operator==(x); } 9211080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9221080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner const SDNodeIterator &operator=(const SDNodeIterator &I) { 9231080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner assert(I.Node == Node && "Cannot assign iterators to two different nodes!"); 9241080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner Operand = I.Operand; 9251080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return *this; 9261080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 927ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 9281080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner pointer operator*() const { 9291080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return Node->getOperand(Operand).Val; 9301080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9311080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner pointer operator->() const { return operator*(); } 932ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 9331080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator& operator++() { // Preincrement 9341080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner ++Operand; 9351080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return *this; 9361080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9371080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner SDNodeIterator operator++(int) { // Postincrement 938ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman SDNodeIterator tmp = *this; ++*this; return tmp; 9391080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9401080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9411080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static SDNodeIterator begin(SDNode *N) { return SDNodeIterator(N, 0); } 9421080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static SDNodeIterator end (SDNode *N) { 9431080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator(N, N->getNumOperands()); 9441080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9451080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9461080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner unsigned getOperand() const { return Operand; } 9471080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner const SDNode *getNode() const { return Node; } 9481080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner}; 9491080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 9501080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattnertemplate <> struct GraphTraits<SDNode*> { 9511080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner typedef SDNode NodeType; 9521080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner typedef SDNodeIterator ChildIteratorType; 9531080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner static inline NodeType *getEntryNode(SDNode *N) { return N; } 954ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman static inline ChildIteratorType child_begin(NodeType *N) { 9551080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator::begin(N); 9561080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 957ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman static inline ChildIteratorType child_end(NodeType *N) { 9581080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner return SDNodeIterator::end(N); 9591080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner } 9601080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner}; 9611080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner 96263b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner} // end llvm namespace 96363b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner 96463b570d49b7bf205d48749aae1467ef96152ea7aChris Lattner#endif 965