/** ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** * Copyright 2013 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ #include #include #include #include #include #include #include using namespace alloy; using namespace alloy::backend; using namespace alloy::backend::x64; using namespace alloy::backend::x64::lowering; using namespace alloy::runtime; X64Backend::X64Backend(Runtime* runtime) : code_cache_(0), lowering_table_(0), Backend(runtime) { } X64Backend::~X64Backend() { alloy::tracing::WriteEvent(EventType::Deinit({ })); delete lowering_table_; delete code_cache_; } int X64Backend::Initialize() { int result = Backend::Initialize(); if (result) { return result; } machine_info_.register_sets[0] = { 0, "gpr", MachineInfo::RegisterSet::INT_TYPES, X64Emitter::GPR_COUNT, }; machine_info_.register_sets[1] = { 1, "xmm", MachineInfo::RegisterSet::FLOAT_TYPES | MachineInfo::RegisterSet::VEC_TYPES, X64Emitter::XMM_COUNT, }; code_cache_ = new X64CodeCache(); result = code_cache_->Initialize(); if (result) { return result; } auto allocator = new XbyakAllocator(); auto thunk_emitter = new X64ThunkEmitter(this, allocator); host_to_guest_thunk_ = thunk_emitter->EmitHostToGuestThunk(); guest_to_host_thunk_ = thunk_emitter->EmitGuestToHostThunk(); delete thunk_emitter; delete allocator; lowering_table_ = new LoweringTable(this); RegisterSequences(lowering_table_); alloy::tracing::WriteEvent(EventType::Init({ })); return result; } Assembler* X64Backend::CreateAssembler() { return new X64Assembler(this); }