ARMv7-M 汇编:寄存器中未对齐的字节替换?

ARMv7-M assembly: unaligned byte replacement in registers?

假设我们有三个目标寄存器,r5、r6 和 r7,并将它们视为一个 12 字节的数组:

r5={a, b, c, d} r6={e, f, g, h} r7={i, j, k, l}

我想做的是从给定的内存位置读取八个字节{0, 1, 2, 3, 4, 5, 6, 7},并将它们复制到三个目标寄存器中以提供

r5={a, 0, 1, 2} r6={3, 4, 5, 6} r7={7, j, k, l}

换句话说,我想用从 ROM 读取的八个字节替换 r5-r7 中数组的字节 1-8。

我可以用六个指令完成:

ldrd    r0, r1, [r3]
bfi     r5, r0, #8, #24
ubfx    r6, r0, #24, #8
bfi     r6, r1, #8, #24
bfc     r7, #0, #8
orr     r7, r7, r1, lsr #24

可以用更少的时间完成吗?假设没有浮点单元。

(背景:这是 blitting 例程的一部分,从内存中读取几个像素模式并合成到一组寄存器中,然后用 stmia 写入显示缓冲区。)

我对 post 以下内容犹豫不决,因为它没有解决所提出的问题 - 它在内存中而不是在寄存器中组装输出。

但物有所值:

r5,r6,r7 - abcdefghijkl      (as per the question)
r3       - input array ptr   (as per the question)
r2       - output array ptr

                        r5   r6   r7    [r3]         r0    r1        [r2]
                        abcd efgh ijkl  01234567
ldrd    r0, r1, [r3]                                 0123  4567      ------------
str     r5, [r2, #0]                                                 abcd-------- 
str     r7, [r2, #8]                                                 abcd----ijkl 
str.w   r0, [r2, #1]                                                 a0123---ijkl 
str.w   r1, [r2, #5]                                                 a01234567jkl

注意:

  • 三个输出字组合成四次写入内存,其中两次未对齐。
  • 两个str指令是16位编码。