backend\A64\a32_emit_a64: Implement UpdateUpperLocationDescriptor
This commit is contained in:
parent
5aa60e72a3
commit
60e798d886
@ -62,6 +62,10 @@ A32::LocationDescriptor A32EmitContext::Location() const {
|
||||
return A32::LocationDescriptor{block.Location()};
|
||||
}
|
||||
|
||||
A32::LocationDescriptor A32EmitContext::EndLocation() const {
|
||||
return A32::LocationDescriptor{block.EndLocation()};
|
||||
}
|
||||
|
||||
bool A32EmitContext::IsSingleStep() const {
|
||||
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) {
|
||||
ctx.reg_alloc.HostCall(nullptr);
|
||||
|
||||
|
@ -30,6 +30,7 @@ class RegAlloc;
|
||||
struct A32EmitContext final : public EmitContext {
|
||||
A32EmitContext(RegAlloc& reg_alloc, IR::Block& block);
|
||||
A32::LocationDescriptor Location() const;
|
||||
A32::LocationDescriptor EndLocation() const;
|
||||
bool IsSingleStep() const;
|
||||
FP::RoundingMode FPSCR_RMode() const override;
|
||||
u32 FPCR() const override;
|
||||
|
@ -32,7 +32,7 @@ A32OPC(GetGEFlags, U32,
|
||||
A32OPC(SetGEFlags, Void, U32 )
|
||||
A32OPC(SetGEFlagsCompressed, Void, U32 )
|
||||
A32OPC(BXWritePC, Void, U32 )
|
||||
//A32OPC(UpdateUpperLocationDescriptor, Void, )
|
||||
A32OPC(UpdateUpperLocationDescriptor, Void, )
|
||||
A32OPC(CallSupervisor, Void, U32 )
|
||||
A32OPC(ExceptionRaised, Void, U32, U64 )
|
||||
//A32OPC(DataSynchronizationBarrier, Void, )
|
||||
|
Loading…
x
Reference in New Issue
Block a user