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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_SCRIPT_BINARYOP_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_SCRIPT_BINARYOP_H_ 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operator.h" 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <cstddef> 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 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 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <Operator::Type TYPE> 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass BinaryOp : public Operator { 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines friend class Operator; 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines BinaryOp() : Operator(Operator::BINARY, TYPE), m_Size(0) { 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_pOperand[0] = m_pOperand[1] = NULL; 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines ~BinaryOp() {} 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines IntOperand* eval(const Module& pModule, const TargetLDBackend& pBackend); 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines void appendOperand(Operand* pOperand) { 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_pOperand[m_Size++] = pOperand; 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (m_Size == 2) 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines m_Size = 0; 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t m_Size; 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Operand* m_pOperand[2]; 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 5387f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MUL>::eval(const Module&, 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 5687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::DIV>::eval(const Module&, 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 5987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MOD>::eval(const Module&, 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 6287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::ADD>::eval(const Module&, 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 6587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::SUB>::eval(const Module&, 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 6737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 6887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LSHIFT>::eval(const Module&, 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 7187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::RSHIFT>::eval(const Module&, 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 7337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 7437b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* BinaryOp<Operator::LT>::eval(const Module&, const TargetLDBackend&); 7537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 7637b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* BinaryOp<Operator::LE>::eval(const Module&, const TargetLDBackend&); 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 7837b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* BinaryOp<Operator::GT>::eval(const Module&, const TargetLDBackend&); 7937b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 8037b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* BinaryOp<Operator::GE>::eval(const Module&, const TargetLDBackend&); 8137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 8237b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* BinaryOp<Operator::EQ>::eval(const Module&, const TargetLDBackend&); 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 8437b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* BinaryOp<Operator::NE>::eval(const Module&, const TargetLDBackend&); 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 8687f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::BITWISE_AND>::eval(const Module&, 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 8837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 8987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::BITWISE_XOR>::eval(const Module&, 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 9287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::BITWISE_OR>::eval(const Module&, 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 9587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LOGICAL_AND>::eval(const Module&, 9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 9887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::LOGICAL_OR>::eval(const Module&, 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 10287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::ALIGN>::eval(const Module&, 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 10437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 10537b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* BinaryOp<Operator::DATA_SEGMENT_RELRO_END>::eval( 10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines const Module&, 10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines const TargetLDBackend&); 10837b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 10987f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MAX>::eval(const Module&, 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 11137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 11287f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::MIN>::eval(const Module&, 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 11437b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 11587f34658dec9097d987d254a990ea7f311bfc95fStephen HinesIntOperand* BinaryOp<Operator::SEGMENT_START>::eval(const Module&, 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend&); 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_SCRIPT_BINARYOP_H_ 121