[AArch64] Implement a way to call lambdas in the emitter
This commit is contained in:
parent
aa5ab45104
commit
8c53b88cc3
|
@ -597,6 +597,29 @@ public:
|
||||||
// ABI related
|
// ABI related
|
||||||
void ABI_PushRegisters(BitSet32 registers);
|
void ABI_PushRegisters(BitSet32 registers);
|
||||||
void ABI_PopRegisters(BitSet32 registers, BitSet32 ignore_mask = BitSet32(0));
|
void ABI_PopRegisters(BitSet32 registers, BitSet32 ignore_mask = BitSet32(0));
|
||||||
|
|
||||||
|
// Utility to generate a call to a std::function object.
|
||||||
|
//
|
||||||
|
// Unfortunately, calling operator() directly is undefined behavior in C++
|
||||||
|
// (this method might be a thunk in the case of multi-inheritance) so we
|
||||||
|
// have to go through a trampoline function.
|
||||||
|
template <typename T, typename... Args>
|
||||||
|
static void CallLambdaTrampoline(const std::function<T(Args...)>* f,
|
||||||
|
Args... args)
|
||||||
|
{
|
||||||
|
(*f)(args...);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function expects you to have set up the state.
|
||||||
|
// Overwrites X0 and X30
|
||||||
|
template <typename T, typename... Args>
|
||||||
|
ARM64Reg ABI_SetupLambda(const std::function<T(Args...)>* f)
|
||||||
|
{
|
||||||
|
auto trampoline = &ARM64XEmitter::CallLambdaTrampoline<T, Args...>;
|
||||||
|
MOVI2R(X30, (u64)trampoline);
|
||||||
|
MOVI2R(X0, (u64)const_cast<void*>((const void*)f));
|
||||||
|
return X30;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ARM64FloatEmitter
|
class ARM64FloatEmitter
|
||||||
|
|
Loading…
Reference in New Issue