- What does
rep; nopmean? - Is it the same as
pauseinstruction? - Is it the same as
rep nop(without the semi-colon)? - What's the difference to the simple
nopinstruction? - 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.