diff --git ./sysdeps/alpha/alphaev6/memset.S ./sysdeps/alpha/alphaev6/memset.S
index 5c1e307cdf..fb01baa795 100644
--- ./sysdeps/alpha/alphaev6/memset.S
+++ ./sysdeps/alpha/alphaev6/memset.S
@@ -158,19 +158,38 @@ $bigalign:
 	 * Scratch registers available: $7, $2, $4, $1
 	 * We know that we'll be taking a minimum of one trip through.
 	 * CWG Section 3.7.6: do not expect a sustained store rate of > 1/cycle
-	 * Assumes the wh64 needs to be for 2 trips through the loop in the future.
-	 * The wh64 is issued on for the starting destination address for trip +2
-	 * through the loop, and if there are less than two trips left, the target
-	 * address will be for the current trip.
+	 *
+	 * The wh64 is issued five trips ahead of the block it is computed on,
+	 * so that when it is consumed at the top of the next trip it names the
+	 * block four lines (256 bytes) beyond the stores of that trip.  A
+	 * shorter lead does not work: wh64 has to claim the line before the
+	 * stores reach it and, unlike a load prefetch, there is no fill latency
+	 * for a late hint to hide behind.  Measured on an EV68CB (DS15, 2MB
+	 * off-chip Bcache), a one-line lead is 453k cycles for a cold 256KB
+	 * memset against 406k for issuing no hint at all -- i.e. it is worse
+	 * than useless -- while four lines is 151k, a 3.0x improvement.  The
+	 * curve is flat from three lines out to eight, so the exact depth in
+	 * that range does not matter; being under it does.
+	 *
+	 * If fewer than four lines remain the hint would run off the end of the
+	 * region, and wh64 makes the whole 64-byte block UNPREDICTABLE, so the
+	 * target falls back to the block the next trip stores.  That is always
+	 * in range and still avoids that block's read-for-ownership.
+	 *
+	 * Guard arithmetic: the hint consumed at trip N+1 covers
+	 * [$5+256, $5+320), so trip N+1 needs 40 quads left; it is computed at
+	 * trip N, which therefore needs 48.
 	 */
 
 $do_wh64:
 	wh64	($4)		# L1 : memory subsystem write hint
-	subq	$3, 24, $2	# E : For determining future wh64 addresses
+	subq	$3, 48, $2	# E : >= 48 quads left? (see guard note above)
 	stq	$17, 0($5)	# L :
 	nop			# E :
 
-	addq	$5, 128, $4	# E : speculative target of next wh64
+	lda	$4, 320($5)	# E : speculative target of next wh64 (4 lines
+				#     ahead of the trip that consumes it; 320
+				#     exceeds the 8-bit addq literal field)
 	stq	$17, 8($5)	# L :
 	stq	$17, 16($5)	# L :
 	addq	$5, 64, $7	# E : Fallback address for wh64 (== next trip addr)
