ARM上的LSB到MSB位反转

gre*_*til 4 arm bit-manipulation neon

我需要用LSB中的每个字节而不是MSB来反转YUV图像.我已经在C中读取了用于位反转的最佳算法(从MSB-> LSB到LSB-> MSB)但是我想做一些经过ARM优化的东西.

int8 *image;
for(i = 0; i < size; i++) {
    image[i] = reversebit8(image[i]); //Use the lookup mechanism
}
Run Code Online (Sandbox Code Playgroud)

当我控制图像格式(双字节YUYV或任何排列)时,我可以反转16位:

int16 *image;
for(i = 0; i < size / 2; i++) {
    image[i] = reversebit16(image[i]);
}
Run Code Online (Sandbox Code Playgroud)

图像从YUYV LSB到UYVY MSB.甚至是32位:

int32 *image;
for(i = 0; i < size / 4; i++) {
    image[i] = reversebit32(image[i]);
}
Run Code Online (Sandbox Code Playgroud)

图像从YUYV LSB变为VYUY MSB.

问题:如何以优化的方式为ARM执行此操作?霓虹灯也很好.

我认为这些说明http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0100a/armasm_cihjgdid.htm可能很有用.

Var*_*der 5

ARM RBIT指令可以满足您的需求.写一个循环,在每个对齐的4字节值上调用它.

A8.6.134 RBIT
Reverse Bits reverses the bit order in a 32-bit register. Encoding T1 ARMv6T2, ARMv7

RBIT<c> <Rd>,<Rm>

if ConditionPassed() then
   EncodingSpecificOperations(); bits(32) result;
   for i = 0 to 31 do
      result<31-i> = R[m]<i>;
   R[d] = result;
Run Code Online (Sandbox Code Playgroud)


gre*_*til 4

正如我在问题中提到的,这些 ARM 指令(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0100a/armasm_cihjgdid.htm)可以解决这个问题:

int32 *image;
for (i = 0; i < size / 4; h++) {
    asm("rbit %1,%0" : "=r" (image[i]) : "r" (image[i]));
    asm("rev %1,%0" : "=r" (image[i]) : "r" (image[i]));
}
Run Code Online (Sandbox Code Playgroud)

rbit 逐位反转 32 位。rev 逐字节反转 32 位。总之,每个字节都是独立反转的。我仍然想知道是否有更好的语法或更好的方法来做到这一点。

  • 您不需要循环获取 8 位和 16 位值。我认为“rbit”后跟“rev”或 16 位旋转将反转 *打包* 8 位和 16 位值。对于 32 位,只需要“rbit”。 (3认同)