Home > Articles > Programming

This chapter is from the book

This chapter is from the book

2–15 Rotate Shifts

These are rather trivial. Perhaps surprisingly, this code works for n ranging from 0 to 32 inclusive, even if the shifts are mod-32.

If your machine has double-length shifts, they can be used to do rotate shifts. These instructions might be written

shldi RT,RA,RB,I
shrdi RT,RA,RB,I

They treat the concatenation of RA and RB as a single double-length quantity, and shift it left or right by the amount given by the immediate field I. (If the shift amount is in a register, the instructions are awkward to implement on most RISCs because they require reading three registers.) The result of the left shift is the high-order word of the shifted double-length quantity, and the result of the right shift is the low-order word.

Using shldi, a rotate left of Rx can be accomplished by

shldi RT,Rx,Rx, I

and similarly a rotate right shift can be accomplished with shrdi.

A rotate left shift of one position can be accomplished by adding the contents of a register to itself with “end-around carry” (adding the carry that results from the addition to the sum in the low-order position). Most machines do not have that instruction, but on many machines it can be accomplished with two instructions: (1) add the contents of the register to itself, generating a carry (into a status register), and (2) add the carry to the sum.

  • + Share This
  • 🔖 Save To Your Account