/* * Prefetching Operations * (C) 2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_PREFETCH_H__ #define BOTAN_PREFETCH_H__ #include namespace Botan { template inline void prefetch_readonly(const T* addr, u32bit length) { #if defined(__GNUG__) const u32bit Ts_per_cache_line = CPUID::cache_line_size() / sizeof(T); for(u32bit i = 0; i <= length; i += Ts_per_cache_line) __builtin_prefetch(addr + i, 0); #endif } template inline void prefetch_readwrite(const T* addr, u32bit length) { #if defined(__GNUG__) const u32bit Ts_per_cache_line = CPUID::cache_line_size() / sizeof(T); for(u32bit i = 0; i <= length; i += Ts_per_cache_line) __builtin_prefetch(addr + i, 1); #endif } } #endif