From cf50b62e4b79cc9056f656e846b10902f2188a5b Mon Sep 17 00:00:00 2001 From: Ashay Rane <253344819+raneashay@users.noreply.github.com> Date: Tue, 3 Mar 2026 15:41:22 -0600 Subject: [PATCH] Add prefetch support for Windows on X64 and AArch64 This patch largely mimics the prefetch support for Linux on X64 and AArch64 to apply for Windows. One key change, however, is that instead of using inline assembly, which isn't supported by MSVC, this patch uses compiler builtins (`__prefetch2()` on AArch64 and `_mm_prefetch()` on X64). --- .../prefetch_windows_aarch64.inline.hpp | 14 ++++++++++++++ .../windows_x86/prefetch_windows_x86.inline.hpp | 11 +++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/hotspot/os_cpu/windows_aarch64/prefetch_windows_aarch64.inline.hpp b/src/hotspot/os_cpu/windows_aarch64/prefetch_windows_aarch64.inline.hpp index a360ee342be68..a2c8f0c685c4a 100644 --- a/src/hotspot/os_cpu/windows_aarch64/prefetch_windows_aarch64.inline.hpp +++ b/src/hotspot/os_cpu/windows_aarch64/prefetch_windows_aarch64.inline.hpp @@ -27,10 +27,24 @@ // Included in runtime/prefetch.inline.hpp +#include + +// __prefetch2(addr, prfop) emits a PRFM instruction. +// The prfop encoding is: +// type: PLD = 00, PLI = 01, PST = 10 +// target: L1 = 00, L2 = 01, L3 = 10 +// policy: KEEP = 0, STRM = 1 + inline void Prefetch::read (const void *loc, intx interval) { + if (interval >= 0) { + __prefetch2((const char*) loc + interval, /* PLD + L1 + KEEP */ 0); + } } inline void Prefetch::write(void *loc, intx interval) { + if (interval >= 0) { + __prefetch2((char*) loc + interval, /* PST + L1 + KEEP */ 16); + } } #endif // OS_CPU_WINDOWS_AARCH64_PREFETCH_WINDOWS_AARCH64_INLINE_HPP diff --git a/src/hotspot/os_cpu/windows_x86/prefetch_windows_x86.inline.hpp b/src/hotspot/os_cpu/windows_x86/prefetch_windows_x86.inline.hpp index 645fbe99a223d..7ae566b40c606 100644 --- a/src/hotspot/os_cpu/windows_x86/prefetch_windows_x86.inline.hpp +++ b/src/hotspot/os_cpu/windows_x86/prefetch_windows_x86.inline.hpp @@ -27,7 +27,14 @@ // Included in runtime/prefetch.inline.hpp -inline void Prefetch::read (const void *loc, intx interval) {} -inline void Prefetch::write(void *loc, intx interval) {} +#include + +inline void Prefetch::read (const void *loc, intx interval) { + _mm_prefetch((const char*) loc + interval, _MM_HINT_T0); +} + +inline void Prefetch::write(void *loc, intx interval) { + _mm_prefetch((const char*) loc + interval, _MM_HINT_T0); +} #endif // OS_CPU_WINDOWS_X86_PREFETCH_WINDOWS_X86_INLINE_HPP