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