位反转 指令是DSP扩展指令。 在ARM9E、CORTEX-M3等有DSP扩展的ARM系列CPU上有, RBIT指令实现单周期的字内位反转。ARM7没有位反转指令。
最近把 STM32的RADIX-4 FFT 汇编文件 cr4_fft_64_stm32.s 移植到ARM7下。当中一项工作是要完成DSP 位反转的指令 RBIT cntrbitrev,index
刚开始用C写了个函数给汇编调用,后来直接用汇编写了个宏。
//RBIT cntrbitrev,index
void RBIT( register unsigned int cntrbitrev,register unsigned int x)
{
register unsigned int y = 0x55555555;
x = (((x >> 1) & y) | ((x & y) << 1));
y = 0x33333333;
x = (((x >> 2) & y) | ((x & y) << 2));
y = 0x0f0f0f0f;
x = (((x >> 4) & y) | ((x & y) << 4));
y = 0x00ff00ff;
x = (((x >> 8) & y) | ((x & y) << 8));
cntrbitrev=((x >> 16) | (x << 16));
}
MACRO
MYRBIT $temp2
ADRL $temp2, TableRBIT_V1 ;
LDR r2,[$temp2] ;//0x6ac 0x55555555
AND r3,r2,r1,LSR #1
AND r12,r1,r2
ORR r1,r3,r12,LSL #1
LDR r2,[$temp2,#4] ;//0x6b0 0X33333333
AND r3,r2,r1,LSR #2
AND r12,r1,r2
ORR r1,r3,r12,LSL #2
LDR r2,[$temp2,#8] ;//0x6b4 0f0f0f0f
AND r3,r2,r1,LSR #4
AND r12,r1,r2
ORR r1,r3,r12,LSL #4
LDR r2,[$temp2,#12] ;//0x6b8 00ff00ff
AND r3,r2,r1,LSR #8
AND r12,r1,r2
ORR r1,r3,r12,LSL #8
MOV r3,r1,LSR #16
ORR r0,r3,r1,LSL #16
MEND
TableRBIT_V1
DCD 0x55555555,0x33333333,0x0f0f0f0f,0x00ff00ff
MYRBIT使用方法:
进栈
MOVS R0,cntrbitrev
MOVS R1,index
MYRBIT tmp2
MOV tmp2,R0
出栈
用户504624 2009-7-13 09:09