// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "vm/globals.h"
#if defined(TARGET_ARCH_ARM)

#include "vm/assembler_macros.h"

#include "vm/assembler.h"

namespace dart {

#define __ assembler->


void AssemblerMacros::TryAllocate(Assembler* assembler,
                                  const Class& cls,
                                  Label* failure,
                                  bool near_jump,
                                  Register instance_reg) {
  UNIMPLEMENTED();
}


void AssemblerMacros::EnterDartFrame(Assembler* assembler,
                                     intptr_t frame_size) {
  const intptr_t offset = assembler->CodeSize();
  // Save PC in frame for fast identification of corresponding code.
  // Note that callee-saved registers can be added to the register list.
  __ EnterFrame((1 << PP) | (1 << FP) | (1 << LR) | (1 << PC), 0);

  if (offset != 0) {
    // Adjust saved PC for any intrinsic code that could have been generated
    // before a frame is created. Use PP as temp register.
    __ ldr(PP, Address(FP, 2 * kWordSize));
    __ AddImmediate(PP, PP, -offset);
    __ str(PP, Address(FP, 2 * kWordSize));
  }

  // Setup pool pointer for this dart function.
  const intptr_t object_pool_pc_dist =
     Instructions::HeaderSize() - Instructions::object_pool_offset() +
     assembler->CodeSize() + Instr::kPCReadOffset;
  __ ldr(PP, Address(PC, -object_pool_pc_dist));

  // Reserve space for locals.
  __ AddImmediate(SP, -frame_size);
}


void AssemblerMacros::LeaveDartFrame(Assembler* assembler) {
  __ LeaveFrame((1 << PP) | (1 << FP) | (1 << LR));
  // Adjust SP for PC pushed in EnterDartFrame.
  __ AddImmediate(SP, kWordSize);
}


void AssemblerMacros::EnterStubFrame(Assembler* assembler) {
  // Push 0 as saved PC for stub frames.
  __ mov(IP, ShifterOperand(LR));
  __ mov(LR, ShifterOperand(0));
  __ EnterFrame((1 << FP) | (1 << IP) | (1 << LR), 0);
}


void AssemblerMacros::LeaveStubFrame(Assembler* assembler) {
  __ LeaveFrame((1 << FP) | (1 << LR));
  // Adjust SP for null PC pushed in EnterStubFrame.
  __ AddImmediate(SP, kWordSize);
}

}  // namespace dart

#endif  // defined TARGET_ARCH_ARM

