rdtsc.h 720 B

12345678910111213141516171819202122232425262728293031323334353637
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #ifdef _MSC_VER
  5. #include <intrin.h>
  6. #endif
  7. #include "common/common_types.h"
  8. namespace Common::X64 {
  9. #ifdef _MSC_VER
  10. __forceinline static u64 FencedRDTSC() {
  11. _mm_lfence();
  12. _ReadWriteBarrier();
  13. const u64 result = __rdtsc();
  14. _mm_lfence();
  15. _ReadWriteBarrier();
  16. return result;
  17. }
  18. #else
  19. static inline u64 FencedRDTSC() {
  20. u64 eax;
  21. u64 edx;
  22. asm volatile("lfence\n\t"
  23. "rdtsc\n\t"
  24. "lfence\n\t"
  25. : "=a"(eax), "=d"(edx));
  26. return (edx << 32) | eax;
  27. }
  28. #endif
  29. u64 EstimateRDTSCFrequency();
  30. } // namespace Common::X64