rep; nop
mean?pause
instruction?rep nop
(without the semi-colon)?nop
instruction?After some discussion in the comments of another question, I realized that I don't know what rep; nop;
means in x86 (or x86-64) assembly. And also I couldn't find a good explanation on the web.
I know that rep
is a prefix that means "repeat the next instruction cx
times" (or at least it was, in old 16-bit x86 assembly). According to this summary table at Wikipedia, it seems rep
can only be used with movs
, stos
, cmps
, lods
, scas
(but maybe this limitation was removed on newer processors). Thus, I would think rep nop
(without semi-colon) would repeat a nop
operation cx
times.
However, after further searching, I got even more confused. It seems that rep; nop
and pause
map to the exactly same opcode, and pause
has a bit different behavior than just nop
. Some old mail from 2005 said different things:
With these different opinions, I couldn't understand the correct meaning.
It's being used in Linux kernel (on both i386 and x86_64), together with this comment: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
It is also being used in BeRTOS, with the same comment.
rep; nop
is indeed the same as the pause
instruction (opcode F390
). It might be used for assemblers which don't support the pause
instruction yet. On previous processors, this simply did nothing, just like nop
but in two bytes. On new processors which support hyperthreading, it is used as a hint to the processor that you are executing a spinloop to increase performance. From Intel's instruction reference:
Improves the performance of spin-wait loops. When executing a “spin-wait loop,” a Pentium 4 or Intel Xeon processor suffers a severe performance penalty when exiting the loop because it detects a possible memory order violation. The PAUSE instruction provides a hint to the processor that the code sequence is a spin-wait loop. The processor uses this hint to avoid the memory order violation in most situations, which greatly improves processor performance. For this reason, it is recommended that a PAUSE instruction be placed in all spin-wait loops.