cutils: Add generic prefetch

There's no real knowledge of the cacheline size,
just prefetching one loop ahead.

Signed-off-by: Richard Henderson <rth@twiddle.net>
Message-Id: <1472496380-19706-7-git-send-email-rth@twiddle.net>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Richard Henderson 2016-08-29 11:46:17 -07:00 committed by Paolo Bonzini
parent 86444f084b
commit 083d012a38

View File

@ -38,6 +38,8 @@ static bool NAME(const void *buf, size_t len) \
do { \ do { \
const VECTYPE *p = buf; \ const VECTYPE *p = buf; \
VECTYPE t; \ VECTYPE t; \
__builtin_prefetch(buf + SIZE); \
barrier(); \
if (SIZE == sizeof(VECTYPE) * 4) { \ if (SIZE == sizeof(VECTYPE) * 4) { \
t = (p[0] | p[1]) | (p[2] | p[3]); \ t = (p[0] | p[1]) | (p[2] | p[3]); \
} else if (SIZE == sizeof(VECTYPE) * 8) { \ } else if (SIZE == sizeof(VECTYPE) * 8) { \
@ -219,6 +221,9 @@ bool buffer_is_zero(const void *buf, size_t len)
return true; return true;
} }
/* Fetch the beginning of the buffer while we select the accelerator. */
__builtin_prefetch(buf);
/* Use an optimized zero check if possible. Note that this also /* Use an optimized zero check if possible. Note that this also
includes a check for an unrolled loop over 64-bit integers. */ includes a check for an unrolled loop over 64-bit integers. */
return select_accel_fn(buf, len); return select_accel_fn(buf, len);