Compare commits

..

3 Commits

Author SHA1 Message Date
lizzie 5679d20e2a 2026-09-11 20:03:41
Signed-off-by: lizzie <lizzie@eden-emu.dev>
2026-09-11 20:03:41 +00:00
lizzie 64cec648f5 2026-09-11 19:36:26
Signed-off-by: lizzie <lizzie@eden-emu.dev>
2026-09-11 19:36:26 +00:00
lizzie ea11b44946 2026-09-11 19:25:01
Signed-off-by: lizzie <lizzie@eden-emu.dev>
2026-09-11 19:25:01 +00:00
101 changed files with 1253 additions and 1233 deletions
@@ -298,7 +298,7 @@ NvResult nvhost_gpu::AllocateObjectContext(IoctlAllocObjCtx& params) {
return NvResult::Success; return NvResult::Success;
} }
static std::vector<Tegra::CommandHeader> BuildWaitCommandList( static boost::container::small_vector<Tegra::CommandHeader, 512> BuildWaitCommandList(
NvFence fence) { NvFence fence) {
return { return {
Tegra::BuildCommandHeader(Tegra::BufferMethods::SyncpointPayload, 1, Tegra::BuildCommandHeader(Tegra::BufferMethods::SyncpointPayload, 1,
@@ -310,9 +310,9 @@ static std::vector<Tegra::CommandHeader> BuildWaitCommandList(
}; };
} }
static std::vector<Tegra::CommandHeader> BuildIncrementCommandList( static boost::container::small_vector<Tegra::CommandHeader, 512> BuildIncrementCommandList(
NvFence fence) { NvFence fence) {
std::vector<Tegra::CommandHeader> result{ boost::container::small_vector<Tegra::CommandHeader, 512> result{
Tegra::BuildCommandHeader(Tegra::BufferMethods::SyncpointPayload, 1, Tegra::BuildCommandHeader(Tegra::BufferMethods::SyncpointPayload, 1,
Tegra::SubmissionMode::Increasing), Tegra::SubmissionMode::Increasing),
{}}; {}};
@@ -327,9 +327,9 @@ static std::vector<Tegra::CommandHeader> BuildIncrementCommandList(
return result; return result;
} }
static std::vector<Tegra::CommandHeader> BuildIncrementWithWfiCommandList( static boost::container::small_vector<Tegra::CommandHeader, 512> BuildIncrementWithWfiCommandList(
NvFence fence) { NvFence fence) {
std::vector<Tegra::CommandHeader> result{ boost::container::small_vector<Tegra::CommandHeader, 512> result{
Tegra::BuildCommandHeader(Tegra::BufferMethods::WaitForIdle, 1, Tegra::BuildCommandHeader(Tegra::BufferMethods::WaitForIdle, 1,
Tegra::SubmissionMode::Increasing), Tegra::SubmissionMode::Increasing),
{}}; {}};
@@ -31,7 +31,7 @@ struct Jit::Impl final {
, core(conf) {} , core(conf) {}
HaltReason Run() { HaltReason Run() {
ASSERT(!jit_interface->is_executing); DEBUG_ASSERT(!jit_interface->is_executing);
PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&halt_reason))); PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&halt_reason)));
jit_interface->is_executing = true; jit_interface->is_executing = true;
@@ -42,7 +42,7 @@ struct Jit::Impl final {
} }
HaltReason Step() { HaltReason Step() {
ASSERT(!jit_interface->is_executing); DEBUG_ASSERT(!jit_interface->is_executing);
PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&halt_reason))); PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&halt_reason)));
jit_interface->is_executing = true; jit_interface->is_executing = true;
@@ -31,7 +31,7 @@ struct Jit::Impl final {
, core(conf) {} , core(conf) {}
HaltReason Run() { HaltReason Run() {
ASSERT(!is_executing); DEBUG_ASSERT(!is_executing);
PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&halt_reason))); PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&halt_reason)));
is_executing = true; is_executing = true;
HaltReason hr = core.Run(current_address_space, current_state, &halt_reason); HaltReason hr = core.Run(current_address_space, current_state, &halt_reason);
@@ -41,7 +41,7 @@ struct Jit::Impl final {
} }
HaltReason Step() { HaltReason Step() {
ASSERT(!is_executing); DEBUG_ASSERT(!is_executing);
PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&halt_reason))); PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&halt_reason)));
is_executing = true; is_executing = true;
HaltReason hr = core.Step(current_address_space, current_state, &halt_reason); HaltReason hr = core.Step(current_address_space, current_state, &halt_reason);
@@ -57,7 +57,7 @@ constexpr RegisterList ToRegList(oaknut::Reg reg) {
if (reg.is_vector()) { if (reg.is_vector()) {
return RegisterList{1} << (reg.index() + 32); return RegisterList{1} << (reg.index() + 32);
} }
ASSERT(reg.index() != 31 && "ZR not allowed in reg list"); DEBUG_ASSERT(reg.index() != 31 && "ZR not allowed in reg list");
if (reg.index() == -1) { if (reg.index() == -1) {
return RegisterList{1} << 31; return RegisterList{1} << 31;
} }
@@ -31,7 +31,7 @@ AddressSpace::AddressSpace(std::size_t code_cache_size)
, code(mem.ptr(), mem.ptr()) , code(mem.ptr(), mem.ptr())
, fastmem_manager(exception_handler) , fastmem_manager(exception_handler)
{ {
ASSERT(code_cache_size <= 128 * 1024 * 1024 && "code_cache_size > 128 MiB not currently supported"); DEBUG_ASSERT(code_cache_size <= 128 * 1024 * 1024 && "code_cache_size > 128 MiB not currently supported");
exception_handler.Register(mem, code_cache_size); exception_handler.Register(mem, code_cache_size);
exception_handler.SetFastmemCallback([this](u64 host_pc) { exception_handler.SetFastmemCallback([this](u64 host_pc) {
@@ -115,9 +115,13 @@ EmittedBlockInfo AddressSpace::Emit(IR::Block block) {
EmittedBlockInfo block_info = EmitArm64(code, std::move(block), GetEmitConfig(), fastmem_manager); EmittedBlockInfo block_info = EmitArm64(code, std::move(block), GetEmitConfig(), fastmem_manager);
ASSERT(block_entries.insert({block.Location(), block_info.entry_point}).second); [[maybe_unused]] bool r = true;
ASSERT(reverse_block_entries.insert({block_info.entry_point, block.Location()}).second); r &= block_entries.insert({block.Location(), block_info.entry_point}).second;
ASSERT(block_infos.insert({block_info.entry_point, block_info}).second); DEBUG_ASSERT(r);
r &= reverse_block_entries.insert({block_info.entry_point, block.Location()}).second;
DEBUG_ASSERT(r);
r &= block_infos.insert({block_info.entry_point, block_info}).second;
DEBUG_ASSERT(r);
Link(block_info); Link(block_info);
RelinkForDescriptor(block.Location(), block_info.entry_point); RelinkForDescriptor(block.Location(), block_info.entry_point);
@@ -54,7 +54,7 @@ void EmitIR<IR::Opcode::PushRSB>(oaknut::CodeGenerator& code, EmitContext& ctx,
} }
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[0].IsImmediate()); DEBUG_ASSERT(args[0].IsImmediate());
const IR::LocationDescriptor target{args[0].GetImmediateU64()}; const IR::LocationDescriptor target{args[0].GetImmediateU64()};
code.LDR(Wscratch2, SP, offsetof(StackLayout, rsb_ptr)); code.LDR(Wscratch2, SP, offsetof(StackLayout, rsb_ptr));
@@ -71,19 +71,19 @@ void EmitIR<IR::Opcode::PushRSB>(oaknut::CodeGenerator& code, EmitContext& ctx,
template<> template<>
void EmitIR<IR::Opcode::GetCarryFromOp>(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::GetCarryFromOp>(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst) {
[[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst); [[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(ctx.reg_alloc.WasValueDefined(inst)); DEBUG_ASSERT(ctx.reg_alloc.WasValueDefined(inst));
} }
template<> template<>
void EmitIR<IR::Opcode::GetOverflowFromOp>(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::GetOverflowFromOp>(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst) {
[[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst); [[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(ctx.reg_alloc.WasValueDefined(inst)); DEBUG_ASSERT(ctx.reg_alloc.WasValueDefined(inst));
} }
template<> template<>
void EmitIR<IR::Opcode::GetGEFromOp>(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::GetGEFromOp>(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst) {
[[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst); [[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(ctx.reg_alloc.WasValueDefined(inst)); DEBUG_ASSERT(ctx.reg_alloc.WasValueDefined(inst));
} }
template<> template<>
@@ -149,13 +149,13 @@ void EmitIR<IR::Opcode::GetNZFromOp>(oaknut::CodeGenerator& code, EmitContext& c
template<> template<>
void EmitIR<IR::Opcode::GetUpperFromOp>(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::GetUpperFromOp>(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst) {
[[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst); [[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(ctx.reg_alloc.WasValueDefined(inst)); DEBUG_ASSERT(ctx.reg_alloc.WasValueDefined(inst));
} }
template<> template<>
void EmitIR<IR::Opcode::GetLowerFromOp>(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::GetLowerFromOp>(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst) {
[[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst); [[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(ctx.reg_alloc.WasValueDefined(inst)); DEBUG_ASSERT(ctx.reg_alloc.WasValueDefined(inst));
} }
template<> template<>
@@ -206,9 +206,9 @@ EmittedBlockInfo EmitArm64(oaknut::CodeGenerator& code, IR::Block block, const E
ebi.entry_point = code.xptr<CodePtr>(); ebi.entry_point = code.xptr<CodePtr>();
if (ctx.block.GetCondition() == IR::Cond::AL) { if (ctx.block.GetCondition() == IR::Cond::AL) {
ASSERT(!ctx.block.HasConditionFailedLocation()); DEBUG_ASSERT(!ctx.block.HasConditionFailedLocation());
} else { } else {
ASSERT(ctx.block.HasConditionFailedLocation()); DEBUG_ASSERT(ctx.block.HasConditionFailedLocation());
oaknut::Label pass; oaknut::Label pass;
pass = conf.emit_cond(code, ctx, ctx.block.GetCondition()); pass = conf.emit_cond(code, ctx, ctx.block.GetCondition());
@@ -234,7 +234,7 @@ void EmitIR<IR::Opcode::A32GetRegister>(oaknut::CodeGenerator& code, EmitContext
template<> template<>
void EmitIR<IR::Opcode::A32GetExtendedRegister32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::A32GetExtendedRegister32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsSingleExtReg(reg)); DEBUG_ASSERT(A32::IsSingleExtReg(reg));
const size_t index = static_cast<size_t>(reg) - static_cast<size_t>(A32::ExtReg::S0); const size_t index = static_cast<size_t>(reg) - static_cast<size_t>(A32::ExtReg::S0);
auto Sresult = ctx.reg_alloc.WriteS(inst); auto Sresult = ctx.reg_alloc.WriteS(inst);
@@ -248,7 +248,7 @@ void EmitIR<IR::Opcode::A32GetExtendedRegister32>(oaknut::CodeGenerator& code, E
template<> template<>
void EmitIR<IR::Opcode::A32GetVector>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::A32GetVector>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg)); DEBUG_ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg));
if (A32::IsDoubleExtReg(reg)) { if (A32::IsDoubleExtReg(reg)) {
const size_t index = static_cast<size_t>(reg) - static_cast<size_t>(A32::ExtReg::D0); const size_t index = static_cast<size_t>(reg) - static_cast<size_t>(A32::ExtReg::D0);
@@ -266,7 +266,7 @@ void EmitIR<IR::Opcode::A32GetVector>(oaknut::CodeGenerator& code, EmitContext&
template<> template<>
void EmitIR<IR::Opcode::A32GetExtendedRegister64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::A32GetExtendedRegister64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsDoubleExtReg(reg)); DEBUG_ASSERT(A32::IsDoubleExtReg(reg));
const size_t index = static_cast<size_t>(reg) - static_cast<size_t>(A32::ExtReg::D0); const size_t index = static_cast<size_t>(reg) - static_cast<size_t>(A32::ExtReg::D0);
auto Dresult = ctx.reg_alloc.WriteD(inst); auto Dresult = ctx.reg_alloc.WriteD(inst);
@@ -294,7 +294,7 @@ void EmitIR<IR::Opcode::A32SetRegister>(oaknut::CodeGenerator& code, EmitContext
template<> template<>
void EmitIR<IR::Opcode::A32SetExtendedRegister32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::A32SetExtendedRegister32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsSingleExtReg(reg)); DEBUG_ASSERT(A32::IsSingleExtReg(reg));
const size_t index = static_cast<size_t>(reg) - static_cast<size_t>(A32::ExtReg::S0); const size_t index = static_cast<size_t>(reg) - static_cast<size_t>(A32::ExtReg::S0);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
@@ -309,7 +309,7 @@ void EmitIR<IR::Opcode::A32SetExtendedRegister32>(oaknut::CodeGenerator& code, E
template<> template<>
void EmitIR<IR::Opcode::A32SetExtendedRegister64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::A32SetExtendedRegister64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsDoubleExtReg(reg)); DEBUG_ASSERT(A32::IsDoubleExtReg(reg));
const size_t index = static_cast<size_t>(reg) - static_cast<size_t>(A32::ExtReg::D0); const size_t index = static_cast<size_t>(reg) - static_cast<size_t>(A32::ExtReg::D0);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
@@ -324,7 +324,7 @@ void EmitIR<IR::Opcode::A32SetExtendedRegister64>(oaknut::CodeGenerator& code, E
template<> template<>
void EmitIR<IR::Opcode::A32SetVector>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::A32SetVector>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg)); DEBUG_ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg));
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
if (A32::IsDoubleExtReg(reg)) { if (A32::IsDoubleExtReg(reg)) {
@@ -194,8 +194,8 @@ void EmitIR<IR::Opcode::TestBit>(oaknut::CodeGenerator& code, EmitContext& ctx,
auto Xresult = ctx.reg_alloc.WriteX(inst); auto Xresult = ctx.reg_alloc.WriteX(inst);
auto Xoperand = ctx.reg_alloc.ReadX(args[0]); auto Xoperand = ctx.reg_alloc.ReadX(args[0]);
RegAlloc::Realize(Xresult, Xoperand); RegAlloc::Realize(Xresult, Xoperand);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
ASSERT(args[1].GetImmediateU8() < 64); DEBUG_ASSERT(args[1].GetImmediateU8() < 64);
code.UBFX(Xresult, Xoperand, args[1].GetImmediateU8(), 1); code.UBFX(Xresult, Xoperand, args[1].GetImmediateU8(), 1);
} }
@@ -893,9 +893,9 @@ static void EmitAddSub(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst*
if (overflow_inst) { if (overflow_inst) {
// There is a limited set of circumstances where this is required, so assert for this. // There is a limited set of circumstances where this is required, so assert for this.
ASSERT(!sub); DEBUG_ASSERT(!sub);
ASSERT(!nzcv_inst); DEBUG_ASSERT(!nzcv_inst);
ASSERT(args[2].IsImmediate() && args[2].GetImmediateU1() == false); DEBUG_ASSERT(args[2].IsImmediate() && args[2].GetImmediateU1() == false);
auto Rb = ctx.reg_alloc.ReadReg<bitsize>(args[1]); auto Rb = ctx.reg_alloc.ReadReg<bitsize>(args[1]);
auto Woverflow = ctx.reg_alloc.WriteW(overflow_inst); auto Woverflow = ctx.reg_alloc.WriteW(overflow_inst);
@@ -1134,7 +1134,7 @@ static void EmitBitOp(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* i
if constexpr (!std::is_same_v<EmitFn2, std::nullptr_t>) { if constexpr (!std::is_same_v<EmitFn2, std::nullptr_t>) {
const auto nz_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetNZFromOp); const auto nz_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetNZFromOp);
const auto nzcv_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetNZCVFromOp); const auto nzcv_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetNZCVFromOp);
ASSERT(!(nz_inst && nzcv_inst)); DEBUG_ASSERT(!(nz_inst && nzcv_inst));
const auto flag_inst = nz_inst ? nz_inst : nzcv_inst; const auto flag_inst = nz_inst ? nz_inst : nzcv_inst;
if (flag_inst) { if (flag_inst) {
@@ -1171,7 +1171,7 @@ template<std::size_t bitsize>
static void EmitAndNot(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { static void EmitAndNot(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
const auto nz_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetNZFromOp); const auto nz_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetNZFromOp);
const auto nzcv_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetNZCVFromOp); const auto nzcv_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetNZCVFromOp);
ASSERT(!(nz_inst && nzcv_inst)); DEBUG_ASSERT(!(nz_inst && nzcv_inst));
const auto flag_inst = nz_inst ? nz_inst : nzcv_inst; const auto flag_inst = nz_inst ? nz_inst : nzcv_inst;
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
@@ -1402,7 +1402,7 @@ void EmitIR<IR::Opcode::CountLeadingZeros64>(oaknut::CodeGenerator& code, EmitCo
template<> template<>
void EmitIR<IR::Opcode::ExtractRegister32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::ExtractRegister32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[2].IsImmediate()); DEBUG_ASSERT(args[2].IsImmediate());
auto Wresult = ctx.reg_alloc.WriteW(inst); auto Wresult = ctx.reg_alloc.WriteW(inst);
auto Wop1 = ctx.reg_alloc.ReadW(args[0]); auto Wop1 = ctx.reg_alloc.ReadW(args[0]);
@@ -1416,7 +1416,7 @@ void EmitIR<IR::Opcode::ExtractRegister32>(oaknut::CodeGenerator& code, EmitCont
template<> template<>
void EmitIR<IR::Opcode::ExtractRegister64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::ExtractRegister64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[2].IsImmediate()); DEBUG_ASSERT(args[2].IsImmediate());
auto Xresult = ctx.reg_alloc.WriteX(inst); auto Xresult = ctx.reg_alloc.WriteX(inst);
auto Xop1 = ctx.reg_alloc.ReadX(args[0]); auto Xop1 = ctx.reg_alloc.ReadX(args[0]);
@@ -1430,7 +1430,7 @@ void EmitIR<IR::Opcode::ExtractRegister64>(oaknut::CodeGenerator& code, EmitCont
template<> template<>
void EmitIR<IR::Opcode::ReplicateBit32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::ReplicateBit32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
auto Wresult = ctx.reg_alloc.WriteW(inst); auto Wresult = ctx.reg_alloc.WriteW(inst);
auto Wvalue = ctx.reg_alloc.ReadW(args[0]); auto Wvalue = ctx.reg_alloc.ReadW(args[0]);
@@ -1444,7 +1444,7 @@ void EmitIR<IR::Opcode::ReplicateBit32>(oaknut::CodeGenerator& code, EmitContext
template<> template<>
void EmitIR<IR::Opcode::ReplicateBit64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::ReplicateBit64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
auto Xresult = ctx.reg_alloc.WriteX(inst); auto Xresult = ctx.reg_alloc.WriteX(inst);
auto Xvalue = ctx.reg_alloc.ReadX(args[0]); auto Xvalue = ctx.reg_alloc.ReadX(args[0]);
@@ -68,7 +68,7 @@ static void EmitConvert(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst
RegAlloc::Realize(Vto, Vfrom); RegAlloc::Realize(Vto, Vfrom);
ctx.fpsr.Load(); ctx.fpsr.Load();
ASSERT(rounding_mode == ctx.FPCR().RMode()); DEBUG_ASSERT(rounding_mode == ctx.FPCR().RMode());
emit(Vto, Vfrom); emit(Vto, Vfrom);
} }
@@ -106,8 +106,8 @@ static void EmitToFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst*
} }
} }
} else { } else {
ASSERT(fbits == 0); DEBUG_ASSERT(fbits == 0);
ASSERT(bitsize_to != 16); DEBUG_ASSERT(bitsize_to != 16);
if constexpr (is_signed) { if constexpr (is_signed) {
switch (rounding_mode) { switch (rounding_mode) {
case FP::RoundingMode::ToNearest_TieEven: case FP::RoundingMode::ToNearest_TieEven:
@@ -449,7 +449,7 @@ void EmitIR<IR::Opcode::FPRoundInt32>(oaknut::CodeGenerator& code, EmitContext&
ctx.fpsr.Load(); ctx.fpsr.Load();
if (exact) { if (exact) {
ASSERT(ctx.FPCR().RMode() == rounding_mode); DEBUG_ASSERT(ctx.FPCR().RMode() == rounding_mode);
code.FRINTX(Sresult, Soperand); code.FRINTX(Sresult, Soperand);
} else { } else {
switch (rounding_mode) { switch (rounding_mode) {
@@ -486,7 +486,7 @@ void EmitIR<IR::Opcode::FPRoundInt64>(oaknut::CodeGenerator& code, EmitContext&
ctx.fpsr.Load(); ctx.fpsr.Load();
if (exact) { if (exact) {
ASSERT(ctx.FPCR().RMode() == rounding_mode); DEBUG_ASSERT(ctx.FPCR().RMode() == rounding_mode);
code.FRINTX(Dresult, Doperand); code.FRINTX(Dresult, Doperand);
} else { } else {
switch (rounding_mode) { switch (rounding_mode) {
@@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project. /* This file is part of the dynarmic project.
* Copyright (c) 2022 MerryMage * Copyright (c) 2022 MerryMage
* SPDX-License-Identifier: 0BSD * SPDX-License-Identifier: 0BSD
@@ -244,7 +247,7 @@ static void EmitPackedAddSub(oaknut::CodeGenerator& code, EmitContext& ctx, IR::
} }
if (ge_inst) { if (ge_inst) {
ASSERT(!is_halving); DEBUG_ASSERT(!is_halving);
auto Vge = ctx.reg_alloc.WriteD(ge_inst); auto Vge = ctx.reg_alloc.WriteD(ge_inst);
RegAlloc::Realize(Vge); RegAlloc::Realize(Vge);
@@ -24,7 +24,7 @@ using namespace oaknut::util;
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedAddWithFlag32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::SignedSaturatedAddWithFlag32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
const auto overflow_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetOverflowFromOp); const auto overflow_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetOverflowFromOp);
ASSERT(overflow_inst); DEBUG_ASSERT(overflow_inst);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto Wresult = ctx.reg_alloc.WriteW(inst); auto Wresult = ctx.reg_alloc.WriteW(inst);
@@ -44,7 +44,7 @@ void EmitIR<IR::Opcode::SignedSaturatedAddWithFlag32>(oaknut::CodeGenerator& cod
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedSubWithFlag32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::SignedSaturatedSubWithFlag32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
const auto overflow_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetOverflowFromOp); const auto overflow_inst = inst->GetAssociatedPseudoOperation(IR::Opcode::GetOverflowFromOp);
ASSERT(overflow_inst); DEBUG_ASSERT(overflow_inst);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto Wresult = ctx.reg_alloc.WriteW(inst); auto Wresult = ctx.reg_alloc.WriteW(inst);
@@ -67,7 +67,7 @@ void EmitIR<IR::Opcode::SignedSaturation>(oaknut::CodeGenerator& code, EmitConte
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const std::size_t N = args[1].GetImmediateU8(); const std::size_t N = args[1].GetImmediateU8();
ASSERT(N >= 1 && N <= 32); DEBUG_ASSERT(N >= 1 && N <= 32);
if (N == 32) { if (N == 32) {
ctx.reg_alloc.DefineAsExisting(inst, args[0]); ctx.reg_alloc.DefineAsExisting(inst, args[0]);
@@ -113,7 +113,7 @@ void EmitIR<IR::Opcode::UnsignedSaturation>(oaknut::CodeGenerator& code, EmitCon
ctx.reg_alloc.SpillFlags(); ctx.reg_alloc.SpillFlags();
const std::size_t N = args[1].GetImmediateU8(); const std::size_t N = args[1].GetImmediateU8();
ASSERT(N <= 31); DEBUG_ASSERT(N <= 31);
const u32 saturated_value = (1u << N) - 1; const u32 saturated_value = (1u << N) - 1;
code.MOV(Wscratch0, saturated_value); code.MOV(Wscratch0, saturated_value);
@@ -275,7 +275,7 @@ static void EmitReduce(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst,
template<std::size_t size, typename EmitFn> template<std::size_t size, typename EmitFn>
static void EmitGetElement(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst, EmitFn emit) { static void EmitGetElement(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst, EmitFn emit) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
auto Rresult = ctx.reg_alloc.WriteReg<std::max<std::size_t>(32, size)>(inst); auto Rresult = ctx.reg_alloc.WriteReg<std::max<std::size_t>(32, size)>(inst);
@@ -310,7 +310,7 @@ void EmitIR<IR::Opcode::VectorGetElement64>(oaknut::CodeGenerator& code, EmitCon
template<std::size_t size, typename EmitFn> template<std::size_t size, typename EmitFn>
static void EmitSetElement(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst, EmitFn emit) { static void EmitSetElement(oaknut::CodeGenerator&, EmitContext& ctx, IR::Inst* inst, EmitFn emit) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
auto Qvector = ctx.reg_alloc.ReadWriteQ(args[0], inst); auto Qvector = ctx.reg_alloc.ReadWriteQ(args[0], inst);
@@ -650,7 +650,7 @@ void EmitIR<IR::Opcode::VectorExtract>(oaknut::CodeGenerator& code, EmitContext&
auto Qa = ctx.reg_alloc.ReadQ(args[0]); auto Qa = ctx.reg_alloc.ReadQ(args[0]);
auto Qb = ctx.reg_alloc.ReadQ(args[1]); auto Qb = ctx.reg_alloc.ReadQ(args[1]);
const u8 position = args[2].GetImmediateU8(); const u8 position = args[2].GetImmediateU8();
ASSERT(position % 8 == 0); DEBUG_ASSERT(position % 8 == 0);
RegAlloc::Realize(Qresult, Qa, Qb); RegAlloc::Realize(Qresult, Qa, Qb);
code.EXT(Qresult->B16(), Qa->B16(), Qb->B16(), position / 8); code.EXT(Qresult->B16(), Qa->B16(), Qb->B16(), position / 8);
@@ -663,7 +663,7 @@ void EmitIR<IR::Opcode::VectorExtractLower>(oaknut::CodeGenerator& code, EmitCon
auto Da = ctx.reg_alloc.ReadD(args[0]); auto Da = ctx.reg_alloc.ReadD(args[0]);
auto Db = ctx.reg_alloc.ReadD(args[1]); auto Db = ctx.reg_alloc.ReadD(args[1]);
const u8 position = args[2].GetImmediateU8(); const u8 position = args[2].GetImmediateU8();
ASSERT(position % 8 == 0); DEBUG_ASSERT(position % 8 == 0);
RegAlloc::Realize(Dresult, Da, Db); RegAlloc::Realize(Dresult, Da, Db);
code.EXT(Dresult->B8(), Da->B8(), Db->B8(), position / 8); code.EXT(Dresult->B8(), Da->B8(), Db->B8(), position / 8);
@@ -958,7 +958,7 @@ void EmitIR<IR::Opcode::VectorMultiply32>(oaknut::CodeGenerator& code, EmitConte
template<> template<>
void EmitIR<IR::Opcode::VectorMultiply64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::VectorMultiply64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
ASSERT(ctx.conf.very_verbose_debugging_output && "VectorMultiply64 is for debugging only"); DEBUG_ASSERT(ctx.conf.very_verbose_debugging_output && "VectorMultiply64 is for debugging only");
EmitThreeOp(code, ctx, inst, [&](auto& Qresult, auto& Qa, auto& Qb) { EmitThreeOp(code, ctx, inst, [&](auto& Qresult, auto& Qa, auto& Qb) {
code.FMOV(Xscratch0, Qa->toD()); code.FMOV(Xscratch0, Qa->toD());
code.FMOV(Xscratch1, Qb->toD()); code.FMOV(Xscratch1, Qb->toD());
@@ -1289,7 +1289,7 @@ void EmitIR<IR::Opcode::VectorReduceAdd64>(oaknut::CodeGenerator& code, EmitCont
template<> template<>
void EmitIR<IR::Opcode::VectorRotateWholeVectorRight>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::VectorRotateWholeVectorRight>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
EmitImmShift<8>(code, ctx, inst, [&](auto Vresult, auto Voperand, u8 shift_amount) { EmitImmShift<8>(code, ctx, inst, [&](auto Vresult, auto Voperand, u8 shift_amount) {
ASSERT(shift_amount % 8 == 0); DEBUG_ASSERT(shift_amount % 8 == 0);
const u8 ext_imm = (shift_amount % 128) / 8; const u8 ext_imm = (shift_amount % 128) / 8;
code.EXT(Vresult, Voperand, Voperand, ext_imm); code.EXT(Vresult, Voperand, Voperand, ext_imm);
}); });
@@ -1602,12 +1602,12 @@ void EmitIR<IR::Opcode::VectorSub64>(oaknut::CodeGenerator& code, EmitContext& c
template<> template<>
void EmitIR<IR::Opcode::VectorTable>(oaknut::CodeGenerator&, EmitContext&, IR::Inst* inst) { void EmitIR<IR::Opcode::VectorTable>(oaknut::CodeGenerator&, EmitContext&, IR::Inst* inst) {
// Do nothing. We *want* to hold on to the refcount for our arguments, so VectorTableLookup can use our arguments. // Do nothing. We *want* to hold on to the refcount for our arguments, so VectorTableLookup can use our arguments.
ASSERT(inst->UseCount() == 1 && "Table cannot be used multiple times"); DEBUG_ASSERT(inst->UseCount() == 1 && "Table cannot be used multiple times");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorTableLookup64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::VectorTableLookup64>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
ASSERT(inst->GetArg(1).GetInst()->GetOpcode() == IR::Opcode::VectorTable); DEBUG_ASSERT(inst->GetArg(1).GetInst()->GetOpcode() == IR::Opcode::VectorTable);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto table = ctx.reg_alloc.GetArgumentInfo(inst->GetArg(1).GetInst()); auto table = ctx.reg_alloc.GetArgumentInfo(inst->GetArg(1).GetInst());
@@ -1674,7 +1674,7 @@ void EmitIR<IR::Opcode::VectorTableLookup64>(oaknut::CodeGenerator& code, EmitCo
template<> template<>
void EmitIR<IR::Opcode::VectorTableLookup128>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::VectorTableLookup128>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
ASSERT(inst->GetArg(1).GetInst()->GetOpcode() == IR::Opcode::VectorTable); DEBUG_ASSERT(inst->GetArg(1).GetInst()->GetOpcode() == IR::Opcode::VectorTable);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto table = ctx.reg_alloc.GetArgumentInfo(inst->GetArg(1).GetInst()); auto table = ctx.reg_alloc.GetArgumentInfo(inst->GetArg(1).GetInst());
@@ -139,7 +139,7 @@ static void EmitFromFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Ins
const u8 fbits = args[1].GetImmediateU8(); const u8 fbits = args[1].GetImmediateU8();
const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8()); const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8());
const bool fpcr_controlled = args[3].GetImmediateU1(); const bool fpcr_controlled = args[3].GetImmediateU1();
ASSERT(rounding_mode == ctx.FPCR(fpcr_controlled).RMode()); DEBUG_ASSERT(rounding_mode == ctx.FPCR(fpcr_controlled).RMode());
RegAlloc::Realize(Qto, Qfrom); RegAlloc::Realize(Qto, Qfrom);
MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] {
@@ -199,7 +199,7 @@ void EmitToFixed(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst)
} }
} }
} else { } else {
ASSERT(fbits == 0); DEBUG_ASSERT(fbits == 0);
if constexpr (is_signed) { if constexpr (is_signed) {
switch (rounding_mode) { switch (rounding_mode) {
case FP::RoundingMode::ToNearest_TieEven: case FP::RoundingMode::ToNearest_TieEven:
@@ -346,7 +346,7 @@ template<>
void EmitIR<IR::Opcode::FPVectorFromHalf32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::FPVectorFromHalf32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const auto rounding_mode = static_cast<FP::RoundingMode>(args[1].GetImmediateU8()); const auto rounding_mode = static_cast<FP::RoundingMode>(args[1].GetImmediateU8());
ASSERT(rounding_mode == FP::RoundingMode::ToNearest_TieEven); DEBUG_ASSERT(rounding_mode == FP::RoundingMode::ToNearest_TieEven);
const bool fpcr_controlled = args[2].GetImmediateU1(); const bool fpcr_controlled = args[2].GetImmediateU1();
auto Qresult = ctx.reg_alloc.WriteQ(inst); auto Qresult = ctx.reg_alloc.WriteQ(inst);
@@ -617,7 +617,7 @@ void EmitIR<IR::Opcode::FPVectorRoundInt32>(oaknut::CodeGenerator& code, EmitCon
MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] {
if (exact) { if (exact) {
ASSERT(ctx.FPCR(fpcr_controlled).RMode() == rounding_mode); DEBUG_ASSERT(ctx.FPCR(fpcr_controlled).RMode() == rounding_mode);
code.FRINTX(Qresult->S4(), Qoperand->S4()); code.FRINTX(Qresult->S4(), Qoperand->S4());
} else { } else {
switch (rounding_mode) { switch (rounding_mode) {
@@ -657,7 +657,7 @@ void EmitIR<IR::Opcode::FPVectorRoundInt64>(oaknut::CodeGenerator& code, EmitCon
MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] {
if (exact) { if (exact) {
ASSERT(ctx.FPCR(fpcr_controlled).RMode() == rounding_mode); DEBUG_ASSERT(ctx.FPCR(fpcr_controlled).RMode() == rounding_mode);
code.FRINTX(Qresult->D2(), Qoperand->D2()); code.FRINTX(Qresult->D2(), Qoperand->D2());
} else { } else {
switch (rounding_mode) { switch (rounding_mode) {
@@ -743,7 +743,7 @@ template<>
void EmitIR<IR::Opcode::FPVectorToHalf32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::FPVectorToHalf32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const auto rounding_mode = static_cast<FP::RoundingMode>(args[1].GetImmediateU8()); const auto rounding_mode = static_cast<FP::RoundingMode>(args[1].GetImmediateU8());
ASSERT(rounding_mode == FP::RoundingMode::ToNearest_TieEven); DEBUG_ASSERT(rounding_mode == FP::RoundingMode::ToNearest_TieEven);
const bool fpcr_controlled = args[2].GetImmediateU1(); const bool fpcr_controlled = args[2].GetImmediateU1();
auto Dresult = ctx.reg_alloc.WriteD(inst); auto Dresult = ctx.reg_alloc.WriteD(inst);
@@ -53,19 +53,19 @@ bool Argument::GetImmediateU1() const {
u8 Argument::GetImmediateU8() const { u8 Argument::GetImmediateU8() const {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm < 0x100); DEBUG_ASSERT(imm < 0x100);
return u8(imm); return u8(imm);
} }
u16 Argument::GetImmediateU16() const { u16 Argument::GetImmediateU16() const {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm < 0x10000); DEBUG_ASSERT(imm < 0x10000);
return u16(imm); return u16(imm);
} }
u32 Argument::GetImmediateU32() const { u32 Argument::GetImmediateU32() const {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm < 0x100000000); DEBUG_ASSERT(imm < 0x100000000);
return u32(imm); return u32(imm);
} }
@@ -74,12 +74,12 @@ u64 Argument::GetImmediateU64() const {
} }
IR::Cond Argument::GetImmediateCond() const { IR::Cond Argument::GetImmediateCond() const {
ASSERT(IsImmediate() && GetType() == IR::Type::Cond); DEBUG_ASSERT(IsImmediate() && GetType() == IR::Type::Cond);
return value.GetCond(); return value.GetCond();
} }
IR::AccType Argument::GetImmediateAccType() const { IR::AccType Argument::GetImmediateAccType() const {
ASSERT(IsImmediate() && GetType() == IR::Type::AccType); DEBUG_ASSERT(IsImmediate() && GetType() == IR::Type::AccType);
return value.GetAccType(); return value.GetAccType();
} }
@@ -92,12 +92,12 @@ bool HostLocInfo::Contains(const IR::Inst* value) const {
} }
void HostLocInfo::SetupScratchLocation() { void HostLocInfo::SetupScratchLocation() {
ASSERT(IsCompletelyEmpty()); DEBUG_ASSERT(IsCompletelyEmpty());
realized = true; realized = true;
} }
void HostLocInfo::SetupLocation(const IR::Inst* value) { void HostLocInfo::SetupLocation(const IR::Inst* value) {
ASSERT(IsCompletelyEmpty()); DEBUG_ASSERT(IsCompletelyEmpty());
values.clear(); values.clear();
values.push_back(value); values.push_back(value);
realized = true; realized = true;
@@ -135,7 +135,7 @@ RegAlloc::ArgumentInfo RegAlloc::GetArgumentInfo(IR::Inst* inst) {
const IR::Value arg = inst->GetArg(i); const IR::Value arg = inst->GetArg(i);
ret[i].value = arg; ret[i].value = arg;
if (!arg.IsImmediate() && !IsValuelessType(arg.GetType())) { if (!arg.IsImmediate() && !IsValuelessType(arg.GetType())) {
ASSERT(ValueLocation(arg.GetInst()) && "argument must already been defined"); DEBUG_ASSERT(ValueLocation(arg.GetInst()) && "argument must already been defined");
ValueInfo(arg.GetInst()).uses_this_inst++; ValueInfo(arg.GetInst()).uses_this_inst++;
} }
} }
@@ -174,11 +174,11 @@ void RegAlloc::PrepareForCall(std::optional<Argument::copyable_reference> arg0,
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
if (args[i]) { if (args[i]) {
if (args[i]->get().GetType() == IR::Type::U128) { if (args[i]->get().GetType() == IR::Type::U128) {
ASSERT(fprs[nsrn].IsCompletelyEmpty()); DEBUG_ASSERT(fprs[nsrn].IsCompletelyEmpty());
LoadCopyInto(args[i]->get().value, oaknut::QReg{nsrn}); LoadCopyInto(args[i]->get().value, oaknut::QReg{nsrn});
nsrn++; nsrn++;
} else { } else {
ASSERT(gprs[ngrn].IsCompletelyEmpty()); DEBUG_ASSERT(gprs[ngrn].IsCompletelyEmpty());
LoadCopyInto(args[i]->get().value, oaknut::XReg{ngrn}); LoadCopyInto(args[i]->get().value, oaknut::XReg{ngrn});
ngrn++; ngrn++;
} }
@@ -192,7 +192,7 @@ void RegAlloc::PrepareForCall(std::optional<Argument::copyable_reference> arg0,
void RegAlloc::DefineAsExisting(IR::Inst* inst, Argument& arg) { void RegAlloc::DefineAsExisting(IR::Inst* inst, Argument& arg) {
defined_insts.insert(inst); defined_insts.insert(inst);
ASSERT(!ValueLocation(inst)); DEBUG_ASSERT(!ValueLocation(inst));
if (arg.value.IsImmediate()) { if (arg.value.IsImmediate()) {
inst->ReplaceUsesWith(arg.value); inst->ReplaceUsesWith(arg.value);
@@ -206,9 +206,9 @@ void RegAlloc::DefineAsExisting(IR::Inst* inst, Argument& arg) {
void RegAlloc::DefineAsRegister(IR::Inst* inst, oaknut::Reg reg) { void RegAlloc::DefineAsRegister(IR::Inst* inst, oaknut::Reg reg) {
defined_insts.insert(inst); defined_insts.insert(inst);
ASSERT(!ValueLocation(inst)); DEBUG_ASSERT(!ValueLocation(inst));
auto& info = reg.is_vector() ? fprs[reg.index()] : gprs[reg.index()]; auto& info = reg.is_vector() ? fprs[reg.index()] : gprs[reg.index()];
ASSERT(info.IsCompletelyEmpty()); DEBUG_ASSERT(info.IsCompletelyEmpty());
info.values.push_back(inst); info.values.push_back(inst);
info.expected_uses += inst->UseCount(); info.expected_uses += inst->UseCount();
} }
@@ -228,18 +228,18 @@ void RegAlloc::UpdateAllUses() {
void RegAlloc::AssertAllUnlocked() const { void RegAlloc::AssertAllUnlocked() const {
const auto is_unlocked = [](const auto& i) { return !i.locked && !i.realized; }; const auto is_unlocked = [](const auto& i) { return !i.locked && !i.realized; };
ASSERT(std::all_of(gprs.begin(), gprs.end(), is_unlocked)); DEBUG_ASSERT(std::all_of(gprs.begin(), gprs.end(), is_unlocked));
ASSERT(std::all_of(fprs.begin(), fprs.end(), is_unlocked)); DEBUG_ASSERT(std::all_of(fprs.begin(), fprs.end(), is_unlocked));
ASSERT(is_unlocked(flags)); DEBUG_ASSERT(is_unlocked(flags));
ASSERT(std::all_of(spills.begin(), spills.end(), is_unlocked)); DEBUG_ASSERT(std::all_of(spills.begin(), spills.end(), is_unlocked));
} }
void RegAlloc::AssertNoMoreUses() const { void RegAlloc::AssertNoMoreUses() const {
const auto is_empty = [](const auto& i) { return i.IsCompletelyEmpty(); }; const auto is_empty = [](const auto& i) { return i.IsCompletelyEmpty(); };
ASSERT(std::all_of(gprs.begin(), gprs.end(), is_empty)); DEBUG_ASSERT(std::all_of(gprs.begin(), gprs.end(), is_empty));
ASSERT(std::all_of(fprs.begin(), fprs.end(), is_empty)); DEBUG_ASSERT(std::all_of(fprs.begin(), fprs.end(), is_empty));
ASSERT(is_empty(flags)); DEBUG_ASSERT(is_empty(flags));
ASSERT(std::all_of(spills.begin(), spills.end(), is_empty)); DEBUG_ASSERT(std::all_of(spills.begin(), spills.end(), is_empty));
} }
void RegAlloc::EmitVerboseDebuggingOutput() { void RegAlloc::EmitVerboseDebuggingOutput() {
@@ -271,7 +271,7 @@ void RegAlloc::EmitVerboseDebuggingOutput() {
template<HostLoc::Kind kind> template<HostLoc::Kind kind>
int RegAlloc::GenerateImmediate(const IR::Value& value) { int RegAlloc::GenerateImmediate(const IR::Value& value) {
ASSERT(value.GetType() != IR::Type::U1); DEBUG_ASSERT(value.GetType() != IR::Type::U1);
if constexpr (kind == HostLoc::Kind::Gpr) { if constexpr (kind == HostLoc::Kind::Gpr) {
const int new_location_index = AllocateRegister(gprs, gpr_order); const int new_location_index = AllocateRegister(gprs, gpr_order);
SpillGpr(new_location_index); SpillGpr(new_location_index);
@@ -309,15 +309,15 @@ int RegAlloc::RealizeReadImpl(const IR::Value& value) {
} }
const auto current_location = ValueLocation(value.GetInst()); const auto current_location = ValueLocation(value.GetInst());
ASSERT(current_location); DEBUG_ASSERT(current_location);
if (current_location->kind == required_kind) { if (current_location->kind == required_kind) {
ValueInfo(*current_location).realized = true; ValueInfo(*current_location).realized = true;
return current_location->index; return current_location->index;
} }
ASSERT(!bool(ValueInfo(*current_location).realized)); DEBUG_ASSERT(!bool(ValueInfo(*current_location).realized));
ASSERT(bool(ValueInfo(*current_location).locked)); DEBUG_ASSERT(bool(ValueInfo(*current_location).locked));
if constexpr (required_kind == HostLoc::Kind::Gpr) { if constexpr (required_kind == HostLoc::Kind::Gpr) {
const int new_location_index = AllocateRegister(gprs, gpr_order); const int new_location_index = AllocateRegister(gprs, gpr_order);
@@ -328,7 +328,7 @@ int RegAlloc::RealizeReadImpl(const IR::Value& value) {
UNREACHABLE(); //logic error UNREACHABLE(); //logic error
case HostLoc::Kind::Fpr: case HostLoc::Kind::Fpr:
code.FMOV(oaknut::XReg{new_location_index}, oaknut::DReg{current_location->index}); code.FMOV(oaknut::XReg{new_location_index}, oaknut::DReg{current_location->index});
// ASSERT size fits // DEBUG_ASSERT size fits
break; break;
case HostLoc::Kind::Spill: case HostLoc::Kind::Spill:
code.LDR(oaknut::XReg{new_location_index}, SP, spill_offset + current_location->index * spill_slot_size); code.LDR(oaknut::XReg{new_location_index}, SP, spill_offset + current_location->index * spill_slot_size);
@@ -355,7 +355,7 @@ int RegAlloc::RealizeReadImpl(const IR::Value& value) {
code.LDR(oaknut::QReg{new_location_index}, SP, spill_offset + current_location->index * spill_slot_size); code.LDR(oaknut::QReg{new_location_index}, SP, spill_offset + current_location->index * spill_slot_size);
break; break;
case HostLoc::Kind::Flags: case HostLoc::Kind::Flags:
ASSERT(false && "Moving from flags into fprs is not currently supported"); DEBUG_ASSERT(false && "Moving from flags into fprs is not currently supported");
break; break;
} }
@@ -372,7 +372,7 @@ int RegAlloc::RealizeReadImpl(const IR::Value& value) {
template<HostLoc::Kind kind> template<HostLoc::Kind kind>
int RegAlloc::RealizeWriteImpl(const IR::Inst* value) { int RegAlloc::RealizeWriteImpl(const IR::Inst* value) {
defined_insts.insert(value); defined_insts.insert(value);
ASSERT(!ValueLocation(value)); DEBUG_ASSERT(!ValueLocation(value));
if constexpr (kind == HostLoc::Kind::Gpr) { if constexpr (kind == HostLoc::Kind::Gpr) {
const int new_location_index = AllocateRegister(gprs, gpr_order); const int new_location_index = AllocateRegister(gprs, gpr_order);
@@ -407,7 +407,7 @@ int RegAlloc::RealizeReadWriteImpl(const IR::Value& read_value, const IR::Inst*
LoadCopyInto(read_value, oaknut::QReg{write_loc}); LoadCopyInto(read_value, oaknut::QReg{write_loc});
return write_loc; return write_loc;
} else if constexpr (kind == HostLoc::Kind::Flags) { } else if constexpr (kind == HostLoc::Kind::Flags) {
ASSERT(false && "Incorrect function for ReadWrite of flags"); DEBUG_ASSERT(false && "Incorrect function for ReadWrite of flags");
} else { } else {
UNREACHABLE(); UNREACHABLE();
} }
@@ -439,7 +439,7 @@ int RegAlloc::AllocateRegister(const std::array<HostLocInfo, 32>& regs, const st
} }
void RegAlloc::SpillGpr(int index) { void RegAlloc::SpillGpr(int index) {
ASSERT(!gprs[index].locked && !gprs[index].realized); DEBUG_ASSERT(!gprs[index].locked && !gprs[index].realized);
if (gprs[index].values.empty()) { if (gprs[index].values.empty()) {
return; return;
} }
@@ -449,7 +449,7 @@ void RegAlloc::SpillGpr(int index) {
} }
void RegAlloc::SpillFpr(int index) { void RegAlloc::SpillFpr(int index) {
ASSERT(!fprs[index].locked && !fprs[index].realized); DEBUG_ASSERT(!fprs[index].locked && !fprs[index].realized);
if (fprs[index].values.empty()) { if (fprs[index].values.empty()) {
return; return;
} }
@@ -461,7 +461,7 @@ void RegAlloc::SpillFpr(int index) {
void RegAlloc::ReadWriteFlags(Argument& read, IR::Inst* write) { void RegAlloc::ReadWriteFlags(Argument& read, IR::Inst* write) {
defined_insts.insert(write); defined_insts.insert(write);
const auto current_location = ValueLocation(read.value.GetInst()); const auto current_location = ValueLocation(read.value.GetInst());
ASSERT(current_location); DEBUG_ASSERT(current_location);
if (current_location->kind == HostLoc::Kind::Flags) { if (current_location->kind == HostLoc::Kind::Flags) {
if (!flags.IsOneRemainingUse()) { if (!flags.IsOneRemainingUse()) {
@@ -489,7 +489,7 @@ void RegAlloc::ReadWriteFlags(Argument& read, IR::Inst* write) {
} }
void RegAlloc::SpillFlags() { void RegAlloc::SpillFlags() {
ASSERT(!flags.locked && !flags.realized); DEBUG_ASSERT(!flags.locked && !flags.realized);
if (flags.values.empty()) { if (flags.values.empty()) {
return; return;
} }
@@ -501,7 +501,7 @@ void RegAlloc::SpillFlags() {
int RegAlloc::FindFreeSpill() const { int RegAlloc::FindFreeSpill() const {
const auto iter = std::find_if(spills.begin(), spills.end(), [](const HostLocInfo& info) { return info.values.empty(); }); const auto iter = std::find_if(spills.begin(), spills.end(), [](const HostLocInfo& info) { return info.values.empty(); });
ASSERT(iter != spills.end() && "All spill locations are full"); DEBUG_ASSERT(iter != spills.end() && "All spill locations are full");
return static_cast<int>(iter - spills.begin()); return static_cast<int>(iter - spills.begin());
} }
@@ -512,14 +512,14 @@ void RegAlloc::LoadCopyInto(const IR::Value& value, oaknut::XReg reg) {
} }
const auto current_location = ValueLocation(value.GetInst()); const auto current_location = ValueLocation(value.GetInst());
ASSERT(current_location); DEBUG_ASSERT(current_location);
switch (current_location->kind) { switch (current_location->kind) {
case HostLoc::Kind::Gpr: case HostLoc::Kind::Gpr:
code.MOV(reg, oaknut::XReg{current_location->index}); code.MOV(reg, oaknut::XReg{current_location->index});
break; break;
case HostLoc::Kind::Fpr: case HostLoc::Kind::Fpr:
code.FMOV(reg, oaknut::DReg{current_location->index}); code.FMOV(reg, oaknut::DReg{current_location->index});
// ASSERT size fits // DEBUG_ASSERT size fits
break; break;
case HostLoc::Kind::Spill: case HostLoc::Kind::Spill:
code.LDR(reg, SP, spill_offset + current_location->index * spill_slot_size); code.LDR(reg, SP, spill_offset + current_location->index * spill_slot_size);
@@ -538,7 +538,7 @@ void RegAlloc::LoadCopyInto(const IR::Value& value, oaknut::QReg reg) {
} }
const auto current_location = ValueLocation(value.GetInst()); const auto current_location = ValueLocation(value.GetInst());
ASSERT(current_location); DEBUG_ASSERT(current_location);
switch (current_location->kind) { switch (current_location->kind) {
case HostLoc::Kind::Gpr: case HostLoc::Kind::Gpr:
code.FMOV(reg.toD(), oaknut::XReg{current_location->index}); code.FMOV(reg.toD(), oaknut::XReg{current_location->index});
@@ -87,7 +87,11 @@ private:
}; };
MachHandler::MachHandler() { MachHandler::MachHandler() {
#define KCHECK(x) ASSERT((x) == KERN_SUCCESS && "init failure at " #x) #define KCHECK(x) do { \
[[maybe_unused]] auto r = (x); \
DEBUG_ASSERT(r == KERN_SUCCESS && "init failure at " #x); \
} while (0);
KCHECK(mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &server_port)); KCHECK(mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &server_port));
KCHECK(mach_port_insert_right(mach_task_self(), server_port, server_port, MACH_MSG_TYPE_MAKE_SEND)); KCHECK(mach_port_insert_right(mach_task_self(), server_port, server_port, MACH_MSG_TYPE_MAKE_SEND));
KCHECK(task_set_exception_ports(mach_task_self(), EXC_MASK_BAD_ACCESS, server_port, EXCEPTION_STATE | MACH_EXCEPTION_CODES, THREAD_STATE)); KCHECK(task_set_exception_ports(mach_task_self(), EXC_MASK_BAD_ACCESS, server_port, EXCEPTION_STATE | MACH_EXCEPTION_CODES, THREAD_STATE));
@@ -138,7 +138,7 @@ void SigHandler::SigAction(int sig, siginfo_t* info, void* raw_context) {
#elif defined(ARCHITECTURE_loongarch64) #elif defined(ARCHITECTURE_loongarch64)
CTX_PC = fc.call_pc; CTX_PC = fc.call_pc;
#else #else
ASSERT(false); DEBUG_ASSERT(false);
#endif #endif
return; return;
} }
@@ -115,7 +115,7 @@ void A32AddressSpace::Link(EmittedBlockInfo& block_info) {
break; break;
} }
default: default:
ASSERT(false && "Invalid relocation target"); DEBUG_ASSERT(false && "Invalid relocation target");
} }
} }
} }
@@ -25,7 +25,7 @@ struct Jit::Impl final {
, current_address_space(conf) {} , current_address_space(conf) {}
HaltReason Run() { HaltReason Run() {
ASSERT(!jit_interface->is_executing); DEBUG_ASSERT(!jit_interface->is_executing);
jit_interface->is_executing = true; jit_interface->is_executing = true;
const auto location_descriptor = current_state.GetLocationDescriptor(); const auto location_descriptor = current_state.GetLocationDescriptor();
@@ -38,7 +38,7 @@ struct Jit::Impl final {
} }
HaltReason Step() { HaltReason Step() {
ASSERT(!jit_interface->is_executing); DEBUG_ASSERT(!jit_interface->is_executing);
jit_interface->is_executing = true; jit_interface->is_executing = true;
const auto location_descriptor = A32::LocationDescriptor{current_state.GetLocationDescriptor()}.SetSingleStepping(true); const auto location_descriptor = A32::LocationDescriptor{current_state.GetLocationDescriptor()}.SetSingleStepping(true);
@@ -20,7 +20,7 @@ public:
explicit CodeBlock(std::size_t size) noexcept explicit CodeBlock(std::size_t size) noexcept
: memsize(size) { : memsize(size) {
mem = static_cast<u8*>(mmap(nullptr, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0)); mem = static_cast<u8*>(mmap(nullptr, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0));
ASSERT(mem != MAP_FAILED); DEBUG_ASSERT(mem != MAP_FAILED);
la_init_assembler(&as, mem, size); la_init_assembler(&as, mem, size);
} }
@@ -16,7 +16,7 @@ namespace Dynarmic::Backend::LoongArch64 {
template<IR::Opcode op> template<IR::Opcode op>
void EmitIR(lagoon_assembler_t&, EmitContext&, IR::Inst*) { void EmitIR(lagoon_assembler_t&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented opcode"); DEBUG_ASSERT(false && "Unimplemented opcode");
} }
template<> template<>
@@ -36,7 +36,7 @@ void EmitIR<IR::Opcode::LogicalShiftLeft32>(lagoon_assembler_t&, EmitContext& ct
template<> template<>
void EmitIR<IR::Opcode::GetCarryFromOp>(lagoon_assembler_t&, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::GetCarryFromOp>(lagoon_assembler_t&, EmitContext& ctx, IR::Inst* inst) {
ASSERT(ctx.reg_alloc.IsValueLive(inst)); DEBUG_ASSERT(ctx.reg_alloc.IsValueLive(inst));
} }
template<> template<>
@@ -98,7 +98,7 @@ EmittedBlockInfo EmitLoongArch64(lagoon_assembler_t& as, IR::Block block, const
const auto term = block.GetTerminal(); const auto term = block.GetTerminal();
const IR::Term::LeafTerminal* leaft_term = std::get_if<IR::Term::LeafTerminal>(&term); const IR::Term::LeafTerminal* leaft_term = std::get_if<IR::Term::LeafTerminal>(&term);
const IR::Term::LinkBlock* link_block_term = std::get_if<IR::Term::LinkBlock>(leaft_term); const IR::Term::LinkBlock* link_block_term = std::get_if<IR::Term::LinkBlock>(leaft_term);
ASSERT(link_block_term); DEBUG_ASSERT(link_block_term);
la_load_immediate64(&as, Xscratch0, link_block_term->next.Value()); la_load_immediate64(&as, Xscratch0, link_block_term->next.Value());
la_st_w(&as, Xscratch0, Xstate, static_cast<int32_t>(offsetof(A32JitState, regs) + sizeof(u32) * 15)); la_st_w(&as, Xscratch0, Xstate, static_cast<int32_t>(offsetof(A32JitState, regs) + sizeof(u32) * 15));
@@ -41,7 +41,7 @@ template<>
void EmitIR<IR::Opcode::A32SetCpsrNZC>(lagoon_assembler_t& as, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::A32SetCpsrNZC>(lagoon_assembler_t& as, EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(!args[0].IsImmediate() && !args[1].IsImmediate()); DEBUG_ASSERT(!args[0].IsImmediate() && !args[1].IsImmediate());
auto Xnz = ctx.reg_alloc.ReadX(args[0]); auto Xnz = ctx.reg_alloc.ReadX(args[0]);
auto Xc = ctx.reg_alloc.ReadX(args[1]); auto Xc = ctx.reg_alloc.ReadX(args[1]);
@@ -22,8 +22,8 @@ void EmitIR<IR::Opcode::LogicalShiftLeft32>(lagoon_assembler_t& as, EmitContext&
auto& shift_arg = args[1]; auto& shift_arg = args[1];
auto& carry_arg = args[2]; auto& carry_arg = args[2];
ASSERT(carry_inst != nullptr); DEBUG_ASSERT(carry_inst != nullptr);
ASSERT(shift_arg.IsImmediate()); DEBUG_ASSERT(shift_arg.IsImmediate());
auto Xresult = ctx.reg_alloc.WriteX(inst); auto Xresult = ctx.reg_alloc.WriteX(inst);
auto Xcarry_out = ctx.reg_alloc.WriteX(carry_inst); auto Xcarry_out = ctx.reg_alloc.WriteX(carry_inst);
@@ -42,19 +42,19 @@ bool Argument::GetImmediateU1() const {
u8 Argument::GetImmediateU8() const { u8 Argument::GetImmediateU8() const {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm < 0x100); DEBUG_ASSERT(imm < 0x100);
return u8(imm); return u8(imm);
} }
u16 Argument::GetImmediateU16() const { u16 Argument::GetImmediateU16() const {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm < 0x10000); DEBUG_ASSERT(imm < 0x10000);
return u16(imm); return u16(imm);
} }
u32 Argument::GetImmediateU32() const { u32 Argument::GetImmediateU32() const {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm < 0x100000000); DEBUG_ASSERT(imm < 0x100000000);
return u32(imm); return u32(imm);
} }
@@ -63,12 +63,12 @@ u64 Argument::GetImmediateU64() const {
} }
IR::Cond Argument::GetImmediateCond() const { IR::Cond Argument::GetImmediateCond() const {
ASSERT(IsImmediate() && GetType() == IR::Type::Cond); DEBUG_ASSERT(IsImmediate() && GetType() == IR::Type::Cond);
return value.GetCond(); return value.GetCond();
} }
IR::AccType Argument::GetImmediateAccType() const { IR::AccType Argument::GetImmediateAccType() const {
ASSERT(IsImmediate() && GetType() == IR::Type::AccType); DEBUG_ASSERT(IsImmediate() && GetType() == IR::Type::AccType);
return value.GetAccType(); return value.GetAccType();
} }
@@ -77,7 +77,7 @@ bool HostLocInfo::Contains(const IR::Inst* value) const {
} }
void HostLocInfo::SetupScratchLocation() { void HostLocInfo::SetupScratchLocation() {
ASSERT(IsCompletelyEmpty()); DEBUG_ASSERT(IsCompletelyEmpty());
locked = 1; locked = 1;
realized = true; realized = true;
} }
@@ -103,7 +103,7 @@ RegAlloc::ArgumentInfo RegAlloc::GetArgumentInfo(IR::Inst* inst) {
const IR::Value arg = inst->GetArg(i); const IR::Value arg = inst->GetArg(i);
ret[i].value = arg; ret[i].value = arg;
if (!arg.IsImmediate() && !IsValuelessType(arg.GetType())) { if (!arg.IsImmediate() && !IsValuelessType(arg.GetType())) {
ASSERT(ValueLocation(arg.GetInst()) && "argument must already been defined"); DEBUG_ASSERT(ValueLocation(arg.GetInst()) && "argument must already been defined");
ValueInfo(arg.GetInst()).uses_this_inst++; ValueInfo(arg.GetInst()).uses_this_inst++;
} }
} }
@@ -121,7 +121,7 @@ void RegAlloc::UpdateAllUses() {
} }
void RegAlloc::DefineAsExisting(IR::Inst* inst, Argument& arg) { void RegAlloc::DefineAsExisting(IR::Inst* inst, Argument& arg) {
ASSERT(!ValueLocation(inst)); DEBUG_ASSERT(!ValueLocation(inst));
if (arg.value.IsImmediate()) { if (arg.value.IsImmediate()) {
inst->ReplaceUsesWith(arg.value); inst->ReplaceUsesWith(arg.value);
@@ -136,7 +136,7 @@ void RegAlloc::DefineAsExisting(IR::Inst* inst, Argument& arg) {
void RegAlloc::AssertNoMoreUses() const { void RegAlloc::AssertNoMoreUses() const {
// TODO: Re-enable this assert once all register allocation issues are fixed // TODO: Re-enable this assert once all register allocation issues are fixed
// const auto is_empty = [](const auto& i) { return i.IsCompletelyEmpty(); }; // const auto is_empty = [](const auto& i) { return i.IsCompletelyEmpty(); };
// ASSERT(std::all_of(hostloc_info.begin(), hostloc_info.end(), is_empty)); // DEBUG_ASSERT(std::all_of(hostloc_info.begin(), hostloc_info.end(), is_empty));
} }
template<HostLoc::Kind kind> template<HostLoc::Kind kind>
@@ -151,7 +151,7 @@ u32 RegAlloc::GenerateImmediate(const IR::Value& value) {
return new_location_index; return new_location_index;
} else if constexpr (kind == HostLoc::Kind::Fpr) { } else if constexpr (kind == HostLoc::Kind::Fpr) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} else { } else {
UNREACHABLE(); UNREACHABLE();
} }
@@ -165,15 +165,15 @@ u32 RegAlloc::RealizeReadImpl(const IR::Value& value) {
} }
const auto current_location = ValueLocation(value.GetInst()); const auto current_location = ValueLocation(value.GetInst());
ASSERT(current_location); DEBUG_ASSERT(current_location);
if (current_location->kind == required_kind) { if (current_location->kind == required_kind) {
ValueInfo(*current_location).realized = true; ValueInfo(*current_location).realized = true;
return current_location->index; return current_location->index;
} }
ASSERT(!ValueInfo(*current_location).realized); DEBUG_ASSERT(!ValueInfo(*current_location).realized);
ASSERT(!ValueInfo(*current_location).locked); DEBUG_ASSERT(!ValueInfo(*current_location).locked);
if constexpr (required_kind == HostLoc::Kind::Gpr) { if constexpr (required_kind == HostLoc::Kind::Gpr) {
const u32 new_location_index = AllocateRegister(gpr_order, GprOffset); const u32 new_location_index = AllocateRegister(gpr_order, GprOffset);
@@ -236,7 +236,7 @@ u32 RegAlloc::RealizeWriteImpl(const IR::Inst* value, HostLoc::Kind required_kin
} }
} }
ASSERT(!ValueLocation(value)); DEBUG_ASSERT(!ValueLocation(value));
const auto setup_location = [&](HostLocInfo& info) { const auto setup_location = [&](HostLocInfo& info) {
info = {}; info = {};
@@ -277,7 +277,7 @@ u32 RegAlloc::AllocateRegister(const std::vector<u32>& order, size_t base_offset
std::copy_if(order.begin(), order.end(), std::back_inserter(candidates), [&](u32 i) { std::copy_if(order.begin(), order.end(), std::back_inserter(candidates), [&](u32 i) {
return !hostloc_info[base_offset + i].locked; return !hostloc_info[base_offset + i].locked;
}); });
ASSERT(!candidates.empty()); DEBUG_ASSERT(!candidates.empty());
u32 best = candidates[0]; u32 best = candidates[0];
size_t min_lru = hostloc_info[base_offset + best].lru_counter; size_t min_lru = hostloc_info[base_offset + best].lru_counter;
@@ -294,7 +294,7 @@ u32 RegAlloc::AllocateRegister(const std::vector<u32>& order, size_t base_offset
void RegAlloc::SpillGpr(u32 index) { void RegAlloc::SpillGpr(u32 index) {
auto& gpr_info = hostloc_info[GprOffset + index]; auto& gpr_info = hostloc_info[GprOffset + index];
ASSERT(!gpr_info.locked && !gpr_info.realized); DEBUG_ASSERT(!gpr_info.locked && !gpr_info.realized);
if (gpr_info.values.empty()) { if (gpr_info.values.empty()) {
return; return;
} }
@@ -306,7 +306,7 @@ void RegAlloc::SpillGpr(u32 index) {
void RegAlloc::SpillFpr(u32 index) { void RegAlloc::SpillFpr(u32 index) {
auto& fpr_info = hostloc_info[FprOffset + index]; auto& fpr_info = hostloc_info[FprOffset + index];
ASSERT(!fpr_info.locked && !fpr_info.realized); DEBUG_ASSERT(!fpr_info.locked && !fpr_info.realized);
if (fpr_info.values.empty()) { if (fpr_info.values.empty()) {
return; return;
} }
@@ -94,7 +94,7 @@ void A32AddressSpace::EmitPrelude() {
void A32AddressSpace::SetCursorPtr(CodePtr ptr) { void A32AddressSpace::SetCursorPtr(CodePtr ptr) {
ptrdiff_t offset = ptr - GetMemPtr<CodePtr>(); ptrdiff_t offset = ptr - GetMemPtr<CodePtr>();
ASSERT(offset >= 0); DEBUG_ASSERT(offset >= 0);
as.RewindBuffer(offset); as.RewindBuffer(offset);
} }
@@ -31,7 +31,7 @@ struct Jit::Impl final {
, core(conf) {} , core(conf) {}
HaltReason Run() { HaltReason Run() {
ASSERT(!jit_interface->is_executing); DEBUG_ASSERT(!jit_interface->is_executing);
jit_interface->is_executing = true; jit_interface->is_executing = true;
HaltReason hr = core.Run(current_address_space, current_state, &halt_reason); HaltReason hr = core.Run(current_address_space, current_state, &halt_reason);
RequestCacheInvalidation(); RequestCacheInvalidation();
@@ -40,9 +40,9 @@ struct Jit::Impl final {
} }
HaltReason Step() { HaltReason Step() {
ASSERT(!jit_interface->is_executing); DEBUG_ASSERT(!jit_interface->is_executing);
jit_interface->is_executing = true; jit_interface->is_executing = true;
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
RequestCacheInvalidation(); RequestCacheInvalidation();
jit_interface->is_executing = false; jit_interface->is_executing = false;
return HaltReason{}; return HaltReason{};
@@ -28,12 +28,12 @@ struct Jit::Impl final {
, jit_interface(jit_interface) {} , jit_interface(jit_interface) {}
HaltReason Run() { HaltReason Run() {
ASSERT(false); DEBUG_ASSERT(false);
return HaltReason{}; return HaltReason{};
} }
HaltReason Step() { HaltReason Step() {
ASSERT(false); DEBUG_ASSERT(false);
return HaltReason{}; return HaltReason{};
} }
@@ -51,7 +51,7 @@ struct Jit::Impl final {
} }
void Reset() { void Reset() {
ASSERT(!is_executing); DEBUG_ASSERT(!is_executing);
//jit_state = {}; //jit_state = {};
} }
@@ -22,7 +22,7 @@ class CodeBlock {
public: public:
explicit CodeBlock(std::size_t size) noexcept : memsize(size) { explicit CodeBlock(std::size_t size) noexcept : memsize(size) {
mem = (u8*)mmap(nullptr, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0); mem = (u8*)mmap(nullptr, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
ASSERT(mem != nullptr); DEBUG_ASSERT(mem != nullptr);
} }
~CodeBlock() noexcept { ~CodeBlock() noexcept {
@@ -35,39 +35,39 @@ void EmitIR<IR::Opcode::Identity>(biscuit::Assembler&, EmitContext& ctx, IR::Ins
template<> template<>
void EmitIR<IR::Opcode::Breakpoint>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Breakpoint>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::CallHostFunction>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::CallHostFunction>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PushRSB>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PushRSB>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::GetCarryFromOp>(biscuit::Assembler&, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::GetCarryFromOp>(biscuit::Assembler&, EmitContext& ctx, IR::Inst* inst) {
[[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst); [[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(ctx.reg_alloc.IsValueLive(inst)); DEBUG_ASSERT(ctx.reg_alloc.IsValueLive(inst));
} }
template<> template<>
void EmitIR<IR::Opcode::GetOverflowFromOp>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::GetOverflowFromOp>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::GetGEFromOp>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::GetGEFromOp>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::GetNZCVFromOp>(biscuit::Assembler&, EmitContext& ctx, IR::Inst* inst) { void EmitIR<IR::Opcode::GetNZCVFromOp>(biscuit::Assembler&, EmitContext& ctx, IR::Inst* inst) {
[[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst); [[maybe_unused]] auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(ctx.reg_alloc.IsValueLive(inst)); DEBUG_ASSERT(ctx.reg_alloc.IsValueLive(inst));
} }
template<> template<>
@@ -87,12 +87,12 @@ void EmitIR<IR::Opcode::GetNZFromOp>(biscuit::Assembler& as, EmitContext& ctx, I
template<> template<>
void EmitIR<IR::Opcode::GetUpperFromOp>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::GetUpperFromOp>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::GetLowerFromOp>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::GetLowerFromOp>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
@@ -109,7 +109,7 @@ void EmitIR<IR::Opcode::GetCFlagFromNZCV>(biscuit::Assembler& as, EmitContext& c
template<> template<>
void EmitIR<IR::Opcode::NZCVFromPackedFlags>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::NZCVFromPackedFlags>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
EmittedBlockInfo EmitRV64(biscuit::Assembler& as, IR::Block block, const EmitConfig& emit_conf) { EmittedBlockInfo EmitRV64(biscuit::Assembler& as, IR::Block block, const EmitConfig& emit_conf) {
@@ -228,7 +228,7 @@ void EmitA32Terminal(biscuit::Assembler& as, EmitContext& ctx) {
template<> template<>
void EmitIR<IR::Opcode::A32SetCheckBit>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetCheckBit>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
@@ -243,17 +243,17 @@ void EmitIR<IR::Opcode::A32GetRegister>(biscuit::Assembler& as, EmitContext& ctx
template<> template<>
void EmitIR<IR::Opcode::A32GetExtendedRegister32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32GetExtendedRegister32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32GetExtendedRegister64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32GetExtendedRegister64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32GetVector>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32GetVector>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
@@ -272,27 +272,27 @@ void EmitIR<IR::Opcode::A32SetRegister>(biscuit::Assembler& as, EmitContext& ctx
template<> template<>
void EmitIR<IR::Opcode::A32SetExtendedRegister32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetExtendedRegister32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32SetExtendedRegister64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetExtendedRegister64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32SetVector>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetVector>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32GetCpsr>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32GetCpsr>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32SetCpsr>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetCpsr>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
@@ -307,17 +307,17 @@ void EmitIR<IR::Opcode::A32SetCpsrNZCV>(biscuit::Assembler& as, EmitContext& ctx
template<> template<>
void EmitIR<IR::Opcode::A32SetCpsrNZCVRaw>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetCpsrNZCVRaw>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32SetCpsrNZCVQ>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetCpsrNZCVQ>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32SetCpsrNZ>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetCpsrNZ>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
@@ -325,7 +325,7 @@ void EmitIR<IR::Opcode::A32SetCpsrNZC>(biscuit::Assembler& as, EmitContext& ctx,
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
// TODO: Add full implementation // TODO: Add full implementation
ASSERT(!args[0].IsImmediate() && !args[1].IsImmediate()); DEBUG_ASSERT(!args[0].IsImmediate() && !args[1].IsImmediate());
auto Xnz = ctx.reg_alloc.ReadX(args[0]); auto Xnz = ctx.reg_alloc.ReadX(args[0]);
auto Xc = ctx.reg_alloc.ReadX(args[1]); auto Xc = ctx.reg_alloc.ReadX(args[1]);
@@ -341,82 +341,82 @@ void EmitIR<IR::Opcode::A32SetCpsrNZC>(biscuit::Assembler& as, EmitContext& ctx,
template<> template<>
void EmitIR<IR::Opcode::A32GetCFlag>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32GetCFlag>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32OrQFlag>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32OrQFlag>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32GetGEFlags>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32GetGEFlags>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32SetGEFlags>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetGEFlags>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32SetGEFlagsCompressed>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetGEFlagsCompressed>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32BXWritePC>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32BXWritePC>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32UpdateUpperLocationDescriptor>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32UpdateUpperLocationDescriptor>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32CallSupervisor>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32CallSupervisor>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ExceptionRaised>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ExceptionRaised>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32DataSynchronizationBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32DataSynchronizationBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32DataMemoryBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32DataMemoryBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32InstructionSynchronizationBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32InstructionSynchronizationBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32GetFpscr>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32GetFpscr>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32SetFpscr>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetFpscr>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32GetFpscrNZCV>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32GetFpscrNZCV>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32SetFpscrNZCV>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32SetFpscrNZCV>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
@@ -22,37 +22,37 @@ namespace Dynarmic::Backend::RV64 {
template<> template<>
void EmitIR<IR::Opcode::A32CoprocInternalOperation>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32CoprocInternalOperation>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32CoprocSendOneWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32CoprocSendOneWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32CoprocSendTwoWords>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32CoprocSendTwoWords>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32CoprocGetOneWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32CoprocGetOneWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32CoprocGetTwoWords>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32CoprocGetTwoWords>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32CoprocLoadWords>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32CoprocLoadWords>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32CoprocStoreWords>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32CoprocStoreWords>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
@@ -22,87 +22,87 @@ namespace Dynarmic::Backend::RV64 {
template<> template<>
void EmitIR<IR::Opcode::A32ClearExclusive>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ClearExclusive>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ReadMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ReadMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ReadMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ReadMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ReadMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ReadMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ReadMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ReadMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ExclusiveReadMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ExclusiveReadMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ExclusiveReadMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ExclusiveReadMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ExclusiveReadMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ExclusiveReadMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ExclusiveReadMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ExclusiveReadMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32WriteMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32WriteMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32WriteMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32WriteMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32WriteMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32WriteMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32WriteMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32WriteMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ExclusiveWriteMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ExclusiveWriteMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ExclusiveWriteMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ExclusiveWriteMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ExclusiveWriteMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ExclusiveWriteMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A32ExclusiveWriteMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A32ExclusiveWriteMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
@@ -22,182 +22,182 @@ namespace Dynarmic::Backend::RV64 {
template<> template<>
void EmitIR<IR::Opcode::A64SetCheckBit>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetCheckBit>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetCFlag>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetCFlag>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetNZCVRaw>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetNZCVRaw>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetNZCVRaw>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetNZCVRaw>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetNZCV>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetNZCV>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetW>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetW>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetX>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetX>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetS>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetS>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetD>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetD>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetQ>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetQ>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetSP>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetSP>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetFPCR>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetFPCR>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetFPSR>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetFPSR>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetW>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetW>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetX>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetX>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetS>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetS>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetD>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetD>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetQ>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetQ>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetSP>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetSP>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetFPCR>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetFPCR>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetFPSR>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetFPSR>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetPC>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetPC>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64CallSupervisor>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64CallSupervisor>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ExceptionRaised>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ExceptionRaised>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64DataCacheOperationRaised>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64DataCacheOperationRaised>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64InstructionCacheOperationRaised>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64InstructionCacheOperationRaised>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64DataSynchronizationBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64DataSynchronizationBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64DataMemoryBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64DataMemoryBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64InstructionSynchronizationBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64InstructionSynchronizationBarrier>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetCNTFRQ>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetCNTFRQ>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetCNTPCT>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetCNTPCT>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetCTR>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetCTR>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetDCZID>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetDCZID>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetTPIDR>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetTPIDR>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64GetTPIDRRO>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64GetTPIDRRO>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64SetTPIDR>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64SetTPIDR>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
@@ -22,107 +22,107 @@ namespace Dynarmic::Backend::RV64 {
template<> template<>
void EmitIR<IR::Opcode::A64ClearExclusive>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ClearExclusive>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ReadMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ReadMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ReadMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ReadMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ReadMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ReadMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ReadMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ReadMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ReadMemory128>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ReadMemory128>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ExclusiveReadMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ExclusiveReadMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ExclusiveReadMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ExclusiveReadMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ExclusiveReadMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ExclusiveReadMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ExclusiveReadMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ExclusiveReadMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ExclusiveReadMemory128>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ExclusiveReadMemory128>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64WriteMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64WriteMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64WriteMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64WriteMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64WriteMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64WriteMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64WriteMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64WriteMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64WriteMemory128>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64WriteMemory128>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ExclusiveWriteMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ExclusiveWriteMemory8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ExclusiveWriteMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ExclusiveWriteMemory16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ExclusiveWriteMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ExclusiveWriteMemory32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ExclusiveWriteMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ExclusiveWriteMemory64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::A64ExclusiveWriteMemory128>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::A64ExclusiveWriteMemory128>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
@@ -22,82 +22,82 @@ namespace Dynarmic::Backend::RV64 {
template<> template<>
void EmitIR<IR::Opcode::CRC32Castagnoli8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::CRC32Castagnoli8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::CRC32Castagnoli16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::CRC32Castagnoli16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::CRC32Castagnoli32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::CRC32Castagnoli32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::CRC32Castagnoli64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::CRC32Castagnoli64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::CRC32ISO8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::CRC32ISO8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::CRC32ISO16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::CRC32ISO16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::CRC32ISO32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::CRC32ISO32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::CRC32ISO64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::CRC32ISO64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::AESDecryptSingleRound>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::AESDecryptSingleRound>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::AESEncryptSingleRound>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::AESEncryptSingleRound>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::AESInverseMixColumns>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::AESInverseMixColumns>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::AESMixColumns>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::AESMixColumns>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SM4AccessSubstitutionBox>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SM4AccessSubstitutionBox>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SHA256Hash>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SHA256Hash>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SHA256MessageSchedule0>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SHA256MessageSchedule0>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SHA256MessageSchedule1>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SHA256MessageSchedule1>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
@@ -22,67 +22,67 @@ namespace Dynarmic::Backend::RV64 {
template<> template<>
void EmitIR<IR::Opcode::Pack2x32To1x64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Pack2x32To1x64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::Pack2x64To1x128>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Pack2x64To1x128>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::LeastSignificantWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::LeastSignificantWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::LeastSignificantHalf>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::LeastSignificantHalf>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::LeastSignificantByte>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::LeastSignificantByte>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::MostSignificantWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::MostSignificantWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::MostSignificantBit>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::MostSignificantBit>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::IsZero32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::IsZero32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::IsZero64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::IsZero64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::TestBit>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::TestBit>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ConditionalSelect32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ConditionalSelect32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ConditionalSelect64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ConditionalSelect64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ConditionalSelectNZCV>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ConditionalSelectNZCV>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
@@ -95,8 +95,8 @@ void EmitIR<IR::Opcode::LogicalShiftLeft32>(biscuit::Assembler& as, EmitContext&
auto& carry_arg = args[2]; auto& carry_arg = args[2];
// TODO: Add full implementation // TODO: Add full implementation
ASSERT(carry_inst != nullptr); DEBUG_ASSERT(carry_inst != nullptr);
ASSERT(shift_arg.IsImmediate()); DEBUG_ASSERT(shift_arg.IsImmediate());
auto Xresult = ctx.reg_alloc.WriteX(inst); auto Xresult = ctx.reg_alloc.WriteX(inst);
auto Xcarry_out = ctx.reg_alloc.WriteX(carry_inst); auto Xcarry_out = ctx.reg_alloc.WriteX(carry_inst);
@@ -124,7 +124,7 @@ void EmitIR<IR::Opcode::LogicalShiftLeft32>(biscuit::Assembler& as, EmitContext&
template<> template<>
void EmitIR<IR::Opcode::LogicalShiftLeft64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::LogicalShiftLeft64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
@@ -136,8 +136,8 @@ void EmitIR<IR::Opcode::LogicalShiftRight32>(biscuit::Assembler& as, EmitContext
auto& shift_arg = args[1]; auto& shift_arg = args[1];
// TODO: Add full implementation // TODO: Add full implementation
ASSERT(carry_inst == nullptr); DEBUG_ASSERT(carry_inst == nullptr);
ASSERT(shift_arg.IsImmediate()); DEBUG_ASSERT(shift_arg.IsImmediate());
const u8 shift = shift_arg.GetImmediateU8(); const u8 shift = shift_arg.GetImmediateU8();
auto Xresult = ctx.reg_alloc.WriteX(inst); auto Xresult = ctx.reg_alloc.WriteX(inst);
@@ -153,72 +153,72 @@ void EmitIR<IR::Opcode::LogicalShiftRight32>(biscuit::Assembler& as, EmitContext
template<> template<>
void EmitIR<IR::Opcode::LogicalShiftRight64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::LogicalShiftRight64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ArithmeticShiftRight32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ArithmeticShiftRight32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ArithmeticShiftRight64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ArithmeticShiftRight64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::BitRotateRight32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::BitRotateRight32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::BitRotateRight64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::BitRotateRight64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::RotateRightExtended>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::RotateRightExtended>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::LogicalShiftLeftMasked32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::LogicalShiftLeftMasked32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::LogicalShiftLeftMasked64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::LogicalShiftLeftMasked64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::LogicalShiftRightMasked32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::LogicalShiftRightMasked32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::LogicalShiftRightMasked64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::LogicalShiftRightMasked64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ArithmeticShiftRightMasked32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ArithmeticShiftRightMasked32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ArithmeticShiftRightMasked64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ArithmeticShiftRightMasked64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::RotateRightMasked32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::RotateRightMasked32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::RotateRightMasked64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::RotateRightMasked64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<size_t bitsize> template<size_t bitsize>
@@ -264,7 +264,7 @@ static void AddImmWithFlags(biscuit::Assembler& as, biscuit::GPR rd, biscuit::GP
as.SLLI(Xscratch1, Xscratch1, 28); as.SLLI(Xscratch1, Xscratch1, 28);
as.OR(flags, flags, Xscratch1); as.OR(flags, flags, Xscratch1);
} else { } else {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} }
@@ -279,7 +279,7 @@ static void EmitAddSub(biscuit::Assembler& as, EmitContext& ctx, IR::Inst* inst)
auto Xa = ctx.reg_alloc.ReadX(args[0]); auto Xa = ctx.reg_alloc.ReadX(args[0]);
if (overflow_inst) { if (overflow_inst) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} else if (nzcv_inst) { } else if (nzcv_inst) {
if (args[1].IsImmediate()) { if (args[1].IsImmediate()) {
const u64 imm = args[1].GetImmediateU64(); const u64 imm = args[1].GetImmediateU64();
@@ -294,17 +294,17 @@ static void EmitAddSub(biscuit::Assembler& as, EmitContext& ctx, IR::Inst* inst)
AddImmWithFlags<bitsize>(as, *Xresult, *Xa, sub ? -imm : imm, *Xflags); AddImmWithFlags<bitsize>(as, *Xresult, *Xa, sub ? -imm : imm, *Xflags);
} }
} else { } else {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} else { } else {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} else { } else {
if (args[1].IsImmediate()) { if (args[1].IsImmediate()) {
const u64 imm = args[1].GetImmediateU64(); const u64 imm = args[1].GetImmediateU64();
if (args[2].IsImmediate()) { if (args[2].IsImmediate()) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} else { } else {
auto Xnzcv = ctx.reg_alloc.ReadX(args[2]); auto Xnzcv = ctx.reg_alloc.ReadX(args[2]);
RegAlloc::Realize(Xresult, Xa, Xnzcv); RegAlloc::Realize(Xresult, Xa, Xnzcv);
@@ -317,7 +317,7 @@ static void EmitAddSub(biscuit::Assembler& as, EmitContext& ctx, IR::Inst* inst)
as.ADDW(Xresult, Xa, Xscratch0); as.ADDW(Xresult, Xa, Xscratch0);
} }
} else { } else {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} }
} }
@@ -329,7 +329,7 @@ void EmitIR<IR::Opcode::Add32>(biscuit::Assembler& as, EmitContext& ctx, IR::Ins
template<> template<>
void EmitIR<IR::Opcode::Add64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Add64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
@@ -339,237 +339,237 @@ void EmitIR<IR::Opcode::Sub32>(biscuit::Assembler& as, EmitContext& ctx, IR::Ins
template<> template<>
void EmitIR<IR::Opcode::Sub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Sub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::Mul32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Mul32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::Mul64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Mul64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedMultiplyHigh64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedMultiplyHigh64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedMultiplyHigh64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedMultiplyHigh64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedDiv32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedDiv32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedDiv64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedDiv64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedDiv32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedDiv32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedDiv64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedDiv64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::And32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::And32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::And64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::And64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::AndNot32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::AndNot32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::AndNot64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::AndNot64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::Eor32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Eor32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::Eor64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Eor64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::Or32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Or32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::Or64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Or64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::Not32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Not32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::Not64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::Not64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignExtendByteToWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignExtendByteToWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignExtendHalfToWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignExtendHalfToWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignExtendByteToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignExtendByteToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignExtendHalfToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignExtendHalfToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignExtendWordToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignExtendWordToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ZeroExtendByteToWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ZeroExtendByteToWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ZeroExtendHalfToWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ZeroExtendHalfToWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ZeroExtendByteToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ZeroExtendByteToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ZeroExtendHalfToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ZeroExtendHalfToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ZeroExtendWordToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ZeroExtendWordToLong>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ZeroExtendLongToQuad>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ZeroExtendLongToQuad>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ByteReverseWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ByteReverseWord>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ByteReverseHalf>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ByteReverseHalf>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ByteReverseDual>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ByteReverseDual>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::CountLeadingZeros32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::CountLeadingZeros32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::CountLeadingZeros64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::CountLeadingZeros64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ExtractRegister32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ExtractRegister32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ExtractRegister64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ExtractRegister64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ReplicateBit32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ReplicateBit32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::ReplicateBit64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::ReplicateBit64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::MaxSigned32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::MaxSigned32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::MaxSigned64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::MaxSigned64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::MaxUnsigned32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::MaxUnsigned32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::MaxUnsigned64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::MaxUnsigned64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::MinSigned32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::MinSigned32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::MinSigned64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::MinSigned64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::MinUnsigned32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::MinUnsigned32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::MinUnsigned64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::MinUnsigned64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
@@ -22,442 +22,442 @@ namespace Dynarmic::Backend::RV64 {
template<> template<>
void EmitIR<IR::Opcode::FPAbs16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPAbs16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPAbs32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPAbs32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPAbs64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPAbs64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPCompare32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPCompare32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPCompare64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPCompare64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPDiv32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPDiv32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPDiv64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPDiv64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMax32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMax32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMax64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMax64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMaxNumeric32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMaxNumeric32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMaxNumeric64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMaxNumeric64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMin32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMin32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMin64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMin64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMinNumeric32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMinNumeric32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMinNumeric64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMinNumeric64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMul32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMul32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMul64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMul64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMulAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMulAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMulAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMulAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMulAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMulAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMulSub16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMulSub16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMulSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMulSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMulSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMulSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMulX32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMulX32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPMulX64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPMulX64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPNeg16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPNeg16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPNeg32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPNeg32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPNeg64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPNeg64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRecipEstimate16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRecipEstimate16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRecipEstimate32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRecipEstimate32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRecipEstimate64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRecipEstimate64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRecipExponent16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRecipExponent16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRecipExponent32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRecipExponent32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRecipExponent64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRecipExponent64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRecipStepFused16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRecipStepFused16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRecipStepFused32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRecipStepFused32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRecipStepFused64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRecipStepFused64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRoundInt16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRoundInt16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRoundInt32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRoundInt32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRoundInt64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRoundInt64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRSqrtEstimate16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRSqrtEstimate16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRSqrtEstimate32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRSqrtEstimate32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRSqrtEstimate64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRSqrtEstimate64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRSqrtStepFused16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRSqrtStepFused16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRSqrtStepFused32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRSqrtStepFused32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPRSqrtStepFused64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPRSqrtStepFused64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSqrt32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSqrt32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSqrt64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSqrt64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPHalfToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPHalfToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPHalfToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPHalfToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSingleToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSingleToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSingleToHalf>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSingleToHalf>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPDoubleToHalf>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPDoubleToHalf>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPDoubleToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPDoubleToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPDoubleToFixedS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPDoubleToFixedS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPDoubleToFixedS32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPDoubleToFixedS32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPDoubleToFixedS64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPDoubleToFixedS64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPDoubleToFixedU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPDoubleToFixedU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPDoubleToFixedU32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPDoubleToFixedU32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPDoubleToFixedU64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPDoubleToFixedU64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPHalfToFixedS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPHalfToFixedS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPHalfToFixedS32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPHalfToFixedS32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPHalfToFixedS64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPHalfToFixedS64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPHalfToFixedU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPHalfToFixedU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPHalfToFixedU32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPHalfToFixedU32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPHalfToFixedU64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPHalfToFixedU64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSingleToFixedS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSingleToFixedS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSingleToFixedS32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSingleToFixedS32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSingleToFixedS64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSingleToFixedS64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSingleToFixedU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSingleToFixedU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSingleToFixedU32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSingleToFixedU32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPSingleToFixedU64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPSingleToFixedU64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedU16ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedU16ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedS16ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedS16ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedU16ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedU16ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedS16ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedS16ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedU32ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedU32ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedS32ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedS32ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedU32ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedU32ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedS32ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedS32ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedU64ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedU64ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedU64ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedU64ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedS64ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedS64ToDouble>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPFixedS64ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPFixedS64ToSingle>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
@@ -22,172 +22,172 @@ namespace Dynarmic::Backend::RV64 {
template<> template<>
void EmitIR<IR::Opcode::PackedAddU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedAddU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedAddS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedAddS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSubU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSubU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSubS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSubS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedAddU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedAddU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedAddS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedAddS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSubU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSubU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSubS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSubS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedAddSubU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedAddSubU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedAddSubS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedAddSubS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSubAddU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSubAddU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSubAddS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSubAddS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingAddU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingAddU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingAddS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingAddS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingSubU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingSubU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingSubS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingSubS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingAddU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingAddU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingAddS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingAddS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingSubU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingSubU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingSubS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingSubS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingAddSubU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingAddSubU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingAddSubS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingAddSubS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingSubAddU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingSubAddU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedHalvingSubAddS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedHalvingSubAddS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSaturatedAddU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSaturatedAddU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSaturatedAddS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSaturatedAddS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSaturatedSubU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSaturatedSubU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSaturatedSubS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSaturatedSubS8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSaturatedAddU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSaturatedAddU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSaturatedAddS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSaturatedAddS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSaturatedSubU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSaturatedSubU16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSaturatedSubS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSaturatedSubS16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedAbsDiffSumU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedAbsDiffSumU8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::PackedSelect>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::PackedSelect>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
@@ -22,112 +22,112 @@ namespace Dynarmic::Backend::RV64 {
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedAddWithFlag32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedAddWithFlag32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedSubWithFlag32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedSubWithFlag32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturation>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturation>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedSaturation>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedSaturation>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedAdd8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedAdd8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedDoublingMultiplyReturnHigh16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedDoublingMultiplyReturnHigh16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedDoublingMultiplyReturnHigh32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedDoublingMultiplyReturnHigh32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedSub8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedSub8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedSub16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedSub16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::SignedSaturatedSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::SignedSaturatedSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedSaturatedAdd8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedSaturatedAdd8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedSaturatedAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedSaturatedAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedSaturatedAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedSaturatedAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedSaturatedAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedSaturatedAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedSaturatedSub8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedSaturatedSub8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedSaturatedSub16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedSaturatedSub16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedSaturatedSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedSaturatedSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::UnsignedSaturatedSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::UnsignedSaturatedSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
File diff suppressed because it is too large Load Diff
@@ -22,337 +22,337 @@ namespace Dynarmic::Backend::RV64 {
template<> template<>
void EmitIR<IR::Opcode::FPVectorAbs16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorAbs16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorAbs32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorAbs32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorAbs64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorAbs64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorDiv32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorDiv32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorDiv64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorDiv64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorEqual16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorEqual16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorEqual32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorEqual32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorEqual64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorEqual64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorFromHalf32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorFromHalf32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorFromSignedFixed32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorFromSignedFixed32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorFromSignedFixed64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorFromSignedFixed64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorFromUnsignedFixed32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorFromUnsignedFixed32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorFromUnsignedFixed64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorFromUnsignedFixed64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorGreater32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorGreater32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorGreater64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorGreater64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorGreaterEqual32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorGreaterEqual32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorGreaterEqual64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorGreaterEqual64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMax32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMax32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMax64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMax64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMaxNumeric32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMaxNumeric32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMaxNumeric64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMaxNumeric64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMin32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMin32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMin64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMin64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMinNumeric32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMinNumeric32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMinNumeric64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMinNumeric64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMul32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMul32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMul64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMul64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMulAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMulAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMulAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMulAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMulAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMulAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMulX32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMulX32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorMulX64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorMulX64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorNeg16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorNeg16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorNeg32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorNeg32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorNeg64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorNeg64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorPairedAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorPairedAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorPairedAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorPairedAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorPairedAddLower32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorPairedAddLower32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorPairedAddLower64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorPairedAddLower64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRecipEstimate16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRecipEstimate16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRecipEstimate32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRecipEstimate32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRecipEstimate64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRecipEstimate64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRecipStepFused16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRecipStepFused16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRecipStepFused32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRecipStepFused32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRecipStepFused64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRecipStepFused64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRoundInt16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRoundInt16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRoundInt32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRoundInt32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRoundInt64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRoundInt64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRSqrtEstimate16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRSqrtEstimate16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRSqrtEstimate32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRSqrtEstimate32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRSqrtEstimate64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRSqrtEstimate64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRSqrtStepFused16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRSqrtStepFused16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRSqrtStepFused32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRSqrtStepFused32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorRSqrtStepFused64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorRSqrtStepFused64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorSqrt32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorSqrt32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorSqrt64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorSqrt64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorToHalf32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorToHalf32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorToSignedFixed16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorToSignedFixed16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorToSignedFixed32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorToSignedFixed32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorToSignedFixed64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorToSignedFixed64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorToUnsignedFixed16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorToUnsignedFixed16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorToUnsignedFixed32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorToUnsignedFixed32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::FPVectorToUnsignedFixed64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::FPVectorToUnsignedFixed64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
@@ -22,82 +22,82 @@ namespace Dynarmic::Backend::RV64 {
template<> template<>
void EmitIR<IR::Opcode::VectorSignedSaturatedAdd8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorSignedSaturatedAdd8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorSignedSaturatedAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorSignedSaturatedAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorSignedSaturatedAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorSignedSaturatedAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorSignedSaturatedAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorSignedSaturatedAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorSignedSaturatedSub8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorSignedSaturatedSub8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorSignedSaturatedSub16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorSignedSaturatedSub16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorSignedSaturatedSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorSignedSaturatedSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorSignedSaturatedSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorSignedSaturatedSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorUnsignedSaturatedAdd8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorUnsignedSaturatedAdd8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorUnsignedSaturatedAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorUnsignedSaturatedAdd16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorUnsignedSaturatedAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorUnsignedSaturatedAdd32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorUnsignedSaturatedAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorUnsignedSaturatedAdd64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorUnsignedSaturatedSub8>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorUnsignedSaturatedSub8>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorUnsignedSaturatedSub16>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorUnsignedSaturatedSub16>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorUnsignedSaturatedSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorUnsignedSaturatedSub32>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
template<> template<>
void EmitIR<IR::Opcode::VectorUnsignedSaturatedSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) { void EmitIR<IR::Opcode::VectorUnsignedSaturatedSub64>(biscuit::Assembler&, EmitContext&, IR::Inst*) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} }
} // namespace Dynarmic::Backend::RV64 } // namespace Dynarmic::Backend::RV64
@@ -44,19 +44,19 @@ bool Argument::GetImmediateU1() const {
u8 Argument::GetImmediateU8() const { u8 Argument::GetImmediateU8() const {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm < 0x100); DEBUG_ASSERT(imm < 0x100);
return u8(imm); return u8(imm);
} }
u16 Argument::GetImmediateU16() const { u16 Argument::GetImmediateU16() const {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm < 0x10000); DEBUG_ASSERT(imm < 0x10000);
return u16(imm); return u16(imm);
} }
u32 Argument::GetImmediateU32() const { u32 Argument::GetImmediateU32() const {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm < 0x100000000); DEBUG_ASSERT(imm < 0x100000000);
return u32(imm); return u32(imm);
} }
@@ -65,12 +65,12 @@ u64 Argument::GetImmediateU64() const {
} }
IR::Cond Argument::GetImmediateCond() const { IR::Cond Argument::GetImmediateCond() const {
ASSERT(IsImmediate() && GetType() == IR::Type::Cond); DEBUG_ASSERT(IsImmediate() && GetType() == IR::Type::Cond);
return value.GetCond(); return value.GetCond();
} }
IR::AccType Argument::GetImmediateAccType() const { IR::AccType Argument::GetImmediateAccType() const {
ASSERT(IsImmediate() && GetType() == IR::Type::AccType); DEBUG_ASSERT(IsImmediate() && GetType() == IR::Type::AccType);
return value.GetAccType(); return value.GetAccType();
} }
@@ -79,7 +79,7 @@ bool HostLocInfo::Contains(const IR::Inst* value) const {
} }
void HostLocInfo::SetupScratchLocation() { void HostLocInfo::SetupScratchLocation() {
ASSERT(IsCompletelyEmpty()); DEBUG_ASSERT(IsCompletelyEmpty());
realized = true; realized = true;
} }
@@ -104,7 +104,7 @@ RegAlloc::ArgumentInfo RegAlloc::GetArgumentInfo(IR::Inst* inst) {
const IR::Value arg = inst->GetArg(i); const IR::Value arg = inst->GetArg(i);
ret[i].value = arg; ret[i].value = arg;
if (!arg.IsImmediate() && !IsValuelessType(arg.GetType())) { if (!arg.IsImmediate() && !IsValuelessType(arg.GetType())) {
ASSERT(ValueLocation(arg.GetInst()) && "argument must already been defined"); DEBUG_ASSERT(ValueLocation(arg.GetInst()) && "argument must already been defined");
ValueInfo(arg.GetInst()).uses_this_inst++; ValueInfo(arg.GetInst()).uses_this_inst++;
} }
} }
@@ -128,7 +128,7 @@ void RegAlloc::UpdateAllUses() {
} }
void RegAlloc::DefineAsExisting(IR::Inst* inst, Argument& arg) { void RegAlloc::DefineAsExisting(IR::Inst* inst, Argument& arg) {
ASSERT(!ValueLocation(inst)); DEBUG_ASSERT(!ValueLocation(inst));
if (arg.value.IsImmediate()) { if (arg.value.IsImmediate()) {
inst->ReplaceUsesWith(arg.value); inst->ReplaceUsesWith(arg.value);
@@ -142,15 +142,15 @@ void RegAlloc::DefineAsExisting(IR::Inst* inst, Argument& arg) {
void RegAlloc::AssertNoMoreUses() const { void RegAlloc::AssertNoMoreUses() const {
const auto is_empty = [](const auto& i) { return i.IsCompletelyEmpty(); }; const auto is_empty = [](const auto& i) { return i.IsCompletelyEmpty(); };
ASSERT(std::all_of(gprs.begin(), gprs.end(), is_empty)); DEBUG_ASSERT(std::all_of(gprs.begin(), gprs.end(), is_empty));
ASSERT(std::all_of(fprs.begin(), fprs.end(), is_empty)); DEBUG_ASSERT(std::all_of(fprs.begin(), fprs.end(), is_empty));
ASSERT(std::all_of(spills.begin(), spills.end(), is_empty)); DEBUG_ASSERT(std::all_of(spills.begin(), spills.end(), is_empty));
} }
template<HostLoc::Kind kind> template<HostLoc::Kind kind>
u32 RegAlloc::GenerateImmediate(const IR::Value& value) { u32 RegAlloc::GenerateImmediate(const IR::Value& value) {
// TODO // TODO
// ASSERT(value.GetType() != IR::Type::U1); // DEBUG_ASSERT(value.GetType() != IR::Type::U1);
if constexpr (kind == HostLoc::Kind::Gpr) { if constexpr (kind == HostLoc::Kind::Gpr) {
const u32 new_location_index = AllocateRegister(gprs, gpr_order); const u32 new_location_index = AllocateRegister(gprs, gpr_order);
@@ -161,7 +161,7 @@ u32 RegAlloc::GenerateImmediate(const IR::Value& value) {
return new_location_index; return new_location_index;
} else if constexpr (kind == HostLoc::Kind::Fpr) { } else if constexpr (kind == HostLoc::Kind::Fpr) {
ASSERT(false && "Unimplemented instruction"); DEBUG_ASSERT(false && "Unimplemented instruction");
} else { } else {
UNREACHABLE(); UNREACHABLE();
} }
@@ -175,15 +175,15 @@ u32 RegAlloc::RealizeReadImpl(const IR::Value& value) {
} }
const auto current_location = ValueLocation(value.GetInst()); const auto current_location = ValueLocation(value.GetInst());
ASSERT(current_location); DEBUG_ASSERT(current_location);
if (current_location->kind == required_kind) { if (current_location->kind == required_kind) {
ValueInfo(*current_location).realized = true; ValueInfo(*current_location).realized = true;
return current_location->index; return current_location->index;
} }
ASSERT(!ValueInfo(*current_location).realized); DEBUG_ASSERT(!ValueInfo(*current_location).realized);
ASSERT(!ValueInfo(*current_location).locked); DEBUG_ASSERT(!ValueInfo(*current_location).locked);
if constexpr (required_kind == HostLoc::Kind::Gpr) { if constexpr (required_kind == HostLoc::Kind::Gpr) {
const u32 new_location_index = AllocateRegister(gprs, gpr_order); const u32 new_location_index = AllocateRegister(gprs, gpr_order);
@@ -194,7 +194,7 @@ u32 RegAlloc::RealizeReadImpl(const IR::Value& value) {
UNREACHABLE(); //logic error UNREACHABLE(); //logic error
case HostLoc::Kind::Fpr: case HostLoc::Kind::Fpr:
as.FMV_X_D(biscuit::GPR(new_location_index), biscuit::FPR{current_location->index}); as.FMV_X_D(biscuit::GPR(new_location_index), biscuit::FPR{current_location->index});
// ASSERT size fits // DEBUG_ASSERT size fits
break; break;
case HostLoc::Kind::Spill: case HostLoc::Kind::Spill:
as.LD(biscuit::GPR{new_location_index}, spill_offset + current_location->index * spill_slot_size, biscuit::sp); as.LD(biscuit::GPR{new_location_index}, spill_offset + current_location->index * spill_slot_size, biscuit::sp);
@@ -229,7 +229,7 @@ u32 RegAlloc::RealizeReadImpl(const IR::Value& value) {
template<HostLoc::Kind required_kind> template<HostLoc::Kind required_kind>
u32 RegAlloc::RealizeWriteImpl(const IR::Inst* value) { u32 RegAlloc::RealizeWriteImpl(const IR::Inst* value) {
ASSERT(!ValueLocation(value)); DEBUG_ASSERT(!ValueLocation(value));
const auto setup_location = [&](HostLocInfo& info) { const auto setup_location = [&](HostLocInfo& info) {
info = {}; info = {};
@@ -274,7 +274,7 @@ u32 RegAlloc::AllocateRegister(const std::array<HostLocInfo, 32>& regs, const st
} }
void RegAlloc::SpillGpr(u32 index) { void RegAlloc::SpillGpr(u32 index) {
ASSERT(!gprs[index].locked && !gprs[index].realized); DEBUG_ASSERT(!gprs[index].locked && !gprs[index].realized);
if (gprs[index].values.empty()) { if (gprs[index].values.empty()) {
return; return;
} }
@@ -284,7 +284,7 @@ void RegAlloc::SpillGpr(u32 index) {
} }
void RegAlloc::SpillFpr(u32 index) { void RegAlloc::SpillFpr(u32 index) {
ASSERT(!fprs[index].locked && !fprs[index].realized); DEBUG_ASSERT(!fprs[index].locked && !fprs[index].realized);
if (fprs[index].values.empty()) { if (fprs[index].values.empty()) {
return; return;
} }
@@ -295,7 +295,7 @@ void RegAlloc::SpillFpr(u32 index) {
u32 RegAlloc::FindFreeSpill() const { u32 RegAlloc::FindFreeSpill() const {
const auto iter = std::find_if(spills.begin(), spills.end(), [](const HostLocInfo& info) { return info.values.empty(); }); const auto iter = std::find_if(spills.begin(), spills.end(), [](const HostLocInfo& info) { return info.values.empty(); });
ASSERT(iter != spills.end() && "All spill locations are full"); DEBUG_ASSERT(iter != spills.end() && "All spill locations are full");
return static_cast<u32>(iter - spills.begin()); return static_cast<u32>(iter - spills.begin());
} }
@@ -209,11 +209,11 @@ void A32EmitX64::InvalidateCacheRanges(const boost::icl::interval_set<u32>& rang
void A32EmitX64::EmitCondPrelude(const A32EmitContext& ctx) { void A32EmitX64::EmitCondPrelude(const A32EmitContext& ctx) {
if (ctx.block.GetCondition() == IR::Cond::AL) { if (ctx.block.GetCondition() == IR::Cond::AL) {
ASSERT(!ctx.block.HasConditionFailedLocation()); DEBUG_ASSERT(!ctx.block.HasConditionFailedLocation());
return; return;
} }
ASSERT(ctx.block.HasConditionFailedLocation()); DEBUG_ASSERT(ctx.block.HasConditionFailedLocation());
Xbyak::Label pass = EmitCond(ctx.block.GetCondition()); Xbyak::Label pass = EmitCond(ctx.block.GetCondition());
if (conf.enable_cycle_counting) { if (conf.enable_cycle_counting) {
@@ -311,7 +311,7 @@ void A32EmitX64::EmitA32GetRegister(A32EmitContext& ctx, IR::Inst* inst) {
void A32EmitX64::EmitA32GetExtendedRegister32(A32EmitContext& ctx, IR::Inst* inst) { void A32EmitX64::EmitA32GetExtendedRegister32(A32EmitContext& ctx, IR::Inst* inst) {
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsSingleExtReg(reg)); DEBUG_ASSERT(A32::IsSingleExtReg(reg));
const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code);
code.movss(result, MJitStateExtReg(reg)); code.movss(result, MJitStateExtReg(reg));
@@ -320,7 +320,7 @@ void A32EmitX64::EmitA32GetExtendedRegister32(A32EmitContext& ctx, IR::Inst* ins
void A32EmitX64::EmitA32GetExtendedRegister64(A32EmitContext& ctx, IR::Inst* inst) { void A32EmitX64::EmitA32GetExtendedRegister64(A32EmitContext& ctx, IR::Inst* inst) {
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsDoubleExtReg(reg)); DEBUG_ASSERT(A32::IsDoubleExtReg(reg));
const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code);
code.movsd(result, MJitStateExtReg(reg)); code.movsd(result, MJitStateExtReg(reg));
@@ -329,7 +329,7 @@ void A32EmitX64::EmitA32GetExtendedRegister64(A32EmitContext& ctx, IR::Inst* ins
void A32EmitX64::EmitA32GetVector(A32EmitContext& ctx, IR::Inst* inst) { void A32EmitX64::EmitA32GetVector(A32EmitContext& ctx, IR::Inst* inst) {
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg)); DEBUG_ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg));
const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code);
if (A32::IsDoubleExtReg(reg)) { if (A32::IsDoubleExtReg(reg)) {
@@ -358,7 +358,7 @@ void A32EmitX64::EmitA32SetRegister(A32EmitContext& ctx, IR::Inst* inst) {
void A32EmitX64::EmitA32SetExtendedRegister32(A32EmitContext& ctx, IR::Inst* inst) { void A32EmitX64::EmitA32SetExtendedRegister32(A32EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsSingleExtReg(reg)); DEBUG_ASSERT(A32::IsSingleExtReg(reg));
if (args[1].IsInXmm(ctx.reg_alloc)) { if (args[1].IsInXmm(ctx.reg_alloc)) {
Xbyak::Xmm to_store = ctx.reg_alloc.UseXmm(code, args[1]); Xbyak::Xmm to_store = ctx.reg_alloc.UseXmm(code, args[1]);
@@ -372,7 +372,7 @@ void A32EmitX64::EmitA32SetExtendedRegister32(A32EmitContext& ctx, IR::Inst* ins
void A32EmitX64::EmitA32SetExtendedRegister64(A32EmitContext& ctx, IR::Inst* inst) { void A32EmitX64::EmitA32SetExtendedRegister64(A32EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsDoubleExtReg(reg)); DEBUG_ASSERT(A32::IsDoubleExtReg(reg));
if (args[1].IsInXmm(ctx.reg_alloc)) { if (args[1].IsInXmm(ctx.reg_alloc)) {
const Xbyak::Xmm to_store = ctx.reg_alloc.UseXmm(code, args[1]); const Xbyak::Xmm to_store = ctx.reg_alloc.UseXmm(code, args[1]);
@@ -386,7 +386,7 @@ void A32EmitX64::EmitA32SetExtendedRegister64(A32EmitContext& ctx, IR::Inst* ins
void A32EmitX64::EmitA32SetVector(A32EmitContext& ctx, IR::Inst* inst) { void A32EmitX64::EmitA32SetVector(A32EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef(); const A32::ExtReg reg = inst->GetArg(0).GetA32ExtRegRef();
ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg)); DEBUG_ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg));
const Xbyak::Xmm to_store = ctx.reg_alloc.UseXmm(code, args[1]); const Xbyak::Xmm to_store = ctx.reg_alloc.UseXmm(code, args[1]);
if (A32::IsDoubleExtReg(reg)) { if (A32::IsDoubleExtReg(reg)) {
@@ -647,7 +647,7 @@ void A32EmitX64::EmitA32GetGEFlags(A32EmitContext& ctx, IR::Inst* inst) {
void A32EmitX64::EmitA32SetGEFlags(A32EmitContext& ctx, IR::Inst* inst) { void A32EmitX64::EmitA32SetGEFlags(A32EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(!args[0].IsImmediate()); DEBUG_ASSERT(!args[0].IsImmediate());
if (args[0].IsInXmm(ctx.reg_alloc)) { if (args[0].IsInXmm(ctx.reg_alloc)) {
const Xbyak::Xmm to_store = ctx.reg_alloc.UseXmm(code, args[0]); const Xbyak::Xmm to_store = ctx.reg_alloc.UseXmm(code, args[0]);
@@ -788,7 +788,7 @@ void A32EmitX64::EmitA32ExceptionRaised(A32EmitContext& ctx, IR::Inst* inst) {
ctx.reg_alloc.EndOfAllocScope(); ctx.reg_alloc.EndOfAllocScope();
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[0].IsImmediate() && args[1].IsImmediate()); DEBUG_ASSERT(args[0].IsImmediate() && args[1].IsImmediate());
const u32 pc = args[0].GetImmediateU32(); const u32 pc = args[0].GetImmediateU32();
const u64 exception = args[1].GetImmediateU64(); const u64 exception = args[1].GetImmediateU64();
Devirtualize<&A32::UserCallbacks::ExceptionRaised>(conf.callbacks).EmitCall(code, [&](RegList param) { Devirtualize<&A32::UserCallbacks::ExceptionRaised>(conf.callbacks).EmitCall(code, [&](RegList param) {
@@ -74,7 +74,7 @@ struct Jit::Impl {
~Impl() = default; ~Impl() = default;
HaltReason Run() { HaltReason Run() {
ASSERT(!jit_interface->is_executing); DEBUG_ASSERT(!jit_interface->is_executing);
PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&jit_state.halt_reason))); PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&jit_state.halt_reason)));
jit_interface->is_executing = true; jit_interface->is_executing = true;
const CodePtr current_codeptr = [this] { const CodePtr current_codeptr = [this] {
@@ -94,7 +94,7 @@ struct Jit::Impl {
} }
HaltReason Step() { HaltReason Step() {
ASSERT(!jit_interface->is_executing); DEBUG_ASSERT(!jit_interface->is_executing);
PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&jit_state.halt_reason))); PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&jit_state.halt_reason)));
jit_interface->is_executing = true; jit_interface->is_executing = true;
const HaltReason hr = block_of_code.StepCode(&jit_state, GetCurrentSingleStep()); const HaltReason hr = block_of_code.StepCode(&jit_state, GetCurrentSingleStep());
@@ -116,7 +116,7 @@ struct Jit::Impl {
} }
void Reset() { void Reset() {
ASSERT(!jit_interface->is_executing); DEBUG_ASSERT(!jit_interface->is_executing);
jit_state = {}; jit_state = {};
} }
@@ -501,7 +501,7 @@ void A64EmitX64::EmitA64SetPC(A64EmitContext& ctx, IR::Inst* inst) {
void A64EmitX64::EmitA64CallSupervisor(A64EmitContext& ctx, IR::Inst* inst) { void A64EmitX64::EmitA64CallSupervisor(A64EmitContext& ctx, IR::Inst* inst) {
ctx.reg_alloc.HostCall(code, nullptr); ctx.reg_alloc.HostCall(code, nullptr);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[0].IsImmediate()); DEBUG_ASSERT(args[0].IsImmediate());
const u32 imm = args[0].GetImmediateU32(); const u32 imm = args[0].GetImmediateU32();
Devirtualize<&A64::UserCallbacks::CallSVC>(conf.callbacks).EmitCall(code, [&](RegList param) { Devirtualize<&A64::UserCallbacks::CallSVC>(conf.callbacks).EmitCall(code, [&](RegList param) {
code.mov(param[0], imm); code.mov(param[0], imm);
@@ -513,7 +513,7 @@ void A64EmitX64::EmitA64CallSupervisor(A64EmitContext& ctx, IR::Inst* inst) {
void A64EmitX64::EmitA64ExceptionRaised(A64EmitContext& ctx, IR::Inst* inst) { void A64EmitX64::EmitA64ExceptionRaised(A64EmitContext& ctx, IR::Inst* inst) {
ctx.reg_alloc.HostCall(code, nullptr); ctx.reg_alloc.HostCall(code, nullptr);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[0].IsImmediate() && args[1].IsImmediate()); DEBUG_ASSERT(args[0].IsImmediate() && args[1].IsImmediate());
const u64 pc = args[0].GetImmediateU64(); const u64 pc = args[0].GetImmediateU64();
const u64 exception = args[1].GetImmediateU64(); const u64 exception = args[1].GetImmediateU64();
Devirtualize<&A64::UserCallbacks::ExceptionRaised>(conf.callbacks).EmitCall(code, [&](RegList param) { Devirtualize<&A64::UserCallbacks::ExceptionRaised>(conf.callbacks).EmitCall(code, [&](RegList param) {
@@ -66,13 +66,13 @@ public:
, emitter(block_of_code, conf, jit) , emitter(block_of_code, conf, jit)
, polyfill_options(GenPolyfillOptions(block_of_code)) , polyfill_options(GenPolyfillOptions(block_of_code))
{ {
ASSERT(conf.page_table_address_space_bits >= 12 && conf.page_table_address_space_bits <= 64); DEBUG_ASSERT(conf.page_table_address_space_bits >= 12 && conf.page_table_address_space_bits <= 64);
} }
~Impl() = default; ~Impl() = default;
HaltReason Run() { HaltReason Run() {
ASSERT(!is_executing); DEBUG_ASSERT(!is_executing);
PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&jit_state.halt_reason))); PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&jit_state.halt_reason)));
is_executing = true; is_executing = true;
// TODO: Check code alignment // TODO: Check code alignment
@@ -92,7 +92,7 @@ public:
} }
HaltReason Step() { HaltReason Step() {
ASSERT(!is_executing); DEBUG_ASSERT(!is_executing);
PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&jit_state.halt_reason))); PerformRequestedCacheInvalidation(static_cast<HaltReason>(Atomic::Load(&jit_state.halt_reason)));
is_executing = true; is_executing = true;
const HaltReason hr = block_of_code.StepCode(&jit_state, GetCurrentSingleStep()); const HaltReason hr = block_of_code.StepCode(&jit_state, GetCurrentSingleStep());
@@ -116,7 +116,7 @@ public:
} }
void Reset() { void Reset() {
ASSERT(!is_executing); DEBUG_ASSERT(!is_executing);
jit_state = {}; jit_state = {};
} }
@@ -191,12 +191,12 @@ void BlockOfCode::DisableWriting() {
} }
void BlockOfCode::ClearCache() { void BlockOfCode::ClearCache() {
ASSERT(prelude_complete); DEBUG_ASSERT(prelude_complete);
SetCodePtr(code_begin); SetCodePtr(code_begin);
} }
size_t BlockOfCode::SpaceRemaining() const { size_t BlockOfCode::SpaceRemaining() const {
ASSERT(prelude_complete); DEBUG_ASSERT(prelude_complete);
const u8* current_ptr = getCurr<const u8*>(); const u8* current_ptr = getCurr<const u8*>();
if (current_ptr >= &top_[maxSize_]) if (current_ptr >= &top_[maxSize_])
return 0; return 0;
@@ -466,7 +466,7 @@ void BlockOfCode::SetCodePtr(CodePtr code_ptr) {
void BlockOfCode::EnsurePatchLocationSize(CodePtr begin, size_t size) { void BlockOfCode::EnsurePatchLocationSize(CodePtr begin, size_t size) {
size_t current_size = getCurr<const u8*>() - reinterpret_cast<const u8*>(begin); size_t current_size = getCurr<const u8*>() - reinterpret_cast<const u8*>(begin);
ASSERT(current_size <= size); DEBUG_ASSERT(current_size <= size);
nop(size - current_size); nop(size - current_size);
} }
@@ -28,7 +28,7 @@ Xbyak::Address ConstantPool::GetConstant(BlockOfCode& code, const Xbyak::Address
const auto constant = ConstantT(lower, upper); const auto constant = ConstantT(lower, upper);
auto it = constant_info.find(constant); auto it = constant_info.find(constant);
if (it == constant_info.end()) { if (it == constant_info.end()) {
ASSERT(insertion_point < pool.size()); DEBUG_ASSERT(insertion_point < pool.size());
ConstantT& target_constant = pool[insertion_point]; ConstantT& target_constant = pool[insertion_point];
target_constant = constant; target_constant = constant;
it = constant_info.insert({constant, &target_constant}).first; it = constant_info.insert({constant, &target_constant}).first;
@@ -148,7 +148,7 @@ void EmitX64::EmitVerboseDebuggingOutput(RegAlloc& reg_alloc) {
void EmitX64::EmitPushRSB(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitPushRSB(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[0].IsImmediate()); DEBUG_ASSERT(args[0].IsImmediate());
const u64 unique_hash_of_target = args[0].GetImmediateU64(); const u64 unique_hash_of_target = args[0].GetImmediateU64();
ctx.reg_alloc.ScratchGpr(code, HostLoc::RCX); ctx.reg_alloc.ScratchGpr(code, HostLoc::RCX);
@@ -288,7 +288,7 @@ void EmitX64::EmitNZCVFromPackedFlags(EmitContext& ctx, IR::Inst* inst) {
} }
void EmitX64::EmitAddCycles(size_t cycles) { void EmitX64::EmitAddCycles(size_t cycles) {
ASSERT(cycles < (std::numeric_limits<s32>::max)()); DEBUG_ASSERT(cycles < (std::numeric_limits<s32>::max)());
code.sub(qword[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, cycles_remaining)], static_cast<u32>(cycles)); code.sub(qword[rsp + ABI_SHADOW_SPACE + offsetof(StackLayout, cycles_remaining)], static_cast<u32>(cycles));
} }
@@ -129,7 +129,7 @@ void EmitX64::EmitIsZero64(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitTestBit(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitTestBit(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const Xbyak::Reg64 result = ctx.reg_alloc.UseScratchGpr(code, args[0]); const Xbyak::Reg64 result = ctx.reg_alloc.UseScratchGpr(code, args[0]);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
// TODO: Flag optimization // TODO: Flag optimization
code.bt(result, args[1].GetImmediateU8()); code.bt(result, args[1].GetImmediateU8());
code.setc(result.cvt8()); code.setc(result.cvt8());
@@ -1842,7 +1842,7 @@ void EmitX64::EmitFPFixedS32ToSingle(EmitContext& ctx, IR::Inst* inst) {
if (rounding_mode == ctx.FPCR().RMode() || ctx.HasOptimization(OptimizationFlag::Unsafe_IgnoreStandardFPCRValue)) { if (rounding_mode == ctx.FPCR().RMode() || ctx.HasOptimization(OptimizationFlag::Unsafe_IgnoreStandardFPCRValue)) {
code.cvtsi2ss(result, from); code.cvtsi2ss(result, from);
} else { } else {
ASSERT(rounding_mode == FP::RoundingMode::ToNearest_TieEven); DEBUG_ASSERT(rounding_mode == FP::RoundingMode::ToNearest_TieEven);
code.EnterStandardASIMD(); code.EnterStandardASIMD();
code.cvtsi2ss(result, from); code.cvtsi2ss(result, from);
code.LeaveStandardASIMD(); code.LeaveStandardASIMD();
@@ -1878,7 +1878,7 @@ void EmitX64::EmitFPFixedU32ToSingle(EmitContext& ctx, IR::Inst* inst) {
if (rounding_mode == ctx.FPCR().RMode() || ctx.HasOptimization(OptimizationFlag::Unsafe_IgnoreStandardFPCRValue)) { if (rounding_mode == ctx.FPCR().RMode() || ctx.HasOptimization(OptimizationFlag::Unsafe_IgnoreStandardFPCRValue)) {
op(); op();
} else { } else {
ASSERT(rounding_mode == FP::RoundingMode::ToNearest_TieEven); DEBUG_ASSERT(rounding_mode == FP::RoundingMode::ToNearest_TieEven);
code.EnterStandardASIMD(); code.EnterStandardASIMD();
op(); op();
code.LeaveStandardASIMD(); code.LeaveStandardASIMD();
@@ -1984,7 +1984,7 @@ void EmitX64::EmitFPFixedS64ToDouble(EmitContext& ctx, IR::Inst* inst) {
const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code);
const size_t fbits = args[1].GetImmediateU8(); const size_t fbits = args[1].GetImmediateU8();
const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8()); const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8());
ASSERT(rounding_mode == ctx.FPCR().RMode()); DEBUG_ASSERT(rounding_mode == ctx.FPCR().RMode());
code.cvtsi2sd(result, from); code.cvtsi2sd(result, from);
@@ -2003,7 +2003,7 @@ void EmitX64::EmitFPFixedS64ToSingle(EmitContext& ctx, IR::Inst* inst) {
const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code);
const size_t fbits = args[1].GetImmediateU8(); const size_t fbits = args[1].GetImmediateU8();
const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8()); const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8());
ASSERT(rounding_mode == ctx.FPCR().RMode()); DEBUG_ASSERT(rounding_mode == ctx.FPCR().RMode());
code.cvtsi2ss(result, from); code.cvtsi2ss(result, from);
@@ -2022,7 +2022,7 @@ void EmitX64::EmitFPFixedU64ToDouble(EmitContext& ctx, IR::Inst* inst) {
const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code);
const size_t fbits = args[1].GetImmediateU8(); const size_t fbits = args[1].GetImmediateU8();
const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8()); const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8());
ASSERT(rounding_mode == ctx.FPCR().RMode()); DEBUG_ASSERT(rounding_mode == ctx.FPCR().RMode());
if (code.HasHostFeature(HostFeature::AVX512F)) { if (code.HasHostFeature(HostFeature::AVX512F)) {
code.vcvtusi2sd(result, result, from); code.vcvtusi2sd(result, result, from);
@@ -2053,7 +2053,7 @@ void EmitX64::EmitFPFixedU64ToSingle(EmitContext& ctx, IR::Inst* inst) {
const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code);
const size_t fbits = args[1].GetImmediateU8(); const size_t fbits = args[1].GetImmediateU8();
const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8()); const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8());
ASSERT(rounding_mode == ctx.FPCR().RMode()); DEBUG_ASSERT(rounding_mode == ctx.FPCR().RMode());
if (code.HasHostFeature(HostFeature::AVX512F)) { if (code.HasHostFeature(HostFeature::AVX512F)) {
const Xbyak::Reg64 from = ctx.reg_alloc.UseGpr(code, args[0]); const Xbyak::Reg64 from = ctx.reg_alloc.UseGpr(code, args[0]);
@@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project. /* This file is part of the dynarmic project.
* Copyright (c) 2022 MerryMage * Copyright (c) 2022 MerryMage
* SPDX-License-Identifier: 0BSD * SPDX-License-Identifier: 0BSD
@@ -113,7 +116,7 @@ void AxxEmitX64::EmitMemoryRead(AxxEmitContext& ctx, IR::Inst* inst) {
}); });
} else { } else {
// Use page table // Use page table
ASSERT(conf.page_table); DEBUG_ASSERT(conf.page_table);
const auto src_ptr = EmitVAddrLookup(code, ctx, bitsize, *abort, vaddr); const auto src_ptr = EmitVAddrLookup(code, ctx, bitsize, *abort, vaddr);
EmitReadMemoryMov<bitsize>(code, value_idx, src_ptr, ordered); EmitReadMemoryMov<bitsize>(code, value_idx, src_ptr, ordered);
@@ -200,7 +203,7 @@ void AxxEmitX64::EmitMemoryWrite(AxxEmitContext& ctx, IR::Inst* inst) {
}); });
} else { } else {
// Use page table // Use page table
ASSERT(conf.page_table); DEBUG_ASSERT(conf.page_table);
const auto dest_ptr = EmitVAddrLookup(code, ctx, bitsize, *abort, vaddr); const auto dest_ptr = EmitVAddrLookup(code, ctx, bitsize, *abort, vaddr);
EmitWriteMemoryMov<bitsize>(code, dest_ptr, value_idx, ordered); EmitWriteMemoryMov<bitsize>(code, dest_ptr, value_idx, ordered);
@@ -216,7 +219,7 @@ void AxxEmitX64::EmitMemoryWrite(AxxEmitContext& ctx, IR::Inst* inst) {
template<std::size_t bitsize, auto callback> template<std::size_t bitsize, auto callback>
void AxxEmitX64::EmitExclusiveReadMemory(AxxEmitContext& ctx, IR::Inst* inst) { void AxxEmitX64::EmitExclusiveReadMemory(AxxEmitContext& ctx, IR::Inst* inst) {
ASSERT(conf.global_monitor != nullptr); DEBUG_ASSERT(conf.global_monitor != nullptr);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const bool ordered = IsOrdered(args[2].GetImmediateAccType()); const bool ordered = IsOrdered(args[2].GetImmediateAccType());
@@ -267,7 +270,7 @@ void AxxEmitX64::EmitExclusiveReadMemory(AxxEmitContext& ctx, IR::Inst* inst) {
template<std::size_t bitsize, auto callback> template<std::size_t bitsize, auto callback>
void AxxEmitX64::EmitExclusiveWriteMemory(AxxEmitContext& ctx, IR::Inst* inst) { void AxxEmitX64::EmitExclusiveWriteMemory(AxxEmitContext& ctx, IR::Inst* inst) {
ASSERT(conf.global_monitor != nullptr); DEBUG_ASSERT(conf.global_monitor != nullptr);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const bool ordered = IsOrdered(args[3].GetImmediateAccType()); const bool ordered = IsOrdered(args[3].GetImmediateAccType());
@@ -320,7 +323,7 @@ void AxxEmitX64::EmitExclusiveWriteMemory(AxxEmitContext& ctx, IR::Inst* inst) {
template<std::size_t bitsize, auto callback> template<std::size_t bitsize, auto callback>
void AxxEmitX64::EmitExclusiveReadMemoryInline(AxxEmitContext& ctx, IR::Inst* inst) { void AxxEmitX64::EmitExclusiveReadMemoryInline(AxxEmitContext& ctx, IR::Inst* inst) {
ASSERT(conf.global_monitor && conf.fastmem_pointer); DEBUG_ASSERT(conf.global_monitor && conf.fastmem_pointer);
if (!exception_handler.SupportsFastmem()) { if (!exception_handler.SupportsFastmem()) {
EmitExclusiveReadMemory<bitsize, callback>(ctx, inst); EmitExclusiveReadMemory<bitsize, callback>(ctx, inst);
return; return;
@@ -397,7 +400,7 @@ void AxxEmitX64::EmitExclusiveReadMemoryInline(AxxEmitContext& ctx, IR::Inst* in
template<std::size_t bitsize, auto callback> template<std::size_t bitsize, auto callback>
void AxxEmitX64::EmitExclusiveWriteMemoryInline(AxxEmitContext& ctx, IR::Inst* inst) { void AxxEmitX64::EmitExclusiveWriteMemoryInline(AxxEmitContext& ctx, IR::Inst* inst) {
ASSERT(conf.global_monitor && conf.fastmem_pointer); DEBUG_ASSERT(conf.global_monitor && conf.fastmem_pointer);
if (!exception_handler.SupportsFastmem()) { if (!exception_handler.SupportsFastmem()) {
EmitExclusiveWriteMemory<bitsize, callback>(ctx, inst); EmitExclusiveWriteMemory<bitsize, callback>(ctx, inst);
return; return;
@@ -148,7 +148,7 @@ template<>
code.and_(tmp, u32((1 << valid_page_index_bits) - 1)); code.and_(tmp, u32((1 << valid_page_index_bits) - 1));
} }
} else { } else {
ASSERT(valid_page_index_bits < 32); DEBUG_ASSERT(valid_page_index_bits < 32);
code.mov(tmp, vaddr); code.mov(tmp, vaddr);
code.shr(tmp, int(page_table_const_bits)); code.shr(tmp, int(page_table_const_bits));
code.test(tmp, u32(-(1 << valid_page_index_bits))); code.test(tmp, u32(-(1 << valid_page_index_bits)));
@@ -118,7 +118,7 @@ void EmitX64::EmitSignedSaturation(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const size_t N = args[1].GetImmediateU8(); const size_t N = args[1].GetImmediateU8();
ASSERT(N >= 1 && N <= 32); DEBUG_ASSERT(N >= 1 && N <= 32);
if (N == 32) { if (N == 32) {
if (overflow_inst) { if (overflow_inst) {
@@ -167,7 +167,7 @@ void EmitX64::EmitUnsignedSaturation(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const size_t N = args[1].GetImmediateU8(); const size_t N = args[1].GetImmediateU8();
ASSERT(N <= 31); DEBUG_ASSERT(N <= 31);
const u32 saturated_value = (1u << N) - 1; const u32 saturated_value = (1u << N) - 1;
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project. /* This file is part of the dynarmic project.
@@ -18,7 +18,7 @@ void EmitX64::EmitSHA256Hash(EmitContext& ctx, IR::Inst* inst) {
const bool part1 = args[3].GetImmediateU1(); const bool part1 = args[3].GetImmediateU1();
ASSERT(code.HasHostFeature(HostFeature::SHA)); DEBUG_ASSERT(code.HasHostFeature(HostFeature::SHA));
// 3 2 1 0 // 3 2 1 0
// x = d c b a // x = d c b a
@@ -54,7 +54,7 @@ void EmitX64::EmitSHA256Hash(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitSHA256MessageSchedule0(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitSHA256MessageSchedule0(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(code.HasHostFeature(HostFeature::SHA)); DEBUG_ASSERT(code.HasHostFeature(HostFeature::SHA));
const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]);
const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]);
@@ -67,7 +67,7 @@ void EmitX64::EmitSHA256MessageSchedule0(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitSHA256MessageSchedule1(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitSHA256MessageSchedule1(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(code.HasHostFeature(HostFeature::SHA)); DEBUG_ASSERT(code.HasHostFeature(HostFeature::SHA));
const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]); const Xbyak::Xmm x = ctx.reg_alloc.UseScratchXmm(code, args[0]);
const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]); const Xbyak::Xmm y = ctx.reg_alloc.UseXmm(code, args[1]);
@@ -177,7 +177,7 @@ static void EmitTwoArgumentFallback(BlockOfCode& code, EmitContext& ctx, IR::Ins
void EmitX64::EmitVectorGetElement8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorGetElement8(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
// TODO: DefineValue directly on Argument for index == 0 // TODO: DefineValue directly on Argument for index == 0
@@ -201,7 +201,7 @@ void EmitX64::EmitVectorGetElement8(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorGetElement16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorGetElement16(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
// TODO: DefineValue directly on Argument for index == 0 // TODO: DefineValue directly on Argument for index == 0
@@ -214,7 +214,7 @@ void EmitX64::EmitVectorGetElement16(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorGetElement32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorGetElement32(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
// TODO: DefineValue directly on Argument for index == 0 // TODO: DefineValue directly on Argument for index == 0
@@ -235,7 +235,7 @@ void EmitX64::EmitVectorGetElement32(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorGetElement64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorGetElement64(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
if (index == 0) { if (index == 0) {
@@ -263,7 +263,7 @@ void EmitX64::EmitVectorGetElement64(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorSetElement8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorSetElement8(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]);
@@ -295,7 +295,7 @@ void EmitX64::EmitVectorSetElement8(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorSetElement16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorSetElement16(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]);
@@ -308,7 +308,7 @@ void EmitX64::EmitVectorSetElement16(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorSetElement32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorSetElement32(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]);
@@ -331,7 +331,7 @@ void EmitX64::EmitVectorSetElement32(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorSetElement64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorSetElement64(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const source_vector = ctx.reg_alloc.UseScratchXmm(code, args[0]);
@@ -717,9 +717,9 @@ void EmitX64::EmitVectorBroadcast64(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorBroadcastElementLower8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastElementLower8(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
ASSERT(index < 16); DEBUG_ASSERT(index < 16);
if (index > 0) { if (index > 0) {
code.psrldq(a, index); code.psrldq(a, index);
} }
@@ -741,9 +741,9 @@ void EmitX64::EmitVectorBroadcastElementLower8(EmitContext& ctx, IR::Inst* inst)
void EmitX64::EmitVectorBroadcastElementLower16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastElementLower16(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
ASSERT(index < 8); DEBUG_ASSERT(index < 8);
if (index > 0) { if (index > 0) {
code.psrldq(a, u8(index * 2)); code.psrldq(a, u8(index * 2));
} }
@@ -754,9 +754,9 @@ void EmitX64::EmitVectorBroadcastElementLower16(EmitContext& ctx, IR::Inst* inst
void EmitX64::EmitVectorBroadcastElementLower32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastElementLower32(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
ASSERT(index < 4); DEBUG_ASSERT(index < 4);
if (index > 0) { if (index > 0) {
code.psrldq(a, u8(index * 4)); code.psrldq(a, u8(index * 4));
@@ -770,9 +770,9 @@ void EmitX64::EmitVectorBroadcastElementLower32(EmitContext& ctx, IR::Inst* inst
void EmitX64::EmitVectorBroadcastElement8(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastElement8(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
ASSERT(index < 16); DEBUG_ASSERT(index < 16);
if (index > 0) { if (index > 0) {
code.psrldq(a, index); code.psrldq(a, index);
} }
@@ -794,9 +794,9 @@ void EmitX64::EmitVectorBroadcastElement8(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorBroadcastElement16(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastElement16(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
ASSERT(index < 8); DEBUG_ASSERT(index < 8);
if (index == 0 && code.HasHostFeature(HostFeature::AVX2)) { if (index == 0 && code.HasHostFeature(HostFeature::AVX2)) {
code.vpbroadcastw(a, a); code.vpbroadcastw(a, a);
} else { } else {
@@ -814,9 +814,9 @@ void EmitX64::EmitVectorBroadcastElement16(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorBroadcastElement32(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastElement32(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
ASSERT(index < 4); DEBUG_ASSERT(index < 4);
code.pshufd(a, a, mcl::bit::replicate_element<2, u8>(index)); code.pshufd(a, a, mcl::bit::replicate_element<2, u8>(index));
@@ -826,9 +826,9 @@ void EmitX64::EmitVectorBroadcastElement32(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorBroadcastElement64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorBroadcastElement64(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]);
ASSERT(args[1].IsImmediate()); DEBUG_ASSERT(args[1].IsImmediate());
const u8 index = args[1].GetImmediateU8(); const u8 index = args[1].GetImmediateU8();
ASSERT(index < 2); DEBUG_ASSERT(index < 2);
if (code.HasHostFeature(HostFeature::AVX)) { if (code.HasHostFeature(HostFeature::AVX)) {
code.vpermilpd(a, a, mcl::bit::replicate_element<1, u8>(index)); code.vpermilpd(a, a, mcl::bit::replicate_element<1, u8>(index));
@@ -1314,7 +1314,7 @@ void EmitX64::EmitVectorExtract(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
const u8 position = args[2].GetImmediateU8(); const u8 position = args[2].GetImmediateU8();
ASSERT(position % 8 == 0); DEBUG_ASSERT(position % 8 == 0);
if (position == 0) { if (position == 0) {
ctx.reg_alloc.DefineValue(code, inst, args[0]); ctx.reg_alloc.DefineValue(code, inst, args[0]);
@@ -1346,7 +1346,7 @@ void EmitX64::EmitVectorExtractLower(EmitContext& ctx, IR::Inst* inst) {
auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]); auto const xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]);
const u8 position = args[2].GetImmediateU8(); const u8 position = args[2].GetImmediateU8();
ASSERT(position % 8 == 0); DEBUG_ASSERT(position % 8 == 0);
if (position != 0) { if (position != 0) {
auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]); auto const xmm_b = ctx.reg_alloc.UseXmm(code, args[1]);
@@ -3821,7 +3821,7 @@ void EmitX64::EmitVectorRotateWholeVectorRight(EmitContext& ctx, IR::Inst* inst)
auto const operand = ctx.reg_alloc.UseXmm(code, args[0]); auto const operand = ctx.reg_alloc.UseXmm(code, args[0]);
auto const result = ctx.reg_alloc.ScratchXmm(code); auto const result = ctx.reg_alloc.ScratchXmm(code);
const u8 shift_amount = args[1].GetImmediateU8(); const u8 shift_amount = args[1].GetImmediateU8();
ASSERT(shift_amount % 32 == 0); DEBUG_ASSERT(shift_amount % 32 == 0);
const u8 shuffle_imm = std::rotr<u8>(0b11100100, shift_amount / 32 * 2); const u8 shuffle_imm = std::rotr<u8>(0b11100100, shift_amount / 32 * 2);
code.pshufd(result, operand, shuffle_imm); code.pshufd(result, operand, shuffle_imm);
@@ -4914,7 +4914,7 @@ static void EmitVectorSignedSaturatedNarrowToUnsigned(size_t original_esize, Blo
code.punpcklbw(reconstructed, xmm0); code.punpcklbw(reconstructed, xmm0);
break; break;
case 32: case 32:
ASSERT(code.HasHostFeature(HostFeature::SSE41)); DEBUG_ASSERT(code.HasHostFeature(HostFeature::SSE41));
code.packusdw(dest, xmm0); // SSE4.1 code.packusdw(dest, xmm0); // SSE4.1
code.movdqa(reconstructed, dest); code.movdqa(reconstructed, dest);
code.punpcklwd(reconstructed, xmm0); code.punpcklwd(reconstructed, xmm0);
@@ -5276,11 +5276,11 @@ void EmitX64::EmitVectorSub64(EmitContext& ctx, IR::Inst* inst) {
void EmitX64::EmitVectorTable(EmitContext&, IR::Inst* inst) { void EmitX64::EmitVectorTable(EmitContext&, IR::Inst* inst) {
// Do nothing. We *want* to hold on to the refcount for our arguments, so VectorTableLookup can use our arguments. // Do nothing. We *want* to hold on to the refcount for our arguments, so VectorTableLookup can use our arguments.
ASSERT(inst->UseCount() == 1 && "Table cannot be used multiple times"); DEBUG_ASSERT(inst->UseCount() == 1 && "Table cannot be used multiple times");
} }
void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) {
ASSERT(inst->GetArg(1).GetInst()->GetOpcode() == IR::Opcode::VectorTable); DEBUG_ASSERT(inst->GetArg(1).GetInst()->GetOpcode() == IR::Opcode::VectorTable);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto table = ctx.reg_alloc.GetArgumentInfo(inst->GetArg(1).GetInst()); auto table = ctx.reg_alloc.GetArgumentInfo(inst->GetArg(1).GetInst());
@@ -5438,7 +5438,7 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) {
code.pxor(xmm0, xmm0); code.pxor(xmm0, xmm0);
code.punpcklqdq(xmm_table1, xmm0); code.punpcklqdq(xmm_table1, xmm0);
} else { } else {
ASSERT(table_size == 4); DEBUG_ASSERT(table_size == 4);
auto const xmm_table1_upper = ctx.reg_alloc.UseXmm(code, table[3]); auto const xmm_table1_upper = ctx.reg_alloc.UseXmm(code, table[3]);
code.punpcklqdq(xmm_table1, xmm_table1_upper); code.punpcklqdq(xmm_table1, xmm_table1_upper);
ctx.reg_alloc.Release(xmm_table1_upper); ctx.reg_alloc.Release(xmm_table1_upper);
@@ -5529,7 +5529,7 @@ void EmitX64::EmitVectorTableLookup64(EmitContext& ctx, IR::Inst* inst) {
} }
void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorTableLookup128(EmitContext& ctx, IR::Inst* inst) {
ASSERT(inst->GetArg(1).GetInst()->GetOpcode() == IR::Opcode::VectorTable); DEBUG_ASSERT(inst->GetArg(1).GetInst()->GetOpcode() == IR::Opcode::VectorTable);
auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto args = ctx.reg_alloc.GetArgumentInfo(inst);
auto table = ctx.reg_alloc.GetArgumentInfo(inst->GetArg(1).GetInst()); auto table = ctx.reg_alloc.GetArgumentInfo(inst->GetArg(1).GetInst());
@@ -676,7 +676,7 @@ void EmitX64::EmitFPVectorFromSignedFixed32(EmitContext& ctx, IR::Inst* inst) {
const int fbits = args[1].GetImmediateU8(); const int fbits = args[1].GetImmediateU8();
const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8()); const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8());
const bool fpcr_controlled = args[3].GetImmediateU1(); const bool fpcr_controlled = args[3].GetImmediateU1();
ASSERT(rounding_mode == ctx.FPCR(fpcr_controlled).RMode()); DEBUG_ASSERT(rounding_mode == ctx.FPCR(fpcr_controlled).RMode());
MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] {
code.cvtdq2ps(xmm, xmm); code.cvtdq2ps(xmm, xmm);
@@ -694,7 +694,7 @@ void EmitX64::EmitFPVectorFromSignedFixed64(EmitContext& ctx, IR::Inst* inst) {
const int fbits = args[1].GetImmediateU8(); const int fbits = args[1].GetImmediateU8();
const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8()); const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8());
const bool fpcr_controlled = args[3].GetImmediateU1(); const bool fpcr_controlled = args[3].GetImmediateU1();
ASSERT(rounding_mode == ctx.FPCR(fpcr_controlled).RMode()); DEBUG_ASSERT(rounding_mode == ctx.FPCR(fpcr_controlled).RMode());
MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] {
if (code.HasHostFeature(HostFeature::AVX512_OrthoFloat)) { if (code.HasHostFeature(HostFeature::AVX512_OrthoFloat)) {
@@ -745,7 +745,7 @@ void EmitX64::EmitFPVectorFromUnsignedFixed32(EmitContext& ctx, IR::Inst* inst)
const int fbits = args[1].GetImmediateU8(); const int fbits = args[1].GetImmediateU8();
const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8()); const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8());
const bool fpcr_controlled = args[3].GetImmediateU1(); const bool fpcr_controlled = args[3].GetImmediateU1();
ASSERT(rounding_mode == ctx.FPCR(fpcr_controlled).RMode()); DEBUG_ASSERT(rounding_mode == ctx.FPCR(fpcr_controlled).RMode());
MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] {
if (code.HasHostFeature(HostFeature::AVX512_Ortho)) { if (code.HasHostFeature(HostFeature::AVX512_Ortho)) {
@@ -795,7 +795,7 @@ void EmitX64::EmitFPVectorFromUnsignedFixed64(EmitContext& ctx, IR::Inst* inst)
const int fbits = args[1].GetImmediateU8(); const int fbits = args[1].GetImmediateU8();
const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8()); const FP::RoundingMode rounding_mode = static_cast<FP::RoundingMode>(args[2].GetImmediateU8());
const bool fpcr_controlled = args[3].GetImmediateU1(); const bool fpcr_controlled = args[3].GetImmediateU1();
ASSERT(rounding_mode == ctx.FPCR(fpcr_controlled).RMode()); DEBUG_ASSERT(rounding_mode == ctx.FPCR(fpcr_controlled).RMode());
MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] {
if (code.HasHostFeature(HostFeature::AVX512_OrthoFloat)) { if (code.HasHostFeature(HostFeature::AVX512_OrthoFloat)) {
@@ -104,7 +104,7 @@ static PrologueInformation GetPrologueInformation() {
entry.code.OpInfo = reg; entry.code.OpInfo = reg;
}; };
const auto alloc_large = [&](u8 offset, size_t size) { const auto alloc_large = [&](u8 offset, size_t size) {
ASSERT(size % 8 == 0); DEBUG_ASSERT(size % 8 == 0);
size /= 8; size /= 8;
auto& entry = next_entry(); auto& entry = next_entry();
@@ -123,7 +123,7 @@ static PrologueInformation GetPrologueInformation() {
} }
}; };
const auto save_xmm128 = [&](u8 offset, u8 reg, size_t frame_offset) { const auto save_xmm128 = [&](u8 offset, u8 reg, size_t frame_offset) {
ASSERT(frame_offset % 16 == 0); DEBUG_ASSERT(frame_offset % 16 == 0);
auto& entry = next_entry(); auto& entry = next_entry();
entry.code.CodeOffset = offset; entry.code.CodeOffset = offset;
@@ -165,7 +165,7 @@ static PrologueInformation GetPrologueInformation() {
auto& last_entry = next_entry(); auto& last_entry = next_entry();
last_entry.FrameOffset = 0; last_entry.FrameOffset = 0;
} }
ASSERT(ret.unwind_code.size() % 2 == 0); DEBUG_ASSERT(ret.unwind_code.size() % 2 == 0);
return ret; return ret;
} }
@@ -78,12 +78,12 @@ constexpr bool HostLocIsFlag(HostLoc reg) {
} }
constexpr HostLoc HostLocRegIdx(int idx) { constexpr HostLoc HostLocRegIdx(int idx) {
ASSERT(idx >= 0 && idx <= 15); DEBUG_ASSERT(idx >= 0 && idx <= 15);
return HostLoc(idx); return HostLoc(idx);
} }
constexpr HostLoc HostLocXmmIdx(int idx) { constexpr HostLoc HostLocXmmIdx(int idx) {
ASSERT(idx >= 0 && idx <= 15); DEBUG_ASSERT(idx >= 0 && idx <= 15);
return HostLoc(size_t(HostLoc::XMM0) + idx); return HostLoc(size_t(HostLoc::XMM0) + idx);
} }
@@ -159,12 +159,12 @@ const std::bitset<32> any_xmm = BuildRegSet({
}); });
inline Xbyak::Reg64 HostLocToReg64(HostLoc loc) noexcept { inline Xbyak::Reg64 HostLocToReg64(HostLoc loc) noexcept {
ASSERT(HostLocIsGPR(loc)); DEBUG_ASSERT(HostLocIsGPR(loc));
return Xbyak::Reg64(int(loc)); return Xbyak::Reg64(int(loc));
} }
inline Xbyak::Xmm HostLocToXmm(HostLoc loc) noexcept { inline Xbyak::Xmm HostLocToXmm(HostLoc loc) noexcept {
ASSERT(HostLocIsXMM(loc)); DEBUG_ASSERT(HostLocIsXMM(loc));
return Xbyak::Xmm(int(loc) - int(HostLoc::XMM0)); return Xbyak::Xmm(int(loc) - int(HostLoc::XMM0));
} }
@@ -56,11 +56,11 @@ static inline bool IsValuelessType(const IR::Type type) noexcept {
} }
void HostLocInfo::ReleaseOne() noexcept { void HostLocInfo::ReleaseOne() noexcept {
ASSERT(is_being_used_count > 0); DEBUG_ASSERT(is_being_used_count > 0);
--is_being_used_count; --is_being_used_count;
is_scratch = false; is_scratch = false;
if (current_references > 0) { if (current_references > 0) {
ASSERT(size_t(accumulated_uses) + 1 < (std::numeric_limits<decltype(accumulated_uses)>::max)()); DEBUG_ASSERT(size_t(accumulated_uses) + 1 < (std::numeric_limits<decltype(accumulated_uses)>::max)());
++accumulated_uses; ++accumulated_uses;
--current_references; --current_references;
if (current_references == 0) if (current_references == 0)
@@ -69,7 +69,7 @@ void HostLocInfo::ReleaseOne() noexcept {
} }
void HostLocInfo::ReleaseAll() noexcept { void HostLocInfo::ReleaseAll() noexcept {
ASSERT(size_t(accumulated_uses) + current_references < (std::numeric_limits<decltype(accumulated_uses)>::max)()); DEBUG_ASSERT(size_t(accumulated_uses) + current_references < (std::numeric_limits<decltype(accumulated_uses)>::max)());
accumulated_uses += current_references; accumulated_uses += current_references;
current_references = 0; current_references = 0;
is_set_last_use = false; is_set_last_use = false;
@@ -91,7 +91,7 @@ void HostLocInfo::AddValue(HostLoc loc, IR::Inst* inst) noexcept {
} }
values.push_back(inst); values.push_back(inst);
ASSERT(size_t(total_uses) + inst->UseCount() < (std::numeric_limits<decltype(total_uses)>::max)()); DEBUG_ASSERT(size_t(total_uses) + inst->UseCount() < (std::numeric_limits<decltype(total_uses)>::max)());
total_uses += inst->UseCount(); total_uses += inst->UseCount();
max_bit_width = std::max<uint8_t>(max_bit_width, std::countr_zero(GetBitWidth(inst->GetType()))); max_bit_width = std::max<uint8_t>(max_bit_width, std::countr_zero(GetBitWidth(inst->GetType())));
} }
@@ -129,24 +129,24 @@ bool Argument::GetImmediateU1() const noexcept {
u8 Argument::GetImmediateU8() const noexcept { u8 Argument::GetImmediateU8() const noexcept {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm <= u64(std::numeric_limits<u8>::max())); DEBUG_ASSERT(imm <= u64(std::numeric_limits<u8>::max()));
return u8(imm); return u8(imm);
} }
u16 Argument::GetImmediateU16() const noexcept { u16 Argument::GetImmediateU16() const noexcept {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm <= u64(std::numeric_limits<u16>::max())); DEBUG_ASSERT(imm <= u64(std::numeric_limits<u16>::max()));
return u16(imm); return u16(imm);
} }
u32 Argument::GetImmediateU32() const noexcept { u32 Argument::GetImmediateU32() const noexcept {
const u64 imm = value.GetImmediateAsU64(); const u64 imm = value.GetImmediateAsU64();
ASSERT(imm <= u64(std::numeric_limits<u32>::max())); DEBUG_ASSERT(imm <= u64(std::numeric_limits<u32>::max()));
return u32(imm); return u32(imm);
} }
u64 Argument::GetImmediateS32() const noexcept { u64 Argument::GetImmediateS32() const noexcept {
ASSERT(FitsInImmediateS32()); DEBUG_ASSERT(FitsInImmediateS32());
return value.GetImmediateAsU64(); return value.GetImmediateAsU64();
} }
@@ -155,12 +155,12 @@ u64 Argument::GetImmediateU64() const noexcept {
} }
IR::Cond Argument::GetImmediateCond() const noexcept { IR::Cond Argument::GetImmediateCond() const noexcept {
ASSERT(IsImmediate() && GetType() == IR::Type::Cond); DEBUG_ASSERT(IsImmediate() && GetType() == IR::Type::Cond);
return value.GetCond(); return value.GetCond();
} }
IR::AccType Argument::GetImmediateAccType() const noexcept { IR::AccType Argument::GetImmediateAccType() const noexcept {
ASSERT(IsImmediate() && GetType() == IR::Type::AccType); DEBUG_ASSERT(IsImmediate() && GetType() == IR::Type::AccType);
return value.GetAccType(); return value.GetAccType();
} }
@@ -201,7 +201,7 @@ RegAlloc::ArgumentInfo RegAlloc::GetArgumentInfo(const IR::Inst* inst) noexcept
ret[i].value = arg; ret[i].value = arg;
if (!arg.IsImmediate() && !IsValuelessType(arg.GetType())) { if (!arg.IsImmediate() && !IsValuelessType(arg.GetType())) {
auto const loc = ValueLocation(arg.GetInst()); auto const loc = ValueLocation(arg.GetInst());
ASSERT(loc && "argument must already been defined"); DEBUG_ASSERT(loc && "argument must already been defined");
LocInfo(*loc).AddArgReference(); LocInfo(*loc).AddArgReference();
} }
} }
@@ -209,7 +209,7 @@ RegAlloc::ArgumentInfo RegAlloc::GetArgumentInfo(const IR::Inst* inst) noexcept
} }
void RegAlloc::RegisterPseudoOperation(const IR::Inst* inst) noexcept { void RegAlloc::RegisterPseudoOperation(const IR::Inst* inst) noexcept {
ASSERT(IsValueLive(inst) || !inst->HasUses()); DEBUG_ASSERT(IsValueLive(inst) || !inst->HasUses());
for (size_t i = 0; i < inst->NumArgs(); i++) { for (size_t i = 0; i < inst->NumArgs(); i++) {
auto const arg = inst->GetArg(i); auto const arg = inst->GetArg(i);
if (!arg.IsImmediate() && !IsValuelessType(arg.GetType())) { if (!arg.IsImmediate() && !IsValuelessType(arg.GetType())) {
@@ -222,37 +222,37 @@ void RegAlloc::RegisterPseudoOperation(const IR::Inst* inst) noexcept {
} }
Xbyak::Reg64 RegAlloc::UseScratchGpr(BlockOfCode& code, Argument& arg) noexcept { Xbyak::Reg64 RegAlloc::UseScratchGpr(BlockOfCode& code, Argument& arg) noexcept {
ASSERT(!arg.allocated); DEBUG_ASSERT(!arg.allocated);
arg.allocated = true; arg.allocated = true;
return HostLocToReg64(UseScratchImpl(code, arg.value, gpr_order)); return HostLocToReg64(UseScratchImpl(code, arg.value, gpr_order));
} }
Xbyak::Xmm RegAlloc::UseScratchXmm(BlockOfCode& code, Argument& arg) noexcept { Xbyak::Xmm RegAlloc::UseScratchXmm(BlockOfCode& code, Argument& arg) noexcept {
ASSERT(!arg.allocated); DEBUG_ASSERT(!arg.allocated);
arg.allocated = true; arg.allocated = true;
return HostLocToXmm(UseScratchImpl(code, arg.value, xmm_order)); return HostLocToXmm(UseScratchImpl(code, arg.value, xmm_order));
} }
void RegAlloc::UseScratch(BlockOfCode& code, Argument& arg, HostLoc host_loc) noexcept { void RegAlloc::UseScratch(BlockOfCode& code, Argument& arg, HostLoc host_loc) noexcept {
ASSERT(!arg.allocated); DEBUG_ASSERT(!arg.allocated);
arg.allocated = true; arg.allocated = true;
UseScratchImpl(code, arg.value, BuildRegSet({host_loc})); UseScratchImpl(code, arg.value, BuildRegSet({host_loc}));
} }
void RegAlloc::DefineValue(BlockOfCode& code, IR::Inst* inst, const Xbyak::Reg& reg) noexcept { void RegAlloc::DefineValue(BlockOfCode& code, IR::Inst* inst, const Xbyak::Reg& reg) noexcept {
ASSERT(reg.getKind() == Xbyak::Operand::XMM || reg.getKind() == Xbyak::Operand::REG); DEBUG_ASSERT(reg.getKind() == Xbyak::Operand::XMM || reg.getKind() == Xbyak::Operand::REG);
const auto hostloc = static_cast<HostLoc>(reg.getIdx() + static_cast<size_t>(reg.getKind() == Xbyak::Operand::XMM ? HostLoc::XMM0 : HostLoc::RAX)); const auto hostloc = static_cast<HostLoc>(reg.getIdx() + static_cast<size_t>(reg.getKind() == Xbyak::Operand::XMM ? HostLoc::XMM0 : HostLoc::RAX));
DefineValueImpl(code, inst, hostloc); DefineValueImpl(code, inst, hostloc);
} }
void RegAlloc::DefineValue(BlockOfCode& code, IR::Inst* inst, Argument& arg) noexcept { void RegAlloc::DefineValue(BlockOfCode& code, IR::Inst* inst, Argument& arg) noexcept {
ASSERT(!arg.allocated); DEBUG_ASSERT(!arg.allocated);
arg.allocated = true; arg.allocated = true;
DefineValueImpl(code, inst, arg.value); DefineValueImpl(code, inst, arg.value);
} }
void RegAlloc::Release(const Xbyak::Reg& reg) noexcept { void RegAlloc::Release(const Xbyak::Reg& reg) noexcept {
ASSERT(reg.getKind() == Xbyak::Operand::XMM || reg.getKind() == Xbyak::Operand::REG); DEBUG_ASSERT(reg.getKind() == Xbyak::Operand::XMM || reg.getKind() == Xbyak::Operand::REG);
const auto hostloc = static_cast<HostLoc>(reg.getIdx() + static_cast<size_t>(reg.getKind() == Xbyak::Operand::XMM ? HostLoc::XMM0 : HostLoc::RAX)); const auto hostloc = static_cast<HostLoc>(reg.getIdx() + static_cast<size_t>(reg.getKind() == Xbyak::Operand::XMM ? HostLoc::XMM0 : HostLoc::RAX));
LocInfo(hostloc).ReleaseOne(); LocInfo(hostloc).ReleaseOne();
} }
@@ -382,15 +382,15 @@ void RegAlloc::HostCall(
} }
void RegAlloc::AllocStackSpace(BlockOfCode& code, const size_t stack_space) noexcept { void RegAlloc::AllocStackSpace(BlockOfCode& code, const size_t stack_space) noexcept {
ASSERT(stack_space < size_t((std::numeric_limits<s32>::max)())); DEBUG_ASSERT(stack_space < size_t((std::numeric_limits<s32>::max)()));
ASSERT(reserved_stack_space == 0); DEBUG_ASSERT(reserved_stack_space == 0);
reserved_stack_space = stack_space; reserved_stack_space = stack_space;
code.sub(code.rsp, u32(stack_space)); code.sub(code.rsp, u32(stack_space));
} }
void RegAlloc::ReleaseStackSpace(BlockOfCode& code, const size_t stack_space) noexcept { void RegAlloc::ReleaseStackSpace(BlockOfCode& code, const size_t stack_space) noexcept {
ASSERT(stack_space < size_t((std::numeric_limits<s32>::max)())); DEBUG_ASSERT(stack_space < size_t((std::numeric_limits<s32>::max)()));
ASSERT(reserved_stack_space == stack_space); DEBUG_ASSERT(reserved_stack_space == stack_space);
reserved_stack_space = 0; reserved_stack_space = 0;
code.add(code.rsp, u32(stack_space)); code.add(code.rsp, u32(stack_space));
} }
@@ -449,7 +449,7 @@ HostLoc RegAlloc::SelectARegister(std::bitset<32> desired_locations) const noexc
auto const it_final = it_empty_candidate != HostLoc::FirstSpill auto const it_final = it_empty_candidate != HostLoc::FirstSpill
? it_empty_candidate : it_candidate != HostLoc::FirstSpill ? it_empty_candidate : it_candidate != HostLoc::FirstSpill
? it_candidate : it_rex_candidate; ? it_candidate : it_rex_candidate;
ASSERT(it_final != HostLoc::FirstSpill && "All candidate registers have already been allocated"); DEBUG_ASSERT(it_final != HostLoc::FirstSpill && "All candidate registers have already been allocated");
// Evil magic - increment LRU counter (will wrap at 256) // Evil magic - increment LRU counter (will wrap at 256)
const_cast<RegAlloc*>(this)->LocInfo(HostLoc(it_final)).lru_counter++; const_cast<RegAlloc*>(this)->LocInfo(HostLoc(it_final)).lru_counter++;
return HostLoc(it_final); return HostLoc(it_final);
@@ -459,26 +459,26 @@ std::optional<HostLoc> RegAlloc::ValueLocation(const IR::Inst* value) const noex
for (size_t i = 0; i < hostloc_info.size(); i++) for (size_t i = 0; i < hostloc_info.size(); i++)
if (hostloc_info[i].ContainsValue(value)) { if (hostloc_info[i].ContainsValue(value)) {
//for (size_t j = 0; j < hostloc_info.size(); ++j) //for (size_t j = 0; j < hostloc_info.size(); ++j)
// ASSERT((i == j || !hostloc_info[j].ContainsValue(value)) && "duplicate defs"); // DEBUG_ASSERT((i == j || !hostloc_info[j].ContainsValue(value)) && "duplicate defs");
return HostLoc(i); return HostLoc(i);
} }
return std::nullopt; return std::nullopt;
} }
void RegAlloc::DefineValueImpl(BlockOfCode& code, IR::Inst* def_inst, HostLoc host_loc) noexcept { void RegAlloc::DefineValueImpl(BlockOfCode& code, IR::Inst* def_inst, HostLoc host_loc) noexcept {
ASSERT(!ValueLocation(def_inst) && "def_inst has already been defined"); DEBUG_ASSERT(!ValueLocation(def_inst) && "def_inst has already been defined");
LocInfo(host_loc).AddValue(host_loc, def_inst); LocInfo(host_loc).AddValue(host_loc, def_inst);
ASSERT(*ValueLocation(def_inst) == host_loc); DEBUG_ASSERT(*ValueLocation(def_inst) == host_loc);
} }
void RegAlloc::DefineValueImpl(BlockOfCode& code, IR::Inst* def_inst, const IR::Value& use_inst) noexcept { void RegAlloc::DefineValueImpl(BlockOfCode& code, IR::Inst* def_inst, const IR::Value& use_inst) noexcept {
ASSERT(!ValueLocation(def_inst) && "def_inst has already been defined"); DEBUG_ASSERT(!ValueLocation(def_inst) && "def_inst has already been defined");
if (use_inst.IsImmediate()) { if (use_inst.IsImmediate()) {
const HostLoc location = ScratchImpl(code, gpr_order); const HostLoc location = ScratchImpl(code, gpr_order);
DefineValueImpl(code, def_inst, location); DefineValueImpl(code, def_inst, location);
LoadImmediate(code, use_inst, location); LoadImmediate(code, use_inst, location);
} else { } else {
ASSERT(ValueLocation(use_inst.GetInst()) && "use_inst must already be defined"); DEBUG_ASSERT(ValueLocation(use_inst.GetInst()) && "use_inst must already be defined");
const HostLoc location = *ValueLocation(use_inst.GetInst()); const HostLoc location = *ValueLocation(use_inst.GetInst());
DefineValueImpl(code, def_inst, location); DefineValueImpl(code, def_inst, location);
} }
@@ -486,22 +486,22 @@ void RegAlloc::DefineValueImpl(BlockOfCode& code, IR::Inst* def_inst, const IR::
void RegAlloc::Move(BlockOfCode& code, HostLoc to, HostLoc from) noexcept { void RegAlloc::Move(BlockOfCode& code, HostLoc to, HostLoc from) noexcept {
const size_t bit_width = LocInfo(from).GetMaxBitWidth(); const size_t bit_width = LocInfo(from).GetMaxBitWidth();
ASSERT(LocInfo(to).IsEmpty() && !LocInfo(from).IsLocked()); DEBUG_ASSERT(LocInfo(to).IsEmpty() && !LocInfo(from).IsLocked());
ASSERT(bit_width <= HostLocBitWidth(to)); DEBUG_ASSERT(bit_width <= HostLocBitWidth(to));
ASSERT(!LocInfo(from).IsEmpty() && "Mov eliminated"); DEBUG_ASSERT(!LocInfo(from).IsEmpty() && "Mov eliminated");
EmitMove(code, bit_width, to, from); EmitMove(code, bit_width, to, from);
LocInfo(to) = std::exchange(LocInfo(from), {}); LocInfo(to) = std::exchange(LocInfo(from), {});
} }
void RegAlloc::CopyToScratch(BlockOfCode& code, size_t bit_width, HostLoc to, HostLoc from) noexcept { void RegAlloc::CopyToScratch(BlockOfCode& code, size_t bit_width, HostLoc to, HostLoc from) noexcept {
ASSERT(LocInfo(to).IsEmpty() && !LocInfo(from).IsEmpty()); DEBUG_ASSERT(LocInfo(to).IsEmpty() && !LocInfo(from).IsEmpty());
EmitMove(code, bit_width, to, from); EmitMove(code, bit_width, to, from);
} }
void RegAlloc::Exchange(BlockOfCode& code, HostLoc a, HostLoc b) noexcept { void RegAlloc::Exchange(BlockOfCode& code, HostLoc a, HostLoc b) noexcept {
ASSERT(!LocInfo(a).IsLocked() && !LocInfo(b).IsLocked()); DEBUG_ASSERT(!LocInfo(a).IsLocked() && !LocInfo(b).IsLocked());
ASSERT(LocInfo(a).GetMaxBitWidth() <= HostLocBitWidth(b)); DEBUG_ASSERT(LocInfo(a).GetMaxBitWidth() <= HostLocBitWidth(b));
ASSERT(LocInfo(b).GetMaxBitWidth() <= HostLocBitWidth(a)); DEBUG_ASSERT(LocInfo(b).GetMaxBitWidth() <= HostLocBitWidth(a));
if (LocInfo(a).IsEmpty()) { if (LocInfo(a).IsEmpty()) {
Move(code, a, b); Move(code, a, b);
@@ -514,16 +514,16 @@ void RegAlloc::Exchange(BlockOfCode& code, HostLoc a, HostLoc b) noexcept {
} }
void RegAlloc::MoveOutOfTheWay(BlockOfCode& code, HostLoc reg) noexcept { void RegAlloc::MoveOutOfTheWay(BlockOfCode& code, HostLoc reg) noexcept {
ASSERT(!LocInfo(reg).IsLocked()); DEBUG_ASSERT(!LocInfo(reg).IsLocked());
if (!LocInfo(reg).IsEmpty()) { if (!LocInfo(reg).IsEmpty()) {
SpillRegister(code, reg); SpillRegister(code, reg);
} }
} }
void RegAlloc::SpillRegister(BlockOfCode& code, HostLoc loc) noexcept { void RegAlloc::SpillRegister(BlockOfCode& code, HostLoc loc) noexcept {
ASSERT(HostLocIsRegister(loc) && "Only registers can be spilled"); DEBUG_ASSERT(HostLocIsRegister(loc) && "Only registers can be spilled");
ASSERT(!LocInfo(loc).IsEmpty() && "There is no need to spill unoccupied registers"); DEBUG_ASSERT(!LocInfo(loc).IsEmpty() && "There is no need to spill unoccupied registers");
ASSERT(!LocInfo(loc).IsLocked() && "Registers that have been allocated must not be spilt"); DEBUG_ASSERT(!LocInfo(loc).IsLocked() && "Registers that have been allocated must not be spilt");
auto const new_loc = FindFreeSpill(HostLocIsXMM(loc)); auto const new_loc = FindFreeSpill(HostLocIsXMM(loc));
Move(code, new_loc, loc); Move(code, new_loc, loc);
} }
@@ -559,7 +559,7 @@ HostLoc RegAlloc::FindFreeSpill(bool is_xmm) const noexcept {
}() }()
HostLoc RegAlloc::LoadImmediate(BlockOfCode& code, IR::Value imm, HostLoc host_loc) noexcept { HostLoc RegAlloc::LoadImmediate(BlockOfCode& code, IR::Value imm, HostLoc host_loc) noexcept {
ASSERT(imm.IsImmediate() && "imm is not an immediate"); DEBUG_ASSERT(imm.IsImmediate() && "imm is not an immediate");
if (HostLocIsGPR(host_loc)) { if (HostLocIsGPR(host_loc)) {
const Xbyak::Reg64 reg = HostLocToReg64(host_loc); const Xbyak::Reg64 reg = HostLocToReg64(host_loc);
const u64 imm_value = imm.GetImmediateAsU64(); const u64 imm_value = imm.GetImmediateAsU64();
@@ -584,9 +584,9 @@ HostLoc RegAlloc::LoadImmediate(BlockOfCode& code, IR::Value imm, HostLoc host_l
void RegAlloc::EmitMove(BlockOfCode& code, const size_t bit_width, const HostLoc to, const HostLoc from) noexcept { void RegAlloc::EmitMove(BlockOfCode& code, const size_t bit_width, const HostLoc to, const HostLoc from) noexcept {
auto const spill_to_op_arg_helper = [&](HostLoc loc, size_t reserved_stack_space) { auto const spill_to_op_arg_helper = [&](HostLoc loc, size_t reserved_stack_space) {
ASSERT(HostLocIsSpill(loc)); DEBUG_ASSERT(HostLocIsSpill(loc));
size_t i = size_t(loc) - size_t(HostLoc::FirstSpill); size_t i = size_t(loc) - size_t(HostLoc::FirstSpill);
ASSERT(i < SpillCount && "Spill index greater than number of available spill locations"); DEBUG_ASSERT(i < SpillCount && "Spill index greater than number of available spill locations");
return Xbyak::util::rsp + reserved_stack_space + ABI_SHADOW_SPACE + offsetof(StackLayout, spill) + i * sizeof(StackLayout::spill[0]); return Xbyak::util::rsp + reserved_stack_space + ABI_SHADOW_SPACE + offsetof(StackLayout, spill) + i * sizeof(StackLayout::spill[0]);
}; };
auto const spill_xmm_to_op = [&](const HostLoc loc) { auto const spill_xmm_to_op = [&](const HostLoc loc) {
@@ -595,21 +595,21 @@ void RegAlloc::EmitMove(BlockOfCode& code, const size_t bit_width, const HostLoc
if (HostLocIsXMM(to) && HostLocIsXMM(from)) { if (HostLocIsXMM(to) && HostLocIsXMM(from)) {
MAYBE_AVX(movaps, HostLocToXmm(to), HostLocToXmm(from)); MAYBE_AVX(movaps, HostLocToXmm(to), HostLocToXmm(from));
} else if (HostLocIsGPR(to) && HostLocIsGPR(from)) { } else if (HostLocIsGPR(to) && HostLocIsGPR(from)) {
ASSERT(bit_width != 128); DEBUG_ASSERT(bit_width != 128);
if (bit_width == 64) { if (bit_width == 64) {
code.mov(HostLocToReg64(to), HostLocToReg64(from)); code.mov(HostLocToReg64(to), HostLocToReg64(from));
} else { } else {
code.mov(HostLocToReg64(to).cvt32(), HostLocToReg64(from).cvt32()); code.mov(HostLocToReg64(to).cvt32(), HostLocToReg64(from).cvt32());
} }
} else if (HostLocIsXMM(to) && HostLocIsGPR(from)) { } else if (HostLocIsXMM(to) && HostLocIsGPR(from)) {
ASSERT(bit_width != 128); DEBUG_ASSERT(bit_width != 128);
if (bit_width == 64) { if (bit_width == 64) {
MAYBE_AVX(movq, HostLocToXmm(to), HostLocToReg64(from)); MAYBE_AVX(movq, HostLocToXmm(to), HostLocToReg64(from));
} else { } else {
MAYBE_AVX(movd, HostLocToXmm(to), HostLocToReg64(from).cvt32()); MAYBE_AVX(movd, HostLocToXmm(to), HostLocToReg64(from).cvt32());
} }
} else if (HostLocIsGPR(to) && HostLocIsXMM(from)) { } else if (HostLocIsGPR(to) && HostLocIsXMM(from)) {
ASSERT(bit_width != 128); DEBUG_ASSERT(bit_width != 128);
if (bit_width == 64) { if (bit_width == 64) {
MAYBE_AVX(movq, HostLocToReg64(to), HostLocToXmm(from)); MAYBE_AVX(movq, HostLocToReg64(to), HostLocToXmm(from));
} else { } else {
@@ -617,7 +617,7 @@ void RegAlloc::EmitMove(BlockOfCode& code, const size_t bit_width, const HostLoc
} }
} else if (HostLocIsXMM(to) && HostLocIsSpill(from)) { } else if (HostLocIsXMM(to) && HostLocIsSpill(from)) {
const Xbyak::Address spill_addr = spill_xmm_to_op(from); const Xbyak::Address spill_addr = spill_xmm_to_op(from);
ASSERT(spill_addr.getBit() >= bit_width); DEBUG_ASSERT(spill_addr.getBit() >= bit_width);
switch (bit_width) { switch (bit_width) {
case 128: case 128:
MAYBE_AVX(movaps, HostLocToXmm(to), spill_addr); MAYBE_AVX(movaps, HostLocToXmm(to), spill_addr);
@@ -635,7 +635,7 @@ void RegAlloc::EmitMove(BlockOfCode& code, const size_t bit_width, const HostLoc
} }
} else if (HostLocIsSpill(to) && HostLocIsXMM(from)) { } else if (HostLocIsSpill(to) && HostLocIsXMM(from)) {
const Xbyak::Address spill_addr = spill_xmm_to_op(to); const Xbyak::Address spill_addr = spill_xmm_to_op(to);
ASSERT(spill_addr.getBit() >= bit_width); DEBUG_ASSERT(spill_addr.getBit() >= bit_width);
switch (bit_width) { switch (bit_width) {
case 128: case 128:
MAYBE_AVX(movaps, spill_addr, HostLocToXmm(from)); MAYBE_AVX(movaps, spill_addr, HostLocToXmm(from));
@@ -652,14 +652,14 @@ void RegAlloc::EmitMove(BlockOfCode& code, const size_t bit_width, const HostLoc
UNREACHABLE(); UNREACHABLE();
} }
} else if (HostLocIsGPR(to) && HostLocIsSpill(from)) { } else if (HostLocIsGPR(to) && HostLocIsSpill(from)) {
ASSERT(bit_width != 128); DEBUG_ASSERT(bit_width != 128);
if (bit_width == 64) { if (bit_width == 64) {
code.mov(HostLocToReg64(to), Xbyak::util::qword[spill_to_op_arg_helper(from, reserved_stack_space)]); code.mov(HostLocToReg64(to), Xbyak::util::qword[spill_to_op_arg_helper(from, reserved_stack_space)]);
} else { } else {
code.mov(HostLocToReg64(to).cvt32(), Xbyak::util::dword[spill_to_op_arg_helper(from, reserved_stack_space)]); code.mov(HostLocToReg64(to).cvt32(), Xbyak::util::dword[spill_to_op_arg_helper(from, reserved_stack_space)]);
} }
} else if (HostLocIsSpill(to) && HostLocIsGPR(from)) { } else if (HostLocIsSpill(to) && HostLocIsGPR(from)) {
ASSERT(bit_width != 128); DEBUG_ASSERT(bit_width != 128);
if (bit_width == 64) { if (bit_width == 64) {
code.mov(Xbyak::util::qword[spill_to_op_arg_helper(to, reserved_stack_space)], HostLocToReg64(from)); code.mov(Xbyak::util::qword[spill_to_op_arg_helper(to, reserved_stack_space)], HostLocToReg64(from));
} else { } else {
@@ -672,7 +672,7 @@ void RegAlloc::EmitMove(BlockOfCode& code, const size_t bit_width, const HostLoc
#undef MAYBE_AVX #undef MAYBE_AVX
void RegAlloc::EmitExchange(BlockOfCode& code, const HostLoc a, const HostLoc b) noexcept { void RegAlloc::EmitExchange(BlockOfCode& code, const HostLoc a, const HostLoc b) noexcept {
ASSERT(HostLocIsGPR(a) && HostLocIsGPR(b) && "Exchanging XMM registers is uneeded OR invalid emit"); DEBUG_ASSERT(HostLocIsGPR(a) && HostLocIsGPR(b) && "Exchanging XMM registers is uneeded OR invalid emit");
code.xchg(HostLocToReg64(a), HostLocToReg64(b)); code.xchg(HostLocToReg64(a), HostLocToReg64(b));
} }
@@ -49,19 +49,19 @@ public:
return is_being_used_count == 0 && current_references == 1 && size_t(accumulated_uses) + 1 == size_t(total_uses); return is_being_used_count == 0 && current_references == 1 && size_t(accumulated_uses) + 1 == size_t(total_uses);
} }
inline void ReadLock() noexcept { inline void ReadLock() noexcept {
ASSERT(size_t(is_being_used_count) + 1 < (std::numeric_limits<decltype(is_being_used_count)>::max)()); DEBUG_ASSERT(size_t(is_being_used_count) + 1 < (std::numeric_limits<decltype(is_being_used_count)>::max)());
ASSERT(!bool(is_scratch)); DEBUG_ASSERT(!bool(is_scratch));
is_being_used_count++; is_being_used_count++;
} }
inline void WriteLock() noexcept { inline void WriteLock() noexcept {
ASSERT(is_being_used_count == 0); DEBUG_ASSERT(is_being_used_count == 0);
is_being_used_count++; is_being_used_count++;
is_scratch = true; is_scratch = true;
} }
inline void AddArgReference() noexcept { inline void AddArgReference() noexcept {
ASSERT(size_t(current_references) + 1 < (std::numeric_limits<decltype(current_references)>::max)()); DEBUG_ASSERT(size_t(current_references) + 1 < (std::numeric_limits<decltype(current_references)>::max)());
++current_references; ++current_references;
ASSERT(size_t(accumulated_uses) + current_references <= size_t(total_uses)); DEBUG_ASSERT(size_t(accumulated_uses) + current_references <= size_t(total_uses));
} }
void ReleaseOne() noexcept; void ReleaseOne() noexcept;
void ReleaseAll() noexcept; void ReleaseAll() noexcept;
@@ -147,12 +147,12 @@ public:
return !!ValueLocation(inst); return !!ValueLocation(inst);
} }
inline Xbyak::Reg64 UseGpr(BlockOfCode& code, Argument& arg) noexcept { inline Xbyak::Reg64 UseGpr(BlockOfCode& code, Argument& arg) noexcept {
ASSERT(!arg.allocated); DEBUG_ASSERT(!arg.allocated);
arg.allocated = true; arg.allocated = true;
return HostLocToReg64(UseImpl(code, arg.value, gpr_order)); return HostLocToReg64(UseImpl(code, arg.value, gpr_order));
} }
inline Xbyak::Xmm UseXmm(BlockOfCode& code, Argument& arg) noexcept { inline Xbyak::Xmm UseXmm(BlockOfCode& code, Argument& arg) noexcept {
ASSERT(!arg.allocated); DEBUG_ASSERT(!arg.allocated);
arg.allocated = true; arg.allocated = true;
return HostLocToXmm(UseImpl(code, arg.value, xmm_order)); return HostLocToXmm(UseImpl(code, arg.value, xmm_order));
} }
@@ -160,7 +160,7 @@ public:
return UseGpr(code, arg); return UseGpr(code, arg);
} }
inline void Use(BlockOfCode& code, Argument& arg, const HostLoc host_loc) noexcept { inline void Use(BlockOfCode& code, Argument& arg, const HostLoc host_loc) noexcept {
ASSERT(!arg.allocated); DEBUG_ASSERT(!arg.allocated);
arg.allocated = true; arg.allocated = true;
UseImpl(code, arg.value, BuildRegSet({host_loc})); UseImpl(code, arg.value, BuildRegSet({host_loc}));
} }
@@ -205,7 +205,7 @@ public:
iter.ReleaseAll(); iter.ReleaseAll();
} }
inline void AssertNoMoreUses() noexcept { inline void AssertNoMoreUses() noexcept {
ASSERT(std::all_of(hostloc_info.begin(), hostloc_info.end(), [](const auto& i) noexcept { return i.IsEmpty(); })); DEBUG_ASSERT(std::all_of(hostloc_info.begin(), hostloc_info.end(), [](const auto& i) noexcept { return i.IsEmpty(); }));
} }
#ifndef NDEBUG #ifndef NDEBUG
inline void EmitVerboseDebuggingOutput(BlockOfCode& code) noexcept { inline void EmitVerboseDebuggingOutput(BlockOfCode& code) noexcept {
+3 -3
View File
@@ -73,7 +73,7 @@ public:
/// Set rounding mode control field. /// Set rounding mode control field.
void RMode(FP::RoundingMode rounding_mode) { void RMode(FP::RoundingMode rounding_mode) {
ASSERT(static_cast<u32>(rounding_mode) <= 0b11 && "FPCR: Invalid rounding mode"); DEBUG_ASSERT(static_cast<u32>(rounding_mode) <= 0b11 && "FPCR: Invalid rounding mode");
value = mcl::bit::set_bits<22, 23>(value, static_cast<u32>(rounding_mode)); value = mcl::bit::set_bits<22, 23>(value, static_cast<u32>(rounding_mode));
} }
@@ -93,7 +93,7 @@ public:
/// Set the stride of a vector when executing AArch32 VFP instructions. /// Set the stride of a vector when executing AArch32 VFP instructions.
/// This field has no function in AArch64 state. /// This field has no function in AArch64 state.
void Stride(size_t stride) { void Stride(size_t stride) {
ASSERT(stride >= 1 && stride <= 2 && "FPCR: Invalid stride"); DEBUG_ASSERT(stride >= 1 && stride <= 2 && "FPCR: Invalid stride");
value = mcl::bit::set_bits<20, 21>(value, stride == 1 ? 0b00u : 0b11u); value = mcl::bit::set_bits<20, 21>(value, stride == 1 ? 0b00u : 0b11u);
} }
@@ -116,7 +116,7 @@ public:
/// Sets the length of a vector when executing AArch32 VFP instructions. /// Sets the length of a vector when executing AArch32 VFP instructions.
/// This field has no function in AArch64 state. /// This field has no function in AArch64 state.
void Len(size_t len) { void Len(size_t len) {
ASSERT(len >= 1 && len <= 8 && "FPCR: Invalid len"); DEBUG_ASSERT(len >= 1 && len <= 8 && "FPCR: Invalid len");
value = mcl::bit::set_bits<16, 18>(value, static_cast<u32>(len - 1)); value = mcl::bit::set_bits<16, 18>(value, static_cast<u32>(len - 1));
} }
@@ -26,7 +26,7 @@ namespace Dynarmic::FP {
template<typename FPT> template<typename FPT>
u64 FPRoundInt(FPT op, FPCR fpcr, RoundingMode rounding, bool exact, FPSR& fpsr) { u64 FPRoundInt(FPT op, FPCR fpcr, RoundingMode rounding, bool exact, FPSR& fpsr) {
ASSERT(rounding != RoundingMode::ToOdd); DEBUG_ASSERT(rounding != RoundingMode::ToOdd);
auto [type, sign, value] = FPUnpack<FPT>(op, fpcr, fpsr); auto [type, sign, value] = FPUnpack<FPT>(op, fpcr, fpsr);
@@ -25,9 +25,9 @@ namespace Dynarmic::FP {
template<typename FPT> template<typename FPT>
u64 FPToFixed(size_t ibits, FPT op, size_t fbits, bool unsigned_, FPCR fpcr, RoundingMode rounding, FPSR& fpsr) { u64 FPToFixed(size_t ibits, FPT op, size_t fbits, bool unsigned_, FPCR fpcr, RoundingMode rounding, FPSR& fpsr) {
ASSERT(rounding != RoundingMode::ToOdd); DEBUG_ASSERT(rounding != RoundingMode::ToOdd);
ASSERT(ibits <= 64); DEBUG_ASSERT(ibits <= 64);
ASSERT(fbits <= ibits); DEBUG_ASSERT(fbits <= ibits);
auto [type, sign, value] = FPUnpack<FPT>(op, fpcr, fpsr); auto [type, sign, value] = FPUnpack<FPT>(op, fpcr, fpsr);
@@ -18,27 +18,27 @@ namespace Dynarmic::FP {
void FPProcessException(FPExc exception, FPCR fpcr, FPSR& fpsr) { void FPProcessException(FPExc exception, FPCR fpcr, FPSR& fpsr) {
switch (exception) { switch (exception) {
case FPExc::InvalidOp: case FPExc::InvalidOp:
ASSERT(!fpcr.IOE() && "Raising floating point exceptions unimplemented"); DEBUG_ASSERT(!fpcr.IOE() && "Raising floating point exceptions unimplemented");
fpsr.IOC(true); fpsr.IOC(true);
break; break;
case FPExc::DivideByZero: case FPExc::DivideByZero:
ASSERT(!fpcr.DZE() && "Raising floating point exceptions unimplemented"); DEBUG_ASSERT(!fpcr.DZE() && "Raising floating point exceptions unimplemented");
fpsr.DZC(true); fpsr.DZC(true);
break; break;
case FPExc::Overflow: case FPExc::Overflow:
ASSERT(!fpcr.OFE() && "Raising floating point exceptions unimplemented"); DEBUG_ASSERT(!fpcr.OFE() && "Raising floating point exceptions unimplemented");
fpsr.OFC(true); fpsr.OFC(true);
break; break;
case FPExc::Underflow: case FPExc::Underflow:
ASSERT(!fpcr.UFE() && "Raising floating point exceptions unimplemented"); DEBUG_ASSERT(!fpcr.UFE() && "Raising floating point exceptions unimplemented");
fpsr.UFC(true); fpsr.UFC(true);
break; break;
case FPExc::Inexact: case FPExc::Inexact:
ASSERT(!fpcr.IXE() && "Raising floating point exceptions unimplemented"); DEBUG_ASSERT(!fpcr.IXE() && "Raising floating point exceptions unimplemented");
fpsr.IXC(true); fpsr.IXC(true);
break; break;
case FPExc::InputDenorm: case FPExc::InputDenorm:
ASSERT(!fpcr.IDE() && "Raising floating point exceptions unimplemented"); DEBUG_ASSERT(!fpcr.IDE() && "Raising floating point exceptions unimplemented");
fpsr.IDC(true); fpsr.IDC(true);
break; break;
default: default:
@@ -23,7 +23,7 @@ namespace Dynarmic::FP {
template<typename FPT> template<typename FPT>
FPT FPProcessNaN(FPType type, FPT op, FPCR fpcr, FPSR& fpsr) { FPT FPProcessNaN(FPType type, FPT op, FPCR fpcr, FPSR& fpsr) {
ASSERT(type == FPType::QNaN || type == FPType::SNaN); DEBUG_ASSERT(type == FPType::QNaN || type == FPType::SNaN);
constexpr size_t topfrac = FPInfo<FPT>::explicit_mantissa_width - 1; constexpr size_t topfrac = FPInfo<FPT>::explicit_mantissa_width - 1;
@@ -85,8 +85,8 @@ std::tuple<bool, int, u64, ResidualError> Normalize(FPUnpacked op, int extra_rig
template<typename FPT> template<typename FPT>
FPT FPRoundBase(FPUnpacked op, FPCR fpcr, RoundingMode rounding, FPSR& fpsr) { FPT FPRoundBase(FPUnpacked op, FPCR fpcr, RoundingMode rounding, FPSR& fpsr) {
ASSERT(op.mantissa != 0); DEBUG_ASSERT(op.mantissa != 0);
ASSERT(rounding != RoundingMode::ToNearest_TieAwayFromZero); DEBUG_ASSERT(rounding != RoundingMode::ToNearest_TieAwayFromZero);
constexpr int minimum_exp = FPInfo<FPT>::exponent_min; constexpr int minimum_exp = FPInfo<FPT>::exponent_min;
constexpr size_t E = FPInfo<FPT>::exponent_width; constexpr size_t E = FPInfo<FPT>::exponent_width;
@@ -35,7 +35,7 @@ std::string DisassembleX64(const void* begin, const void* end) {
while (pos < end) { while (pos < end) {
char buffer[80]; char buffer[80];
size_t inst_size = LLVMDisasmInstruction(llvm_ctx, const_cast<u8*>(pos), remaining, reinterpret_cast<u64>(pos), buffer, sizeof(buffer)); size_t inst_size = LLVMDisasmInstruction(llvm_ctx, const_cast<u8*>(pos), remaining, reinterpret_cast<u64>(pos), buffer, sizeof(buffer));
ASSERT(inst_size); DEBUG_ASSERT(inst_size);
for (const u8* i = pos; i < pos + inst_size; i++) for (const u8* i = pos; i < pos + inst_size; i++)
result += fmt::format("{:02x} ", *i); result += fmt::format("{:02x} ", *i);
for (size_t i = inst_size; i < 10; i++) for (size_t i = inst_size; i < 10; i++)
@@ -64,12 +64,12 @@ IR::U32U64 IREmitter::GetExtendedRegister(ExtReg reg) {
} }
IR::U128 IREmitter::GetVector(ExtReg reg) { IR::U128 IREmitter::GetVector(ExtReg reg) {
ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg)); DEBUG_ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg));
return Inst<IR::U128>(Opcode::A32GetVector, IR::Value(reg)); return Inst<IR::U128>(Opcode::A32GetVector, IR::Value(reg));
} }
void IREmitter::SetRegister(const Reg reg, const IR::U32& value) { void IREmitter::SetRegister(const Reg reg, const IR::U32& value) {
ASSERT(reg != A32::Reg::PC); DEBUG_ASSERT(reg != A32::Reg::PC);
Inst(Opcode::A32SetRegister, IR::Value(reg), value); Inst(Opcode::A32SetRegister, IR::Value(reg), value);
} }
@@ -84,7 +84,7 @@ void IREmitter::SetExtendedRegister(const ExtReg reg, const IR::U32U64& value) {
} }
void IREmitter::SetVector(ExtReg reg, const IR::U128& value) { void IREmitter::SetVector(ExtReg reg, const IR::U128& value) {
ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg)); DEBUG_ASSERT(A32::IsDoubleExtReg(reg) || A32::IsQuadExtReg(reg));
Inst(Opcode::A32SetVector, IR::Value(reg), value); Inst(Opcode::A32SetVector, IR::Value(reg), value);
} }
@@ -361,7 +361,7 @@ IR::U32 IREmitter::ExclusiveWriteMemory64(const IR::U32& vaddr, const IR::U32& v
} }
void IREmitter::CoprocInternalOperation(size_t coproc_no, bool two, size_t opc1, CoprocReg CRd, CoprocReg CRn, CoprocReg CRm, size_t opc2) { void IREmitter::CoprocInternalOperation(size_t coproc_no, bool two, size_t opc1, CoprocReg CRd, CoprocReg CRn, CoprocReg CRm, size_t opc2) {
ASSERT(coproc_no <= 15); DEBUG_ASSERT(coproc_no <= 15);
const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(opc1), static_cast<u8>(opc1),
@@ -373,7 +373,7 @@ void IREmitter::CoprocInternalOperation(size_t coproc_no, bool two, size_t opc1,
} }
void IREmitter::CoprocSendOneWord(size_t coproc_no, bool two, size_t opc1, CoprocReg CRn, CoprocReg CRm, size_t opc2, const IR::U32& word) { void IREmitter::CoprocSendOneWord(size_t coproc_no, bool two, size_t opc1, CoprocReg CRn, CoprocReg CRm, size_t opc2, const IR::U32& word) {
ASSERT(coproc_no <= 15); DEBUG_ASSERT(coproc_no <= 15);
const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(opc1), static_cast<u8>(opc1),
@@ -384,7 +384,7 @@ void IREmitter::CoprocSendOneWord(size_t coproc_no, bool two, size_t opc1, Copro
} }
void IREmitter::CoprocSendTwoWords(size_t coproc_no, bool two, size_t opc, CoprocReg CRm, const IR::U32& word1, const IR::U32& word2) { void IREmitter::CoprocSendTwoWords(size_t coproc_no, bool two, size_t opc, CoprocReg CRm, const IR::U32& word1, const IR::U32& word2) {
ASSERT(coproc_no <= 15); DEBUG_ASSERT(coproc_no <= 15);
const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(opc), static_cast<u8>(opc),
@@ -393,7 +393,7 @@ void IREmitter::CoprocSendTwoWords(size_t coproc_no, bool two, size_t opc, Copro
} }
IR::U32 IREmitter::CoprocGetOneWord(size_t coproc_no, bool two, size_t opc1, CoprocReg CRn, CoprocReg CRm, size_t opc2) { IR::U32 IREmitter::CoprocGetOneWord(size_t coproc_no, bool two, size_t opc1, CoprocReg CRn, CoprocReg CRm, size_t opc2) {
ASSERT(coproc_no <= 15); DEBUG_ASSERT(coproc_no <= 15);
const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(opc1), static_cast<u8>(opc1),
@@ -404,7 +404,7 @@ IR::U32 IREmitter::CoprocGetOneWord(size_t coproc_no, bool two, size_t opc1, Cop
} }
IR::U64 IREmitter::CoprocGetTwoWords(size_t coproc_no, bool two, size_t opc, CoprocReg CRm) { IR::U64 IREmitter::CoprocGetTwoWords(size_t coproc_no, bool two, size_t opc, CoprocReg CRm) {
ASSERT(coproc_no <= 15); DEBUG_ASSERT(coproc_no <= 15);
const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(opc), static_cast<u8>(opc),
@@ -413,7 +413,7 @@ IR::U64 IREmitter::CoprocGetTwoWords(size_t coproc_no, bool two, size_t opc, Cop
} }
void IREmitter::CoprocLoadWords(size_t coproc_no, bool two, bool long_transfer, CoprocReg CRd, const IR::U32& address, bool has_option, u8 option) { void IREmitter::CoprocLoadWords(size_t coproc_no, bool two, bool long_transfer, CoprocReg CRd, const IR::U32& address, bool has_option, u8 option) {
ASSERT(coproc_no <= 15); DEBUG_ASSERT(coproc_no <= 15);
const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(long_transfer ? 1 : 0), static_cast<u8>(long_transfer ? 1 : 0),
@@ -424,7 +424,7 @@ void IREmitter::CoprocLoadWords(size_t coproc_no, bool two, bool long_transfer,
} }
void IREmitter::CoprocStoreWords(size_t coproc_no, bool two, bool long_transfer, CoprocReg CRd, const IR::U32& address, bool has_option, u8 option) { void IREmitter::CoprocStoreWords(size_t coproc_no, bool two, bool long_transfer, CoprocReg CRd, const IR::U32& address, bool has_option, u8 option) {
ASSERT(coproc_no <= 15); DEBUG_ASSERT(coproc_no <= 15);
const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no), const IR::Value::CoprocessorInfo coproc_info{static_cast<u8>(coproc_no),
static_cast<u8>(two ? 1 : 0), static_cast<u8>(two ? 1 : 0),
static_cast<u8>(long_transfer ? 1 : 0), static_cast<u8>(long_transfer ? 1 : 0),
@@ -85,7 +85,7 @@ constexpr bool IsQuadExtReg(ExtReg reg) {
} }
inline size_t RegNumber(Reg reg) { inline size_t RegNumber(Reg reg) {
ASSERT(reg != Reg::INVALID_REG); DEBUG_ASSERT(reg != Reg::INVALID_REG);
return size_t(reg); return size_t(reg);
} }
@@ -95,13 +95,13 @@ inline size_t RegNumber(ExtReg reg) {
} else if (IsDoubleExtReg(reg)) { } else if (IsDoubleExtReg(reg)) {
return size_t(reg) - size_t(ExtReg::D0); return size_t(reg) - size_t(ExtReg::D0);
} }
ASSERT(IsQuadExtReg(reg)); DEBUG_ASSERT(IsQuadExtReg(reg));
return size_t(reg) - size_t(ExtReg::Q0); return size_t(reg) - size_t(ExtReg::Q0);
} }
inline Reg operator+(Reg reg, size_t number) { inline Reg operator+(Reg reg, size_t number) {
const size_t new_reg = RegNumber(reg) + number; const size_t new_reg = RegNumber(reg) + number;
ASSERT(new_reg <= 15); DEBUG_ASSERT(new_reg <= 15);
return static_cast<Reg>(new_reg); return static_cast<Reg>(new_reg);
} }
@@ -109,7 +109,7 @@ inline Reg operator+(Reg reg, size_t number) {
inline ExtReg operator+(ExtReg reg, size_t number) { inline ExtReg operator+(ExtReg reg, size_t number) {
const auto new_reg = static_cast<ExtReg>(static_cast<size_t>(reg) + number); const auto new_reg = static_cast<ExtReg>(static_cast<size_t>(reg) + number);
ASSERT((IsSingleExtReg(reg) && IsSingleExtReg(new_reg)) DEBUG_ASSERT((IsSingleExtReg(reg) && IsSingleExtReg(new_reg))
|| (IsDoubleExtReg(reg) && IsDoubleExtReg(new_reg)) || (IsDoubleExtReg(reg) && IsDoubleExtReg(new_reg))
|| (IsQuadExtReg(reg) && IsQuadExtReg(new_reg))); || (IsQuadExtReg(reg) && IsQuadExtReg(new_reg)));
@@ -21,7 +21,7 @@
namespace Dynarmic::A32 { namespace Dynarmic::A32 {
bool CondCanContinue(const ConditionalState cond_state, const A32::IREmitter& ir) { bool CondCanContinue(const ConditionalState cond_state, const A32::IREmitter& ir) {
ASSERT(cond_state != ConditionalState::Break && "Should never happen."); DEBUG_ASSERT(cond_state != ConditionalState::Break && "Should never happen.");
if (cond_state == ConditionalState::None) if (cond_state == ConditionalState::None)
return true; return true;
@@ -32,7 +32,7 @@ bool CondCanContinue(const ConditionalState cond_state, const A32::IREmitter& ir
} }
bool IsConditionPassed(TranslatorVisitor& v, IR::Cond cond) { bool IsConditionPassed(TranslatorVisitor& v, IR::Cond cond) {
ASSERT(v.cond_state != ConditionalState::Break && "This should never happen. We requested a break but that wasn't honored."); DEBUG_ASSERT(v.cond_state != ConditionalState::Break && "This should never happen. We requested a break but that wasn't honored.");
if (cond == IR::Cond::NV) { if (cond == IR::Cond::NV) {
// NV conditional is obsolete // NV conditional is obsolete
@@ -29,7 +29,7 @@ bool TranslatorVisitor::ThumbConditionPassed() {
bool TranslatorVisitor::VFPConditionPassed(Cond cond) { bool TranslatorVisitor::VFPConditionPassed(Cond cond) {
if (ir.current_location.TFlag()) { if (ir.current_location.TFlag()) {
ASSERT(cond == Cond::AL); DEBUG_ASSERT(cond == Cond::AL);
return true; return true;
} }
return ArmConditionPassed(cond); return ArmConditionPassed(cond);
@@ -130,7 +130,7 @@ bool ShiftRightNarrowing(TranslatorVisitor& v, bool D, size_t imm6, size_t Vd, b
} }
return v.ir.VectorUnsignedSaturatedNarrow(source_esize, wide_result); return v.ir.VectorUnsignedSaturatedNarrow(source_esize, wide_result);
case Narrowing::SaturateToSigned: case Narrowing::SaturateToSigned:
ASSERT(signedness == Signedness::Signed); DEBUG_ASSERT(signedness == Signedness::Signed);
return v.ir.VectorSignedSaturatedNarrowToSigned(source_esize, wide_result); return v.ir.VectorSignedSaturatedNarrowToSigned(source_esize, wide_result);
} }
UNREACHABLE(); UNREACHABLE();
@@ -95,7 +95,7 @@ bool TranslatorVisitor::arm_LDR_imm(Cond cond, bool P, bool U, bool W, Reg n, Re
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
ASSERT(!(!P && W) && "T form of instruction unimplemented"); DEBUG_ASSERT(!(!P && W) && "T form of instruction unimplemented");
if ((!P || W) && n == t) { if ((!P || W) && n == t) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -126,7 +126,7 @@ bool TranslatorVisitor::arm_LDR_imm(Cond cond, bool P, bool U, bool W, Reg n, Re
// LDR <Rt>, [<Rn>, #+/-<Rm>]{!} // LDR <Rt>, [<Rn>, #+/-<Rm>]{!}
// LDR <Rt>, [<Rn>], #+/-<Rm> // LDR <Rt>, [<Rn>], #+/-<Rm>
bool TranslatorVisitor::arm_LDR_reg(Cond cond, bool P, bool U, bool W, Reg n, Reg t, Imm<5> imm5, ShiftType shift, Reg m) { bool TranslatorVisitor::arm_LDR_reg(Cond cond, bool P, bool U, bool W, Reg n, Reg t, Imm<5> imm5, ShiftType shift, Reg m) {
ASSERT(!(!P && W) && "T form of instruction unimplemented"); DEBUG_ASSERT(!(!P && W) && "T form of instruction unimplemented");
if (m == Reg::PC) { if (m == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -184,7 +184,7 @@ bool TranslatorVisitor::arm_LDRB_imm(Cond cond, bool P, bool U, bool W, Reg n, R
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
ASSERT(!(!P && W) && "T form of instruction unimplemented"); DEBUG_ASSERT(!(!P && W) && "T form of instruction unimplemented");
if ((!P || W) && n == t) { if ((!P || W) && n == t) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -209,7 +209,7 @@ bool TranslatorVisitor::arm_LDRB_imm(Cond cond, bool P, bool U, bool W, Reg n, R
// LDRB <Rt>, [<Rn>, #+/-<Rm>]{!} // LDRB <Rt>, [<Rn>, #+/-<Rm>]{!}
// LDRB <Rt>, [<Rn>], #+/-<Rm> // LDRB <Rt>, [<Rn>], #+/-<Rm>
bool TranslatorVisitor::arm_LDRB_reg(Cond cond, bool P, bool U, bool W, Reg n, Reg t, Imm<5> imm5, ShiftType shift, Reg m) { bool TranslatorVisitor::arm_LDRB_reg(Cond cond, bool P, bool U, bool W, Reg n, Reg t, Imm<5> imm5, ShiftType shift, Reg m) {
ASSERT(!(!P && W) && "T form of instruction unimplemented"); DEBUG_ASSERT(!(!P && W) && "T form of instruction unimplemented");
if (t == Reg::PC || m == Reg::PC) { if (t == Reg::PC || m == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -352,7 +352,7 @@ bool TranslatorVisitor::arm_LDRD_reg(Cond cond, bool P, bool U, bool W, Reg n, R
// LDRH <Rt>, [PC, #-/+<imm>] // LDRH <Rt>, [PC, #-/+<imm>]
bool TranslatorVisitor::arm_LDRH_lit(Cond cond, bool P, bool U, bool W, Reg t, Imm<4> imm8a, Imm<4> imm8b) { bool TranslatorVisitor::arm_LDRH_lit(Cond cond, bool P, bool U, bool W, Reg t, Imm<4> imm8a, Imm<4> imm8b) {
ASSERT(!(!P && W) && "T form of instruction unimplemented"); DEBUG_ASSERT(!(!P && W) && "T form of instruction unimplemented");
if (P == W) { if (P == W) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -382,7 +382,7 @@ bool TranslatorVisitor::arm_LDRH_imm(Cond cond, bool P, bool U, bool W, Reg n, R
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
ASSERT(!(!P && W) && "T form of instruction unimplemented"); DEBUG_ASSERT(!(!P && W) && "T form of instruction unimplemented");
if ((!P || W) && n == t) { if ((!P || W) && n == t) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -407,7 +407,7 @@ bool TranslatorVisitor::arm_LDRH_imm(Cond cond, bool P, bool U, bool W, Reg n, R
// LDRH <Rt>, [<Rn>, #+/-<Rm>]{!} // LDRH <Rt>, [<Rn>, #+/-<Rm>]{!}
// LDRH <Rt>, [<Rn>], #+/-<Rm> // LDRH <Rt>, [<Rn>], #+/-<Rm>
bool TranslatorVisitor::arm_LDRH_reg(Cond cond, bool P, bool U, bool W, Reg n, Reg t, Reg m) { bool TranslatorVisitor::arm_LDRH_reg(Cond cond, bool P, bool U, bool W, Reg n, Reg t, Reg m) {
ASSERT(!(!P && W) && "T form of instruction unimplemented"); DEBUG_ASSERT(!(!P && W) && "T form of instruction unimplemented");
if (t == Reg::PC || m == Reg::PC) { if (t == Reg::PC || m == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -456,7 +456,7 @@ bool TranslatorVisitor::arm_LDRSB_imm(Cond cond, bool P, bool U, bool W, Reg n,
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
ASSERT(!(!P && W) && "T form of instruction unimplemented"); DEBUG_ASSERT(!(!P && W) && "T form of instruction unimplemented");
if ((!P || W) && n == t) { if ((!P || W) && n == t) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -481,7 +481,7 @@ bool TranslatorVisitor::arm_LDRSB_imm(Cond cond, bool P, bool U, bool W, Reg n,
// LDRSB <Rt>, [<Rn>, #+/-<Rm>]{!} // LDRSB <Rt>, [<Rn>, #+/-<Rm>]{!}
// LDRSB <Rt>, [<Rn>], #+/-<Rm> // LDRSB <Rt>, [<Rn>], #+/-<Rm>
bool TranslatorVisitor::arm_LDRSB_reg(Cond cond, bool P, bool U, bool W, Reg n, Reg t, Reg m) { bool TranslatorVisitor::arm_LDRSB_reg(Cond cond, bool P, bool U, bool W, Reg n, Reg t, Reg m) {
ASSERT(!(!P && W) && "T form of instruction unimplemented"); DEBUG_ASSERT(!(!P && W) && "T form of instruction unimplemented");
if (t == Reg::PC || m == Reg::PC) { if (t == Reg::PC || m == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -529,7 +529,7 @@ bool TranslatorVisitor::arm_LDRSH_imm(Cond cond, bool P, bool U, bool W, Reg n,
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
ASSERT(!(!P && W) && "T form of instruction unimplemented"); DEBUG_ASSERT(!(!P && W) && "T form of instruction unimplemented");
if ((!P || W) && n == t) { if ((!P || W) && n == t) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -554,7 +554,7 @@ bool TranslatorVisitor::arm_LDRSH_imm(Cond cond, bool P, bool U, bool W, Reg n,
// LDRSH <Rt>, [<Rn>, #+/-<Rm>]{!} // LDRSH <Rt>, [<Rn>, #+/-<Rm>]{!}
// LDRSH <Rt>, [<Rn>], #+/-<Rm> // LDRSH <Rt>, [<Rn>], #+/-<Rm>
bool TranslatorVisitor::arm_LDRSH_reg(Cond cond, bool P, bool U, bool W, Reg n, Reg t, Reg m) { bool TranslatorVisitor::arm_LDRSH_reg(Cond cond, bool P, bool U, bool W, Reg n, Reg t, Reg m) {
ASSERT(!(!P && W) && "T form of instruction unimplemented"); DEBUG_ASSERT(!(!P && W) && "T form of instruction unimplemented");
if (t == Reg::PC || m == Reg::PC) { if (t == Reg::PC || m == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -34,7 +34,7 @@ bool TranslatorVisitor::arm_MRS(Cond cond, Reg d) {
// MSR<c> <spec_reg>, #<const> // MSR<c> <spec_reg>, #<const>
bool TranslatorVisitor::arm_MSR_imm(Cond cond, unsigned mask, int rotate, Imm<8> imm8) { bool TranslatorVisitor::arm_MSR_imm(Cond cond, unsigned mask, int rotate, Imm<8> imm8) {
ASSERT(mask != 0 && "Decode error"); DEBUG_ASSERT(mask != 0 && "Decode error");
if (!ArmConditionPassed(cond)) { if (!ArmConditionPassed(cond)) {
return true; return true;
@@ -687,7 +687,7 @@ bool TranslatorVisitor::thumb16_NOP() {
// IT{<x>{<y>{<z>}}} <cond> // IT{<x>{<y>{<z>}}} <cond>
bool TranslatorVisitor::thumb16_IT(Imm<8> imm8) { bool TranslatorVisitor::thumb16_IT(Imm<8> imm8) {
ASSERT((imm8.Bits<0, 3>() != 0b0000) && "Decode Error"); DEBUG_ASSERT((imm8.Bits<0, 3>() != 0b0000) && "Decode Error");
if (imm8.Bits<4, 7>() == 0b1111 || (imm8.Bits<4, 7>() == 0b1110 && std::popcount(imm8.Bits<0, 3>()) != 1)) { if (imm8.Bits<4, 7>() == 0b1111 || (imm8.Bits<4, 7>() == 0b1110 && std::popcount(imm8.Bits<0, 3>()) != 1)) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project. /* This file is part of the dynarmic project.
@@ -23,7 +23,7 @@ bool TranslatorVisitor::thumb32_TST_imm(Imm<1> i, Reg n, Imm<3> imm3, Imm<8> imm
} }
bool TranslatorVisitor::thumb32_AND_imm(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) { bool TranslatorVisitor::thumb32_AND_imm(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) {
ASSERT(!(d == Reg::PC && S) && "Decode error"); DEBUG_ASSERT(!(d == Reg::PC && S) && "Decode error");
if ((d == Reg::PC && !S) || n == Reg::PC) { if ((d == Reg::PC && !S) || n == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -69,7 +69,7 @@ bool TranslatorVisitor::thumb32_MOV_imm(Imm<1> i, bool S, Imm<3> imm3, Reg d, Im
} }
bool TranslatorVisitor::thumb32_ORR_imm(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) { bool TranslatorVisitor::thumb32_ORR_imm(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) {
ASSERT(n != Reg::PC && "Decode error"); DEBUG_ASSERT(n != Reg::PC && "Decode error");
if (d == Reg::PC) { if (d == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -100,7 +100,7 @@ bool TranslatorVisitor::thumb32_MVN_imm(Imm<1> i, bool S, Imm<3> imm3, Reg d, Im
} }
bool TranslatorVisitor::thumb32_ORN_imm(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) { bool TranslatorVisitor::thumb32_ORN_imm(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) {
ASSERT(n != Reg::PC && "Decode error"); DEBUG_ASSERT(n != Reg::PC && "Decode error");
if (d == Reg::PC) { if (d == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -128,7 +128,7 @@ bool TranslatorVisitor::thumb32_TEQ_imm(Imm<1> i, Reg n, Imm<3> imm3, Imm<8> imm
} }
bool TranslatorVisitor::thumb32_EOR_imm(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) { bool TranslatorVisitor::thumb32_EOR_imm(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) {
ASSERT(!(d == Reg::PC && S) && "Decode error"); DEBUG_ASSERT(!(d == Reg::PC && S) && "Decode error");
if ((d == Reg::PC && !S) || n == Reg::PC) { if ((d == Reg::PC && !S) || n == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -156,7 +156,7 @@ bool TranslatorVisitor::thumb32_CMN_imm(Imm<1> i, Reg n, Imm<3> imm3, Imm<8> imm
} }
bool TranslatorVisitor::thumb32_ADD_imm_1(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) { bool TranslatorVisitor::thumb32_ADD_imm_1(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) {
ASSERT(!(d == Reg::PC && S) && "Decode error"); DEBUG_ASSERT(!(d == Reg::PC && S) && "Decode error");
if ((d == Reg::PC && !S) || n == Reg::PC) { if ((d == Reg::PC && !S) || n == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -214,7 +214,7 @@ bool TranslatorVisitor::thumb32_CMP_imm(Imm<1> i, Reg n, Imm<3> imm3, Imm<8> imm
} }
bool TranslatorVisitor::thumb32_SUB_imm_1(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) { bool TranslatorVisitor::thumb32_SUB_imm_1(Imm<1> i, bool S, Reg n, Imm<3> imm3, Reg d, Imm<8> imm8) {
ASSERT(!(d == Reg::PC && S) && "Decode error"); DEBUG_ASSERT(!(d == Reg::PC && S) && "Decode error");
if ((d == Reg::PC && !S) || n == Reg::PC) { if ((d == Reg::PC && !S) || n == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
} }
@@ -17,7 +17,7 @@ namespace Dynarmic::A32 {
using SaturationFunction = IR::ResultAndOverflow<IR::U32> (IREmitter::*)(const IR::U32&, size_t); using SaturationFunction = IR::ResultAndOverflow<IR::U32> (IREmitter::*)(const IR::U32&, size_t);
static bool Saturation(TranslatorVisitor& v, bool sh, Reg n, Reg d, Imm<5> shift_amount, size_t saturate_to, SaturationFunction sat_fn) { static bool Saturation(TranslatorVisitor& v, bool sh, Reg n, Reg d, Imm<5> shift_amount, size_t saturate_to, SaturationFunction sat_fn) {
ASSERT(!(sh && shift_amount == 0) && "Invalid decode"); DEBUG_ASSERT(!(sh && shift_amount == 0) && "Invalid decode");
if (d == Reg::PC || n == Reg::PC) { if (d == Reg::PC || n == Reg::PC) {
return v.UnpredictableInstruction(); return v.UnpredictableInstruction();
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project. /* This file is part of the dynarmic project.
@@ -23,7 +23,7 @@ bool TranslatorVisitor::thumb32_TST_reg(Reg n, Imm<3> imm3, Imm<2> imm2, ShiftTy
} }
bool TranslatorVisitor::thumb32_AND_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) { bool TranslatorVisitor::thumb32_AND_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) {
ASSERT(!(d == Reg::PC && S) && "Decode error"); DEBUG_ASSERT(!(d == Reg::PC && S) && "Decode error");
if ((d == Reg::PC && !S) || n == Reg::PC || m == Reg::PC) { if ((d == Reg::PC && !S) || n == Reg::PC || m == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
@@ -67,7 +67,7 @@ bool TranslatorVisitor::thumb32_MOV_reg(bool S, Imm<3> imm3, Reg d, Imm<2> imm2,
} }
bool TranslatorVisitor::thumb32_ORR_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) { bool TranslatorVisitor::thumb32_ORR_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) {
ASSERT(n != Reg::PC && "Decode error"); DEBUG_ASSERT(n != Reg::PC && "Decode error");
if (d == Reg::PC || m == Reg::PC) { if (d == Reg::PC || m == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
@@ -97,7 +97,7 @@ bool TranslatorVisitor::thumb32_MVN_reg(bool S, Imm<3> imm3, Reg d, Imm<2> imm2,
} }
bool TranslatorVisitor::thumb32_ORN_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) { bool TranslatorVisitor::thumb32_ORN_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) {
ASSERT(n != Reg::PC && "Decode error"); DEBUG_ASSERT(n != Reg::PC && "Decode error");
if (d == Reg::PC || m == Reg::PC) { if (d == Reg::PC || m == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
@@ -125,7 +125,7 @@ bool TranslatorVisitor::thumb32_TEQ_reg(Reg n, Imm<3> imm3, Imm<2> imm2, ShiftTy
} }
bool TranslatorVisitor::thumb32_EOR_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) { bool TranslatorVisitor::thumb32_EOR_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) {
ASSERT(!(d == Reg::PC && S) && "Decode error"); DEBUG_ASSERT(!(d == Reg::PC && S) && "Decode error");
if ((d == Reg::PC && !S) || n == Reg::PC || m == Reg::PC) { if ((d == Reg::PC && !S) || n == Reg::PC || m == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
@@ -168,7 +168,7 @@ bool TranslatorVisitor::thumb32_CMN_reg(Reg n, Imm<3> imm3, Imm<2> imm2, ShiftTy
} }
bool TranslatorVisitor::thumb32_ADD_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) { bool TranslatorVisitor::thumb32_ADD_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) {
ASSERT(!(d == Reg::PC && S) && "Decode error"); DEBUG_ASSERT(!(d == Reg::PC && S) && "Decode error");
if ((d == Reg::PC && !S) || n == Reg::PC || m == Reg::PC) { if ((d == Reg::PC && !S) || n == Reg::PC || m == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
@@ -224,7 +224,7 @@ bool TranslatorVisitor::thumb32_CMP_reg(Reg n, Imm<3> imm3, Imm<2> imm2, ShiftTy
} }
bool TranslatorVisitor::thumb32_SUB_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) { bool TranslatorVisitor::thumb32_SUB_reg(bool S, Reg n, Imm<3> imm3, Reg d, Imm<2> imm2, ShiftType type, Reg m) {
ASSERT(!(d == Reg::PC && S) && "Decode error"); DEBUG_ASSERT(!(d == Reg::PC && S) && "Decode error");
if ((d == Reg::PC && !S) || n == Reg::PC || m == Reg::PC) { if ((d == Reg::PC && !S) || n == Reg::PC || m == Reg::PC) {
return UnpredictableInstruction(); return UnpredictableInstruction();
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project. /* This file is part of the dynarmic project.
@@ -1304,11 +1304,11 @@ bool TranslatorVisitor::vfp_VSTR(Cond cond, bool U, bool D, Reg n, size_t Vd, bo
// VSTM{mode}<c> <Rn>{!}, <list of double registers> // VSTM{mode}<c> <Rn>{!}, <list of double registers>
bool TranslatorVisitor::vfp_VSTM_a1(Cond cond, bool p, bool u, bool D, bool w, Reg n, size_t Vd, Imm<8> imm8) { bool TranslatorVisitor::vfp_VSTM_a1(Cond cond, bool p, bool u, bool D, bool w, Reg n, size_t Vd, Imm<8> imm8) {
if (!p && !u && !w) { if (!p && !u && !w) {
ASSERT(false && "Decode error"); DEBUG_ASSERT(false && "Decode error");
} }
if (p && !w) { if (p && !w) {
ASSERT(false && "Decode error"); DEBUG_ASSERT(false && "Decode error");
} }
if (p == u && w) { if (p == u && w) {
@@ -1356,11 +1356,11 @@ bool TranslatorVisitor::vfp_VSTM_a1(Cond cond, bool p, bool u, bool D, bool w, R
// VSTM{mode}<c> <Rn>{!}, <list of single registers> // VSTM{mode}<c> <Rn>{!}, <list of single registers>
bool TranslatorVisitor::vfp_VSTM_a2(Cond cond, bool p, bool u, bool D, bool w, Reg n, size_t Vd, Imm<8> imm8) { bool TranslatorVisitor::vfp_VSTM_a2(Cond cond, bool p, bool u, bool D, bool w, Reg n, size_t Vd, Imm<8> imm8) {
if (!p && !u && !w) { if (!p && !u && !w) {
ASSERT(false && "Decode error"); DEBUG_ASSERT(false && "Decode error");
} }
if (p && !w) { if (p && !w) {
ASSERT(false && "Decode error"); DEBUG_ASSERT(false && "Decode error");
} }
if (p == u && w) { if (p == u && w) {
@@ -1399,11 +1399,11 @@ bool TranslatorVisitor::vfp_VSTM_a2(Cond cond, bool p, bool u, bool D, bool w, R
// VLDM{mode}<c> <Rn>{!}, <list of double registers> // VLDM{mode}<c> <Rn>{!}, <list of double registers>
bool TranslatorVisitor::vfp_VLDM_a1(Cond cond, bool p, bool u, bool D, bool w, Reg n, size_t Vd, Imm<8> imm8) { bool TranslatorVisitor::vfp_VLDM_a1(Cond cond, bool p, bool u, bool D, bool w, Reg n, size_t Vd, Imm<8> imm8) {
if (!p && !u && !w) { if (!p && !u && !w) {
ASSERT(false && "Decode error"); DEBUG_ASSERT(false && "Decode error");
} }
if (p && !w) { if (p && !w) {
ASSERT(false && "Decode error"); DEBUG_ASSERT(false && "Decode error");
} }
if (p == u && w) { if (p == u && w) {
@@ -1449,11 +1449,11 @@ bool TranslatorVisitor::vfp_VLDM_a1(Cond cond, bool p, bool u, bool D, bool w, R
// VLDM{mode}<c> <Rn>{!}, <list of single registers> // VLDM{mode}<c> <Rn>{!}, <list of single registers>
bool TranslatorVisitor::vfp_VLDM_a2(Cond cond, bool p, bool u, bool D, bool w, Reg n, size_t Vd, Imm<8> imm8) { bool TranslatorVisitor::vfp_VLDM_a2(Cond cond, bool p, bool u, bool D, bool w, Reg n, size_t Vd, Imm<8> imm8) {
if (!p && !u && !w) { if (!p && !u && !w) {
ASSERT(false && "Decode error"); DEBUG_ASSERT(false && "Decode error");
} }
if (p && !w) { if (p && !w) {
ASSERT(false && "Decode error"); DEBUG_ASSERT(false && "Decode error");
} }
if (p == u && w) { if (p == u && w) {
@@ -73,7 +73,7 @@ void TranslateArm(IR::Block& block, LocationDescriptor descriptor, TranslateCall
} }
} }
} }
ASSERT(block.HasTerminal() && "Terminal has not been set"); DEBUG_ASSERT(block.HasTerminal() && "Terminal has not been set");
block.SetEndLocation(visitor.ir.current_location); block.SetEndLocation(visitor.ir.current_location);
} }
@@ -172,7 +172,7 @@ void TranslateThumb(IR::Block& block, LocationDescriptor descriptor, TranslateCa
} }
} }
} }
ASSERT(block.HasTerminal() && "Terminal has not been set"); DEBUG_ASSERT(block.HasTerminal() && "Terminal has not been set");
block.SetEndLocation(visitor.ir.current_location); block.SetEndLocation(visitor.ir.current_location);
} }
@@ -114,14 +114,14 @@ constexpr size_t VecNumber(Vec vec) {
inline Reg operator+(Reg reg, size_t number) { inline Reg operator+(Reg reg, size_t number) {
const size_t new_reg = RegNumber(reg) + number; const size_t new_reg = RegNumber(reg) + number;
ASSERT(new_reg <= 31); DEBUG_ASSERT(new_reg <= 31);
return static_cast<Reg>(new_reg); return static_cast<Reg>(new_reg);
} }
inline Vec operator+(Vec vec, size_t number) { inline Vec operator+(Vec vec, size_t number) {
const size_t new_vec = VecNumber(vec) + number; const size_t new_vec = VecNumber(vec) + number;
ASSERT(new_vec <= 31); DEBUG_ASSERT(new_vec <= 31);
return static_cast<Vec>(new_vec); return static_cast<Vec>(new_vec);
} }
@@ -39,7 +39,7 @@ void Translate(IR::Block& block, LocationDescriptor descriptor, MemoryReadCodeFu
if (single_step && should_continue) { if (single_step && should_continue) {
visitor.ir.SetTerm(IR::Term::LinkBlock{*visitor.ir.current_location}); visitor.ir.SetTerm(IR::Term::LinkBlock{*visitor.ir.current_location});
} }
ASSERT(block.HasTerminal() && "Terminal has not been set"); DEBUG_ASSERT(block.HasTerminal() && "Terminal has not been set");
block.SetEndLocation(*visitor.ir.current_location); block.SetEndLocation(*visitor.ir.current_location);
} }
@@ -170,8 +170,8 @@ void TranslatorVisitor::V_scalar(size_t bitsize, Vec vec, IR::UAnyU128 value) {
} }
IR::U128 TranslatorVisitor::Vpart(size_t bitsize, Vec vec, size_t part) { IR::U128 TranslatorVisitor::Vpart(size_t bitsize, Vec vec, size_t part) {
ASSERT(part == 0 || part == 1); DEBUG_ASSERT(part == 0 || part == 1);
ASSERT(bitsize == 64); DEBUG_ASSERT(bitsize == 64);
if (part == 0) { if (part == 0) {
return V(64, vec); return V(64, vec);
} }
@@ -179,33 +179,33 @@ IR::U128 TranslatorVisitor::Vpart(size_t bitsize, Vec vec, size_t part) {
} }
void TranslatorVisitor::Vpart(size_t bitsize, Vec vec, size_t part, IR::U128 value) { void TranslatorVisitor::Vpart(size_t bitsize, Vec vec, size_t part, IR::U128 value) {
ASSERT(part == 0 || part == 1); DEBUG_ASSERT(part == 0 || part == 1);
if (part == 0) { if (part == 0) {
ASSERT(bitsize == 64); DEBUG_ASSERT(bitsize == 64);
V(128, vec, ir.VectorZeroExtend(bitsize, value)); V(128, vec, ir.VectorZeroExtend(bitsize, value));
} else { } else {
ASSERT(bitsize == 64); DEBUG_ASSERT(bitsize == 64);
V(128, vec, ir.VectorInterleaveLower(64, V(128, vec), value)); V(128, vec, ir.VectorInterleaveLower(64, V(128, vec), value));
} }
} }
IR::UAny TranslatorVisitor::Vpart_scalar(size_t bitsize, Vec vec, size_t part) { IR::UAny TranslatorVisitor::Vpart_scalar(size_t bitsize, Vec vec, size_t part) {
ASSERT(part == 0 || part == 1); DEBUG_ASSERT(part == 0 || part == 1);
if (part == 0) { if (part == 0) {
ASSERT(bitsize == 8 || bitsize == 16 || bitsize == 32 || bitsize == 64); DEBUG_ASSERT(bitsize == 8 || bitsize == 16 || bitsize == 32 || bitsize == 64);
} else { } else {
ASSERT(bitsize == 64); DEBUG_ASSERT(bitsize == 64);
} }
return ir.VectorGetElement(bitsize, V(128, vec), part); return ir.VectorGetElement(bitsize, V(128, vec), part);
} }
void TranslatorVisitor::Vpart_scalar(size_t bitsize, Vec vec, size_t part, IR::UAny value) { void TranslatorVisitor::Vpart_scalar(size_t bitsize, Vec vec, size_t part, IR::UAny value) {
ASSERT(part == 0 || part == 1); DEBUG_ASSERT(part == 0 || part == 1);
if (part == 0) { if (part == 0) {
ASSERT(bitsize == 8 || bitsize == 16 || bitsize == 32 || bitsize == 64); DEBUG_ASSERT(bitsize == 8 || bitsize == 16 || bitsize == 32 || bitsize == 64);
V(128, vec, ir.ZeroExtendToQuad(value)); V(128, vec, ir.ZeroExtendToQuad(value));
} else { } else {
ASSERT(bitsize == 64); DEBUG_ASSERT(bitsize == 64);
V(128, vec, ir.VectorSetElement(64, V(128, vec), 1, value)); V(128, vec, ir.VectorSetElement(64, V(128, vec), 1, value));
} }
} }
@@ -315,8 +315,8 @@ IR::U32U64 TranslatorVisitor::ShiftReg(size_t bitsize, Reg reg, Imm<2> shift, IR
} }
IR::U32U64 TranslatorVisitor::ExtendReg(size_t bitsize, Reg reg, Imm<3> option, u8 shift) { IR::U32U64 TranslatorVisitor::ExtendReg(size_t bitsize, Reg reg, Imm<3> option, u8 shift) {
ASSERT(shift <= 4); DEBUG_ASSERT(shift <= 4);
ASSERT(bitsize == 32 || bitsize == 64); DEBUG_ASSERT(bitsize == 32 || bitsize == 64);
IR::UAny val = X(bitsize, reg); IR::UAny val = X(bitsize, reg);
size_t len; size_t len;
IR::U32U64 extended; IR::U32U64 extended;
@@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project. /* This file is part of the dynarmic project.
* Copyright (c) 2018 MerryMage * Copyright (c) 2018 MerryMage
* SPDX-License-Identifier: 0BSD * SPDX-License-Identifier: 0BSD
@@ -48,7 +51,7 @@ static bool SharedDecodeAndOperation(TranslatorVisitor& v, bool wback, IR::MemOp
default: default:
return v.UnallocatedEncoding(); return v.UnallocatedEncoding();
} }
ASSERT(rpt == 1 || selem == 1); DEBUG_ASSERT(rpt == 1 || selem == 1);
if ((size == 0b11 && !Q) && selem != 1) { if ((size == 0b11 && !Q) && selem != 1) {
return v.ReservedValue(); return v.ReservedValue();
@@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project. /* This file is part of the dynarmic project.
* Copyright (c) 2018 MerryMage * Copyright (c) 2018 MerryMage
* SPDX-License-Identifier: 0BSD * SPDX-License-Identifier: 0BSD
@@ -18,10 +21,10 @@ static bool LoadStoreRegisterImmediate(TranslatorVisitor& v, bool wback, bool po
signed_ = false; signed_ = false;
} else if (size == 0b11) { } else if (size == 0b11) {
memop = IR::MemOp::PREFETCH; memop = IR::MemOp::PREFETCH;
ASSERT(!opc.Bit<0>()); DEBUG_ASSERT(!opc.Bit<0>());
} else { } else {
memop = IR::MemOp::LOAD; memop = IR::MemOp::LOAD;
ASSERT(!(size == 0b10 && opc.Bit<0>() == 1)); DEBUG_ASSERT(!(size == 0b10 && opc.Bit<0>() == 1));
regsize = opc.Bit<0>() ? 32 : 64; regsize = opc.Bit<0>() ? 32 : 64;
signed_ = true; signed_ = true;
} }
@@ -198,7 +198,7 @@ bool ShiftRightNarrowing(TranslatorVisitor& v, Imm<4> immh, Imm<3> immb, Vec Vn,
} }
return v.ir.VectorUnsignedSaturatedNarrow(source_esize, wide_result); return v.ir.VectorUnsignedSaturatedNarrow(source_esize, wide_result);
case Narrowing::SaturateToSigned: case Narrowing::SaturateToSigned:
ASSERT(SignednessSSSBI == SignednessSSSBI::Signed); DEBUG_ASSERT(SignednessSSSBI == SignednessSSSBI::Signed);
return v.ir.VectorSignedSaturatedNarrowToSigned(source_esize, wide_result); return v.ir.VectorSignedSaturatedNarrowToSigned(source_esize, wide_result);
} }
UNREACHABLE(); UNREACHABLE();
@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
/* This file is part of the dynarmic project. /* This file is part of the dynarmic project.
@@ -73,7 +73,7 @@ bool MultiplyByElementHalfPrecision(TranslatorVisitor& v, Imm<1> L, Imm<1> M, Im
// TODO: Currently we don't implement half-precision paths // TODO: Currently we don't implement half-precision paths
// for regular multiplication and extended multiplication. // for regular multiplication and extended multiplication.
ASSERT(extra_behavior != ExtraBehavior::None DEBUG_ASSERT(extra_behavior != ExtraBehavior::None
&& extra_behavior != ExtraBehavior::MultiplyExtended); && extra_behavior != ExtraBehavior::MultiplyExtended);
if (extra_behavior == ExtraBehavior::Subtract) { if (extra_behavior == ExtraBehavior::Subtract) {
operand1 = v.ir.FPNeg(operand1); operand1 = v.ir.FPNeg(operand1);
@@ -127,7 +127,7 @@ bool ShiftRightNarrowingSSBI(TranslatorVisitor& v, bool Q, Imm<4> immh, Imm<3> i
} }
return v.ir.VectorUnsignedSaturatedNarrow(source_esize, wide_result); return v.ir.VectorUnsignedSaturatedNarrow(source_esize, wide_result);
case NarrowingSSBI::SaturateToSigned: case NarrowingSSBI::SaturateToSigned:
ASSERT(SignednessSSBI == SignednessSSBI::Signed); DEBUG_ASSERT(SignednessSSBI == SignednessSSBI::Signed);
return v.ir.VectorSignedSaturatedNarrowToSigned(source_esize, wide_result); return v.ir.VectorSignedSaturatedNarrowToSigned(source_esize, wide_result);
} }
UNREACHABLE(); UNREACHABLE();
@@ -66,7 +66,7 @@ bool TranslatorVisitor::FCMLA_vec(bool Q, Imm<2> size, Vec Vm, Imm<2> rot, Vec V
const size_t esize = 8U << size.ZeroExtend(); const size_t esize = 8U << size.ZeroExtend();
// TODO: Currently we don't support half-precision floating point // TODO: Currently we don't support half-precision floating point
ASSERT(esize != 16); DEBUG_ASSERT(esize != 16);
const size_t datasize = Q ? 128 : 64; const size_t datasize = Q ? 128 : 64;
const size_t num_elements = datasize / esize; const size_t num_elements = datasize / esize;
@@ -135,7 +135,7 @@ bool TranslatorVisitor::FCADD_vec(bool Q, Imm<2> size, Vec Vm, Imm<1> rot, Vec V
const size_t esize = 8U << size.ZeroExtend(); const size_t esize = 8U << size.ZeroExtend();
// TODO: Currently we don't support half-precision floating point // TODO: Currently we don't support half-precision floating point
ASSERT(esize != 16); DEBUG_ASSERT(esize != 16);
const size_t datasize = Q ? 128 : 64; const size_t datasize = Q ? 128 : 64;
const size_t num_elements = datasize / esize; const size_t num_elements = datasize / esize;
@@ -223,7 +223,7 @@ bool TranslatorVisitor::FCMLA_elt(bool Q, Imm<2> size, Imm<1> L, Imm<1> M, Imm<4
const size_t esize = 8U << size.ZeroExtend(); const size_t esize = 8U << size.ZeroExtend();
// TODO: We don't support the half-precision floating point variant yet. // TODO: We don't support the half-precision floating point variant yet.
ASSERT(esize != 16); DEBUG_ASSERT(esize != 16);
const size_t index = [=] { const size_t index = [=] {
if (size == 0b01) { if (size == 0b01) {
+1 -1
View File
@@ -69,7 +69,7 @@ void Block::Reset(LocationDescriptor location_) noexcept {
terminal = std::monostate{}; terminal = std::monostate{};
cond_failed_cycle_count = 0; cond_failed_cycle_count = 0;
cycle_count = 0; cycle_count = 0;
ASSERT(instructions.size() == 0); DEBUG_ASSERT(instructions.size() == 0);
} }
static std::string TerminalToString(const Term::Terminal& terminal_variant) noexcept { static std::string TerminalToString(const Term::Terminal& terminal_variant) noexcept {
+2 -2
View File
@@ -119,12 +119,12 @@ public:
} }
/// Sets the terminal instruction for this basic block. /// Sets the terminal instruction for this basic block.
inline void SetTerminal(Term::Terminal term) noexcept { inline void SetTerminal(Term::Terminal term) noexcept {
ASSERT(!HasTerminal() && "Terminal has already been set."); DEBUG_ASSERT(!HasTerminal() && "Terminal has already been set.");
terminal = std::move(term); terminal = std::move(term);
} }
/// Replaces the terminal instruction for this basic block. /// Replaces the terminal instruction for this basic block.
inline void ReplaceTerminal(Term::Terminal term) noexcept { inline void ReplaceTerminal(Term::Terminal term) noexcept {
ASSERT(HasTerminal() && "Terminal has not been set."); DEBUG_ASSERT(HasTerminal() && "Terminal has not been set.");
terminal = std::move(term); terminal = std::move(term);
} }
/// Determines whether or not this basic block has a terminal instruction. /// Determines whether or not this basic block has a terminal instruction.
+67 -67
View File
@@ -118,7 +118,7 @@ public:
} }
return LeastSignificantWord(value); return LeastSignificantWord(value);
case 64: case 64:
ASSERT(value.GetType() == Type::U64); DEBUG_ASSERT(value.GetType() == Type::U64);
return value; return value;
} }
UNREACHABLE(); UNREACHABLE();
@@ -189,7 +189,7 @@ public:
} }
U32U64 ConditionalSelect(Cond cond, const U32U64& a, const U32U64& b) { U32U64 ConditionalSelect(Cond cond, const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
if (a.GetType() == Type::U32) { if (a.GetType() == Type::U32) {
return Inst<U32>(Opcode::ConditionalSelect32, Value{cond}, a, b); return Inst<U32>(Opcode::ConditionalSelect32, Value{cond}, a, b);
} else { } else {
@@ -272,7 +272,7 @@ public:
} }
U32U64 LogicalShiftLeftMasked(const U32U64& value_in, const U32U64& shift_amount) { U32U64 LogicalShiftLeftMasked(const U32U64& value_in, const U32U64& shift_amount) {
ASSERT(value_in.GetType() == shift_amount.GetType()); DEBUG_ASSERT(value_in.GetType() == shift_amount.GetType());
if (value_in.GetType() == Type::U32) { if (value_in.GetType() == Type::U32) {
return Inst<U32>(Opcode::LogicalShiftLeftMasked32, value_in, shift_amount); return Inst<U32>(Opcode::LogicalShiftLeftMasked32, value_in, shift_amount);
} else { } else {
@@ -281,7 +281,7 @@ public:
} }
U32U64 LogicalShiftRightMasked(const U32U64& value_in, const U32U64& shift_amount) { U32U64 LogicalShiftRightMasked(const U32U64& value_in, const U32U64& shift_amount) {
ASSERT(value_in.GetType() == shift_amount.GetType()); DEBUG_ASSERT(value_in.GetType() == shift_amount.GetType());
if (value_in.GetType() == Type::U32) { if (value_in.GetType() == Type::U32) {
return Inst<U32>(Opcode::LogicalShiftRightMasked32, value_in, shift_amount); return Inst<U32>(Opcode::LogicalShiftRightMasked32, value_in, shift_amount);
} else { } else {
@@ -290,7 +290,7 @@ public:
} }
U32U64 ArithmeticShiftRightMasked(const U32U64& value_in, const U32U64& shift_amount) { U32U64 ArithmeticShiftRightMasked(const U32U64& value_in, const U32U64& shift_amount) {
ASSERT(value_in.GetType() == shift_amount.GetType()); DEBUG_ASSERT(value_in.GetType() == shift_amount.GetType());
if (value_in.GetType() == Type::U32) { if (value_in.GetType() == Type::U32) {
return Inst<U32>(Opcode::ArithmeticShiftRightMasked32, value_in, shift_amount); return Inst<U32>(Opcode::ArithmeticShiftRightMasked32, value_in, shift_amount);
} else { } else {
@@ -299,7 +299,7 @@ public:
} }
U32U64 RotateRightMasked(const U32U64& value_in, const U32U64& shift_amount) { U32U64 RotateRightMasked(const U32U64& value_in, const U32U64& shift_amount) {
ASSERT(value_in.GetType() == shift_amount.GetType()); DEBUG_ASSERT(value_in.GetType() == shift_amount.GetType());
if (value_in.GetType() == Type::U32) { if (value_in.GetType() == Type::U32) {
return Inst<U32>(Opcode::RotateRightMasked32, value_in, shift_amount); return Inst<U32>(Opcode::RotateRightMasked32, value_in, shift_amount);
} else { } else {
@@ -308,7 +308,7 @@ public:
} }
U32U64 AddWithCarry(const U32U64& a, const U32U64& b, const U1& carry_in) { U32U64 AddWithCarry(const U32U64& a, const U32U64& b, const U1& carry_in) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
if (a.GetType() == Type::U32) { if (a.GetType() == Type::U32) {
return Inst<U32>(Opcode::Add32, a, b, carry_in); return Inst<U32>(Opcode::Add32, a, b, carry_in);
} else { } else {
@@ -317,7 +317,7 @@ public:
} }
U32U64 Add(const U32U64& a, const U32U64& b) { U32U64 Add(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
if (a.GetType() == Type::U32) { if (a.GetType() == Type::U32) {
return Inst<U32>(Opcode::Add32, a, b, Imm1(0)); return Inst<U32>(Opcode::Add32, a, b, Imm1(0));
} else { } else {
@@ -326,7 +326,7 @@ public:
} }
U32U64 SubWithCarry(const U32U64& a, const U32U64& b, const U1& carry_in) { U32U64 SubWithCarry(const U32U64& a, const U32U64& b, const U1& carry_in) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
if (a.GetType() == Type::U32) { if (a.GetType() == Type::U32) {
return Inst<U32>(Opcode::Sub32, a, b, carry_in); return Inst<U32>(Opcode::Sub32, a, b, carry_in);
} else { } else {
@@ -335,7 +335,7 @@ public:
} }
U32U64 Sub(const U32U64& a, const U32U64& b) { U32U64 Sub(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
if (a.GetType() == Type::U32) { if (a.GetType() == Type::U32) {
return Inst<U32>(Opcode::Sub32, a, b, Imm1(1)); return Inst<U32>(Opcode::Sub32, a, b, Imm1(1));
} else { } else {
@@ -376,7 +376,7 @@ public:
} }
U32U64 And(const U32U64& a, const U32U64& b) { U32U64 And(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
if (a.GetType() == Type::U32) { if (a.GetType() == Type::U32) {
return Inst<U32>(Opcode::And32, a, b); return Inst<U32>(Opcode::And32, a, b);
} else { } else {
@@ -385,7 +385,7 @@ public:
} }
U32U64 AndNot(const U32U64& a, const U32U64& b) { U32U64 AndNot(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
if (a.GetType() == Type::U32) { if (a.GetType() == Type::U32) {
return Inst<U32>(Opcode::AndNot32, a, b); return Inst<U32>(Opcode::AndNot32, a, b);
} else { } else {
@@ -394,7 +394,7 @@ public:
} }
U32U64 Eor(const U32U64& a, const U32U64& b) { U32U64 Eor(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
if (a.GetType() == Type::U32) { if (a.GetType() == Type::U32) {
return Inst<U32>(Opcode::Eor32, a, b); return Inst<U32>(Opcode::Eor32, a, b);
} else { } else {
@@ -403,7 +403,7 @@ public:
} }
U32U64 Or(const U32U64& a, const U32U64& b) { U32U64 Or(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
if (a.GetType() == Type::U32) { if (a.GetType() == Type::U32) {
return Inst<U32>(Opcode::Or32, a, b); return Inst<U32>(Opcode::Or32, a, b);
} else { } else {
@@ -547,11 +547,11 @@ public:
U32U64 ReplicateBit(const U32U64& a, u8 bit) { U32U64 ReplicateBit(const U32U64& a, u8 bit) {
if (a.GetType() == IR::Type::U32) { if (a.GetType() == IR::Type::U32) {
ASSERT(bit < 32); DEBUG_ASSERT(bit < 32);
return Inst<U32>(Opcode::ReplicateBit32, a, Imm8(bit)); return Inst<U32>(Opcode::ReplicateBit32, a, Imm8(bit));
} }
ASSERT(bit < 64); DEBUG_ASSERT(bit < 64);
return Inst<U64>(Opcode::ReplicateBit64, a, Imm8(bit)); return Inst<U64>(Opcode::ReplicateBit64, a, Imm8(bit));
} }
@@ -600,21 +600,21 @@ public:
} }
ResultAndOverflow<U32> SignedSaturation(const U32& a, size_t bit_size_to_saturate_to) { ResultAndOverflow<U32> SignedSaturation(const U32& a, size_t bit_size_to_saturate_to) {
ASSERT(bit_size_to_saturate_to >= 1 && bit_size_to_saturate_to <= 32); DEBUG_ASSERT(bit_size_to_saturate_to >= 1 && bit_size_to_saturate_to <= 32);
const auto result = Inst<U32>(Opcode::SignedSaturation, a, Imm8(static_cast<u8>(bit_size_to_saturate_to))); const auto result = Inst<U32>(Opcode::SignedSaturation, a, Imm8(static_cast<u8>(bit_size_to_saturate_to)));
const auto overflow = Inst<U1>(Opcode::GetOverflowFromOp, result); const auto overflow = Inst<U1>(Opcode::GetOverflowFromOp, result);
return {result, overflow}; return {result, overflow};
} }
ResultAndOverflow<U32> UnsignedSaturation(const U32& a, size_t bit_size_to_saturate_to) { ResultAndOverflow<U32> UnsignedSaturation(const U32& a, size_t bit_size_to_saturate_to) {
ASSERT(bit_size_to_saturate_to <= 31); DEBUG_ASSERT(bit_size_to_saturate_to <= 31);
const auto result = Inst<U32>(Opcode::UnsignedSaturation, a, Imm8(static_cast<u8>(bit_size_to_saturate_to))); const auto result = Inst<U32>(Opcode::UnsignedSaturation, a, Imm8(static_cast<u8>(bit_size_to_saturate_to)));
const auto overflow = Inst<U1>(Opcode::GetOverflowFromOp, result); const auto overflow = Inst<U1>(Opcode::GetOverflowFromOp, result);
return {result, overflow}; return {result, overflow};
} }
UAny SignedSaturatedAdd(const UAny& a, const UAny& b) { UAny SignedSaturatedAdd(const UAny& a, const UAny& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
const auto result = [&]() -> IR::UAny { const auto result = [&]() -> IR::UAny {
switch (a.GetType()) { switch (a.GetType()) {
case IR::Type::U8: case IR::Type::U8:
@@ -633,7 +633,7 @@ public:
} }
UAny SignedSaturatedDoublingMultiplyReturnHigh(const UAny& a, const UAny& b) { UAny SignedSaturatedDoublingMultiplyReturnHigh(const UAny& a, const UAny& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
const auto result = [&]() -> IR::UAny { const auto result = [&]() -> IR::UAny {
switch (a.GetType()) { switch (a.GetType()) {
case IR::Type::U16: case IR::Type::U16:
@@ -648,7 +648,7 @@ public:
} }
UAny SignedSaturatedSub(const UAny& a, const UAny& b) { UAny SignedSaturatedSub(const UAny& a, const UAny& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
const auto result = [&]() -> IR::UAny { const auto result = [&]() -> IR::UAny {
switch (a.GetType()) { switch (a.GetType()) {
case IR::Type::U8: case IR::Type::U8:
@@ -667,7 +667,7 @@ public:
} }
UAny UnsignedSaturatedAdd(const UAny& a, const UAny& b) { UAny UnsignedSaturatedAdd(const UAny& a, const UAny& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
const auto result = [&]() -> IR::UAny { const auto result = [&]() -> IR::UAny {
switch (a.GetType()) { switch (a.GetType()) {
case IR::Type::U8: case IR::Type::U8:
@@ -686,7 +686,7 @@ public:
} }
UAny UnsignedSaturatedSub(const UAny& a, const UAny& b) { UAny UnsignedSaturatedSub(const UAny& a, const UAny& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
const auto result = [&]() -> IR::UAny { const auto result = [&]() -> IR::UAny {
switch (a.GetType()) { switch (a.GetType()) {
case IR::Type::U8: case IR::Type::U8:
@@ -989,7 +989,7 @@ public:
} }
UAny VectorGetElement(size_t esize, const U128& a, size_t index) { UAny VectorGetElement(size_t esize, const U128& a, size_t index) {
ASSERT(esize * index < 128 && "Invalid index"); DEBUG_ASSERT(esize * index < 128 && "Invalid index");
switch (esize) { switch (esize) {
case 8: case 8:
return Inst<U8>(Opcode::VectorGetElement8, a, Imm8(static_cast<u8>(index))); return Inst<U8>(Opcode::VectorGetElement8, a, Imm8(static_cast<u8>(index)));
@@ -1005,7 +1005,7 @@ public:
} }
U128 VectorSetElement(size_t esize, const U128& a, size_t index, const IR::UAny& elem) { U128 VectorSetElement(size_t esize, const U128& a, size_t index, const IR::UAny& elem) {
ASSERT(esize * index < 128 && "Invalid index"); DEBUG_ASSERT(esize * index < 128 && "Invalid index");
switch (esize) { switch (esize) {
case 8: case 8:
return Inst<U128>(Opcode::VectorSetElement8, a, Imm8(static_cast<u8>(index)), elem); return Inst<U128>(Opcode::VectorSetElement8, a, Imm8(static_cast<u8>(index)), elem);
@@ -1111,7 +1111,7 @@ public:
} }
U128 VectorBroadcastElementLower(size_t esize, const U128& a, size_t index) { U128 VectorBroadcastElementLower(size_t esize, const U128& a, size_t index) {
ASSERT(esize * index < 128 && "Invalid index"); DEBUG_ASSERT(esize * index < 128 && "Invalid index");
switch (esize) { switch (esize) {
case 8: case 8:
return Inst<U128>(Opcode::VectorBroadcastElementLower8, a, u8(index)); return Inst<U128>(Opcode::VectorBroadcastElementLower8, a, u8(index));
@@ -1124,7 +1124,7 @@ public:
} }
U128 VectorBroadcastElement(size_t esize, const U128& a, size_t index) { U128 VectorBroadcastElement(size_t esize, const U128& a, size_t index) {
ASSERT(esize * index < 128 && "Invalid index"); DEBUG_ASSERT(esize * index < 128 && "Invalid index");
switch (esize) { switch (esize) {
case 8: case 8:
return Inst<U128>(Opcode::VectorBroadcastElement8, a, u8(index)); return Inst<U128>(Opcode::VectorBroadcastElement8, a, u8(index));
@@ -1223,12 +1223,12 @@ public:
} }
U128 VectorExtract(const U128& a, const U128& b, size_t position) { U128 VectorExtract(const U128& a, const U128& b, size_t position) {
ASSERT(position <= 128); DEBUG_ASSERT(position <= 128);
return Inst<U128>(Opcode::VectorExtract, a, b, Imm8(static_cast<u8>(position))); return Inst<U128>(Opcode::VectorExtract, a, b, Imm8(static_cast<u8>(position)));
} }
U128 VectorExtractLower(const U128& a, const U128& b, size_t position) { U128 VectorExtractLower(const U128& a, const U128& b, size_t position) {
ASSERT(position <= 64); DEBUG_ASSERT(position <= 64);
return Inst<U128>(Opcode::VectorExtractLower, a, b, Imm8(static_cast<u8>(position))); return Inst<U128>(Opcode::VectorExtractLower, a, b, Imm8(static_cast<u8>(position)));
} }
@@ -1732,7 +1732,7 @@ public:
} }
U128 VectorRotateLeft(size_t esize, const U128& a, u8 amount) { U128 VectorRotateLeft(size_t esize, const U128& a, u8 amount) {
ASSERT(amount < esize); DEBUG_ASSERT(amount < esize);
if (amount == 0) { if (amount == 0) {
return a; return a;
@@ -1743,7 +1743,7 @@ public:
} }
U128 VectorRotateRight(size_t esize, const U128& a, u8 amount) { U128 VectorRotateRight(size_t esize, const U128& a, u8 amount) {
ASSERT(amount < esize); DEBUG_ASSERT(amount < esize);
if (amount == 0) { if (amount == 0) {
return a; return a;
@@ -1754,7 +1754,7 @@ public:
} }
U128 VectorRotateWholeVectorRight(const U128& a, u8 amount) { U128 VectorRotateWholeVectorRight(const U128& a, u8 amount) {
ASSERT(amount % 32 == 0); DEBUG_ASSERT(amount % 32 == 0);
return Inst<U128>(Opcode::VectorRotateWholeVectorRight, a, Imm8(amount)); return Inst<U128>(Opcode::VectorRotateWholeVectorRight, a, Imm8(amount));
} }
@@ -1970,7 +1970,7 @@ public:
} }
U128 VectorSignedSaturatedShiftLeftUnsigned(size_t esize, const U128& a, u8 shift_amount) { U128 VectorSignedSaturatedShiftLeftUnsigned(size_t esize, const U128& a, u8 shift_amount) {
ASSERT(shift_amount < esize); DEBUG_ASSERT(shift_amount < esize);
switch (esize) { switch (esize) {
case 8: case 8:
return Inst<U128>(Opcode::VectorSignedSaturatedShiftLeftUnsigned8, a, Imm8(shift_amount)); return Inst<U128>(Opcode::VectorSignedSaturatedShiftLeftUnsigned8, a, Imm8(shift_amount));
@@ -1999,24 +1999,24 @@ public:
} }
Table VectorTable(std::vector<U64> values) { Table VectorTable(std::vector<U64> values) {
ASSERT(values.size() >= 1 && values.size() <= 4); DEBUG_ASSERT(values.size() >= 1 && values.size() <= 4);
values.resize(4); values.resize(4);
return Inst<Table>(Opcode::VectorTable, values[0], values[1], values[2], values[3]); return Inst<Table>(Opcode::VectorTable, values[0], values[1], values[2], values[3]);
} }
Table VectorTable(std::vector<U128> values) { Table VectorTable(std::vector<U128> values) {
ASSERT(values.size() >= 1 && values.size() <= 4); DEBUG_ASSERT(values.size() >= 1 && values.size() <= 4);
values.resize(4); values.resize(4);
return Inst<Table>(Opcode::VectorTable, values[0], values[1], values[2], values[3]); return Inst<Table>(Opcode::VectorTable, values[0], values[1], values[2], values[3]);
} }
U64 VectorTableLookup(const U64& defaults, const Table& table, const U64& indices) { U64 VectorTableLookup(const U64& defaults, const Table& table, const U64& indices) {
ASSERT(table.GetInst()->GetArg(0).GetType() == Type::U64); DEBUG_ASSERT(table.GetInst()->GetArg(0).GetType() == Type::U64);
return Inst<U64>(Opcode::VectorTableLookup64, defaults, table, indices); return Inst<U64>(Opcode::VectorTableLookup64, defaults, table, indices);
} }
U128 VectorTableLookup(const U128& defaults, const Table& table, const U128& indices) { U128 VectorTableLookup(const U128& defaults, const Table& table, const U128& indices) {
ASSERT(table.GetInst()->GetArg(0).GetType() == Type::U128); DEBUG_ASSERT(table.GetInst()->GetArg(0).GetType() == Type::U128);
return Inst<U128>(Opcode::VectorTableLookup128, defaults, table, indices); return Inst<U128>(Opcode::VectorTableLookup128, defaults, table, indices);
} }
@@ -2130,7 +2130,7 @@ public:
} }
U32U64 FPAdd(const U32U64& a, const U32U64& b) { U32U64 FPAdd(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U32: case Type::U32:
@@ -2143,7 +2143,7 @@ public:
} }
NZCV FPCompare(const U32U64& a, const U32U64& b, bool exc_on_qnan) { NZCV FPCompare(const U32U64& a, const U32U64& b, bool exc_on_qnan) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
const IR::U1 exc_on_qnan_imm = Imm1(exc_on_qnan); const IR::U1 exc_on_qnan_imm = Imm1(exc_on_qnan);
@@ -2158,7 +2158,7 @@ public:
} }
U32U64 FPDiv(const U32U64& a, const U32U64& b) { U32U64 FPDiv(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U32: case Type::U32:
@@ -2171,7 +2171,7 @@ public:
} }
U32U64 FPMax(const U32U64& a, const U32U64& b) { U32U64 FPMax(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U32: case Type::U32:
@@ -2184,7 +2184,7 @@ public:
} }
U32U64 FPMaxNumeric(const U32U64& a, const U32U64& b) { U32U64 FPMaxNumeric(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U32: case Type::U32:
@@ -2197,7 +2197,7 @@ public:
} }
U32U64 FPMin(const U32U64& a, const U32U64& b) { U32U64 FPMin(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U32: case Type::U32:
@@ -2210,7 +2210,7 @@ public:
} }
U32U64 FPMinNumeric(const U32U64& a, const U32U64& b) { U32U64 FPMinNumeric(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U32: case Type::U32:
@@ -2223,7 +2223,7 @@ public:
} }
U32U64 FPMul(const U32U64& a, const U32U64& b) { U32U64 FPMul(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U32: case Type::U32:
@@ -2236,7 +2236,7 @@ public:
} }
U16U32U64 FPMulAdd(const U16U32U64& a, const U16U32U64& b, const U16U32U64& c) { U16U32U64 FPMulAdd(const U16U32U64& a, const U16U32U64& b, const U16U32U64& c) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U16: case Type::U16:
@@ -2251,7 +2251,7 @@ public:
} }
U16U32U64 FPMulSub(const U16U32U64& a, const U16U32U64& b, const U16U32U64& c) { U16U32U64 FPMulSub(const U16U32U64& a, const U16U32U64& b, const U16U32U64& c) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U16: case Type::U16:
@@ -2266,7 +2266,7 @@ public:
} }
U32U64 FPMulX(const U32U64& a, const U32U64& b) { U32U64 FPMulX(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U32: case Type::U32:
@@ -2318,7 +2318,7 @@ public:
} }
U16U32U64 FPRecipStepFused(const U16U32U64& a, const U16U32U64& b) { U16U32U64 FPRecipStepFused(const U16U32U64& a, const U16U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U16: case Type::U16:
@@ -2362,7 +2362,7 @@ public:
} }
U16U32U64 FPRSqrtStepFused(const U16U32U64& a, const U16U32U64& b) { U16U32U64 FPRSqrtStepFused(const U16U32U64& a, const U16U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U16: case Type::U16:
@@ -2388,7 +2388,7 @@ public:
} }
U32U64 FPSub(const U32U64& a, const U32U64& b) { U32U64 FPSub(const U32U64& a, const U32U64& b) {
ASSERT(a.GetType() == b.GetType()); DEBUG_ASSERT(a.GetType() == b.GetType());
switch (a.GetType()) { switch (a.GetType()) {
case Type::U32: case Type::U32:
@@ -2425,7 +2425,7 @@ public:
} }
U16 FPToFixedS16(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) { U16 FPToFixedS16(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) {
ASSERT(fbits <= 16); DEBUG_ASSERT(fbits <= 16);
const U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -2443,7 +2443,7 @@ public:
} }
U32 FPToFixedS32(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) { U32 FPToFixedS32(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) {
ASSERT(fbits <= 32); DEBUG_ASSERT(fbits <= 32);
const U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -2461,7 +2461,7 @@ public:
} }
U64 FPToFixedS64(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) { U64 FPToFixedS64(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) {
ASSERT(fbits <= 64); DEBUG_ASSERT(fbits <= 64);
const U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -2479,7 +2479,7 @@ public:
} }
U16 FPToFixedU16(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) { U16 FPToFixedU16(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) {
ASSERT(fbits <= 16); DEBUG_ASSERT(fbits <= 16);
const U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -2497,7 +2497,7 @@ public:
} }
U32 FPToFixedU32(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) { U32 FPToFixedU32(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) {
ASSERT(fbits <= 32); DEBUG_ASSERT(fbits <= 32);
const U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -2515,7 +2515,7 @@ public:
} }
U64 FPToFixedU64(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) { U64 FPToFixedU64(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) {
ASSERT(fbits <= 64); DEBUG_ASSERT(fbits <= 64);
const U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -2533,7 +2533,7 @@ public:
} }
U32 FPSignedFixedToSingle(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) { U32 FPSignedFixedToSingle(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) {
ASSERT(fbits <= (a.GetType() == Type::U16 ? 16 : (a.GetType() == Type::U32 ? 32 : 64))); DEBUG_ASSERT(fbits <= (a.GetType() == Type::U16 ? 16 : (a.GetType() == Type::U32 ? 32 : 64)));
const IR::U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const IR::U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const IR::U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const IR::U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -2551,7 +2551,7 @@ public:
} }
U32 FPUnsignedFixedToSingle(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) { U32 FPUnsignedFixedToSingle(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) {
ASSERT(fbits <= (a.GetType() == Type::U16 ? 16 : (a.GetType() == Type::U32 ? 32 : 64))); DEBUG_ASSERT(fbits <= (a.GetType() == Type::U16 ? 16 : (a.GetType() == Type::U32 ? 32 : 64)));
const IR::U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const IR::U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const IR::U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const IR::U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -2569,7 +2569,7 @@ public:
} }
U64 FPSignedFixedToDouble(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) { U64 FPSignedFixedToDouble(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) {
ASSERT(fbits <= (a.GetType() == Type::U16 ? 16 : (a.GetType() == Type::U32 ? 32 : 64))); DEBUG_ASSERT(fbits <= (a.GetType() == Type::U16 ? 16 : (a.GetType() == Type::U32 ? 32 : 64)));
const IR::U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const IR::U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const IR::U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const IR::U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -2587,7 +2587,7 @@ public:
} }
U64 FPUnsignedFixedToDouble(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) { U64 FPUnsignedFixedToDouble(const U16U32U64& a, size_t fbits, FP::RoundingMode rounding) {
ASSERT(fbits <= (a.GetType() == Type::U16 ? 16 : (a.GetType() == Type::U32 ? 32 : 64))); DEBUG_ASSERT(fbits <= (a.GetType() == Type::U16 ? 16 : (a.GetType() == Type::U32 ? 32 : 64)));
const IR::U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const IR::U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const IR::U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const IR::U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -2649,12 +2649,12 @@ public:
} }
U128 FPVectorFromHalf(size_t esize, const U128& a, FP::RoundingMode rounding, bool fpcr_controlled = true) { U128 FPVectorFromHalf(size_t esize, const U128& a, FP::RoundingMode rounding, bool fpcr_controlled = true) {
ASSERT(esize == 32); DEBUG_ASSERT(esize == 32);
return Inst<U128>(Opcode::FPVectorFromHalf32, a, Imm8(static_cast<u8>(rounding)), Imm1(fpcr_controlled)); return Inst<U128>(Opcode::FPVectorFromHalf32, a, Imm8(static_cast<u8>(rounding)), Imm1(fpcr_controlled));
} }
U128 FPVectorFromSignedFixed(size_t esize, const U128& a, size_t fbits, FP::RoundingMode rounding, bool fpcr_controlled = true) { U128 FPVectorFromSignedFixed(size_t esize, const U128& a, size_t fbits, FP::RoundingMode rounding, bool fpcr_controlled = true) {
ASSERT(fbits <= esize); DEBUG_ASSERT(fbits <= esize);
switch (esize) { switch (esize) {
case 32: case 32:
return Inst<U128>(Opcode::FPVectorFromSignedFixed32, a, Imm8(static_cast<u8>(fbits)), Imm8(static_cast<u8>(rounding)), Imm1(fpcr_controlled)); return Inst<U128>(Opcode::FPVectorFromSignedFixed32, a, Imm8(static_cast<u8>(fbits)), Imm8(static_cast<u8>(rounding)), Imm1(fpcr_controlled));
@@ -2665,7 +2665,7 @@ public:
} }
U128 FPVectorFromUnsignedFixed(size_t esize, const U128& a, size_t fbits, FP::RoundingMode rounding, bool fpcr_controlled = true) { U128 FPVectorFromUnsignedFixed(size_t esize, const U128& a, size_t fbits, FP::RoundingMode rounding, bool fpcr_controlled = true) {
ASSERT(fbits <= esize); DEBUG_ASSERT(fbits <= esize);
switch (esize) { switch (esize) {
case 32: case 32:
return Inst<U128>(Opcode::FPVectorFromUnsignedFixed32, a, Imm8(static_cast<u8>(fbits)), Imm8(static_cast<u8>(rounding)), Imm1(fpcr_controlled)); return Inst<U128>(Opcode::FPVectorFromUnsignedFixed32, a, Imm8(static_cast<u8>(fbits)), Imm8(static_cast<u8>(rounding)), Imm1(fpcr_controlled));
@@ -2883,12 +2883,12 @@ public:
} }
U128 FPVectorToHalf(size_t esize, const U128& a, FP::RoundingMode rounding, bool fpcr_controlled = true) { U128 FPVectorToHalf(size_t esize, const U128& a, FP::RoundingMode rounding, bool fpcr_controlled = true) {
ASSERT(esize == 32); DEBUG_ASSERT(esize == 32);
return Inst<U128>(Opcode::FPVectorToHalf32, a, Imm8(static_cast<u8>(rounding)), Imm1(fpcr_controlled)); return Inst<U128>(Opcode::FPVectorToHalf32, a, Imm8(static_cast<u8>(rounding)), Imm1(fpcr_controlled));
} }
U128 FPVectorToSignedFixed(size_t esize, const U128& a, size_t fbits, FP::RoundingMode rounding, bool fpcr_controlled = true) { U128 FPVectorToSignedFixed(size_t esize, const U128& a, size_t fbits, FP::RoundingMode rounding, bool fpcr_controlled = true) {
ASSERT(fbits <= esize); DEBUG_ASSERT(fbits <= esize);
const U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -2906,7 +2906,7 @@ public:
} }
U128 FPVectorToUnsignedFixed(size_t esize, const U128& a, size_t fbits, FP::RoundingMode rounding, bool fpcr_controlled = true) { U128 FPVectorToUnsignedFixed(size_t esize, const U128& a, size_t fbits, FP::RoundingMode rounding, bool fpcr_controlled = true) {
ASSERT(fbits <= esize); DEBUG_ASSERT(fbits <= esize);
const U8 fbits_imm = Imm8(static_cast<u8>(fbits)); const U8 fbits_imm = Imm8(static_cast<u8>(fbits));
const U8 rounding_imm = Imm8(static_cast<u8>(rounding)); const U8 rounding_imm = Imm8(static_cast<u8>(rounding));
@@ -27,7 +27,7 @@ Inst* Inst::GetAssociatedPseudoOperation(Opcode opcode) {
Inst* pseudoop = next_pseudoop; Inst* pseudoop = next_pseudoop;
while (pseudoop) { while (pseudoop) {
if (pseudoop->GetOpcode() == opcode) { if (pseudoop->GetOpcode() == opcode) {
ASSERT(pseudoop->GetArg(0).GetInst() == this); DEBUG_ASSERT(pseudoop->GetArg(0).GetInst() == this);
return pseudoop; return pseudoop;
} }
pseudoop = pseudoop->next_pseudoop; pseudoop = pseudoop->next_pseudoop;
@@ -81,7 +81,7 @@ void Inst::Use(const Value& value) {
if (IsAPseudoOperation(op)) { if (IsAPseudoOperation(op)) {
if (op == Opcode::GetNZCVFromOp) { if (op == Opcode::GetNZCVFromOp) {
ASSERT(MayGetNZCVFromOp(value.GetInst()->GetOpcode()) && "This value doesn't support the GetNZCVFromOp pseduo-op"); DEBUG_ASSERT(MayGetNZCVFromOp(value.GetInst()->GetOpcode()) && "This value doesn't support the GetNZCVFromOp pseduo-op");
} }
Inst* insert_point = value.GetInst(); Inst* insert_point = value.GetInst();
+3 -3
View File
@@ -323,7 +323,7 @@ static void RegisterPass(IR::Block& block) {
switch (opcode) { switch (opcode) {
case IR::Opcode::A32GetRegister: { case IR::Opcode::A32GetRegister: {
const A32::Reg reg = inst->GetArg(0).GetA32RegRef(); const A32::Reg reg = inst->GetArg(0).GetA32RegRef();
ASSERT(reg != A32::Reg::PC); DEBUG_ASSERT(reg != A32::Reg::PC);
const size_t reg_index = size_t(reg); const size_t reg_index = size_t(reg);
do_get(reg_info[reg_index], inst); do_get(reg_info[reg_index], inst);
break; break;
@@ -1430,7 +1430,7 @@ static void VerificationPass(const IR::Block& block) {
for (size_t i = 0; i < inst.NumArgs(); i++) { for (size_t i = 0; i < inst.NumArgs(); i++) {
const IR::Type t1 = inst.GetArg(i).GetType(); const IR::Type t1 = inst.GetArg(i).GetType();
const IR::Type t2 = IR::GetArgTypeOf(inst.GetOpcode(), i); const IR::Type t2 = IR::GetArgTypeOf(inst.GetOpcode(), i);
ASSERT(IR::AreTypesCompatible(t1, t2)); DEBUG_ASSERT(IR::AreTypesCompatible(t1, t2));
} }
} }
::Common::unordered_map<IR::Inst*, size_t> actual_uses; ::Common::unordered_map<IR::Inst*, size_t> actual_uses;
@@ -1440,7 +1440,7 @@ static void VerificationPass(const IR::Block& block) {
actual_uses[arg.GetInst()]++; actual_uses[arg.GetInst()]++;
} }
for (auto const& pair : actual_uses) for (auto const& pair : actual_uses)
ASSERT(pair.first->UseCount() == pair.second); DEBUG_ASSERT(pair.first->UseCount() == pair.second);
} }
void Optimize(IR::Block& block, const A32::UserConfig& conf, const Optimization::PolyfillOptions& polyfill_options) { void Optimize(IR::Block& block, const A32::UserConfig& conf, const Optimization::PolyfillOptions& polyfill_options) {
+16 -16
View File
@@ -119,32 +119,32 @@ Type Value::GetType() const noexcept {
} }
A32::Reg Value::GetA32RegRef() const { A32::Reg Value::GetA32RegRef() const {
ASSERT(type == Type::A32Reg); DEBUG_ASSERT(type == Type::A32Reg);
return inner.imm_a32regref; return inner.imm_a32regref;
} }
A32::ExtReg Value::GetA32ExtRegRef() const { A32::ExtReg Value::GetA32ExtRegRef() const {
ASSERT(type == Type::A32ExtReg); DEBUG_ASSERT(type == Type::A32ExtReg);
return inner.imm_a32extregref; return inner.imm_a32extregref;
} }
A64::Reg Value::GetA64RegRef() const { A64::Reg Value::GetA64RegRef() const {
ASSERT(type == Type::A64Reg); DEBUG_ASSERT(type == Type::A64Reg);
return inner.imm_a64regref; return inner.imm_a64regref;
} }
A64::Vec Value::GetA64VecRef() const { A64::Vec Value::GetA64VecRef() const {
ASSERT(type == Type::A64Vec); DEBUG_ASSERT(type == Type::A64Vec);
return inner.imm_a64vecref; return inner.imm_a64vecref;
} }
Inst* Value::GetInst() const { Inst* Value::GetInst() const {
ASSERT(type == Type::Opaque); DEBUG_ASSERT(type == Type::Opaque);
return inner.inst; return inner.inst;
} }
Inst* Value::GetInstRecursive() const { Inst* Value::GetInstRecursive() const {
ASSERT(type == Type::Opaque); DEBUG_ASSERT(type == Type::Opaque);
if (IsIdentity()) if (IsIdentity())
return inner.inst->GetArg(0).GetInstRecursive(); return inner.inst->GetArg(0).GetInstRecursive();
return inner.inst; return inner.inst;
@@ -153,61 +153,61 @@ Inst* Value::GetInstRecursive() const {
bool Value::GetU1() const { bool Value::GetU1() const {
if (IsIdentity()) if (IsIdentity())
return inner.inst->GetArg(0).GetU1(); return inner.inst->GetArg(0).GetU1();
ASSERT(type == Type::U1); DEBUG_ASSERT(type == Type::U1);
return inner.imm_u1; return inner.imm_u1;
} }
u8 Value::GetU8() const { u8 Value::GetU8() const {
if (IsIdentity()) if (IsIdentity())
return inner.inst->GetArg(0).GetU8(); return inner.inst->GetArg(0).GetU8();
ASSERT(type == Type::U8); DEBUG_ASSERT(type == Type::U8);
return inner.imm_u8; return inner.imm_u8;
} }
u16 Value::GetU16() const { u16 Value::GetU16() const {
if (IsIdentity()) if (IsIdentity())
return inner.inst->GetArg(0).GetU16(); return inner.inst->GetArg(0).GetU16();
ASSERT(type == Type::U16); DEBUG_ASSERT(type == Type::U16);
return inner.imm_u16; return inner.imm_u16;
} }
u32 Value::GetU32() const { u32 Value::GetU32() const {
if (IsIdentity()) if (IsIdentity())
return inner.inst->GetArg(0).GetU32(); return inner.inst->GetArg(0).GetU32();
ASSERT(type == Type::U32); DEBUG_ASSERT(type == Type::U32);
return inner.imm_u32; return inner.imm_u32;
} }
u64 Value::GetU64() const { u64 Value::GetU64() const {
if (IsIdentity()) if (IsIdentity())
return inner.inst->GetArg(0).GetU64(); return inner.inst->GetArg(0).GetU64();
ASSERT(type == Type::U64); DEBUG_ASSERT(type == Type::U64);
return inner.imm_u64; return inner.imm_u64;
} }
Value::CoprocessorInfo Value::GetCoprocInfo() const { Value::CoprocessorInfo Value::GetCoprocInfo() const {
if (IsIdentity()) if (IsIdentity())
return inner.inst->GetArg(0).GetCoprocInfo(); return inner.inst->GetArg(0).GetCoprocInfo();
ASSERT(type == Type::CoprocInfo); DEBUG_ASSERT(type == Type::CoprocInfo);
return inner.imm_coproc; return inner.imm_coproc;
} }
Cond Value::GetCond() const { Cond Value::GetCond() const {
if (IsIdentity()) if (IsIdentity())
return inner.inst->GetArg(0).GetCond(); return inner.inst->GetArg(0).GetCond();
ASSERT(type == Type::Cond); DEBUG_ASSERT(type == Type::Cond);
return inner.imm_cond; return inner.imm_cond;
} }
AccType Value::GetAccType() const { AccType Value::GetAccType() const {
if (IsIdentity()) if (IsIdentity())
return inner.inst->GetArg(0).GetAccType(); return inner.inst->GetArg(0).GetAccType();
ASSERT(type == Type::AccType); DEBUG_ASSERT(type == Type::AccType);
return inner.imm_acctype; return inner.imm_acctype;
} }
s64 Value::GetImmediateAsS64() const { s64 Value::GetImmediateAsS64() const {
ASSERT(IsImmediate()); DEBUG_ASSERT(IsImmediate());
switch (GetType()) { switch (GetType()) {
case IR::Type::U1: case IR::Type::U1:
return s64(GetU1()); return s64(GetU1());
@@ -225,7 +225,7 @@ s64 Value::GetImmediateAsS64() const {
} }
u64 Value::GetImmediateAsU64() const { u64 Value::GetImmediateAsU64() const {
ASSERT(IsImmediate()); DEBUG_ASSERT(IsImmediate());
switch (GetType()) { switch (GetType()) {
case IR::Type::U1: case IR::Type::U1:
return u64(GetU1()); return u64(GetU1());
+2 -2
View File
@@ -147,12 +147,12 @@ public:
template<Type other_type, typename = std::enable_if_t<(other_type & type_) != Type::Void>> template<Type other_type, typename = std::enable_if_t<(other_type & type_) != Type::Void>>
/* implicit */ TypedValue(const TypedValue<other_type>& value) /* implicit */ TypedValue(const TypedValue<other_type>& value)
: Value(value) { : Value(value) {
ASSERT((value.GetType() & type_) != Type::Void); DEBUG_ASSERT((value.GetType() & type_) != Type::Void);
} }
explicit TypedValue(const Value& value) explicit TypedValue(const Value& value)
: Value(value) { : Value(value) {
ASSERT((value.GetType() & type_) != Type::Void); DEBUG_ASSERT((value.GetType() & type_) != Type::Void);
} }
explicit TypedValue(Inst* inst) explicit TypedValue(Inst* inst)
+7 -7
View File
@@ -74,7 +74,7 @@ constexpr T ones() {
/// Create a mask with `count` number of one bits. /// Create a mask with `count` number of one bits.
template<std::integral T> template<std::integral T>
constexpr T ones(size_t count) { constexpr T ones(size_t count) {
ASSERT(count <= bitsizeof<T> && "count larger than bitsize of T"); DEBUG_ASSERT(count <= bitsizeof<T> && "count larger than bitsize of T");
if (count == 0) if (count == 0)
return 0; return 0;
return T(~T(0)) >> (bitsizeof<T> - count); return T(~T(0)) >> (bitsizeof<T> - count);
@@ -92,9 +92,9 @@ constexpr T mask() {
/// Create a mask of type T for bits [begin_bit, end_bit] inclusive. /// Create a mask of type T for bits [begin_bit, end_bit] inclusive.
template<std::integral T> template<std::integral T>
constexpr T mask(size_t begin_bit, size_t end_bit) { constexpr T mask(size_t begin_bit, size_t end_bit) {
ASSERT(begin_bit <= end_bit && "invalid bit range (position of beginning bit cannot be greater than that of end bit)"); DEBUG_ASSERT(begin_bit <= end_bit && "invalid bit range (position of beginning bit cannot be greater than that of end bit)");
ASSERT(begin_bit < bitsizeof<T> && "begin_bit must be smaller than size of T"); DEBUG_ASSERT(begin_bit < bitsizeof<T> && "begin_bit must be smaller than size of T");
ASSERT(end_bit < bitsizeof<T> && "end_bit must be smaller than size of T"); DEBUG_ASSERT(end_bit < bitsizeof<T> && "end_bit must be smaller than size of T");
return ones<T>(end_bit - begin_bit + 1) << begin_bit; return ones<T>(end_bit - begin_bit + 1) << begin_bit;
} }
@@ -194,7 +194,7 @@ constexpr T sign_extend(T value) {
/// Sign-extends a value that has bit_count bits to the full bitwidth of type T. /// Sign-extends a value that has bit_count bits to the full bitwidth of type T.
template<std::integral T> template<std::integral T>
constexpr T sign_extend(size_t bit_count, T value) { constexpr T sign_extend(size_t bit_count, T value) {
ASSERT(bit_count != 0 && "cannot sign-extend zero-sized value"); DEBUG_ASSERT(bit_count != 0 && "cannot sign-extend zero-sized value");
using S = std::make_signed_t<T>; using S = std::make_signed_t<T>;
const size_t shift_amount = bitsizeof<T> - bit_count; const size_t shift_amount = bitsizeof<T> - bit_count;
return T(S(value << shift_amount) >> shift_amount); return T(S(value << shift_amount) >> shift_amount);
@@ -222,8 +222,8 @@ constexpr T replicate_element(T value) {
/// Replicate an element across a value of type T. /// Replicate an element across a value of type T.
template<std::integral T> template<std::integral T>
constexpr T replicate_element(size_t element_size, T value) { constexpr T replicate_element(size_t element_size, T value) {
ASSERT(element_size <= bitsizeof<T> && "element_size is too large"); DEBUG_ASSERT(element_size <= bitsizeof<T> && "element_size is too large");
ASSERT(bitsizeof<T> % element_size == 0 && "bitsize of T not divisible by element_size"); DEBUG_ASSERT(bitsizeof<T> % element_size == 0 && "bitsize of T not divisible by element_size");
if (element_size == bitsizeof<T>) if (element_size == bitsizeof<T>)
return value; return value;
return replicate_element<T>(element_size * 2, T(value | (value << element_size))); return replicate_element<T>(element_size * 2, T(value | (value << element_size)));

Some files were not shown because too many files have changed in this diff Show More