📄 cifft_32.asm
字号:
;***********************************************************
; Version 2.20.01
;***********************************************************
;============================================================================
; Description: 32-bit Complex Inverse FFT
;
; Target Processor: C54x
;
; Author: Mike Hannah, Texas Instruments, Inc., May 14, 1998
;
;=============================================================================
.global Itempdw1
.global Itempdw2
.global IfftStage1and2
.global IfftStage3
.global IfftStageX
.global IfftButterfly
.mmregs
.bss Itempdw1,1*2,1,1 ;temporary dword
.bss Itempdw2,1*2,1,1 ;temporary dword
.text
;=============================================================================
; Function: IfftStage1and2
;
; Description: Combined stage 1 and 2 of Complex Inverse FFT (double precision)
;
; Inputs: None
;
; Outputs: None
;
; Assumptions: Output will be in place of input.
;
;=============================================================================
IfftStage1and2:
.if __far_mode
ld *sp(8), A
.else
ld *sp(6), A
.endif
bcd NoScale, AEQ
ld #0, ASM
nop
ld #-2, ASM
rptb Stg1and2End ;(N/4)*28+3
dld *ar2, B ;B=R1 R1
dsub *ar3, B ;B=R1-R2 R2
dld *ar2, A ;A=R1 R1
dadd *ar3, A ;A=R1+R2 R2
sth B, ASM, *ar3+ ;R2H=R1-R2/4 R2
stl B, ASM, *ar3- ;R2L=R1-R2/4 R2
dld *ar4, B ;B=R3 R3
dadd *ar5, B ;B=R3+R4
add B, A ;A=(R1+R2)+(R3+R4)
sth A, ASM, *ar2+ ;R1H'=((R1+R2)+(R3+R4))/4 R1
stl A, ASM, *ar2+ ;R1L'=((R1+R2)+(R3+R4))/4 I1
sub B, 1, A ;A=(R1+R2)-(R3+R4)
dld *ar4, B ;B=R3 R3
dsub *ar5, B ;B=R3-R4 R4
sth A, ASM, *ar4+ ;R3H'=((R1+R2)-(R3+R4))/4 I3
stl A, ASM, *ar4+ ;R3L'=((R1+R2)-(R3+R4))/4 I3
dld *ar3, A ;A=(R1-R2)/4 R2
sth B, ASM, *ar5+ ;R4H=(R3-R4)/4 R4
stl B, ASM, *ar5+ ;R4L=(R3-R4)/4 I4
dld *ar4, B ;B=I3 I3
dsub *ar5-, B ;B=I3-I4 R4
sub B, ASM, A ;A=((R1-R2)-(I3-I4))/4
dst A, *ar3+ ;R2'=((R1-R2)-(I3-I4))/4 I2
add B, -1, A ;A=((R1-R2)+(I3-I4))/4
dld *ar5, B ;B=(R3-R4)/4 R4
dst A, *ar5+ ;R4'=((R1-R2)+(I3-I4))/4 I4
dld *ar4, A ;A=I3 I3
dadd *ar5, A ;A=I3+I4 I4
sth A, ASM, *ar4+ ;I3H=(I3+I4)/4 I3
stl A, ASM, *ar4- ;I3L=(I3+I4)/4 I3
dld *ar2, A ;A=I1 I1
dsub *ar3, A ;A=I1-I2 I2
sub B, 2, A ;A=(I1-I2)-(r3-r4)
sth A, ASM,*ar5+ ;I4H'=((I1-I2)-(r3-r4))/4 I4
stl A, ASM,*ar5+0 ;I4H'=((I1-I2)-(r3-r4))/4 next R4
add B, 3, A ;A=(I1-I2)+(r3-r4)
dld *ar2, B ;B=I1 I1
dadd *ar3, B ;B=I1-I2 I2
sth A, ASM, *ar3+ ;I2H'=(I1-I2)+(R3-R4)/4 I2
stl A, ASM, *ar3+0 ;I2H'=(I1-I2)+(R3-R4)/4 next R2
dld *ar4, A ;A=(I3+I4)/4 I3
add A, 2, B ;B=(I1+I2)+(I3+I4)
sth B, ASM, *ar2+ ;I1H'=(I1+I2)+(I3+I4)/4 I1
stl B, ASM, *ar2+0 ;I1H'=(I1+I2)+(I3+I4)/4 next R1
sub A, 3, B ;B=(I1+I2)-(I3+I4)
sth B, ASM, *ar4+ ;I3'=((I1+I2)-(I3+I4))/4 I3
Stg1and2End
stl B, ASM, *ar4+0 ;I3'=((I1+I2)-(I3+I4))/4 next R3
.if __far_mode
fret
.else
ret
.endif
NoScale:
rptb NoScaleEnd ;(N/4)*28+3
dld *ar2, B ;B=R1 R1
dsub *ar3, B ;B=R1-R2 R2
dld *ar2, A ;A=R1 R1
dadd *ar3, A ;A=R1+R2 R2
sth B, ASM, *ar3+ ;R2H=R1-R2 R2
stl B, ASM, *ar3- ;R2L=R1-R2 R2
dld *ar4, B ;B=R3 R3
dadd *ar5, B ;B=R3+R4
add B, A ;A=(R1+R2)+(R3+R4)
sth A, ASM, *ar2+ ;R1H'=((R1+R2)+(R3+R4)) R1
stl A, ASM, *ar2+ ;R1L'=((R1+R2)+(R3+R4)) I1
sub B, 1, A ;A=(R1+R2)-(R3+R4)
dld *ar4, B ;B=R3 R3
dsub *ar5, B ;B=R3-R4 R4
sth A, ASM, *ar4+ ;R3H'=((R1+R2)-(R3+R4)) I3
stl A, ASM, *ar4+ ;R3L'=((R1+R2)-(R3+R4)) I3
dld *ar3, A ;A=(R1-R2) R2
sth B, ASM, *ar5+ ;R4H=(R3-R4) R4
stl B, ASM, *ar5+ ;R4L=(R3-R4) I4
dld *ar4, B ;B=I3 I3
dsub *ar5-, B ;B=I3-I4 R4
sub B, ASM, A ;A=((R1-R2)-(I3-I4))
dst A, *ar3+ ;R2'=((R1-R2)-(I3-I4)) I2
add B, 1, A ;A=((R1-R2)+(I3-I4))
dld *ar5, B ;B=(R3-R4) R4
dst A, *ar5+ ;R4'=((R1-R2)+(I3-I4)) I4
dld *ar4, A ;A=I3 I3
dadd *ar5, A ;A=I3+I4 I4
sth A, ASM, *ar4+ ;I3H=(I3+I4) I3
stl A, ASM, *ar4- ;I3L=(I3+I4) I3
dld *ar2, A ;A=I1 I1
dsub *ar3, A ;A=I1-I2 I2
sub B, A ;A=(I1-I2)-(r3-r4)
sth A, ASM,*ar5+ ;I4H'=((I1-I2)-(r3-r4)) I4
stl A, ASM,*ar5+0 ;I4H'=((I1-I2)-(r3-r4)) next R4
add B, 1, A ;A=(I1-I2)+(r3-r4)
dld *ar2, B ;B=I1 I1
dadd *ar3, B ;B=I1+I2 I2
sth A, ASM, *ar3+ ;I2H'=(I1-I2)+(R3-R4) I2
stl A, ASM, *ar3+0 ;I2H'=(I1-I2)+(R3-R4) next R2
dld *ar4, A ;A=(I3+I4) I3
add A, B ;B=(I1+I2)+(I3+I4)
sth B, ASM, *ar2+ ;I1H'=(I1+I2)+(I3+I4) I1
stl B, ASM, *ar2+0 ;I1H'=(I1+I2)+(I3+I4) next R1
sub A, 1, B ;B=(I1+I2)-(I3+I4)
sth B, ASM, *ar4+ ;I3'=((I1+I2)-(I3+I4)) I3
NoScaleEnd
stl B, ASM, *ar4+0 ;I3'=((I1+I2)-(I3+I4)) next R3
.if __far_mode
fret
.else
ret
.endif
;=============================================================================
; Function: IfftStage3
;
; Description: Stage 3 of Complex Inverse FFT (double precision)
;
; Inputs: None
;
; Outputs: None
;
; Assumptions: Output will be in place of input.
;
;=============================================================================
IfftStage3:
.if __far_mode
ld *sp(8), A
.else
ld *sp(6), A
.endif
ld #-1,ASM ;ASM=-1
nop
xc 1, AEQ
ld #0, ASM ;ASM=0
rptb IfftStg3End-1 ;(N/8)*36+3
;!!!!! rptb occurs here
; Butterfly1
dld *ar3, A ;A=QR QR
dld *ar2, B ;B=PR PR
dsub *ar3, B ;B=PR-QR QR
sth B, ASM, *ar3+ ;QRH=(PR-QR)/2 QR
stl B, ASM, *ar3+ ;QRL=(PR-QR)/2 QI
add A, 1, B ;B=PR+QR
sth B, ASM, *ar2+ ;PRH=(PR+QR)/2 PR
stl B, ASM, *ar2+ ;PRL=(PR+QR)/2 PI
dld *ar3, A ;A=QI QI
dld *ar3, B ;B=QI QI
dadd *ar2, B ;B=PI+QI PI
sth B, ASM, *ar2+ ;PI=(PI+QI)/2 PI
stl B, ASM, *ar2+ ;PI=(PI+QI)/2 PR+1
sub A, 1, B ;B=PI-QI
sth B, ASM, *ar3+ ;QI=(PI-QI)/2 QI
stl B, ASM, *ar3+ ;QI=(PI-QI)/2 QR+1
; Butterfly2
;===== QR*W (Q31) =====
ld #0, A
macsu *ar4-, *ar3+, A ;QRH*WL QRL WH
macsu *ar3-, *ar4, A ;QRH*WL + QRL*WH
ld A, -16, A ;A>>16
mac *ar4+, *ar3+, A ;A=QR*W QR WL
sth A, *ar5+ ;Itempdw1=QR*W for later use
stl A, *ar5-
;======================
mar *ar3+ ;point to QI QI
;===== QI*W (Q31) =====
ld #0, B ;QIH*WL QIL WH
macsu *ar4-, *ar3+, B ;QIH*WL + QIL*WH
macsu *ar3-, *ar4, B ;A>>16
ld B, -16, B ;A=QI*W QI WL
mac *ar4+, *ar3-, B ;A=QI*W QI
sth B, *ar6+ ;Itempdw2=QI*W for later use
stl B, *ar6-
;======================
mar *ar3- ;point to QR again QR
sub B, A ;A=QR*W - QI*W
dadd *ar2, A ;A=PR+(QR*W - QI*W) PR
dld *ar2, B ;B=PR PR
sth A, ASM, *ar2+ ;PRH'=(PR+(QR*W - QI*W))/2 PR
stl A, ASM, *ar2+ ;PRL'=(PR+(QR*W - QI*W))/2 PI
sub B, A ;A=(QR*W - QI*W)
sub A, B ;B=PR-(QR*W - QI*W)
sth B, ASM, *ar3+ ;QRH'=(PR-(QR*W - QI*W))/2 QR
stl B, ASM, *ar3+ ;QRL'=(PR-(QR*W - QI*W))/2 QI
dld *ar5, B ;B=QR*W
dadd *ar6, B ;B=QR*W + QI*W
dadd *ar2, B ;B=PI+(QR*W + QI*W) PI
dld *ar2, A ;A=PI PI
sth B, ASM, *ar2+ ;PIH'=(PI+(QR*W + QI*W))/2 PI
stl B, ASM, *ar2+ ;PIH'=(PI+(QR*W + QI*W))/2 PR+1
sub A, B ;B=(QR*W + QI*W)
sub B, A ;A=PI-(QR*W + QI*W)
sth A, ASM, *ar3+ ;QIH'=(PI-(QR*W + QI*W))/2 QI
stl A, ASM, *ar3+ ;QIL'=(PI-(QR*W + QI*W))/2 QR+1
; Butterfly3
dld *ar3+, A ;A=QR QI
dld *ar2+, B ;B=PR PI
dsub *ar3, B ;B=PR-QI QR
dadd *ar2-, A ;A=PI+QR PR
sth B, ASM, *ar2+ ;PRH'=(PR-QI)/2 PR
stl B, ASM, *ar2+ ;PRL'=(PR-QI)/2 PI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -