187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- BinaryOp.h ---------------------------------------------------------===//
287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//                     The MCLinker Project
487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// This file is distributed under the University of Illinois Open Source
687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// License. See LICENSE.TXT for details.
787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_SCRIPT_BINARYOP_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_SCRIPT_BINARYOP_H
1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/Operator.h>
1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <cstddef>
1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace mcld
1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Operand;
1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass IntOperand;
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module;
2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass TargetLDBackend;
2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class BinaryOP
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines *  \brief This class defines the interfaces to an binary operator token.
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */
2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<Operator::Type TYPE>
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass BinaryOp : public Operator
2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate:
3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  friend class Operator;
3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  BinaryOp()
3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    : Operator(Operator::BINARY, TYPE), m_Size(0)
3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_pOperand[0] = m_pOperand[1] = NULL;
3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic:
4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ~BinaryOp()
4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {}
4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  IntOperand* eval(const Module& pModule, const TargetLDBackend& pBackend);
4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void appendOperand(Operand* pOperand)
4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    m_pOperand[m_Size++] = pOperand;
4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    if (m_Size == 2)
4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      m_Size = 0;
5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate:
5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  size_t m_Size;
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Operand* m_pOperand[2];
5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines};
5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
5887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MUL>::eval(const Module&,
5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                          const TargetLDBackend&);
6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
6187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::DIV>::eval(const Module&,
6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                          const TargetLDBackend&);
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
6487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MOD>::eval(const Module&,
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                          const TargetLDBackend&);
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
6787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::ADD>::eval(const Module&,
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                          const TargetLDBackend&);
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
7087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::SUB>::eval(const Module&,
7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                          const TargetLDBackend&);
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
7387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LSHIFT>::eval(const Module&,
7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                             const TargetLDBackend&);
7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
7687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::RSHIFT>::eval(const Module&,
7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                             const TargetLDBackend&);
7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
7987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LT>::eval(const Module&,
8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                         const TargetLDBackend&);
8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
8287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LE>::eval(const Module&,
8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                         const TargetLDBackend&);
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
8587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::GT>::eval(const Module&,
8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                         const TargetLDBackend&);
8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
8887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::GE>::eval(const Module&,
8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                         const TargetLDBackend&);
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
9187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::EQ>::eval(const Module&,
9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                         const TargetLDBackend&);
9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
9487f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::NE>::eval(const Module&,
9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                         const TargetLDBackend&);
9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
9787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::BITWISE_AND>::eval(const Module&,
9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                  const TargetLDBackend&);
9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
10087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::BITWISE_XOR>::eval(const Module&,
10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                  const TargetLDBackend&);
10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
10387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::BITWISE_OR>::eval(const Module&,
10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                 const TargetLDBackend&);
10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
10687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LOGICAL_AND>::eval(const Module&,
10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                  const TargetLDBackend&);
10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
10987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LOGICAL_OR>::eval(const Module&,
11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                 const TargetLDBackend&);
11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
11387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::ALIGN>::eval(const Module&,
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                            const TargetLDBackend&);
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
11687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand*
11787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesBinaryOp<Operator::DATA_SEGMENT_RELRO_END>::eval(const Module&,
11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                 const TargetLDBackend&);
11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
12087f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MAX>::eval(const Module&,
12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                          const TargetLDBackend&);
12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
12387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MIN>::eval(const Module&,
12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                          const TargetLDBackend&);
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<>
12687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::SEGMENT_START>::eval(const Module&,
12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                    const TargetLDBackend&);
12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} // namespace of mcld
13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#endif
13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
133