backend/arm64: Implement A32UpdateUpperLocationDescriptor

This commit is contained in:
Merry 2022-07-21 21:07:53 +01:00 committed by merry
parent 00ad84b7ab
commit 67dc7f2e4e
2 changed files with 14 additions and 2 deletions

View file

@ -34,6 +34,8 @@ void EmitIR<IR::Opcode::A32GetCFlag>(oaknut::CodeGenerator& code, EmitContext& c
template<>
void EmitIR<IR::Opcode::A32SetCpsrNZC>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst);
template<>
void EmitIR<IR::Opcode::A32UpdateUpperLocationDescriptor>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst*);
template<>
void EmitIR<IR::Opcode::LogicalShiftLeft32>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst);
template<>
void EmitIR<IR::Opcode::MostSignificantBit>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst);

View file

@ -50,8 +50,8 @@ void EmitSetUpperLocationDescriptor(oaknut::CodeGenerator& code, EmitContext& ct
}();
if (old_upper != new_upper) {
code.MOV(Xscratch0, new_upper);
code.STR(Xscratch0, Xstate, offsetof(A32JitState, upper_location_descriptor));
code.MOV(Wscratch0, new_upper);
code.STR(Wscratch0, Xstate, offsetof(A32JitState, upper_location_descriptor));
}
}
@ -175,4 +175,14 @@ void EmitIR<IR::Opcode::A32SetCpsrNZC>(oaknut::CodeGenerator& code, EmitContext&
code.STR(Wscratch0, Xstate, offsetof(A32JitState, cpsr_nzcv));
}
template<>
void EmitIR<IR::Opcode::A32UpdateUpperLocationDescriptor>(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst*) {
for (auto& inst : ctx.block) {
if (inst.GetOpcode() == IR::Opcode::A32BXWritePC) {
return;
}
}
EmitSetUpperLocationDescriptor(code, ctx, ctx.block.EndLocation(), ctx.block.Location());
}
} // namespace Dynarmic::Backend::Arm64