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