shift | dir | Register | Immediate |
---|---|---|---|
logical | left | sll | slli |
logical | right | srl | srli |
arithmetic | right | sra | srai |
rotate | left | rol | roli |
rotate | right | ror | rori |
pseudo-instruction |
Both register and immediate shifts are R-Format instructions:
sllrC = rA << (rB[4:0]) | slli | rC = rA << (sh) | rB is zero for
slli
| |
v<<n shifts v right by n bits.
If v is unsigned, a right shift is logical. If v is signed, a right shift is arithmetic and the sign bit is shifted in from the left (sign-extension)
Note that the following constructions are compiled to a single rotate instruction:
44: // rotate right 45: nv = (na>>ns)|(na<<(32-ns)); 48: // rotate left 49: nv = (na<<ns)|(na>>(32-ns));
Download: cprog2.zip.
01: //#define DBUG 02: #if defined(DBUG) 03: #include "sys/alt_stdio.h" 04: #define DBPRINTF alt_printf 05: #else 06: #define DBPRINTF 07: #endif 08: 09: int main() 10: { 11: unsigned int na, ns, nv; 12: na = 0x8000F731; 13: DBPRINTF("na = 0x%x\n",na); 14: 15: // logical shift left 16: nv = na<<3; 17: DBPRINTF("na<<3 = 0x%x\n",nv); 18: // logical shift right 19: nv = na>>3; 20: DBPRINTF("na>>3 = 0x%x\n",nv); 21: // arithmetic shift right 22: nv = ((signed)na)>>3; 23: DBPRINTF("((signed)na)>>3 = 0x%x\n",nv); 24: 25: // rotate right 26: nv = (na>>4)|(na<<28); 27: DBPRINTF("rot right 4 = 0x%x\n",nv); 28: 29: // rotate left 30: nv = (na<<4)|(na>>28); 31: DBPRINTF("rot left 4 = 0x%x\n",nv); 32: 33: // use variable as shift amount 34: ns = 5; 35: DBPRINTF("Use variable as shift amount\n ns = %d\n",ns); 36: 37: nv = na>>ns; 38: DBPRINTF("na>>ns = 0x%x\n",nv); 39: 40: nv = na<<ns; 41: DBPRINTF("na<<ns = 0x%x\n",nv); 42: 43: ns = 8; 44: // rotate right 45: nv = (na>>ns)|(na<<(32-ns)); 46: DBPRINTF("rot right 8 = 0x%x\n",nv); 47: 48: // rotate left 49: nv = (na<<ns)|(na>>(32-ns)); 50: DBPRINTF("rot left 8 = 0x%x\n",nv); 51: 52: /* Event loop never exits. */ 53: while (1); 54: return 0; 55: }
0000806c <main>: #define DBPRINTF #endif int main() { 806c: defffc04 addi sp,sp,-16 8070: df000315 stw fp,12(sp) 8074: d839883a mov fp,sp unsigned int na, ns, nv; na = 0x8000F731; 8078: 00a00074 movhi r2,32769 807c: 10bdcc44 addi r2,r2,-2255 8080: e0800015 stw r2,0(fp) DBPRINTF("na = 0x%x\n",na); // logical shift left nv = na<<3; 8084: e0800017 ldw r2,0(fp) 8088: 100490fa slli r2,r2,3 808c: e0800215 stw r2,8(fp) DBPRINTF("na<<3 = 0x%x\n",nv); // logical shift right nv = na>>3; 8090: e0800017 ldw r2,0(fp) 8094: 1004d0fa srli r2,r2,3 8098: e0800215 stw r2,8(fp) DBPRINTF("na>>3 = 0x%x\n",nv); // arithmetic shift right nv = ((signed)na)>>3; 809c: e0800017 ldw r2,0(fp) 80a0: 1005d0fa srai r2,r2,3 80a4: e0800215 stw r2,8(fp) DBPRINTF("((signed)na)>>3 = 0x%x\n",nv); // rotate right nv = (na>>4)|(na<<28); 80a8: e0800017 ldw r2,0(fp) 80ac: 1004173a roli r2,r2,28 80b0: e0800215 stw r2,8(fp) DBPRINTF("rot right 4 = 0x%x\n",nv); // rotate left nv = (na<<4)|(na>>28); 80b4: e0800017 ldw r2,0(fp) 80b8: 1004113a roli r2,r2,4 80bc: e0800215 stw r2,8(fp) DBPRINTF("rot left 4 = 0x%x\n",nv); // use variable as shift amount ns = 5; 80c0: 00800144 movi r2,5 80c4: e0800115 stw r2,4(fp) DBPRINTF("Use variable as shift amount\n ns = %d\n",ns); nv = na>>ns; 80c8: e0c00017 ldw r3,0(fp) 80cc: e0800117 ldw r2,4(fp) 80d0: 1884d83a srl r2,r3,r2 80d4: e0800215 stw r2,8(fp) DBPRINTF("na>>ns = 0x%x\n",nv); nv = na<<ns; 80d8: e0c00017 ldw r3,0(fp) 80dc: e0800117 ldw r2,4(fp) 80e0: 1884983a sll r2,r3,r2 80e4: e0800215 stw r2,8(fp) DBPRINTF("na<<ns = 0x%x\n",nv); ns = 8; 80e8: 00800204 movi r2,8 80ec: e0800115 stw r2,4(fp) // rotate right nv = (na>>ns)|(na<<(32-ns)); 80f0: e0c00017 ldw r3,0(fp) 80f4: e0800117 ldw r2,4(fp) 80f8: 1884583a ror r2,r3,r2 80fc: e0800215 stw r2,8(fp) DBPRINTF("rot right 8 = 0x%x\n",nv); // rotate left nv = (na<<ns)|(na>>(32-ns)); 8100: e0c00017 ldw r3,0(fp) 8104: e0800117 ldw r2,4(fp) 8108: 1884183a rol r2,r3,r2 810c: e0800215 stw r2,8(fp) DBPRINTF("rot left 8 = 0x%x\n",nv); /* Event loop never exits. */ while (1); 8110: 003fff06 br 8110 <main+0xa4>
Maintained by John Loomis, updated Sun Sep 21 18:41:24 2008