dynarmic/src/frontend/A64/ir_emitter.cpp

71 lines
1.6 KiB
C++
Raw Normal View History

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