1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===- Operator.cpp -------------------------------------------------------===// 2f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 3f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// The MCLinker Project 4f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 5f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// This file is distributed under the University of Illinois Open Source 6f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// License. See LICENSE.TXT for details. 7f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 8f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 9f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/Operator.h> 10f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/NullaryOp.h> 11f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/UnaryOp.h> 12f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/BinaryOp.h> 13f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/TernaryOp.h> 14f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/Operand.h> 15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Support/raw_ostream.h> 16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesusing namespace mcld; 18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// Operator 20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesconst char* Operator::OpNames[] = { 22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "+", 23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "-", 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "!", 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "~", 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "*", 27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "/", 28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "%", 29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "+", 30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "-", 31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "<<", 32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ">>", 33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "<", 34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "<=", 35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ">", 36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ">=", 37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "==", 38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "!=", 39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "&", 40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "^", 41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "|", 42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "&&", 43f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "||", 44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "?:", 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "=", 46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "+=", 47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "-=", 48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "*=", 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "/=", 50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "&=", 51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "|=", 52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "<<=", 53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ">>=", 54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "ABSOLUTE", 55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "ADDR", 56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "ALIGN", 57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "ALIGNOF", 58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "BLOCK", 59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "DATA_SEGMENT_ALIGN", 60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "DATA_SEGMENT_END", 61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "DATA_SEGMENT_RELRO_END", 62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "DEFINED", 63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "LENGTH", 64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "LOADADDR", 65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "MAX", 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "MIN", 67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "NEXT", 68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "ORIGIN", 69f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "SEGMENT_START", 70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "SIZEOF", 71f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "SIZEOF_HEADERS", 72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "MAXPAGESIZE", 73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines "COMMONPAGESIZE" 74f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}; 75f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 76f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator::Operator(Arity pArity, 77f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines Type pType) 78f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines : ExprToken(ExprToken::OPERATOR), 79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_Arity(pArity), 80f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_Type(pType) 81f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 82f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_pIntOperand = IntOperand::create(0); 83f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 84f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 85f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator::~Operator() 86f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 87f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 88f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid Operator::dump() const 90f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 91f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::outs() << OpNames[type()]; 92f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 93f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 94f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Nullary operator */ 95f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 96f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::SIZEOF_HEADERS>() 97f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 98f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static NullaryOp<Operator::SIZEOF_HEADERS> op; 99f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 100f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 101f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 102f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 103f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::MAXPAGESIZE>() 104f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 105f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static NullaryOp<Operator::MAXPAGESIZE> op; 106f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 107f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 108f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 109f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 110f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::COMMONPAGESIZE>() 111f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 112f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static NullaryOp<Operator::COMMONPAGESIZE> op; 113f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 114f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 115f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 116f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Unary operator */ 117f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 118f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::UNARY_PLUS>() 119f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 120f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::UNARY_PLUS> op; 121f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 122f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 123f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 124f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 125f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::UNARY_MINUS>() 126f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 127f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::UNARY_MINUS> op; 128f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 129f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 130f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 131f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 132f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::LOGICAL_NOT>() 133f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 134f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::LOGICAL_NOT> op; 135f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 136f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 137f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 138f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 139f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::BITWISE_NOT>() 140f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 141f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::BITWISE_NOT> op; 142f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 143f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 144f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 145f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 146f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::ABSOLUTE>() 147f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 148f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::ABSOLUTE> op; 149f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 150f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 151f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 152f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 153f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::ADDR>() 154f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 155f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::ADDR> op; 156f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 157f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 158f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 159f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 160f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::ALIGNOF>() 161f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 162f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::ALIGNOF> op; 163f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 164f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 165f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 166f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 167f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::DATA_SEGMENT_END>() 168f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 169f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::DATA_SEGMENT_END> op; 170f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 171f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 172f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 173f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 174f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::DEFINED>() 175f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 176f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::DEFINED> op; 177f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 178f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 179f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 180f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 181f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::LENGTH>() 182f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 183f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::LENGTH> op; 184f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 185f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 186f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 187f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 188f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::LOADADDR>() 189f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 190f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::LOADADDR> op; 191f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 192f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 193f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 194f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 195f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::NEXT>() 196f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 197f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::NEXT> op; 198f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 199f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 200f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 201f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 202f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::ORIGIN>() 203f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 204f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::ORIGIN> op; 205f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 206f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 207f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 208f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 209f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::SIZEOF>() 210f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 211f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static UnaryOp<Operator::SIZEOF> op; 212f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 213f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 214f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 215f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Binary operator */ 216f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 217f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::MUL>() 218f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 219f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::MUL> op; 220f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 221f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 222f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 223f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 224f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::DIV>() 225f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 226f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::DIV> op; 227f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 228f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 229f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 230f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 231f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::MOD>() 232f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 233f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::MOD> op; 234f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 235f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 236f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 237f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 238f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::ADD>() 239f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 240f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::ADD> op; 241f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 242f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 243f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 244f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 245f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::SUB>() 246f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 247f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::SUB> op; 248f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 249f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 250f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 251f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 252f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::LSHIFT>() 253f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 254f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::LSHIFT> op; 255f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 256f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 257f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 258f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 259f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::RSHIFT>() 260f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 261f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::RSHIFT> op; 262f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 263f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 264f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 265f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 266f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::LT>() 267f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 268f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::LT> op; 269f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 270f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 271f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 272f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 273f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::LE>() 274f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 275f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::LE> op; 276f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 277f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 278f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 279f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 280f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::GT>() 281f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 282f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::GT> op; 283f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 284f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 285f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 286f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 287f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::GE>() 288f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 289f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::GE> op; 290f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 291f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 292f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 293f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 294f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::EQ>() 295f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 296f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::EQ> op; 297f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 298f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 299f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 300f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 301f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::NE>() 302f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 303f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::NE> op; 304f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 305f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 306f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 307f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 308f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::BITWISE_AND>() 309f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 310f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::BITWISE_AND> op; 311f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 312f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 313f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 314f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 315f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::BITWISE_XOR>() 316f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 317f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::BITWISE_XOR> op; 318f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 319f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 320f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 321f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 322f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::BITWISE_OR>() 323f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 324f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::BITWISE_OR> op; 325f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 326f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 327f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 328f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 329f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::LOGICAL_AND>() 330f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 331f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::LOGICAL_AND> op; 332f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 333f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 334f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 335f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 336f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::LOGICAL_OR>() 337f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 338f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::LOGICAL_OR> op; 339f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 340f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 341f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 342f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 343f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::ALIGN>() 344f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 345f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::ALIGN> op; 346f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 347f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 348f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 349f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 350f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::DATA_SEGMENT_RELRO_END>() 351f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 352f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::DATA_SEGMENT_RELRO_END> op; 353f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 354f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 355f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 356f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 357f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::MAX>() 358f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 359f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::MAX> op; 360f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 361f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 362f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 363f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 364f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::MIN>() 365f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 366f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::MIN> op; 367f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 368f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 369f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 370f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 371f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::SEGMENT_START>() 372f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 373f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static BinaryOp<Operator::SEGMENT_START> op; 374f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 375f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 376f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 377f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Ternary operator */ 378f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 379f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::TERNARY_IF>() 380f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 381f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static TernaryOp<Operator::TERNARY_IF> op; 382f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 383f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 384f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 385f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 386f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesOperator& Operator::create<Operator::DATA_SEGMENT_ALIGN>() 387f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 388f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines static TernaryOp<Operator::DATA_SEGMENT_ALIGN> op; 389f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return op; 390f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 391