diff --git a/src/dynarmic/backend/arm64/a32_address_space.cpp b/src/dynarmic/backend/arm64/a32_address_space.cpp index 59c9193e..208a033e 100644 --- a/src/dynarmic/backend/arm64/a32_address_space.cpp +++ b/src/dynarmic/backend/arm64/a32_address_space.cpp @@ -311,6 +311,7 @@ EmittedBlockInfo A32AddressSpace::Emit(IR::Block block) { .is_a64 = false, .hook_isb = conf.hook_isb, .enable_cycle_counting = conf.enable_cycle_counting, + .wall_clock_cntpct = conf.wall_clock_cntpct, .always_little_endian = conf.always_little_endian, .descriptor_to_fpcr = [](const IR::LocationDescriptor& location) { return FP::FPCR{A32::LocationDescriptor{location}.FPSCR().Value()}; }, .state_nzcv_offset = offsetof(A32JitState, cpsr_nzcv), diff --git a/src/dynarmic/backend/arm64/a64_address_space.cpp b/src/dynarmic/backend/arm64/a64_address_space.cpp index e6045ef8..72b12b6d 100644 --- a/src/dynarmic/backend/arm64/a64_address_space.cpp +++ b/src/dynarmic/backend/arm64/a64_address_space.cpp @@ -441,6 +441,7 @@ EmittedBlockInfo A64AddressSpace::Emit(IR::Block block) { .is_a64 = true, .hook_isb = conf.hook_isb, .enable_cycle_counting = conf.enable_cycle_counting, + .wall_clock_cntpct = conf.wall_clock_cntpct, .always_little_endian = true, .descriptor_to_fpcr = [](const IR::LocationDescriptor& location) { return A64::LocationDescriptor{location}.FPCR(); }, .state_nzcv_offset = offsetof(A64JitState, cpsr_nzcv), diff --git a/src/dynarmic/backend/arm64/emit_arm64.h b/src/dynarmic/backend/arm64/emit_arm64.h index b22bf810..ee3fc03a 100644 --- a/src/dynarmic/backend/arm64/emit_arm64.h +++ b/src/dynarmic/backend/arm64/emit_arm64.h @@ -98,6 +98,7 @@ struct EmitConfig { bool is_a64; bool hook_isb; bool enable_cycle_counting; + bool wall_clock_cntpct; bool always_little_endian; FP::FPCR (*descriptor_to_fpcr)(const IR::LocationDescriptor& descriptor); diff --git a/src/dynarmic/backend/arm64/emit_arm64_a64.cpp b/src/dynarmic/backend/arm64/emit_arm64_a64.cpp index 00405a03..44c39096 100644 --- a/src/dynarmic/backend/arm64/emit_arm64_a64.cpp +++ b/src/dynarmic/backend/arm64/emit_arm64_a64.cpp @@ -425,8 +425,15 @@ void EmitIR(oaknut::CodeGenerator& code, EmitContext& template<> void EmitIR(oaknut::CodeGenerator& code, EmitContext& ctx, IR::Inst* inst) { - // FIXME: AddTicks / GetTicksRemaining auto Xresult = ctx.reg_alloc.PrepareForCallReg(inst); + if (!ctx.conf.wall_clock_cntpct && ctx.conf.enable_cycle_counting) { + code.LDR(X1, SP, offsetof(StackLayout, cycles_to_run)); + code.SUB(X1, X1, Xticks); + EmitRelocation(code, ctx, LinkTarget::AddTicks); + EmitRelocation(code, ctx, LinkTarget::GetTicksRemaining); + code.STR(X0, SP, offsetof(StackLayout, cycles_to_run)); + code.MOV(Xticks, X0); + } EmitRelocation(code, ctx, LinkTarget::GetCNTPCT); code.MOV(Xresult, X0); }