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//===----------------------------------------------------------------------===// 9f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/TernaryOp.h> 10f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/Operand.h> 11f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/ADT/SizeTraits.h> 12f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 13f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesusing namespace mcld; 14f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// TernaryOp 16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* 19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesTernaryOp<Operator::TERNARY_IF>::eval(const Module& pModule, 20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const TargetLDBackend& pBackend) 21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines IntOperand* res = result(); 23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (m_pOperand[0]->value()) 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines res->setValue(m_pOperand[1]->value()); 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines else 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines res->setValue(m_pOperand[2]->value()); 27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return res; 28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* DATA_SEGMENT_ALIGN(maxpagesize, commonpagesize) */ 31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestemplate<> 32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIntOperand* 33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesTernaryOp<Operator::DATA_SEGMENT_ALIGN>::eval(const Module& pModule, 34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const TargetLDBackend& pBackend) 35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 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 59