ARM INSTRUCTION SET S3C2410A
3-62
Multiplication by 6
ADD Ra,Ra,Ra,LSL #1 ; Multiply by 3
MOV Ra,Ra,LSL#1 ; and then by 2
Multiply by 10 and add in extra number
ADD Ra,Ra,Ra,LSL#2 ; Multiply by 5
ADD Ra,Rc,Ra,LSL#1 ; Multiply by 2 and add in next digit
General recursive method for Rb := Ra*C, C a constant:
1. If C even, say C = 2^n*D, D odd:
D=1: MOV Rb,Ra,LSL #n
D<>1: {Rb := Ra*D}
MOV Rb,Rb,LSL #n
2. If C MOD 4 = 1, say C = 2^n*D+1, D odd, n>1:
D=1: ADD Rb,Ra,Ra,LSL #n
D<>1: {Rb := Ra*D}
ADD Rb,Ra,Rb,LSL #n
3. If C MOD 4 = 3, say C = 2^n*D-1, D odd, n>1:
D=1: RSB Rb,Ra,Ra,LSL #n
D<>1: {Rb := Ra*D}
RSB Rb,Ra,Rb,LSL #n
This is not quite optimal, but close. An example of its non-optimality is multiply by 45 which is done by:
RSB Rb,Ra,Ra,LSL#2 ; Multiply by 3
RSB Rb,Ra,Rb,LSL#2 ; Multiply by 4*3-1 = 11
ADD Rb,Ra,Rb,LSL# 2 ; Multiply by 4*11+1 = 45
rather than by:
ADD Rb,Ra,Ra,LSL#3 ; Multiply by 9
ADD Rb,Rb,Rb,LSL#2 ; Multiply by 5*9 = 45