R – Clear upper 16-bits in 1 ARM instruction


In ARM assembly immediates are encoded by an 8-bit rotated value which means we can only encode


Now my problem is that I want to clear the upper 16-bits of r0 and replace it with the half-word stored r1. But because of the limited range of the immediates I have to do: –

bic r0, r0, #0xff000000
bic r0, r0, #0x00ff0000
add r0, r0, r1, LSL #16

Is it possible to do replace the 2 bic instructions with a single instruction? 0xffff0000 is unencodable. Perhaps I should be using another logical operation to clear the upper 16-bits?


EDIT: Sorry I forgot to say that the top 16-bits of r1 is empty, and I'm using an ARM7TDMI

Best Solution

How about:

orr r0,r1,r0,lsl #16
mov r0,r0,ror #16

(This assumes that the top halfword of r1 is empty, like your reference code did.) Depending on the circumstances, you might be able to omit the final mov here by merging it with some later code.