ZHCUCH3A November 2024 – March 2025 F29H850TU , F29H859TU-Q1
C29x CPU 不像 C28x CPU 那样支持本机位反向寻址模式。但是,C29x CPU 架构中存在的功能并行性可确保缺少原生位反向寻址模式不会对性能产生影响。
位反向寻址由一条以位反向方式修改寻址寄存器的指令执行,通常用于对快速傅里叶变换 (FFT) 类型算法的数据进行重新排序。
| 地址 | 值 | 位反向寻址 | 位反向值 |
|---|---|---|---|
| 0000 | 0 | 0000 | 0 |
| 0001 | 1 | 1000 | 8 |
| 0010 | 2 | 0100 | 4 |
| 0011 | 3 | 1100 | 12 |
| 0100 | 4 | 0010 | 2 |
| 0101 | 5 | 1010 | 10 |
| 0110 | 6 | 0110 | 6 |
| 0111 | 7 | 1110 | 14 |
| 1000 | 8 | 0001 | 1 |
| 1001 | 9 | 1001 | 9 |
| 1010 | 10 | 0101 | 5 |
| ... | ... | ... | ... |
位反向寻址支持的指令为:
ADD.BITREV Az,Ay,Ax
执行 ADD 运算,但从左到右添加这些位(与从右到左的标准 ADD 不同)。示例如下:
; Ax = 0011 1001
; Ay = 0000 1000
; Az = 0011 0101 (after a bit reversed add):
ADD Az,Ay,Ax ; Normal Add: Az = 0100 0001
ADD.BITREV Az,Ay,Ax ; Bit Reversed Add: Az = 0011 0101
以下示例说明了如何使用此运算以位反向顺序对数据数组进行反向:
BitReversedIndex = 0;
BitReversedIncrement = N/2;
for(i=0; i < N; i++)
{
BitReversedDataArray[BitReversedIndex] = NormalDataArray[i];
BitReversedIndex = BitReversedAdd(BitReversedIndex+BitReversedIncrement);
}
通常,在对数据进行位反向时,数据数组是大小为 2 的倍数(N = 16、32、64、128 等)。
然后,需要将 BitReversedIncrement 设置为数组大小的一半 (N/2),以位反向顺序递增 1。
前面运算的汇编代码为:
MV A0,#0 ; A0 = BitReversedIndex = 0
MV A8,#N/2 ; A8 = Increment Step = N/2
MV A4,#NormalDataArray ; A4 = Stating Address Of
; NormalDataArray
MV A5,#BitReversedDataArray ; A5 = Stating Address Of
; BitReversedDataArray
; Repeat N times:
LD.32 D0,*A4++ ; Read From NormalDataArray
ST.32 *(A5+A0),D0 ; Write To BitReversedDataArray
||ADD.BITREV A0,A0,A8 ; Increment BitReversedIndex
LD.32 D0,*A4++ ; Read From NormalDataArray
ST.32 *(A5+A0),D0 ; Write To BitReversedDataArray
||ADD.BITREV A0,A0,A8 ; Increment BitReversedIndex
....
LD.32 D0,*A4++ ; Read From NormalDataArray
ST.32 *(A5+A0),D0 ; Write To BitReversedDataArray
||ADD.BITREV A0,A0,A8 ; Increment BitReversedIndex