2013-12-07 1 views
4

Мне нужно отменить изображение YUV с каждым байтом в LSB вместо MSB. Я прочитал Best Algorithm for Bit Reversal (from MSB->LSB to LSB->MSB) in C, но я хотел бы сделать то, что оптимизировано по ARM.Реверсирование бит LSB на MSB на 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 могут быть вам полезны.

ответ

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 бита, байт по байту. В порядке, каждый байт обращается независимо. Мне все еще интересно, есть ли лучший синтаксис или лучший способ сделать это.

+2

Вам не нужно использовать петлю для 8-битных и 16-битных значений. Я думаю, что 'rbit', за которым следует либо' rev', либо 16-битное вращение, будет отменено * упакованное * 8-битное и 16-битное значения. Для 32 битов требуется только «rbit». –

4

Инструкция 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;