📄 cplxfft32b.s
字号:
MOV [w12--],[w10--]
MOV [w13++],w2 ; (w2,w3)=(Pi3-Pi4)/4
MOV [w13--],w3
;---------------------------------
;---------------------------------
;---------- (Pi1,Pi3)
LAC [++w8],B ; B=(Pi1+Pi2)/4
MOV [--w8],[w13]
LAC [++w10],A ; A=(Pi3+Pi4)/4
MOV [--w10],[w12]
ADD A ; A=(Pi1+Pi2+Pi3+Pi4)/4
SFTAC B,#-1
SUB B ; B=(Pi1+Pi2-Pi3-Pi4)/4
MOV [w12++],[W8++] ; Pi1=(Pi1+Pi2+Pi3+Pi4)/4
MOV [w12--],[w8--]
MOV [w13++],[W10++] ; Pi3=(Pi1+Pi2-Pi3-Pi4)/4
MOV [w13--],[w10--]
;---------- (Pr1,Pr3)
LAC [--w8],B ; B=(Pr1+Pr2)/4
MOV [--w8],[w13]
LAC [--w10],A ; A=(Pr3+Pr4)/4
MOV [--w10],[w12]
ADD A ; A=(Pr1+Pr2+Pr3+Pr4)/4
SFTAC B,#-1
SUB B ; B=(Pr1+Pr2-Pr3-Pr4)/4
MOV [w12++],[W8++] ; Pr1=(Pr1+Pr2+Pr3+Pr4)/4
MOV [w12--],[w8--]
MOV [w13++],[W10++] ; Pr3=(Pr1+Pr2-Pr3-Pr4)/4
MOV [w13--],[w10--]
;---------- (Pi2,Pi4)
LAC [++w9],B ; B=(Pi1-Pi2)/4
MOV [--w9],[w13]
LAC w1,A ; A=(Pr3-Pr4)/4
MOV w0,[w12]
ADD A ; A=(Pi1-Pi2+Pr3-Pr4)/4
SFTAC B,#-1
SUB B ; B=(Pi1-Pi2-Pr3+Pr4)/4
MOV [w13++],[W9++] ; Pi2=(Pi1-Pi2-Pr3+Pr4)/4
MOV [w13--],[w9--]
MOV [w12++],[W11++] ; Pi4=(Pi1-Pi2+Pr3-Pr4)/4
MOV [w12--],[w11--]
;----------(Pr2,Pr4)
LAC [--w9],B ; B=(Pr1-Pr2)/4
MOV [--w9],[w13]
LAC w3,A ; A=(Pi3-Pi4)/4
MOV w2,[w12]
ADD A ; A=(Pr1-Pr2+Pi3-Pi4)/4
SFTAC B,#-1
SUB B ; B=(Pr1-Pr2-Pi3+Pi4)/4
MOV [w12++],[W9++] ; Pr2=Pr1-Pr2+Pi3-Pi4)/4
MOV [w12--],[w9--]
MOV [++w13],[--W11] ; Pr4=(Pr1-Pr2-Pi3+Pi4)/4
MOV [--w13],[--w11]
.endm
; Local Stack Frame
;............................................................................
; |_______|
; |_______|<- Stack Pointer SP
; |_______|<- Buffer Pointer FP+18
; |_______|<- Wr Pointer FP+16
; |_______|<- Wi Pointer FP+14
; |_______|<- Stage Counter FP+12
; |_______|<- Block Counter FP+10
; |_______|<- Butterfly Counter FP+8
; |_______|<- Block INDEX FP+6
; |_______|<- Butterfly INDEX FP+4
; |_______|<- Temp FP
;............................................................................
.equ BUF_PTR, 18
.equ WR_PTR, 16
.equ WI_PTR, 14
.equ STG_CNTR, 12
.equ BLK_CNTR, 10
.equ BFL_CNTR, 8
.equ BLK_INDX, 6
.equ BFL_INDX, 4
.equ TEMP, 0
;............................................................................
; Complex FFT Calculation
;............................................................................
_FFTComplex32bIP:
;............................................................................
; Context Save
PUSH.D w8 ; {w8,w9} to TOS
PUSH.D w10 ; {w10,w11} to TOS
PUSH.D w12 ; {w12,w13} to TOS
PUSH CORCON
PUSH PSVPAG
LNK #20
;............................................................................
;; PSVPAG = __builtin_psvpage(&twiddleFactor);
;; CORCONbits.PSV = 1;
MOV w3,PSVPAG
BSET CORCON,#2
; Store Input Parameters
MOV w1,[w14+BUF_PTR]
MOV w2,[w14+WI_PTR] ; Wi = SIN(*)
MOV #TF_FFT_SIZE,W8
ADD w2,w8,w2
MOV w2,[W14+WR_PTR] ; Wr = COS(*)
MOV w0,[w14+STG_CNTR]
MOV #ACCAL,w12
MOV #ACCBL,w13
; Stage 1 to 2 unrolled for cycle efficiency
;............................................................................
MOV w1,w8
ADD w1,#8,w9
ADD w1,#16,w10
ADD w1,#24,w11
MOV #1,w2
SL w2,w0,w2 ; N = 1<<logN2
LSR w2,#2,w2
DEC w2,w2
MOV #32,w0 ; w0=32
MOV w0,[w14+BFL_INDX]
; Loop over butterflies in a block
;............................................................................
DO w2,STG12_END
STG12_START:
STG12_MACRO
MOV [w14+BFL_INDX],w0
ADD w8,w0,w8 ; Next Data Set
ADD w9,w0,w9 ; Next Data Set
ADD w10,w0,w10 ; Next Data Set
STG12_END: ADD w11,w0,w11 ; Next Data Set
;............................................................................
; Stage 3 to LOG2N
;............................................................................
; Butterfly counter for each block, Block counter for each stage and Stage Counter
; Block Index between P & Q inputs of Butterfly for Stage 3
; Twiddle Index for stage 3
MOV #4,w0
MOV w0,[w14+BFL_CNTR] ; BFL_CNTR=4
MOV [w14+STG_CNTR],w1
MOV #1,w2
SL w2,w1,w2 ; N = 1<<logN2
LSR w2,#3,w2 ; N/8
MOV w2,[w14+BLK_CNTR] ; BLK_CNTR=N/8
MOV #(TF_FFT_SIZE/2),w2
MOV w2,[w14+BFL_INDX]
MOV #32,w0
MOV w0,[w14+BLK_INDX]
SUB w1,#2,w1 ; STG_CNTR=STG_CNTR-1
MOV w1,[w14+STG_CNTR]
; Stage 1 to LOG2N
;............................................................................
; MOV #1,w0
; MOV w0,[w14+BFL_CNTR] ; BFL_CNTR=1
; MOV [w14+STG_CNTR],w1
; MOV #1,w2
; SL w2,w1,w2 ; N = 1<<logN2
; LSR w2,#1,w2 ; N/2
; MOV w2,[w14+BLK_CNTR] ; BLK_CNTR=N/2
;
; MOV #(TF_FFT_SIZE*2),w2
; MOV w2,[w14+BFL_INDX]
;
; MOV #8,w0
; MOV w0,[w14+BLK_INDX]
; Loop over stages
;............................................................................
STG_START:
MOV [w14+BUF_PTR],w8 ; Next Butterfly Block (Pr)
MOV [w14+BLK_INDX],w9
ADD w8,w9,w9 ; Next Butterfly Block (Qr)
MOV [w14+BLK_CNTR],w0 ; Block loop count
DEC w0,w0
; Loop over blocks in a stage
;............................................................................
DO w0,BLK_END
BLK_START:
MOV [w14+WR_PTR],w10 ; Initialise Twiddle Factor (Wr) pointer
MOV [w14+WI_PTR],w11 ; Initialisae Twiddle Factor (Wi) pointer
MOV [w14+BFL_CNTR],w0 ; Butterfly loop count
DEC w0,w0
; Loop over butterflies in a block
;............................................................................
DO w0,BFL_END
BFL_START:
BFLY_MACRO
MOV [w14+BFL_INDX],w0
ADD w10,w0,w10 ; Next Twiddle Factor (Wr)
BFL_END: ADD w11,w0,w11 ; Next Twiddle Factor (Wi)
;............................................................................
MOV [w14+BLK_INDX],w0
ADD w8,w0,w8 ; Next Butterfly Block (Pr)
BLK_END: ADD w9,w0,w9 ; Next Butterfly Block(Qr)
;............................................................................
ADD W14,#BFL_INDX,W0
LAC [w0],#1,A ; BFL_INDX = BFL_INDX/2
SAC A,[w0++]
LAC [w0],#-1,A ; BLK_INDX = BLK_INDX * 2
SAC A,[w0++]
LAC [w0],#-1,A ; BFL_CNTR = BFL_CNTR * 2
SAC A,[w0++]
LAC [w0],#1,A ; BLK_CNTR = BLK_CNTR/2
SAC A,[w0++]
DEC [w0],[w0] ; STG_CNTR = STG_CNTR - 1
BRA NZ,STG_START
;............................................................................
; Context Restore
ULNK
POP PSVPAG
POP CORCON
POP.D w12 ; {w12,w13} from TOS
POP.D w10 ; {w10,w11} from TOS
POP.D w8 ; {w8,w9} from TOS
;............................................................................
RETURN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -