Search code examples
assemblyx86cpu-architecturebit-shiftinstruction-set

What's the purpose of the rotate instructions (ROL, RCL on x86)?


I always wondered what's the purpose of the rotate instructions some CPUs have (ROL, RCL on x86, for example). What kind of software makes use of these instructions?

I first thought they may be used for encryption/computing hash codes, but these libraries are written usually in C, which doesn't have operators that map to these instructions. (Editor's note: see Best practices for circular shift (rotate) operations in C++ for how to write C or C++ that will compile to a rotate instruction. Also, optimized crypto libraries often do have asm for specific platforms.)

Has anybody found an use for them? Why where they added to the instructions set?


Solution

  • Rotates are required for bit shifts across multiple words. When you SHL the lower word, the high-order bit spills out into the carry. To complete the operation, you need to shift the higher word(s) while bringing in the carry to the low-order bit. RCL is the instruction that accomplishes this.

                          High word             Low word         CF
    Initial          0110 1001 1011 1001   1100 0010 0000 1101    ?
    SHL low word     0110 1001 1011 1001   1000 0100 0001 1010    1
    RCL high word    1101 0011 0111 0011   1000 0100 0001 1010    0
    

    ROL and ROR are useful for examining a value bit-by-bit in a way that is (ultimately) non-destructive. They can also be used to shunt a bitmask around without bringing in garbage bits.