difference between ldr and ldr.w

user277465 picture user277465 · Mar 21, 2012 · Viewed 11.8k times · Source

I recently had to debug a MachO binary and I came across the following instruction :-

ldr.w r4, [r1, r0, lsl #2]

I understand that ldr r4, [r1, r0, lsl #2] shifts r0 to the left two times, adds it to r1 and dereferences the result.

How is ldr.w different?

Answer

Paul R picture Paul R · Mar 21, 2012

.W is an optional instruction width specifier. It doesn't affect the behaviour of the instruction as such, it just ensures that a 32 bit instruction is generated. See infocenter.arm.com for details:

LDR (pc-relative) in Thumb-2 You can use the .W width specifier to force LDR to generate a 32-bit instruction in Thumb-2 code. LDR.W always generates a 32-bit instruction, even if the target could be reached using a 16-bit LDR. For forward references, LDR without .W always generates a 16-bit instruction in Thumb code, even if that results in failure for a target that could be reached using a 32-bit Thumb-2 LDR instruction.