= Solution
Define `PREFETCH [a]` as a <software prefetch> hint: initiate a request for the <cache line> containing <memory address> `a`, then continue without waiting for that <cache line> to arrive. It produces no value in a destination <processor register>, changes no program data and creates no data-result dependence for later instructions. It may be ignored if resources are unavailable. A useful hint is nonfaulting for an inaccessible or untranslated target: a later real <load instruction> must still perform its ordinary access checks. This is a proposed contract for the instruction, rather than a guarantee that the patent abstract alone fixes every detail of its semantics.
For example, after reading the next <pointer> of a <linked list node>, prefetch that next <linked list node> while processing the current one. Replacing the hint by an otherwise unused ordinary <load instruction> on this <in-order pipeline> would wait in MEM on a <cache miss> before the current computation could start. It would also consume a destination <processor register> and might raise a <synchronous processor exception>. A harmless hint can be scheduled earlier, even on a path where the data will never be demanded. \b[The crucial semantic difference is that cache filling may continue after the prefetch instruction itself has finished.]
A <software prefetch> is not a <memory barrier> and does not establish <acquire-release synchronization> or promise that later accesses will hit. Its purpose is performance; correctness must survive the hint being ignored.
$$
\boxed{\text{A nonblocking hint produces no register result and may be ignored.}}
$$
Back to article page