MCExpr.h revision 4f3e7aa154577c86791908e73a9fec075fdea0ba
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 { 17684c593d05db0bd277268fc9d8c05bce138c745aChris Lattnerclass MCAsmInfo; 18fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarclass MCContext; 19fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarclass MCSymbol; 2015d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbarclass MCValue; 2187392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbarclass raw_ostream; 224f3e7aa154577c86791908e73a9fec075fdea0baChris Lattnerclass StringRef; 23fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 2428c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCExpr - Base class for the full range of assembler expressions which are 259643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar/// needed for parsing. 2628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCExpr { 27fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 2828c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar enum ExprKind { 291aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Binary, ///< Binary expressions. 301aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Constant, ///< Constant expressions. 311aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar SymbolRef, ///< References to labels and assigned expressions. 321aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Unary ///< Unary expressions. 33fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar }; 349643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 35fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprivate: 3628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar ExprKind Kind; 379643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 389643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCExpr(const MCExpr&); // DO NOT IMPLEMENT 399643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar void operator=(const MCExpr&); // DO NOT IMPLEMENT 409643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 41fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprotected: 4228c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar MCExpr(ExprKind _Kind) : Kind(_Kind) {} 439643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 44fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 459643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 469643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 47fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 4828c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar ExprKind getKind() const { return Kind; } 49fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 509643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 5187392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar /// @name Utility Methods 5287392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar /// @{ 5387392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar 54684c593d05db0bd277268fc9d8c05bce138c745aChris Lattner void print(raw_ostream &OS, const MCAsmInfo *MAI) const; 5587392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar void dump() const; 5687392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar 5787392fde1f261fea161b48886fafbedddb18dcceDaniel Dunbar /// @} 589643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Expression Evaluation 599643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 609643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 61fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar /// EvaluateAsAbsolute - Try to evaluate the expression to an absolute value. 62fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar /// 6315d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// @param Res - The absolute value, if evaluation succeeds. 64fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar /// @result - True on success. 65fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar bool EvaluateAsAbsolute(MCContext &Ctx, int64_t &Res) const; 66fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 6715d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// EvaluateAsRelocatable - Try to evaluate the expression to a relocatable 681aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar /// value, i.e. an expression of the fixed form (a - b + constant). 6915d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// 7015d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// @param Res - The relocatable value, if evaluation succeeds. 7115d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar /// @result - True on success. 7215d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar bool EvaluateAsRelocatable(MCContext &Ctx, MCValue &Res) const; 7315d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar 749643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 759643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 7628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCExpr *) { return true; } 77fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 78fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 7928c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar//// MCConstantExpr - Represent a constant integer expression. 8028c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCConstantExpr : public MCExpr { 81fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar int64_t Value; 82fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 839643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCConstantExpr(int64_t _Value) 8428c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Constant), Value(_Value) {} 859643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 869643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 879643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 889643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 899643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 909643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCConstantExpr *Create(int64_t Value, MCContext &Ctx); 919643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 929643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 939643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 949643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 959643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 96fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar int64_t getValue() const { return Value; } 97fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 989643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 999643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1009643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 1019643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Constant; 102fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 10328c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCConstantExpr *) { return true; } 104fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 105fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 10628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCSymbolRefExpr - Represent a reference to a symbol from inside an 1071aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// expression. 1081aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// 1091aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// A symbol reference in an expression may be a use of a label, a use of an 1101aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// assembler variable (defined constant), or constitute an implicit definition 1111aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// of the symbol as external. 11228c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCSymbolRefExpr : public MCExpr { 1139643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCSymbol *Symbol; 114fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1159643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCSymbolRefExpr(const MCSymbol *_Symbol) 11628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::SymbolRef), Symbol(_Symbol) {} 117fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1189643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 1199643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 1209643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1219643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1229643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCSymbolRefExpr *Create(const MCSymbol *Symbol, MCContext &Ctx); 1234f3e7aa154577c86791908e73a9fec075fdea0baChris Lattner static const MCSymbolRefExpr *Create(const StringRef &Name, MCContext &Ctx); 1244f3e7aa154577c86791908e73a9fec075fdea0baChris Lattner 1254f3e7aa154577c86791908e73a9fec075fdea0baChris Lattner 1264f3e7aa154577c86791908e73a9fec075fdea0baChris Lattner 1279643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1289643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 1299643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1309643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1319643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCSymbol &getSymbol() const { return *Symbol; } 1329643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1339643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1349643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1359643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 1369643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::SymbolRef; 137fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 13828c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCSymbolRefExpr *) { return true; } 139fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 140fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 14128c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCUnaryExpr - Unary assembler expressions. 14228c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCUnaryExpr : public MCExpr { 143fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 144fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar enum Opcode { 1451aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LNot, ///< Logical negation. 1461aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Minus, ///< Unary minus. 1471aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Not, ///< Bitwise negation. 1481aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Plus ///< Unary plus. 149fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar }; 150fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 151fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprivate: 152fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode Op; 1539643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *Expr; 154fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1559643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCUnaryExpr(Opcode _Op, const MCExpr *_Expr) 15628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Unary), Op(_Op), Expr(_Expr) {} 1579643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1589643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 1599643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 1609643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1619643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1629643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *Create(Opcode Op, const MCExpr *Expr, 1639643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx); 1649643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateLNot(const MCExpr *Expr, MCContext &Ctx) { 1659643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LNot, Expr, Ctx); 1669643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1679643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateMinus(const MCExpr *Expr, MCContext &Ctx) { 1689643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Minus, Expr, Ctx); 1699643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1709643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateNot(const MCExpr *Expr, MCContext &Ctx) { 1719643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Not, Expr, Ctx); 172fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 1739643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreatePlus(const MCExpr *Expr, MCContext &Ctx) { 1749643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Plus, Expr, Ctx); 1759643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1769643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1779643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1789643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 1799643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 180fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1819643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getOpcode - Get the kind of this unary expression. 182fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode getOpcode() const { return Op; } 183fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1849643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getSubExpr - Get the child of this unary expression. 1859643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getSubExpr() const { return Expr; } 186fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1879643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1889643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1899643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 1909643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Unary; 191fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 19228c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCUnaryExpr *) { return true; } 193fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 194fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 19528c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCBinaryExpr - Binary assembler expressions. 19628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCBinaryExpr : public MCExpr { 197fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 198fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar enum Opcode { 1991aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Add, ///< Addition. 2001aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar And, ///< Bitwise and. 2011aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Div, ///< Division. 2021aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar EQ, ///< Equality comparison. 2031aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar GT, ///< Greater than comparison. 2041aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar GTE, ///< Greater than or equal comparison. 2051aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LAnd, ///< Logical and. 2061aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LOr, ///< Logical or. 2071aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LT, ///< Less than comparison. 2081aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LTE, ///< Less than or equal comparison. 2091aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Mod, ///< Modulus. 2101aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Mul, ///< Multiplication. 2111aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar NE, ///< Inequality comparison. 2121aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Or, ///< Bitwise or. 2131aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Shl, ///< Bitwise shift left. 2141aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Shr, ///< Bitwise shift right. 2151aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Sub, ///< Subtraction. 2161aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Xor ///< Bitwise exclusive or. 217fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar }; 218fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 219fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprivate: 220fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode Op; 2219643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *LHS, *RHS; 222fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 2239643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCBinaryExpr(Opcode _Op, const MCExpr *_LHS, const MCExpr *_RHS) 22428c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Binary), Op(_Op), LHS(_LHS), RHS(_RHS) {} 2259643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 2269643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 2279643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 2289643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 2299643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 2309643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *Create(Opcode Op, const MCExpr *LHS, 2319643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *RHS, MCContext &Ctx); 2329643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateAdd(const MCExpr *LHS, const MCExpr *RHS, 2339643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2349643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Add, LHS, RHS, Ctx); 2359643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2369643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateAnd(const MCExpr *LHS, const MCExpr *RHS, 2379643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2389643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(And, LHS, RHS, Ctx); 2399643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2409643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateDiv(const MCExpr *LHS, const MCExpr *RHS, 2419643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2429643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Div, LHS, RHS, Ctx); 2439643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2449643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateEQ(const MCExpr *LHS, const MCExpr *RHS, 2459643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2469643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(EQ, LHS, RHS, Ctx); 2479643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2489643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateGT(const MCExpr *LHS, const MCExpr *RHS, 2499643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2509643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(GT, LHS, RHS, Ctx); 2519643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2529643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateGTE(const MCExpr *LHS, const MCExpr *RHS, 2539643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2549643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(GTE, LHS, RHS, Ctx); 2559643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2569643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLAnd(const MCExpr *LHS, const MCExpr *RHS, 2579643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2589643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LAnd, LHS, RHS, Ctx); 259fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 2609643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLOr(const MCExpr *LHS, const MCExpr *RHS, 2619643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2629643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LOr, LHS, RHS, Ctx); 2639643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2649643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLT(const MCExpr *LHS, const MCExpr *RHS, 2659643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2669643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LT, LHS, RHS, Ctx); 2679643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2689643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLTE(const MCExpr *LHS, const MCExpr *RHS, 2699643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2709643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LTE, LHS, RHS, Ctx); 2719643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2729643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateMod(const MCExpr *LHS, const MCExpr *RHS, 2739643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2749643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Mod, LHS, RHS, Ctx); 2759643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2769643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateMul(const MCExpr *LHS, const MCExpr *RHS, 2779643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2789643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Mul, LHS, RHS, Ctx); 2799643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2809643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateNE(const MCExpr *LHS, const MCExpr *RHS, 2819643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2829643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(NE, LHS, RHS, Ctx); 2839643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2849643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateOr(const MCExpr *LHS, const MCExpr *RHS, 2859643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2869643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Or, LHS, RHS, Ctx); 2879643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2889643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateShl(const MCExpr *LHS, const MCExpr *RHS, 2899643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2909643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Shl, LHS, RHS, Ctx); 2919643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2929643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateShr(const MCExpr *LHS, const MCExpr *RHS, 2939643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2949643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Shr, LHS, RHS, Ctx); 2959643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2969643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateSub(const MCExpr *LHS, const MCExpr *RHS, 2979643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2989643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Sub, LHS, RHS, Ctx); 2999643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 3009643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateXor(const MCExpr *LHS, const MCExpr *RHS, 3019643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 3029643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Xor, LHS, RHS, Ctx); 3039643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 3049643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 3059643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 3069643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 3079643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 308fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 3099643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getOpcode - Get the kind of this binary expression. 310fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode getOpcode() const { return Op; } 311fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 3121aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar /// getLHS - Get the left-hand side expression of the binary operator. 3139643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getLHS() const { return LHS; } 3141aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar 3151aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar /// getRHS - Get the right-hand side expression of the binary operator. 3169643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getRHS() const { return RHS; } 3179643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 3189643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 319fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 3209643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 3219643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Binary; 322fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 32328c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCBinaryExpr *) { return true; } 324fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 325fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 326fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar} // end namespace llvm 327fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 328fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar#endif 329