I am targeting a Cortex-M0 processor, and am new to Thumb assembly available on the M0. Is there more efficient way to swap two bytes in a 32-bit word (in this example, the middle two bytes)? Thanks!
LDR R0, =0xAABBCCDD LDR R1, =0x00FF0000 LDR R2, =0x0000FF00 MOV R3, R0 MOV R4, R0 ANDS R3, R1 ANDS R4, R2 BICS R0, R1 BICS R0, R2 LSRS R3, #8 LSLS R4, #8 ORRS R0, R3 ORRS R0, R4
LDR R0, =0xAABBCCDD
LDR R1, =0x00FF0000
LDR R2, =0x0000FF00
MOV R3, R0
MOV R4, R0
ANDS R3, R1
ANDS R4, R2
BICS R0, R1
BICS R0, R2
LSRS R3, #8
LSLS R4, #8
ORRS R0, R3
ORRS R0, R4
Sensei, I was able to get it to 6 instructions using REV :-) Thank you!
LDR R0, =0xAABBCCDDLDR R1, =0x00FFFF00REV R2, R0 // R2 0xDDCCBBAAANDS R2, R1 // R2 0x00CCBB00BICS R0, R1 // R0 0xAA0000DDORRS R0, R2 // R0 0xAACCBBDD
Neat. Don't think it can be shorter.
Here is my version, which avoids the literal loading:
.text .thumb .thumb_func ldr r0,=0xaabbccdd bl swap swap: lsls r1,r0,#8 // r1 = bbccdd00 lsrs r1,r1,#16 // r1 = 00bbccdd lsls r1,r1,#8 // r1 = 00bbcc00 eors r0,r1 // r0 = aa0000dd rev16 r1,r1 // r1 = bb0000cc movs r2,#16 rors r1,r2 // r1 = 00ccbb00 orrs r0,r1 // r0 = aaccbbdd bx lr