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