我需要用LSB中的每个字节而不是MSB来反转YUV图像。我已阅读Best Algorithm for Bit Reversal ( from MSB->LSB to LSB->MSB) in C但我想做一些经过ARM优化的事情。
int8 *image;
for(i = 0; i < size; i++) {
image[i] = reversebit8(image[i]); //Use the lookup mechanism
}
当我控制图像格式(双字节YUYV或任何排列)时,我可以反转16位:
int16 *image;
for(i = 0; i < size / 2; i++) {
image[i] = reversebit16(image[i]);
}
图像从YUYV LSB变为UYVY MSB。甚至是32位:
int32 *image;
for(i = 0; i < size / 4; i++) {
image[i] = reversebit32(image[i]);
}
图像从YUYV LSB变为VYUY MSB。
问题:如何以优化的方式为ARM做到这一点?霓虹灯也很好。
我认为那些说明http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0100a/armasm_cihjgdid.htm可能有用。
答案 0 :(得分: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;
答案 1 :(得分:3)
正如我在我的问题中提到的那样,那些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]));
}
rbit逐位反转32位。 rev逐字节地反转32位。很好,每个字节都是独立反转的。我仍然想知道是否有更好的语法或更好的方法来做到这一点。