This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Is there a more efficient way to swap two bytes?

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

Parents Reply Children
  • 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