MCExpr.h revision 8cb9a3b13f3226b7e741768b69d26ecd6b5231f1
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" 148b67f774e9c38b7718b2b300b628388f966df4e0Chandler Carruth#include "llvm/System/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 548cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattner void print(raw_ostream &OS) 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. 65e00b011e6a2597fcc3da88da91a8ffda6eebfcdaDaniel Dunbar bool EvaluateAsAbsolute(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. 72e00b011e6a2597fcc3da88da91a8ffda6eebfcdaDaniel Dunbar bool EvaluateAsRelocatable(MCValue &Res) const; 7315d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar 749643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 759643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 7628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCExpr *) { return true; } 77fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 788cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattner 798cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattnerinline raw_ostream &operator<<(raw_ostream &OS, const MCExpr &E) { 808cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattner E.print(OS); 818cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattner return OS; 828cb9a3b13f3226b7e741768b69d26ecd6b5231f1Chris Lattner} 83fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 8428c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar//// MCConstantExpr - Represent a constant integer expression. 8528c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCConstantExpr : public MCExpr { 86fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar int64_t Value; 87fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 889643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCConstantExpr(int64_t _Value) 8928c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Constant), Value(_Value) {} 909643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 919643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 929643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 939643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 949643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 959643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCConstantExpr *Create(int64_t Value, MCContext &Ctx); 969643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 979643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 989643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 999643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1009643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 101fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar int64_t getValue() const { return Value; } 102fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1039643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1049643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1059643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 1069643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Constant; 107fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 10828c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCConstantExpr *) { return true; } 109fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 110fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 11128c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCSymbolRefExpr - Represent a reference to a symbol from inside an 1121aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// expression. 1131aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// 1141aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// A symbol reference in an expression may be a use of a label, a use of an 1151aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// assembler variable (defined constant), or constitute an implicit definition 1161aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar/// of the symbol as external. 11728c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCSymbolRefExpr : public MCExpr { 1189643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCSymbol *Symbol; 119fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1209643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCSymbolRefExpr(const MCSymbol *_Symbol) 12128c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::SymbolRef), Symbol(_Symbol) {} 122fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1239643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 1249643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 1259643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1269643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1279643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCSymbolRefExpr *Create(const MCSymbol *Symbol, MCContext &Ctx); 1282928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar static const MCSymbolRefExpr *Create(StringRef Name, MCContext &Ctx); 1297eb85194f2b07bc7ba3f274fc00dc389b77b63bfDaniel Dunbar 1309643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1319643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 1329643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1339643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1349643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCSymbol &getSymbol() const { return *Symbol; } 1359643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1369643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1379643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1389643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 1399643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::SymbolRef; 140fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 14128c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCSymbolRefExpr *) { return true; } 142fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 143fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 14428c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCUnaryExpr - Unary assembler expressions. 14528c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCUnaryExpr : public MCExpr { 146fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 147fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar enum Opcode { 1481aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LNot, ///< Logical negation. 1491aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Minus, ///< Unary minus. 1501aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Not, ///< Bitwise negation. 1511aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Plus ///< Unary plus. 152fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar }; 153fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 154fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprivate: 155fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode Op; 1569643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *Expr; 157fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1589643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCUnaryExpr(Opcode _Op, const MCExpr *_Expr) 15928c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Unary), Op(_Op), Expr(_Expr) {} 1609643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1619643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 1629643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 1639643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 1649643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1659643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *Create(Opcode Op, const MCExpr *Expr, 1669643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx); 1679643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateLNot(const MCExpr *Expr, MCContext &Ctx) { 1689643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LNot, Expr, Ctx); 1699643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1709643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateMinus(const MCExpr *Expr, MCContext &Ctx) { 1719643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Minus, Expr, Ctx); 1729643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1739643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreateNot(const MCExpr *Expr, MCContext &Ctx) { 1749643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Not, Expr, Ctx); 175fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 1769643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCUnaryExpr *CreatePlus(const MCExpr *Expr, MCContext &Ctx) { 1779643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Plus, Expr, Ctx); 1789643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 1799643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1809643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1819643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 1829643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 183fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1849643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getOpcode - Get the kind of this unary expression. 185fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode getOpcode() const { return Op; } 186fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1879643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getSubExpr - Get the child of this unary expression. 1889643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getSubExpr() const { return Expr; } 189fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 1909643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 1919643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 1929643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 1939643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Unary; 194fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 19528c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCUnaryExpr *) { return true; } 196fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 197fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 19828c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar/// MCBinaryExpr - Binary assembler expressions. 19928c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbarclass MCBinaryExpr : public MCExpr { 200fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarpublic: 201fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar enum Opcode { 2021aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Add, ///< Addition. 2031aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar And, ///< Bitwise and. 2041aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Div, ///< Division. 2051aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar EQ, ///< Equality comparison. 2061aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar GT, ///< Greater than comparison. 2071aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar GTE, ///< Greater than or equal comparison. 2081aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LAnd, ///< Logical and. 2091aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LOr, ///< Logical or. 2101aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LT, ///< Less than comparison. 2111aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar LTE, ///< Less than or equal comparison. 2121aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Mod, ///< Modulus. 2131aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Mul, ///< Multiplication. 2141aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar NE, ///< Inequality comparison. 2151aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Or, ///< Bitwise or. 2161aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Shl, ///< Bitwise shift left. 2171aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Shr, ///< Bitwise shift right. 2181aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Sub, ///< Subtraction. 2191aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar Xor ///< Bitwise exclusive or. 220fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar }; 221fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 222fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbarprivate: 223fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode Op; 2249643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *LHS, *RHS; 225fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 2269643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCBinaryExpr(Opcode _Op, const MCExpr *_LHS, const MCExpr *_RHS) 22728c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar : MCExpr(MCExpr::Binary), Op(_Op), LHS(_LHS), RHS(_RHS) {} 2289643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 2299643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbarpublic: 2309643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Construction 2319643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 2329643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 2339643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *Create(Opcode Op, const MCExpr *LHS, 2349643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *RHS, MCContext &Ctx); 2359643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateAdd(const MCExpr *LHS, const MCExpr *RHS, 2369643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2379643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Add, LHS, RHS, Ctx); 2389643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2399643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateAnd(const MCExpr *LHS, const MCExpr *RHS, 2409643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2419643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(And, LHS, RHS, Ctx); 2429643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2439643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateDiv(const MCExpr *LHS, const MCExpr *RHS, 2449643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2459643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Div, LHS, RHS, Ctx); 2469643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2479643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateEQ(const MCExpr *LHS, const MCExpr *RHS, 2489643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2499643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(EQ, LHS, RHS, Ctx); 2509643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2519643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateGT(const MCExpr *LHS, const MCExpr *RHS, 2529643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2539643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(GT, LHS, RHS, Ctx); 2549643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2559643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateGTE(const MCExpr *LHS, const MCExpr *RHS, 2569643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2579643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(GTE, LHS, RHS, Ctx); 2589643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2599643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLAnd(const MCExpr *LHS, const MCExpr *RHS, 2609643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2619643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LAnd, LHS, RHS, Ctx); 262fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 2639643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLOr(const MCExpr *LHS, const MCExpr *RHS, 2649643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2659643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LOr, LHS, RHS, Ctx); 2669643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2679643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLT(const MCExpr *LHS, const MCExpr *RHS, 2689643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2699643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LT, LHS, RHS, Ctx); 2709643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2719643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateLTE(const MCExpr *LHS, const MCExpr *RHS, 2729643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2739643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(LTE, LHS, RHS, Ctx); 2749643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2759643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateMod(const MCExpr *LHS, const MCExpr *RHS, 2769643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2779643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Mod, LHS, RHS, Ctx); 2789643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2799643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateMul(const MCExpr *LHS, const MCExpr *RHS, 2809643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2819643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Mul, LHS, RHS, Ctx); 2829643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2839643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateNE(const MCExpr *LHS, const MCExpr *RHS, 2849643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2859643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(NE, LHS, RHS, Ctx); 2869643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2879643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateOr(const MCExpr *LHS, const MCExpr *RHS, 2889643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2899643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Or, LHS, RHS, Ctx); 2909643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2919643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateShl(const MCExpr *LHS, const MCExpr *RHS, 2929643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2939643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Shl, LHS, RHS, Ctx); 2949643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2959643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateShr(const MCExpr *LHS, const MCExpr *RHS, 2969643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 2979643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Shr, LHS, RHS, Ctx); 2989643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 2999643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateSub(const MCExpr *LHS, const MCExpr *RHS, 3009643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 3019643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Sub, LHS, RHS, Ctx); 3029643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 3039643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static const MCBinaryExpr *CreateXor(const MCExpr *LHS, const MCExpr *RHS, 3049643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar MCContext &Ctx) { 3059643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return Create(Xor, LHS, RHS, Ctx); 3069643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar } 3079643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 3089643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 3099643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @name Accessors 3109643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @{ 311fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 3129643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// getOpcode - Get the kind of this binary expression. 313fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar Opcode getOpcode() const { return Op; } 314fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 3151aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar /// getLHS - Get the left-hand side expression of the binary operator. 3169643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getLHS() const { return LHS; } 3171aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar 3181aa14aac4198bca0f44e4adad42bf6238cbf9757Daniel Dunbar /// getRHS - Get the right-hand side expression of the binary operator. 3199643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar const MCExpr *getRHS() const { return RHS; } 3209643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar 3219643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar /// @} 322fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 3239643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar static bool classof(const MCExpr *E) { 3249643ac55142d40da404caa8e5fedfef2cd7b4afcDaniel Dunbar return E->getKind() == MCExpr::Binary; 325fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar } 32628c251b54b0b311749f07babe0f6909e71e877bcDaniel Dunbar static bool classof(const MCBinaryExpr *) { return true; } 327fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar}; 328fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 329fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar} // end namespace llvm 330fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar 331fc6877aec9826fa830204d49eba7fac7412b841eDaniel Dunbar#endif 332