1751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang/*
2751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang * Copyright (C) 2015 The Android Open Source Project
3751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang *
4751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang * Licensed under the Apache License, Version 2.0 (the "License");
5751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang * you may not use this file except in compliance with the License.
6751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang * You may obtain a copy of the License at
7751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang *
8751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang *      http://www.apache.org/licenses/LICENSE-2.0
9751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang *
10751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang * Unless required by applicable law or agreed to in writing, software
11751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang * distributed under the License is distributed on an "AS IS" BASIS,
12751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang * See the License for the specific language governing permissions and
14751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang * limitations under the License.
15751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang */
16751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang
17751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang#include "simulator/code_simulator_arm64.h"
18751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang
19751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wangnamespace art {
20751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wangnamespace arm64 {
21751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang
22751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang// VIXL has not been tested on 32bit architectures, so vixl::Simulator is not always
23751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang// available. To avoid linker error on these architectures, we check if we can simulate
24751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang// in the beginning of following methods, with compile time constant `kCanSimulate`.
25751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang// TODO: when vixl::Simulator is always available, remove the these checks.
26751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang
27751beff19b36f777d9e3a966d754fd9cfad5d534Phil WangCodeSimulatorArm64* CodeSimulatorArm64::CreateCodeSimulatorArm64() {
28751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  if (kCanSimulate) {
29751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang    return new CodeSimulatorArm64();
30751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  } else {
31751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang    return nullptr;
32751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  }
33751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang}
34751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang
35751beff19b36f777d9e3a966d754fd9cfad5d534Phil WangCodeSimulatorArm64::CodeSimulatorArm64()
36751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang    : CodeSimulator(), decoder_(nullptr), simulator_(nullptr) {
37751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  DCHECK(kCanSimulate);
38751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  decoder_ = new vixl::Decoder();
39751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  simulator_ = new vixl::Simulator(decoder_);
40751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang}
41751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang
42751beff19b36f777d9e3a966d754fd9cfad5d534Phil WangCodeSimulatorArm64::~CodeSimulatorArm64() {
43751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  DCHECK(kCanSimulate);
44751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  delete simulator_;
45751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  delete decoder_;
46751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang}
47751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang
48751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wangvoid CodeSimulatorArm64::RunFrom(intptr_t code_buffer) {
49751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  DCHECK(kCanSimulate);
50751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  simulator_->RunFrom(reinterpret_cast<const vixl::Instruction*>(code_buffer));
51751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang}
52751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang
53751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wangbool CodeSimulatorArm64::GetCReturnBool() const {
54751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  DCHECK(kCanSimulate);
55751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  return simulator_->wreg(0);
56751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang}
57751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang
58751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wangint32_t CodeSimulatorArm64::GetCReturnInt32() const {
59751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  DCHECK(kCanSimulate);
60751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  return simulator_->wreg(0);
61751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang}
62751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang
63751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wangint64_t CodeSimulatorArm64::GetCReturnInt64() const {
64751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  DCHECK(kCanSimulate);
65751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang  return simulator_->xreg(0);
66751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang}
67751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang
68751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang}  // namespace arm64
69751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang}  // namespace art
70