ARM Tips & Tricks

Multiplication by constants
Multiplier MUL Rd, Rd, #imm MUL Rd, Rn, #imm MLA Rd, Rd, #imm, Rm MLA Rd, Rn, #imm, Rm
2 MOV Rd, Rd LSL #1 ADD Rd, Rm, Rd LSL #1
3 ADD Rd, Rd, Rd LSL #1 ADD Rd, Rd, Rd LSL #1
ADD Rd, Rd, Rm
4 MOV Rd, Rd LSL #2 ADD Rd, Rm, Rd LSL #2
5 ADD Rd, Rd, Rd LSL #2 ADD Rd, Rd, Rd LSL #2
ADD Rd, Rd, Rm
6 ADD Rd, Rd, Rd LSL #1
MOV Rd, Rd LSL #1
ADD Rd, Rd, Rd LSL #1
ADD Rd, Rm, Rd LSL #1
7 RSB Rd, Rd, Rd LSL #3 RSB Rd, Rd, Rd LSL #3
ADD Rd, Rd, Rm
8 MOV Rd, Rd LSL #3 ADD Rd, Rm, Rd LSL #3
9 ADD Rd, Rd, Rd LSL #3 ADD Rd, Rd, Rd LSL #3
ADD Rd, Rd, Rm
10 ADD Rd, Rd, Rd LSL #2
MOV Rd, Rd LSL #1
ADD Rd, Rd, Rd LSL #2
ADD Rd, Rm, Rd LSL #1
11 ADD Rd, Rd, Rd LSL #2
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #5
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
RSB Rd, Rd, #0
ADD Rd, Rn, Rn LSL #2
ADD Rd, Rn, Rd LSL #1
ADD Rd, Rd, Rd LSL #2
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #5
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
RSB Rd, Rd, Rm
ADD Rd, Rn, Rn LSL #2
ADD Rd, Rn, Rd LSL #1
ADD Rd, Rd, Rm
12 ADD Rd, Rd, Rd LSL #1
MOV Rd, Rd LSL #2
ADD Rd, Rd, Rd LSL #1
ADD Rd, Rm, Rd LSL #2
13 ADD Rd, Rd, Rd LSL #1
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #6
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
ADD Rd, Rn, Rn LSL #1
ADD Rd, Rn, Rd LSL #2
ADD Rd, Rd, Rd LSL #1
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #6
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
ADD Rd, Rd, Rm
ADD Rd, Rn, Rn LSL #1
ADD Rd, Rn, Rd LSL #2
ADD Rd, Rd, Rm
14 RSB Rd, Rd, Rd LSL #3
MOV Rd, Rd LSL #1
RSB Rd, Rd, Rd LSL #3
ADD Rd, Rm, Rd LSL #1
15 RSB Rd, Rd, Rd LSL #4 RSB Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rm
16 MOV Rd, Rd LSL #4 ADD Rd, Rm, Rd LSL #4
17 ADD Rd, Rd, Rd LSL #4 ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rm
18 ADD Rd, Rd, Rd LSL #3
MOV Rd, Rd LSL #1
ADD Rd, Rd, Rd LSL #3
ADD Rd, Rm, Rd LSL #1
19 ADD Rd, Rd, Rd LSL #2
RSB Rd, Rd, Rd LSL #3
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #6
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #9
ADD Rd, Rd, Rd LSL #12
ADD Rd, Rd, Rd LSL #16
ADD Rd, Rd, Rd LSL #24
ADD Rd, Rn, Rn LSL #3
ADD Rd, Rn, Rd LSL #1
ADD Rd, Rd, Rd LSL #2
RSB Rd, Rd, Rd LSL #3
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #6
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #9
ADD Rd, Rd, Rd LSL #12
ADD Rd, Rd, Rd LSL #16
ADD Rd, Rd, Rd LSL #24
ADD Rd, Rd, Rm
ADD Rd, Rn, Rn LSL #3
ADD Rd, Rn, Rd LSL #1
ADD Rd, Rd, Rm
20 ADD Rd, Rd, Rd LSL #2
MOV Rd, Rd LSL #2
ADD Rd, Rd, Rd LSL #2
ADD Rd, Rm, Rd LSL #2
100 ADD Rd, Rd, Rd LSL #2
ADD Rd, Rd, Rd LSL #2
MOV Rd, Rd LSL #2
ADD Rd, Rd, Rd LSL #2
ADD Rd, Rd, Rd LSL #2
ADD Rd, Rm, Rd LSL #2
Division by constants
Divisor Unsigned, floor Unsigned, ceil Unsigned, nearest Signed, floor Signed, ceil Signed, trunc Signed, nearest
2 MOV Rd, Rd LSR #1 SUB Rd, Rd, Rd LSR #1
ADDS Rd, Rd, #1
MOV Rd, Rd RRX

MOVS Rd, Rd LSR #1
ADC Rd, Rd, #0
; tiebreak: even
; Ru = 1<<30, Rv = 0
CMN Ru, Rd LSL #30
ADC Rd, Rv, Rd LSR #1

; tiebreak: odd
; Ru = 1<<31
CMP Ru, Rd LSL #30
SBC Rd, Rd, Rd LSR #1
MOV Rd, Rd ASR #1 SUB Rd, Rd, Rd ASR #1
MOVS Rd, Rd ASR #1
ADC Rd, Rd, #0
MOVS Rd, Rd ASR #1
ADCMI Rd, Rd, #0

; Ru = 1<<30, Rv = 0
CMN Ru, Rd ROR #1
ADC Rd, Rv, Rd ASR #1

; Ru = 1<<30, Rv = -1
CMN Ru, Rd ROR #1
RSC Rd, Rv, Rd ASR #1
3 ; Ru = 0x55555555
ADD Rd, Rd, Rd LSL #2
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
RSB Rd, Rd, #0
CMN Rd, Rd LSR #1
ADDCS Rd, Rd, Ru
ADDMI Rd, Rd, Ru LSL #1
; remainder is encoded in flags as NC

; Ru = 0xAAAAAAAB
MUL Rd, Ru, Rd
CMN Rd, Rd LSR #1
SUBCS Rd, Rd, Ru
SUBMI Rd, Rd, Ru LSL #1
; remainder is encoded in flags as NC
... ... ... ... ... ...
4 MOV Rd, Rd LSR #2 SUB Rd, Rd, Rd LSR #1
SUB Rd, Rd, Rd LSR #1

; Ru = 1<<30
RSBS Rd, Rd, #0
SUBNE Rd, Ru, Rd LSR #2

; Ru = 0
SUBS Rt, Rd, #1
ADCCS Rd, Ru, Rt LSR #2

; Ru = 1
SUBS Rt, Rd, #1
ADDHS Rd, Ru, Rt LSR #2

; Ru = -1
CMN Ru, Rd LSL #30
RSC Rd, Ru, Rd LSR #2

; Ru = -1<<30, Rv = 0
CMN Ru, Rd LSL #30
ADC Rd, Rv, Rd LSR #2

ADDS Rd, Rd, #3
MOV Rd, Rd RRX
MOV Rd, Rd LSR #1

ADDS Rd, Rd, #3
MOV Rd, Rd LSR #2
ORRCS Rd, Rd, #1<<30
; tiebreak: floor
...

; tiebreak: ceil
MOVS Rd, Rd LSR #2
ADC Rd, Rd, #0

; tiebreak: even
...

; tiebreak: odd
...
MOV Rd, Rd ASR #2 ... ... ...
5 ... ... ... ... ... ... ...
Remainder after division by constants
Divisor Unsigned, floor Unsigned, ceil Unsigned, nearest Signed, trunc Signed, nearest
2 AND Rd, Rd, #1 MOV Rd, Rd LSL #31
MOV Rd, Rd ASR #31

AND Rd, Rd, #1
RSB Rd, Rd, #0
; tiebreak: even
...

; tiebreak: odd
...
... ...
3 ; Ru = 3
RSBS Rd, Rd, #0
ADD Rd, Rd, Rd ROR #16
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #2
SUBNE Rd, Ru, Rd LSR #30

; Ru = 3
ADD Rd, Rd, Rd ROR #16
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #2
RSBS Rd, Ru, Rd LSR #30
ADDMI Rd, Rd, #3
... ... ... ...
4 AND Rd, Rd, #3 ANDS Rd, Rd, #3
SUBNE Rd, Rd, #4
; tiebreak: floor
...

; tiebreak: ceil
MOV Rd, Rd LSL #30
MOV Rd, Rd ASR #30

; tiebreak: even
...

; tiebreak: odd
...
... ...
5 ... ... ... ... ...
Division by constants with remainder
Divisor Unsigned, floor Unsigned, ceil Unsigned, nearest Signed, floor Signed, ceil Signed, trunc Signed, nearest
2 ... ... ... ... ... ... ...
3 ... ... ... ... ... ... ...
4 ... ... ... ... ... ... ...
5 ... ... ... ... ... ... ...
2-adic division by constants
Divisor Inverse Minimal in-place code Minimal code using temporaries
3 0xAAAAAAAB ADD Rd, Rd, Rd LSL #2
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
RSB Rd, Rd, #0
-3 0x55555555 ADD Rd, Rd, Rd LSL #2
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
5 0xCCCCCCCD SUB Rd, Rd, Rd LSL #2
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
-5 0x33333333 ADD Rd, Rd, Rd LSL #1
ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
7 0xB6DB6DB7 ADD Rd, Rd, Rd LSL #3
ADD Rd, Rd, Rd LSL #6
ADD Rd, Rd, Rd LSL #12
ADD Rd, Rd, Rd LSL #24
RSB Rd, Rd, #0
-7 0x49249249 ADD Rd, Rd, Rd LSL #3
ADD Rd, Rd, Rd LSL #6
ADD Rd, Rd, Rd LSL #12
ADD Rd, Rd, Rd LSL #24
9 0x38E38E39 SUB Rd, Rd, Rd LSL #3
ADD Rd, Rd, Rd LSL #6
ADD Rd, Rd, Rd LSL #12
ADD Rd, Rd, Rd LSL #24
-9 0xC71C71C7 RSB Rd, Rd, Rd LSL #3
ADD Rd, Rd, Rd LSL #6
ADD Rd, Rd, Rd LSL #12
ADD Rd, Rd, Rd LSL #24
11 0xBA2E8BA3 ADD Rd, Rd, Rd LSL #1
SUB Rd, Rd, Rd LSL #5
ADD Rd, Rd, Rd LSL #10
ADD Rd, Rd, Rd LSL #20
-11 0x45D1745D ADD Rd, Rd, Rd LSL #1
RSB Rd, Rd, Rd LSL #5
ADD Rd, Rd, Rd LSL #10
ADD Rd, Rd, Rd LSL #20
13 0x3B13B13B ADD Rd, Rd, Rd LSL #2
RSB Rd, Rd, Rd LSL #6
ADD Rd, Rd, Rd LSL #12
ADD Rd, Rd, Rd LSL #24
-13 0xC4EC4EC5 ADD Rd, Rd, Rd LSL #2
SUB Rd, Rd, Rd LSL #6
ADD Rd, Rd, Rd LSL #12
ADD Rd, Rd, Rd LSL #24
15 0x11111111 ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
-15 0xEEEEEEEF ADD Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
RSB Rd, Rd, #0
17 0xF0F0F0F1 SUB Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
-17 0x0F0F0F0F RSB Rd, Rd, Rd LSL #4
ADD Rd, Rd, Rd LSL #8
ADD Rd, Rd, Rd LSL #16
19 0x286BCA1B ADD Rd, Rd, Rd LSL #1
ADD Rd, Rd, Rd LSL #3
SUB Rd, Rd, Rd LSL #9
ADD Rd, Rd, Rd LSL #18
-19 0xD79435E5 ADD Rd, Rd, Rd LSL #1
ADD Rd, Rd, Rd LSL #3
RSB Rd, Rd, Rd LSL #9
ADD Rd, Rd, Rd LSL #18