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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operator.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/BinaryOp.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/NullaryOp.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operand.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/UnaryOp.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/TernaryOp.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/raw_ostream.h"
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines
20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// Operator
22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesconst char* Operator::OpNames[] = {
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "+",                      "-",                  "!",
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "~",                      "*",                  "/",
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "%",                      "+",                  "-",
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "<<",                     ">>",                 "<",
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "<=",                     ">",                  ">=",
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "==",                     "!=",                 "&",
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "^",                      "|",                  "&&",
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "||",                     "?:",                 "=",
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "+=",                     "-=",                 "*=",
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "/=",                     "&=",                 "|=",
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "<<=",                    ">>=",                "ABSOLUTE",
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "ADDR",                   "ALIGN",              "ALIGNOF",
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "BLOCK",                  "DATA_SEGMENT_ALIGN", "DATA_SEGMENT_END",
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "DATA_SEGMENT_RELRO_END", "DEFINED",            "LENGTH",
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "LOADADDR",               "MAX",                "MIN",
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "NEXT",                   "ORIGIN",             "SEGMENT_START",
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "SIZEOF",                 "SIZEOF_HEADERS",     "MAXPAGESIZE",
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    "COMMONPAGESIZE"};
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
4337b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator::Operator(Arity pArity, Type pType)
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : ExprToken(ExprToken::OPERATOR), m_Arity(pArity), m_Type(pType) {
45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_pIntOperand = IntOperand::create(0);
46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
4837b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator::~Operator() {
49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid Operator::dump() const {
52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  mcld::outs() << OpNames[type()];
53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Nullary operator */
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
5737b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::SIZEOF_HEADERS>() {
58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static NullaryOp<Operator::SIZEOF_HEADERS> op;
59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
6337b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::MAXPAGESIZE>() {
64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static NullaryOp<Operator::MAXPAGESIZE> op;
65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
6837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
6937b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::COMMONPAGESIZE>() {
70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static NullaryOp<Operator::COMMONPAGESIZE> op;
71f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
74f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Unary operator */
7537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
7637b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::UNARY_PLUS>() {
77f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::UNARY_PLUS> op;
78f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
80f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
8137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
8237b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::UNARY_MINUS>() {
83f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::UNARY_MINUS> op;
84f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
85f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
86f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
8837b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::LOGICAL_NOT>() {
89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::LOGICAL_NOT> op;
90f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
91f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
92f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
9437b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::BITWISE_NOT>() {
95f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::BITWISE_NOT> op;
96f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
97f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
98f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
10037b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::ABSOLUTE>() {
101f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::ABSOLUTE> op;
102f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
103f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
104f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
10537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
10637b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::ADDR>() {
107f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::ADDR> op;
108f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
109f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
110f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
11137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
11237b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::ALIGNOF>() {
113f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::ALIGNOF> op;
114f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
115f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
116f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
11737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
11837b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::DATA_SEGMENT_END>() {
119f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::DATA_SEGMENT_END> op;
120f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
121f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
122f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
12337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
12437b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::DEFINED>() {
125f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::DEFINED> op;
126f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
127f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
128f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
12937b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
13037b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::LENGTH>() {
131f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::LENGTH> op;
132f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
133f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
134f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
13537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
13637b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::LOADADDR>() {
137f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::LOADADDR> op;
138f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
139f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
140f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
14137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
14237b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::NEXT>() {
143f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::NEXT> op;
144f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
145f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
146f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
14737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
14837b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::ORIGIN>() {
149f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::ORIGIN> op;
150f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
151f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
152f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
15337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
15437b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::SIZEOF>() {
155f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static UnaryOp<Operator::SIZEOF> op;
156f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
157f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
158f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
159f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Binary operator */
16037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
16137b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::MUL>() {
162f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::MUL> op;
163f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
164f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
165f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
16637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
16737b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::DIV>() {
168f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::DIV> op;
169f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
170f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
171f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
17237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
17337b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::MOD>() {
174f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::MOD> op;
175f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
176f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
177f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
17837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
17937b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::ADD>() {
180f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::ADD> op;
181f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
182f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
183f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
18437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
18537b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::SUB>() {
186f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::SUB> op;
187f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
188f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
189f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
19037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
19137b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::LSHIFT>() {
192f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::LSHIFT> op;
193f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
194f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
195f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
19637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
19737b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::RSHIFT>() {
198f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::RSHIFT> op;
199f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
200f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
201f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
20237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
20337b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::LT>() {
204f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::LT> op;
205f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
206f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
207f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
20837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
20937b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::LE>() {
210f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::LE> op;
211f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
212f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
213f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
21437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
21537b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::GT>() {
216f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::GT> op;
217f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
218f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
219f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
22037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
22137b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::GE>() {
222f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::GE> op;
223f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
224f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
225f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
22637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
22737b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::EQ>() {
228f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::EQ> op;
229f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
230f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
231f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
23237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
23337b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::NE>() {
234f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::NE> op;
235f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
236f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
237f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
23837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
23937b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::BITWISE_AND>() {
240f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::BITWISE_AND> op;
241f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
242f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
243f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
24437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
24537b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::BITWISE_XOR>() {
246f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::BITWISE_XOR> op;
247f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
248f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
249f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
25037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
25137b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::BITWISE_OR>() {
252f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::BITWISE_OR> op;
253f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
254f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
255f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
25637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
25737b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::LOGICAL_AND>() {
258f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::LOGICAL_AND> op;
259f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
260f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
261f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
26237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
26337b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::LOGICAL_OR>() {
264f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::LOGICAL_OR> op;
265f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
266f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
267f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
26837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
26937b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::ALIGN>() {
270f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::ALIGN> op;
271f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
272f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
273f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
27437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
27537b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::DATA_SEGMENT_RELRO_END>() {
276f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::DATA_SEGMENT_RELRO_END> op;
277f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
278f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
279f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
28037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
28137b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::MAX>() {
282f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::MAX> op;
283f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
284f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
285f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
28637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
28737b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::MIN>() {
288f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::MIN> op;
289f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
290f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
291f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
29237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
29337b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::SEGMENT_START>() {
294f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static BinaryOp<Operator::SEGMENT_START> op;
295f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
296f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
297f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
298f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Ternary operator */
29937b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
30037b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::TERNARY_IF>() {
301f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static TernaryOp<Operator::TERNARY_IF> op;
302f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
303f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
304f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
30537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <>
30637b74a387bb3993387029859c2d9d051c41c724eStephen HinesOperator& Operator::create<Operator::DATA_SEGMENT_ALIGN>() {
307f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  static TernaryOp<Operator::DATA_SEGMENT_ALIGN> op;
308f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return op;
309f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
31037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
31137b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
312