Provide a default implementation of QuicPrefetch(). The new implementation is based on the one used in Chrome; it's the same as the one used in google3, but with MSVC support. PiperOrigin-RevId: 373573478
diff --git a/quic/platform/api/quic_prefetch.h b/common/platform/api/quiche_prefetch.h similarity index 75% rename from quic/platform/api/quic_prefetch.h rename to common/platform/api/quiche_prefetch.h index 49dbe48..706a709 100644 --- a/quic/platform/api/quic_prefetch.h +++ b/common/platform/api/quiche_prefetch.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef QUICHE_QUIC_PLATFORM_API_QUIC_PREFETCH_H_ -#define QUICHE_QUIC_PLATFORM_API_QUIC_PREFETCH_H_ +#ifndef QUICHE_COMMON_PLATFORM_API_QUICHE_PREFETCH_H_ +#define QUICHE_COMMON_PLATFORM_API_QUICHE_PREFETCH_H_ -#include "net/quic/platform/impl/quic_prefetch_impl.h" +#include "quiche_platform_impl/quiche_prefetch_impl.h" -namespace quic { +namespace quiche { // Move data into the cache before it is read, or "prefetch" it. // @@ -30,10 +30,10 @@ // performance, so use them only when representative benchmarks show // an improvement. -inline void QuicPrefetchT0(const void* addr) { - return QuicPrefetchT0Impl(addr); +inline void QuichePrefetchT0(const void* addr) { + return QuichePrefetchT0Impl(addr); } -} // namespace quic +} // namespace quiche -#endif // QUICHE_QUIC_PLATFORM_API_QUIC_PREFETCH_H_ +#endif // QUICHE_COMMON_PLATFORM_API_QUICHE_PREFETCH_H_
diff --git a/common/platform/default/quiche_platform_impl/quiche_prefetch_impl.h b/common/platform/default/quiche_platform_impl/quiche_prefetch_impl.h new file mode 100644 index 0000000..8945481 --- /dev/null +++ b/common/platform/default/quiche_platform_impl/quiche_prefetch_impl.h
@@ -0,0 +1,28 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_PREFETCH_IMPL_H_ +#define QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_PREFETCH_IMPL_H_ + +#if defined(_MSC_VER) +#include <intrin.h> +#endif + +namespace quiche { + +inline void QuichePrefetchT0Impl(const void* addr) { +#if !defined(DISABLE_BUILTIN_PREFETCH) +#if defined(__GNUC__) || (defined(_M_ARM64) && defined(__clang__)) + __builtin_prefetch(addr, 0, 3); +#elif defined(_MSC_VER) + _mm_prefetch(reinterpret_cast<const char*>(addr), _MM_HINT_T0); +#else + (void*)addr; +#endif +#endif // !defined(DISABLE_BUILTIN_PREFETCH) +} + +} // namespace quiche + +#endif // QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUICHE_PREFETCH_IMPL_H_
diff --git a/quic/core/quic_utils.cc b/quic/core/quic_utils.cc index 1a79dca..1f0137a 100644 --- a/quic/core/quic_utils.cc +++ b/quic/core/quic_utils.cc
@@ -21,8 +21,8 @@ #include "quic/platform/api/quic_bug_tracker.h" #include "quic/platform/api/quic_flag_utils.h" #include "quic/platform/api/quic_flags.h" -#include "quic/platform/api/quic_prefetch.h" #include "common/platform/api/quiche_logging.h" +#include "common/platform/api/quiche_prefetch.h" #include "common/quiche_endian.h" namespace quic { @@ -266,9 +266,9 @@ char* next_base = static_cast<char*>(iov[iovnum + 1].iov_base); // Prefetch 2 cachelines worth of data to get the prefetcher started; leave // it to the hardware prefetcher after that. - QuicPrefetchT0(next_base); + quiche::QuichePrefetchT0(next_base); if (iov[iovnum + 1].iov_len >= 64) { - QuicPrefetchT0(next_base + ABSL_CACHELINE_SIZE); + quiche::QuichePrefetchT0(next_base + ABSL_CACHELINE_SIZE); } }