- What does
rep; nop
mean? - Is it the same as
pause
instruction? - Is it the same as
rep nop
(without the semi-colon)? - What's the difference to the simple
nop
instruction? - Does it behave differently on AMD and Intel processors?
- (bonus) Where is the official documentation for these instructions?
Motivation for this question
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:
- "try not to burn too much power"
- "it is equivalent to 'nop' just with 2 byte encoding."
- "it is magic on intel. Its like 'nop but let the other HT sibling run'"
- "it is pause on intel and fast padding on Athlon"
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.