diff --git a/spinlock.c b/spinlock.c
index ba5bb4a5e35d62b435ad8cb8d0deeec2c786c1c6..5f04dcf9676715344158cbab6459747c68329fe1 100644
--- a/spinlock.c
+++ b/spinlock.c
@@ -54,10 +54,14 @@ release(struct spinlock *lock)
   lock->cpu = 0xffffffff;
 
   // The xchg serializes, so that reads before release are 
-  // not reordered after it.  (This reordering would be allowed
-  // by the Intel manuals, but does not happen on current 
-  // Intel processors.  The xchg being asm volatile also keeps
-  // gcc from delaying the above assignments.)
+  // not reordered after it.  The 1996 PentiumPro manual (Volume 3,
+  // 7.2) says reads can be carried out speculatively and in
+  // any order, which implies we need to serialize here.
+  // But the 2007 Intel 64 Architecture Memory Ordering White
+  // Paper says that Intel 64 and IA-32 will not move a load
+  // after a store. So lock->locked = 0 would work here.
+  // The xchg being asm volatile ensures gcc emits it after
+  // the above assignments (and after the critical section).
   xchg(&lock->locked, 0);
 
   popcli();