1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===- TernaryOp.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/TernaryOp.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/SizeTraits.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operand.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// TernaryOp 18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 2037b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* TernaryOp<Operator::TERNARY_IF>::eval( 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines const Module& pModule, 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines const TargetLDBackend& pBackend) { 23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines IntOperand* res = result(); 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (m_pOperand[0]->value()) 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines res->setValue(m_pOperand[1]->value()); 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines else 27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines res->setValue(m_pOperand[2]->value()); 28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return res; 29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* DATA_SEGMENT_ALIGN(maxpagesize, commonpagesize) */ 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 3337b74a387bb3993387029859c2d9d051c41c724eStephen HinesIntOperand* TernaryOp<Operator::DATA_SEGMENT_ALIGN>::eval( 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines const Module& pModule, 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines const TargetLDBackend& pBackend) { 36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* This is equivalent to either 37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines (ALIGN(maxpagesize) + (. & (maxpagesize - 1))) 38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines or 39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines (ALIGN(maxpagesize) + (. & (maxpagesize - commonpagesize))) 40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines */ 41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines IntOperand* res = result(); 42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines uint64_t dot = m_pOperand[0]->value(); 43f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines uint64_t maxPageSize = m_pOperand[1]->value(); 44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines uint64_t commonPageSize = m_pOperand[2]->value(); 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines uint64_t form1 = 0, form2 = 0; 46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines alignAddress(dot, maxPageSize); 48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines form1 = dot + (dot & (maxPageSize - 1)); 50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines form2 = dot + (dot & (maxPageSize - commonPageSize)); 51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (form1 <= form2) 53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines res->setValue(form1); 54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines else 55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines res->setValue(form2); 56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return res; 57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 60