xref: /aosp_15_r20/external/angle/third_party/abseil-cpp/absl/base/prefetch_test.cc (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 // Copyright 2023 The Abseil Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "absl/base/prefetch.h"
16 
17 #include <memory>
18 
19 #include "gtest/gtest.h"
20 
21 namespace {
22 
23 // Below tests exercise the functions only to guarantee they compile and execute
24 // correctly. We make no attempt at verifying any prefetch instructions being
25 // generated and executed: we assume the various implementation in terms of
26 // __builtin_prefetch() or x86 intrinsics to be correct and well tested.
27 
TEST(PrefetchTest,PrefetchToLocalCache_StackA)28 TEST(PrefetchTest, PrefetchToLocalCache_StackA) {
29   char buf[100] = {};
30   absl::PrefetchToLocalCache(buf);
31   absl::PrefetchToLocalCacheNta(buf);
32   absl::PrefetchToLocalCacheForWrite(buf);
33 }
34 
TEST(PrefetchTest,PrefetchToLocalCache_Heap)35 TEST(PrefetchTest, PrefetchToLocalCache_Heap) {
36   auto memory = std::make_unique<char[]>(200 << 10);
37   memset(memory.get(), 0, 200 << 10);
38   absl::PrefetchToLocalCache(memory.get());
39   absl::PrefetchToLocalCacheNta(memory.get());
40   absl::PrefetchToLocalCacheForWrite(memory.get());
41   absl::PrefetchToLocalCache(memory.get() + (50 << 10));
42   absl::PrefetchToLocalCacheNta(memory.get() + (50 << 10));
43   absl::PrefetchToLocalCacheForWrite(memory.get() + (50 << 10));
44   absl::PrefetchToLocalCache(memory.get() + (100 << 10));
45   absl::PrefetchToLocalCacheNta(memory.get() + (100 << 10));
46   absl::PrefetchToLocalCacheForWrite(memory.get() + (100 << 10));
47   absl::PrefetchToLocalCache(memory.get() + (150 << 10));
48   absl::PrefetchToLocalCacheNta(memory.get() + (150 << 10));
49   absl::PrefetchToLocalCacheForWrite(memory.get() + (150 << 10));
50 }
51 
TEST(PrefetchTest,PrefetchToLocalCache_Nullptr)52 TEST(PrefetchTest, PrefetchToLocalCache_Nullptr) {
53   absl::PrefetchToLocalCache(nullptr);
54   absl::PrefetchToLocalCacheNta(nullptr);
55   absl::PrefetchToLocalCacheForWrite(nullptr);
56 }
57 
TEST(PrefetchTest,PrefetchToLocalCache_InvalidPtr)58 TEST(PrefetchTest, PrefetchToLocalCache_InvalidPtr) {
59   absl::PrefetchToLocalCache(reinterpret_cast<const void*>(0x785326532L));
60   absl::PrefetchToLocalCacheNta(reinterpret_cast<const void*>(0x785326532L));
61   absl::PrefetchToLocalCacheForWrite(reinterpret_cast<const void*>(0x78532L));
62 }
63 
64 }  // namespace
65