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位编码。
假设我们有三个目标寄存器,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位编码。