ir/terminal: Add FastDispatchHint
This commit is contained in:
parent
1a69a61cb4
commit
aa8d826c13
6 changed files with 20 additions and 11 deletions
|
@ -1230,14 +1230,8 @@ void A32EmitX64::EmitTerminalImpl(IR::Term::PopRSBHint, IR::LocationDescriptor)
|
||||||
code.or_(ebx, dword[r15 + offsetof(A32JitState, CPSR_et)]);
|
code.or_(ebx, dword[r15 + offsetof(A32JitState, CPSR_et)]);
|
||||||
code.or_(rbx, rcx);
|
code.or_(rbx, rcx);
|
||||||
|
|
||||||
code.mov(eax, dword[r15 + offsetof(A32JitState, rsb_ptr)]);
|
void A32EmitX64::EmitTerminalImpl(IR::Term::FastDispatchHint, IR::LocationDescriptor initial_location) {
|
||||||
code.sub(eax, 1);
|
EmitTerminalImpl(IR::Term::ReturnToDispatch{}, initial_location);
|
||||||
code.and_(eax, u32(A32JitState::RSBPtrMask));
|
|
||||||
code.mov(dword[r15 + offsetof(A32JitState, rsb_ptr)], eax);
|
|
||||||
code.cmp(rbx, qword[r15 + offsetof(A32JitState, rsb_location_descriptors) + rax * sizeof(u64)]);
|
|
||||||
code.jne(code.GetReturnFromRunCodeAddress());
|
|
||||||
code.mov(rax, qword[r15 + offsetof(A32JitState, rsb_codeptrs) + rax * sizeof(u64)]);
|
|
||||||
code.jmp(rax);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void A32EmitX64::EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor initial_location) {
|
void A32EmitX64::EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor initial_location) {
|
||||||
|
|
|
@ -77,6 +77,7 @@ protected:
|
||||||
void EmitTerminalImpl(IR::Term::LinkBlock terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::LinkBlock terminal, IR::LocationDescriptor initial_location) override;
|
||||||
void EmitTerminalImpl(IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location) override;
|
||||||
void EmitTerminalImpl(IR::Term::PopRSBHint terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::PopRSBHint terminal, IR::LocationDescriptor initial_location) override;
|
||||||
|
void EmitTerminalImpl(IR::Term::FastDispatchHint terminal, IR::LocationDescriptor initial_location) override;
|
||||||
void EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor initial_location) override;
|
||||||
void EmitTerminalImpl(IR::Term::CheckBit terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::CheckBit terminal, IR::LocationDescriptor initial_location) override;
|
||||||
void EmitTerminalImpl(IR::Term::CheckHalt terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::CheckHalt terminal, IR::LocationDescriptor initial_location) override;
|
||||||
|
|
|
@ -1070,6 +1070,10 @@ void A64EmitX64::EmitTerminalImpl(IR::Term::PopRSBHint, IR::LocationDescriptor)
|
||||||
code.jmp(rax);
|
code.jmp(rax);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void A64EmitX64::EmitTerminalImpl(IR::Term::FastDispatchHint, IR::LocationDescriptor initial_location) {
|
||||||
|
EmitTerminalImpl(IR::Term::ReturnToDispatch{}, initial_location);
|
||||||
|
}
|
||||||
|
|
||||||
void A64EmitX64::EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor initial_location) {
|
void A64EmitX64::EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor initial_location) {
|
||||||
switch (terminal.if_) {
|
switch (terminal.if_) {
|
||||||
case IR::Cond::AL:
|
case IR::Cond::AL:
|
||||||
|
|
|
@ -83,6 +83,7 @@ protected:
|
||||||
void EmitTerminalImpl(IR::Term::LinkBlock terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::LinkBlock terminal, IR::LocationDescriptor initial_location) override;
|
||||||
void EmitTerminalImpl(IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location) override;
|
||||||
void EmitTerminalImpl(IR::Term::PopRSBHint terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::PopRSBHint terminal, IR::LocationDescriptor initial_location) override;
|
||||||
|
void EmitTerminalImpl(IR::Term::FastDispatchHint terminal, IR::LocationDescriptor initial_location) override;
|
||||||
void EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor initial_location) override;
|
||||||
void EmitTerminalImpl(IR::Term::CheckBit terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::CheckBit terminal, IR::LocationDescriptor initial_location) override;
|
||||||
void EmitTerminalImpl(IR::Term::CheckHalt terminal, IR::LocationDescriptor initial_location) override;
|
void EmitTerminalImpl(IR::Term::CheckHalt terminal, IR::LocationDescriptor initial_location) override;
|
||||||
|
|
|
@ -100,6 +100,7 @@ protected:
|
||||||
virtual void EmitTerminalImpl(IR::Term::LinkBlock terminal, IR::LocationDescriptor initial_location) = 0;
|
virtual void EmitTerminalImpl(IR::Term::LinkBlock terminal, IR::LocationDescriptor initial_location) = 0;
|
||||||
virtual void EmitTerminalImpl(IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location) = 0;
|
virtual void EmitTerminalImpl(IR::Term::LinkBlockFast terminal, IR::LocationDescriptor initial_location) = 0;
|
||||||
virtual void EmitTerminalImpl(IR::Term::PopRSBHint terminal, IR::LocationDescriptor initial_location) = 0;
|
virtual void EmitTerminalImpl(IR::Term::PopRSBHint terminal, IR::LocationDescriptor initial_location) = 0;
|
||||||
|
virtual void EmitTerminalImpl(IR::Term::FastDispatchHint terminal, IR::LocationDescriptor initial_location) = 0;
|
||||||
virtual void EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor initial_location) = 0;
|
virtual void EmitTerminalImpl(IR::Term::If terminal, IR::LocationDescriptor initial_location) = 0;
|
||||||
virtual void EmitTerminalImpl(IR::Term::CheckBit terminal, IR::LocationDescriptor initial_location) = 0;
|
virtual void EmitTerminalImpl(IR::Term::CheckBit terminal, IR::LocationDescriptor initial_location) = 0;
|
||||||
virtual void EmitTerminalImpl(IR::Term::CheckHalt terminal, IR::LocationDescriptor initial_location) = 0;
|
virtual void EmitTerminalImpl(IR::Term::CheckHalt terminal, IR::LocationDescriptor initial_location) = 0;
|
||||||
|
|
|
@ -29,7 +29,7 @@ struct Interpret {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This terminal instruction returns control to the dispatcher.
|
* This terminal instruction returns control to the dispatcher.
|
||||||
* The dispatcher will use the value in R15 to determine what comes next.
|
* The dispatcher will use the current cpu state to determine what comes next.
|
||||||
*/
|
*/
|
||||||
struct ReturnToDispatch {};
|
struct ReturnToDispatch {};
|
||||||
|
|
||||||
|
@ -57,14 +57,21 @@ struct LinkBlockFast {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This terminal instruction checks the top of the Return Stack Buffer against R15.
|
* This terminal instruction checks the top of the Return Stack Buffer against the current
|
||||||
* If RSB lookup fails, control is returned to the dispatcher.
|
* location descriptor. If RSB lookup fails, control is returned to the dispatcher.
|
||||||
* This is an optimization for faster function calls. A backend that doesn't support
|
* This is an optimization for faster function calls. A backend that doesn't support
|
||||||
* this optimization or doesn't have a RSB may choose to implement this exactly as
|
* this optimization or doesn't have a RSB may choose to implement this exactly as
|
||||||
* ReturnToDispatch.
|
* ReturnToDispatch.
|
||||||
*/
|
*/
|
||||||
struct PopRSBHint {};
|
struct PopRSBHint {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This terminal instruction performs a lookup of the current location descriptor in the
|
||||||
|
* fast dispatch lookup table. A backend that doesn't support this optimization may choose
|
||||||
|
* to implement this exactly as ReturnToDispatch.
|
||||||
|
*/
|
||||||
|
struct FastDispatchHint {};
|
||||||
|
|
||||||
struct If;
|
struct If;
|
||||||
struct CheckBit;
|
struct CheckBit;
|
||||||
struct CheckHalt;
|
struct CheckHalt;
|
||||||
|
@ -76,6 +83,7 @@ using Terminal = boost::variant<
|
||||||
LinkBlock,
|
LinkBlock,
|
||||||
LinkBlockFast,
|
LinkBlockFast,
|
||||||
PopRSBHint,
|
PopRSBHint,
|
||||||
|
FastDispatchHint,
|
||||||
boost::recursive_wrapper<If>,
|
boost::recursive_wrapper<If>,
|
||||||
boost::recursive_wrapper<CheckBit>,
|
boost::recursive_wrapper<CheckBit>,
|
||||||
boost::recursive_wrapper<CheckHalt>
|
boost::recursive_wrapper<CheckHalt>
|
||||||
|
|
Loading…
Reference in a new issue