============================================================================== === Deeds-DcS doc. BARREL SHIFTER (Giuliano Donzellini) === ============================================================================== BARREL SHIFTER Shift Type: 65 (arm bit pos.) 00 = Logical LEFT LSL LOGIC, il carry è = al bit "oltre" l'ultimo posizionato 01 = Logical RIGHT LSR 10 = Arithmetic RIGHT 11 = Rotate Right Shift Amount 5 bit (per il 32 bit) Ci, Co -------------------------------------------------------------------------------- LSL #n n= 0..31 (LOGIC SHIFT LEFT) -------------------------------------------------------------------------------- ................................................................................ LSL #0 [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] result unchanged Co <----- from CPSR C ................................................................................ LSL #1 [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | Co <---' | | v--' v--' | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] 0 <--- 1 zero from right ................................................................................ LSL #5 [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | Co <---------------' | | v----<----<----' v----<----<----' | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] 0 0 0 0 0 <--- 5 zeros from right ................................................................................ LSL #31 [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | Co <----------------------------------------------- | v----<----<----<----<----<----<----<----<------' | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <--- 31 zeros from right ................................................................................ -------------------------------------------------------------------------------- LSR #n n= 1..32 (LOGIC SHIFT RIGHT) Note: LSR #0 is used to encode LSR #32 LSR #0 in the source code is converted in LSL #0 -------------------------------------------------------------------------------- ................................................................................ LSR #1 [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | | | '-----> Co '--v '--v | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] ---> 0 (1 zero from left) ................................................................................ LSR #5 [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | | | '-----------------> Co '---->---->----v '---->---->----v | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] ---> 0 0 0 0 0 (5 zeros from left) ................................................................................ LSR #31 [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | '------------------------------------------------> Co '---->---->---->---->--->---->---->---->--->--v | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] ---> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (31 zeros from left) ................................................................................ LSR #32 (really encoded as #0) [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | '---------------------------------------------------> Co [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] ---> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (32 zeros) -------------------------------------------------------------------------------- ASR #n n= 1..32 (ARITHMETIC SHIFT RIGHT) Note: ASR #0 is used to encode ASR #32 ASR #0 in the source code is converted in LSL #0 -------------------------------------------------------------------------------- ................................................................................ ASR #1 [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | | | | | '-----> Co | '--v '--v '--v | | | | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] (sign extended) ................................................................................ ASR #5 [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | | | | | '-----------------> Co | '---->---->----v '---->---->----v '---->---->----v | | | | | | | | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] (sign extended) ................................................................................ ASR #30 [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | | | '---------------------------------------------> Co | '---->---->---->--->--->---->---->---->----v '---->---->---->---->---->---->--->---->---v | | | | | | | | | | | | | | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] (sign extended) ................................................................................ ASR #31 [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | '------------------------------------------------> Co | '---->---->---->---->---->---->---->--->--->--v | | | | | | | | | | | | | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] (sign extended to all the bits) ................................................................................ ASR #32 (really encoded as #0) [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | '---------------------------------------------------> Co '---->---->---->---->---->---->---->--->--->--v | | | | | | | | | | | | | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] (sign extended to all the bits) -------------------------------------------------------------------------------- ROR #n n= 1..31 (ROTATE SHIFT RIGHT) Note: ROR #0 is used to encode RRX -------------------------------------------------------------------------------- ................................................................................ ROR #1 '--<----<----<----<----<----<----<----<----<----<----<----<-' | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | | | | v '--v | '------+---> Co | | | '--->--v | '--v | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] ................................................................................ ROR #5 '--<----<----<----<----<----<----<----<----<----<----<----<-' | | | '--<----<----<----<----<----<----<----<----<----<--<--' | | | | ^ | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] ^ | | | | | | | | | | | | | | '->-' | v | '-->--->--->---' | | ^ | '--->--->--->---' | | | | | | | | '------------------+---> Co '--->--v | | v--->--->--->--v | | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] ................................................................................ ROR #30 '--<----<----<----<----<----<----<----<----<----<----<----<-' | | | '--<----<----<----<----<----<----<----<----<----<--<--' | | | | ^ | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] ^ | | | | | | | | | | | | | | '->-' | | | | | | | v | | | '----------------------------------------------+---> Co | | | '--->--->--->--->--->--->--->--->--->--->--' | | '->--->--->--->--->--->--->--->--->--->-->-' | | '--->--->--->--->--->--->--->--->--->--->---' | | | | | | '--->--v | | | | | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] ................................................................................ ROR #31 '--<----<----<----<----<----<----<----<----<----<----<----<-' | | | '--<----<----<----<----<----<----<----<----<----<--<--' | | | | ^ | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] ^ | | | | | | | | | | | | '->-' | | | | | | v | | '-------------------------------------------------+---> Co | | | | | '->--->--->--->--->--->--->--->--->--->--->---' | '--->--->--->--->--->--->--->--->--->--->--->--' | | | | '--->--v | | | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] -------------------------------------------------------------------------------- RRX (ROTATE RIGHT EXTENDED) Note: ROR #0 is used to encode RRX -------------------------------------------------------------------------------- ................................................................................ RRX [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] | | | '--v | '------> Co | | Ci-----v | '--v | | | [31 30 29 28 27 26 25 24 .... 6 5 4 3 2 1 0] --------------------------------------------------------------------------------