2018-01-06 21:15:25 +00:00
|
|
|
/* This file is part of the dynarmic project.
|
|
|
|
* Copyright (c) 2016 MerryMage
|
|
|
|
* This software may be used and distributed according to the terms of the GNU
|
|
|
|
* General Public License version 2 or any later version.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "common/assert.h"
|
|
|
|
#include "frontend/A64/ir_emitter.h"
|
|
|
|
#include "frontend/ir/opcodes.h"
|
|
|
|
|
|
|
|
namespace Dynarmic {
|
|
|
|
namespace A64 {
|
|
|
|
|
|
|
|
using Opcode = IR::Opcode;
|
|
|
|
|
|
|
|
u64 IREmitter::PC() {
|
|
|
|
return current_location.PC();
|
|
|
|
}
|
|
|
|
|
|
|
|
u64 IREmitter::AlignPC(size_t alignment) {
|
|
|
|
u64 pc = PC();
|
|
|
|
return static_cast<u64>(pc - pc % alignment);
|
|
|
|
}
|
|
|
|
|
2018-01-07 11:31:20 +00:00
|
|
|
IR::U1 IREmitter::GetCFlag() {
|
|
|
|
return Inst<IR::U1>(Opcode::A64GetCFlag);
|
|
|
|
}
|
|
|
|
|
|
|
|
void IREmitter::SetNZCV(const IR::NZCV& nzcv) {
|
|
|
|
Inst(Opcode::A64SetNZCV, nzcv);
|
|
|
|
}
|
|
|
|
|
2018-01-06 21:15:25 +00:00
|
|
|
IR::U32 IREmitter::GetW(Reg reg) {
|
2018-01-07 11:31:20 +00:00
|
|
|
if (reg == Reg::ZR)
|
|
|
|
return Imm32(0);
|
2018-01-06 21:15:25 +00:00
|
|
|
return Inst<IR::U32>(Opcode::A64GetW, IR::Value(reg));
|
|
|
|
}
|
|
|
|
|
|
|
|
IR::U64 IREmitter::GetX(Reg reg) {
|
2018-01-07 11:31:20 +00:00
|
|
|
if (reg == Reg::ZR)
|
|
|
|
return Imm64(0);
|
2018-01-06 21:15:25 +00:00
|
|
|
return Inst<IR::U64>(Opcode::A64GetX, IR::Value(reg));
|
|
|
|
}
|
|
|
|
|
2018-01-07 11:31:20 +00:00
|
|
|
IR::U64 IREmitter::GetSP() {
|
|
|
|
return Inst<IR::U64>(Opcode::A64GetSP);
|
|
|
|
}
|
|
|
|
|
2018-01-06 21:15:25 +00:00
|
|
|
void IREmitter::SetW(const Reg reg, const IR::U32& value) {
|
2018-01-07 11:31:20 +00:00
|
|
|
if (reg == Reg::ZR)
|
|
|
|
return;
|
2018-01-06 21:15:25 +00:00
|
|
|
Inst(Opcode::A64SetW, IR::Value(reg), value);
|
|
|
|
}
|
|
|
|
|
|
|
|
void IREmitter::SetX(const Reg reg, const IR::U64& value) {
|
2018-01-07 11:31:20 +00:00
|
|
|
if (reg == Reg::ZR)
|
|
|
|
return;
|
2018-01-06 21:15:25 +00:00
|
|
|
Inst(Opcode::A64SetX, IR::Value(reg), value);
|
|
|
|
}
|
|
|
|
|
2018-01-07 11:31:20 +00:00
|
|
|
void IREmitter::SetSP(const IR::U64& value) {
|
|
|
|
Inst(Opcode::A64SetSP, value);
|
|
|
|
}
|
|
|
|
|
2018-01-07 13:56:32 +00:00
|
|
|
void IREmitter::SetPC(const IR::U64& value) {
|
|
|
|
Inst(Opcode::A64SetPC, value);
|
|
|
|
}
|
|
|
|
|
2018-01-06 21:15:25 +00:00
|
|
|
} // namespace IR
|
|
|
|
} // namespace Dynarmic
|