backend\A64\a32_emit_a64: Implement UpdateUpperLocationDescriptor

This commit is contained in:
SachinVin 2022-05-29 12:45:14 +05:30
parent 5aa60e72a3
commit 60e798d886
3 changed files with 15 additions and 1 deletions

View File

@ -62,6 +62,10 @@ A32::LocationDescriptor A32EmitContext::Location() const {
return A32::LocationDescriptor{block.Location()}; return A32::LocationDescriptor{block.Location()};
} }
A32::LocationDescriptor A32EmitContext::EndLocation() const {
return A32::LocationDescriptor{block.EndLocation()};
}
bool A32EmitContext::IsSingleStep() const { bool A32EmitContext::IsSingleStep() const {
return A32::LocationDescriptor{block.Location()}.SingleStepping(); return A32::LocationDescriptor{block.Location()}.SingleStepping();
} }
@ -699,6 +703,15 @@ void A32EmitA64::EmitA32BXWritePC(A32EmitContext& ctx, IR::Inst* inst) {
} }
} }
void A32EmitA64::EmitA32UpdateUpperLocationDescriptor(A32EmitContext& ctx, IR::Inst*) {
for (auto& inst : ctx.block) {
if (inst.GetOpcode() == IR::Opcode::A32BXWritePC) {
return;
}
}
EmitSetUpperLocationDescriptor(ctx.EndLocation(), ctx.Location());
}
void A32EmitA64::EmitA32CallSupervisor(A32EmitContext& ctx, IR::Inst* inst) { void A32EmitA64::EmitA32CallSupervisor(A32EmitContext& ctx, IR::Inst* inst) {
ctx.reg_alloc.HostCall(nullptr); ctx.reg_alloc.HostCall(nullptr);

View File

@ -30,6 +30,7 @@ class RegAlloc;
struct A32EmitContext final : public EmitContext { struct A32EmitContext final : public EmitContext {
A32EmitContext(RegAlloc& reg_alloc, IR::Block& block); A32EmitContext(RegAlloc& reg_alloc, IR::Block& block);
A32::LocationDescriptor Location() const; A32::LocationDescriptor Location() const;
A32::LocationDescriptor EndLocation() const;
bool IsSingleStep() const; bool IsSingleStep() const;
FP::RoundingMode FPSCR_RMode() const override; FP::RoundingMode FPSCR_RMode() const override;
u32 FPCR() const override; u32 FPCR() const override;

View File

@ -32,7 +32,7 @@ A32OPC(GetGEFlags, U32,
A32OPC(SetGEFlags, Void, U32 ) A32OPC(SetGEFlags, Void, U32 )
A32OPC(SetGEFlagsCompressed, Void, U32 ) A32OPC(SetGEFlagsCompressed, Void, U32 )
A32OPC(BXWritePC, Void, U32 ) A32OPC(BXWritePC, Void, U32 )
//A32OPC(UpdateUpperLocationDescriptor, Void, ) A32OPC(UpdateUpperLocationDescriptor, Void, )
A32OPC(CallSupervisor, Void, U32 ) A32OPC(CallSupervisor, Void, U32 )
A32OPC(ExceptionRaised, Void, U32, U64 ) A32OPC(ExceptionRaised, Void, U32, U64 )
//A32OPC(DataSynchronizationBarrier, Void, ) //A32OPC(DataSynchronizationBarrier, Void, )