mirror of
https://git.suyu.dev/suyu/dynarmic.git
synced 2026-01-07 15:08:22 +01:00
cast_util: Add FptrCast
Reduce unnecessary type duplication when casting a lambda to a function pointer.
This commit is contained in:
parent
fe583aa076
commit
bd88286b21
7 changed files with 38 additions and 26 deletions
|
|
@ -619,9 +619,7 @@ void A64EmitX64::EmitA64InstructionSynchronizationBarrier(A64EmitContext& ctx, I
|
|||
ctx.reg_alloc.HostCall(nullptr);
|
||||
|
||||
code.mov(code.ABI_PARAM1, reinterpret_cast<u64>(jit_interface));
|
||||
code.CallFunction(static_cast<void(*)(A64::Jit*)>([](A64::Jit* jit) {
|
||||
jit->ClearCache();
|
||||
}));
|
||||
code.CallLambda([](A64::Jit* jit) { jit->ClearCache(); });
|
||||
}
|
||||
|
||||
void A64EmitX64::EmitA64GetCNTFRQ(A64EmitContext& ctx, IR::Inst* inst) {
|
||||
|
|
@ -691,11 +689,11 @@ void A64EmitX64::EmitA64SetExclusive(A64EmitContext& ctx, IR::Inst* inst) {
|
|||
|
||||
code.mov(code.byte[r15 + offsetof(A64JitState, exclusive_state)], u8(1));
|
||||
code.mov(code.ABI_PARAM1, reinterpret_cast<u64>(&conf));
|
||||
code.CallFunction(static_cast<void(*)(A64::UserConfig&, u64, u8)>(
|
||||
code.CallLambda(
|
||||
[](A64::UserConfig& conf, u64 vaddr, u8 size) {
|
||||
conf.global_monitor->Mark(conf.processor_id, vaddr, size);
|
||||
}
|
||||
));
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -1025,52 +1023,52 @@ void A64EmitX64::EmitExclusiveWrite(A64EmitContext& ctx, IR::Inst* inst, size_t
|
|||
code.mov(code.ABI_PARAM1, reinterpret_cast<u64>(&conf));
|
||||
switch (bitsize) {
|
||||
case 8:
|
||||
code.CallFunction(static_cast<u32(*)(A64::UserConfig&, u64, u8)>(
|
||||
code.CallLambda(
|
||||
[](A64::UserConfig& conf, u64 vaddr, u8 value) -> u32 {
|
||||
return conf.global_monitor->DoExclusiveOperation(conf.processor_id, vaddr, 1, [&]{
|
||||
conf.callbacks->MemoryWrite8(vaddr, value);
|
||||
}) ? 0 : 1;
|
||||
}
|
||||
));
|
||||
);
|
||||
break;
|
||||
case 16:
|
||||
code.CallFunction(static_cast<u32(*)(A64::UserConfig&, u64, u16)>(
|
||||
code.CallLambda(
|
||||
[](A64::UserConfig& conf, u64 vaddr, u16 value) -> u32 {
|
||||
return conf.global_monitor->DoExclusiveOperation(conf.processor_id, vaddr, 2, [&]{
|
||||
conf.callbacks->MemoryWrite16(vaddr, value);
|
||||
}) ? 0 : 1;
|
||||
}
|
||||
));
|
||||
);
|
||||
break;
|
||||
case 32:
|
||||
code.CallFunction(static_cast<u32(*)(A64::UserConfig&, u64, u32)>(
|
||||
code.CallLambda(
|
||||
[](A64::UserConfig& conf, u64 vaddr, u32 value) -> u32 {
|
||||
return conf.global_monitor->DoExclusiveOperation(conf.processor_id, vaddr, 4, [&]{
|
||||
conf.callbacks->MemoryWrite32(vaddr, value);
|
||||
}) ? 0 : 1;
|
||||
}
|
||||
));
|
||||
);
|
||||
break;
|
||||
case 64:
|
||||
code.CallFunction(static_cast<u32(*)(A64::UserConfig&, u64, u64)>(
|
||||
code.CallLambda(
|
||||
[](A64::UserConfig& conf, u64 vaddr, u64 value) -> u32 {
|
||||
return conf.global_monitor->DoExclusiveOperation(conf.processor_id, vaddr, 8, [&]{
|
||||
conf.callbacks->MemoryWrite64(vaddr, value);
|
||||
}) ? 0 : 1;
|
||||
}
|
||||
));
|
||||
);
|
||||
break;
|
||||
case 128:
|
||||
code.sub(rsp, 16 + ABI_SHADOW_SPACE);
|
||||
code.lea(code.ABI_PARAM3, ptr[rsp + ABI_SHADOW_SPACE]);
|
||||
code.movaps(xword[code.ABI_PARAM3], xmm1);
|
||||
code.CallFunction(static_cast<u32(*)(A64::UserConfig&, u64, A64::Vector&)>(
|
||||
code.CallLambda(
|
||||
[](A64::UserConfig& conf, u64 vaddr, A64::Vector& value) -> u32 {
|
||||
return conf.global_monitor->DoExclusiveOperation(conf.processor_id, vaddr, 16, [&]{
|
||||
conf.callbacks->MemoryWrite128(vaddr, value);
|
||||
}) ? 0 : 1;
|
||||
}
|
||||
));
|
||||
);
|
||||
code.add(rsp, 16 + ABI_SHADOW_SPACE);
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue