MCExpr.h revision 9643ac55142d40da404caa8e5fedfef2cd7b4afc
128c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar//===- MCExpr.h - Assembly Level Expressions --------------------*- C++ -*-===// 2fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// 3fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// The LLVM Compiler Infrastructure 4fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// 5fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// This file is distributed under the University of Illinois Open Source 6fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// License. See LICENSE.TXT for details. 7fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar// 8fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar//===----------------------------------------------------------------------===// 9fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1028c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar#ifndef LLVM_MC_MCEXPR_H 1128c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar#define LLVM_MC_MCEXPR_H 12fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 13fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar#include "llvm/Support/Casting.h" 14fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar#include "llvm/Support/DataTypes.h" 15fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 16fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarnamespace llvm { 17fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarclass MCContext; 18fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarclass MCSymbol; 1915d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbarclass MCValue; 20fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 2128c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCExpr - Base class for the full range of assembler expressions which are 229643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar/// needed for parsing. 2328c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCExpr { 24fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 2528c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar enum ExprKind { 261aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Binary, ///< Binary expressions. 271aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Constant, ///< Constant expressions. 281aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar SymbolRef, ///< References to labels and assigned expressions. 291aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Unary ///< Unary expressions. 30fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar }; 319643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 32fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprivate: 3328c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar ExprKind Kind; 349643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 359643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCExpr(const MCExpr&); // DO NOT IMPLEMENT 369643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar void operator=(const MCExpr&); // DO NOT IMPLEMENT 379643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 38fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprotected: 3928c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar MCExpr(ExprKind _Kind) : Kind(_Kind) {} 409643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 41fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 429643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 439643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 44fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 4528c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar ExprKind getKind() const { return Kind; } 46fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 479643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 489643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Expression Evaluation 499643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 509643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 51fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar /// EvaluateAsAbsolute - Try to evaluate the expression to an absolute value. 52fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar /// 5315d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// @param Res - The absolute value, if evaluation succeeds. 54fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar /// @result - True on success. 55fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar bool EvaluateAsAbsolute(MCContext &Ctx, int64_t &Res) const; 56fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 5715d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// EvaluateAsRelocatable - Try to evaluate the expression to a relocatable 581aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar /// value, i.e. an expression of the fixed form (a - b + constant). 5915d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// 6015d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// @param Res - The relocatable value, if evaluation succeeds. 6115d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// @result - True on success. 6215d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar bool EvaluateAsRelocatable(MCContext &Ctx, MCValue &Res) const; 6315d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar 649643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 659643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 6628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCExpr *) { return true; } 67fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 68fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 6928c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar//// MCConstantExpr - Represent a constant integer expression. 7028c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCConstantExpr : public MCExpr { 71fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar int64_t Value; 72fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 739643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCConstantExpr(int64_t _Value) 7428c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Constant), Value(_Value) {} 759643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 769643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 779643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 789643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 799643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 809643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCConstantExpr *Create(int64_t Value, MCContext &Ctx); 819643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 829643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 839643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 849643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 859643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 86fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar int64_t getValue() const { return Value; } 87fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 889643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 899643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 909643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 919643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Constant; 92fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 9328c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCConstantExpr *) { return true; } 94fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 95fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 9628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCSymbolRefExpr - Represent a reference to a symbol from inside an 971aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// expression. 981aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// 991aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// A symbol reference in an expression may be a use of a label, a use of an 1001aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// assembler variable (defined constant), or constitute an implicit definition 1011aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// of the symbol as external. 10228c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCSymbolRefExpr : public MCExpr { 1039643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCSymbol *Symbol; 104fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1059643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCSymbolRefExpr(const MCSymbol *_Symbol) 10628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::SymbolRef), Symbol(_Symbol) {} 107fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1089643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 1099643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 1109643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1119643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1129643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCSymbolRefExpr *Create(const MCSymbol *Symbol, MCContext &Ctx); 1139643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1149643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1159643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 1169643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1179643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1189643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCSymbol &getSymbol() const { return *Symbol; } 1199643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1209643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1219643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1229643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 1239643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::SymbolRef; 124fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 12528c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCSymbolRefExpr *) { return true; } 126fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 127fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 12828c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCUnaryExpr - Unary assembler expressions. 12928c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCUnaryExpr : public MCExpr { 130fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 131fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar enum Opcode { 1321aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LNot, ///< Logical negation. 1331aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Minus, ///< Unary minus. 1341aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Not, ///< Bitwise negation. 1351aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Plus ///< Unary plus. 136fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar }; 137fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 138fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprivate: 139fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode Op; 1409643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *Expr; 141fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1429643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCUnaryExpr(Opcode _Op, const MCExpr *_Expr) 14328c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Unary), Op(_Op), Expr(_Expr) {} 1449643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1459643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 1469643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 1479643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1489643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1499643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *Create(Opcode Op, const MCExpr *Expr, 1509643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx); 1519643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateLNot(const MCExpr *Expr, MCContext &Ctx) { 1529643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LNot, Expr, Ctx); 1539643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1549643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateMinus(const MCExpr *Expr, MCContext &Ctx) { 1559643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Minus, Expr, Ctx); 1569643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1579643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateNot(const MCExpr *Expr, MCContext &Ctx) { 1589643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Not, Expr, Ctx); 159fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 1609643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreatePlus(const MCExpr *Expr, MCContext &Ctx) { 1619643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Plus, Expr, Ctx); 1629643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1639643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1649643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1659643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 1669643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 167fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1689643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getOpcode - Get the kind of this unary expression. 169fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode getOpcode() const { return Op; } 170fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1719643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getSubExpr - Get the child of this unary expression. 1729643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getSubExpr() const { return Expr; } 173fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1749643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1759643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1769643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 1779643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Unary; 178fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 17928c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCUnaryExpr *) { return true; } 180fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 181fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 18228c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCBinaryExpr - Binary assembler expressions. 18328c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCBinaryExpr : public MCExpr { 184fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 185fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar enum Opcode { 1861aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Add, ///< Addition. 1871aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar And, ///< Bitwise and. 1881aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Div, ///< Division. 1891aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar EQ, ///< Equality comparison. 1901aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar GT, ///< Greater than comparison. 1911aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar GTE, ///< Greater than or equal comparison. 1921aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LAnd, ///< Logical and. 1931aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LOr, ///< Logical or. 1941aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LT, ///< Less than comparison. 1951aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LTE, ///< Less than or equal comparison. 1961aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Mod, ///< Modulus. 1971aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Mul, ///< Multiplication. 1981aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar NE, ///< Inequality comparison. 1991aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Or, ///< Bitwise or. 2001aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Shl, ///< Bitwise shift left. 2011aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Shr, ///< Bitwise shift right. 2021aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Sub, ///< Subtraction. 2031aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Xor ///< Bitwise exclusive or. 204fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar }; 205fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 206fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprivate: 207fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode Op; 2089643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *LHS, *RHS; 209fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 2109643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCBinaryExpr(Opcode _Op, const MCExpr *_LHS, const MCExpr *_RHS) 21128c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Binary), Op(_Op), LHS(_LHS), RHS(_RHS) {} 2129643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 2139643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 2149643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 2159643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 2169643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 2179643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *Create(Opcode Op, const MCExpr *LHS, 2189643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *RHS, MCContext &Ctx); 2199643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateAdd(const MCExpr *LHS, const MCExpr *RHS, 2209643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2219643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Add, LHS, RHS, Ctx); 2229643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2239643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateAnd(const MCExpr *LHS, const MCExpr *RHS, 2249643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2259643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(And, LHS, RHS, Ctx); 2269643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2279643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateDiv(const MCExpr *LHS, const MCExpr *RHS, 2289643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2299643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Div, LHS, RHS, Ctx); 2309643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2319643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateEQ(const MCExpr *LHS, const MCExpr *RHS, 2329643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2339643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(EQ, LHS, RHS, Ctx); 2349643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2359643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateGT(const MCExpr *LHS, const MCExpr *RHS, 2369643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2379643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(GT, LHS, RHS, Ctx); 2389643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2399643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateGTE(const MCExpr *LHS, const MCExpr *RHS, 2409643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2419643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(GTE, LHS, RHS, Ctx); 2429643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2439643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLAnd(const MCExpr *LHS, const MCExpr *RHS, 2449643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2459643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LAnd, LHS, RHS, Ctx); 246fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 2479643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLOr(const MCExpr *LHS, const MCExpr *RHS, 2489643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2499643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LOr, LHS, RHS, Ctx); 2509643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2519643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLT(const MCExpr *LHS, const MCExpr *RHS, 2529643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2539643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LT, LHS, RHS, Ctx); 2549643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2559643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLTE(const MCExpr *LHS, const MCExpr *RHS, 2569643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2579643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LTE, LHS, RHS, Ctx); 2589643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2599643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateMod(const MCExpr *LHS, const MCExpr *RHS, 2609643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2619643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Mod, LHS, RHS, Ctx); 2629643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2639643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateMul(const MCExpr *LHS, const MCExpr *RHS, 2649643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2659643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Mul, LHS, RHS, Ctx); 2669643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2679643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateNE(const MCExpr *LHS, const MCExpr *RHS, 2689643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2699643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(NE, LHS, RHS, Ctx); 2709643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2719643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateOr(const MCExpr *LHS, const MCExpr *RHS, 2729643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2739643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Or, LHS, RHS, Ctx); 2749643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2759643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateShl(const MCExpr *LHS, const MCExpr *RHS, 2769643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2779643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Shl, LHS, RHS, Ctx); 2789643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2799643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateShr(const MCExpr *LHS, const MCExpr *RHS, 2809643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2819643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Shr, LHS, RHS, Ctx); 2829643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2839643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateSub(const MCExpr *LHS, const MCExpr *RHS, 2849643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2859643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Sub, LHS, RHS, Ctx); 2869643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2879643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateXor(const MCExpr *LHS, const MCExpr *RHS, 2889643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2899643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Xor, LHS, RHS, Ctx); 2909643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2919643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 2929643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 2939643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 2949643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 295fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 2969643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getOpcode - Get the kind of this binary expression. 297fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode getOpcode() const { return Op; } 298fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 2991aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar /// getLHS - Get the left-hand side expression of the binary operator. 3009643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getLHS() const { return LHS; } 3011aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar 3021aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar /// getRHS - Get the right-hand side expression of the binary operator. 3039643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getRHS() const { return RHS; } 3049643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 3059643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 306fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 3079643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 3089643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Binary; 309fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 31028c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCBinaryExpr *) { return true; } 311fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 312fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 313fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar} // end namespace llvm 314fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 315fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar#endif 316