⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fir32_emac.s

📁 freescale MAC DSP的算法库(FFT
💻 S
📖 第 1 页 / 共 2 页
字号:
mac.l 		a6,d5,<<,ACC0 				;ACC0+=a6*d5;
mac.l 		a6,d6,<<,-(a3),a6,ACC1 		;ACC1+=a6*d6; a6=*--pCurCoef;
 
mac.l 		a6,d6,<<,ACC0 				;ACC0+=a6*d6
 
.ENDBUFx:									;}//end if #3
											;}//end if #1
;//storing results
movclr.l 	ACC0,d6   						;d6=ACC0; ACC0=0;
move.l 		d6,(a0)+						;(*pCurY++)=d6;
movclr.l 	ACC1,d6      					;d6=ACC1; ACC1=0;
move.l 		d6,(a0)+						;(*pCurY++)=d6;
movclr.l 	ACC2,d6      					;d6=ACC2; ACC2=0;
move.l 		d6,(a0)+						;(*pCurY++)=d6;
movclr.l 	ACC3,d6      					;d6=ACC3; ACC3=0;
move.l 		d6,(a0)+						;(*pCurY++)=d6;
  
addq.l 		#4,d1							;//i+=4;
bra  		.FORi1							;//jumping to .FORi1
 
.ENDFORi1:									;}//end of outer loop #1

move.l		d0,d7							;d7=N%4;
andi.l		#3,d7							
move.l		d0,d5							;d5=N-d7+1;
sub.l		d7,d5							
addq.l		#1,d5							

moveq.l		#1,d1							;//i=1;
;//cycle of computing a "tail" of output samples from Y[N-N%4+1] to Y[N]
.FORi2:										;for(i=1; i<=N%4; i++){ //begin of outer loop #2
cmp.l		d7,d1							;//comparing i with N%4
bhi			.ENDFORi2 						;//if (i>N%4) then jump to .ENDFORi2

move.l 		68(a7),a6         				;pCurX=pX+d5;
lea 		(0,a6,d5.l*4),a1       
     
move.l 		(a2),a3          				;pCurCoef=pFIR->pFirCoef; 
//cycle of getting Y[d5]
moveq		#0,d2             					  
move.l 		(a3)+,d4        				;d4=*pCurCoef++;
.FORk21:									;for (k=0; k<d5; k++) { //begin of inner loop #4
move.l 		-(a1),d3         				;d3=*--pCurX
      
mac.l		d3,d4,<<,(a3)+,d4,ACC0 		;ACC0+=d3*d4; d4=*pCurCoef++;
addq.l 		#1,d2            				;//Incrementing k
cmp.l		d5,d2          					;//Comparing k with i
bcs 		.FORk21        					;//if (k<i) then jump to .FORk21
											;} //end of inner loop #4
;//Testing that History Buffer is filled => this is not first calling of this function
tst.l		12(a2)            					;if(pFIR->iFirHistoryCount>0)  { //if #4
beq 		.NEXTif								;//if (pFIR->iFirHistoryCount=0) then jump to .NEXTif
move.l		8(a2),a6	        
lea 		(-4,a6,d0.l*4),a4     				;pCurHistory=pFIR->pFirHistory+N-1;
      
move.l 		d5,d2            					;for(k=d5;k<N;k++)  { //begin of inner loop #5
.FORk22:                       					
cmp.l		d0,d2             					;//Comparing k with N
bcc			.NEXTif
move.l 		-(a4),d3         					;d3=*--pCurHistory
      
mac.l		d3,d4,<<,(a3)+,d4,ACC0			;ACC0+=d3*d4; d4=*pCurCoef++;
addq.l 		#1,d2            					;//Incrementing k
bra 		.FORk22              				;//jumping to .FORk2
.NEXTif:                      					;}//end of inner loop #5	
;// End of cycle of getting Y[d5] 
	
												;}//end if #4
movclr.l	ACC0,d6            					;d6=ACC0; ACC0=0;
move.l 		d6,(a0)+          					;(*pCurY++)=d6;
addq.l 		#1,d1								;//incrementing i
addq.l      #1,d5       						;//incrementing d5
bra 		.FORi2               				;//Jumping to .FORi2

.ENDFORi2:										;//end of outer loop #2
;//End of getting Y[1]..Y[N]

;//begin of getting Y[N+1]..Y[n]
move.l		76(a7),d7						;d7=n;//length of input and output arrays

cmpi.l		#4,d0							;//if (N>=4) then jump to .NMORE3
bcc			.NMORE3							;if (N<4) { //if #5

move.l		d0,d1							;d1=N+1;
addq.l		#1,d1
bra			.FORi4							;//jumping to .FORi4

.NMORE3:									;}//end if #5
;//if number of coefficients more and equal 4
move.l		d0,d1							;if (N>=4) { //if #6
addq.l		#4,d1							;d1=N+4

.FORi3:										;for (i=d1; i<=n; i+=4){ //begin of outer loop #3
cmp.l		d7,d1							;//comparing i with n
bhi			.ENDFORi3						;//if (i>n) then jump to .ENDFORi3

move.l 		(a2),a3							;pCurCoef=pFIR->pFirCoef;
move.l 		68(a7),a6         				;pCurX=pX+i-4;
lea 		(-16,a6,d1.l*4),a1

movem.l 	(a1),d3-d6						;d3=*pCurX++; d4=*pCurX++; d5=*pCurX++; d6=*pCurX; pCurX-=3;
move.l 		(a3)+,a6  						;a6=*pCurCoef++;
  
move.l 		d0,d2							;d2=N%4+4;
andi.l		#3,d2 
addq.l		#4,d2

cmpi.l		#4,d2							;if (d2=4){ //if #7
bne			.CYCLE_BEGIN2
addq.l		#1,d2							;d2+=1;
											;}//end if #7
.CYCLE_BEGIN2:
;//multiplying 4 input samples on first coefficient
mac.l 		a6,d6,<<,-(a1),d6,ACC3  	;ACC3+=a6*d6; d6=*--pCurX;
mac.l 		a6,d5,<<,ACC2           	;ACC2+=a6*d5;
mac.l 		a6,d4,<<,ACC1           	;ACC1+=a6*d4;
mac.l 		a6,d3,<<,(a3)+,a6,ACC0  	;ACC0+=a6*d3; a6=*pCurCoef++;
;//cycle of multiplying 8 input samples on 4 coefficients per iteration
.FORk4:    									;for(k=d2; k<=N; k+=4) { //begin of inner loop #6
cmp.l 		d0,d2    						;//comparing k with N
bhi    		.ENDFORk4						;//if (k>N) then jump to .ENDFORk4
 
mac.l 		a6,d5,<<,-(a1),d5,ACC3    	;ACC3+=a6*d5; d5=*--pCurX; 
mac.l 		a6,d4,<<,ACC2             	;ACC2+=a6*d4;
mac.l 		a6,d3,<<,ACC1             	;ACC1+=a6*d3;
mac.l 		a6,d6,<<,(a3)+,a6,ACC0    	;ACC0+=a6*d6; a6=*pCurCoef++;
 
mac.l 		a6,d4,<<,-(a1),d4,ACC3   	;ACC3+=a6*d4; d4=*--pCurX;
mac.l 		a6,d3,<<,ACC2            	;ACC2+=a6*d3;
mac.l 		a6,d6,<<,ACC1            	;ACC1+=a6*d6;
mac.l 		a6,d5,<<,(a3)+,a6,ACC0   	;ACC0+=a6*d5; a6=*pCurCoef++;
 
mac.l 		a6,d3,<<,-(a1),d3,ACC3    	;ACC3+=a6*d3; d3=*--pCurX;
mac.l 		a6,d6,<<,ACC2              	;ACC2+=a6*d6;
mac.l 		a6,d5,<<,ACC1     			;ACC1+=a6*d5;
mac.l 		a6,d4,<<,(a3)+,a6,ACC0  	;ACC0+=a6*d4; a6=*pCurCoef++;

mac.l		a6,d6,<<,-(a1),d6,ACC3    	;ACC3+=a6*d6; d6=*--pCurX;
mac.l 		a6,d5,<<,ACC2             	;ACC2+=a6*d5;
mac.l 		a6,d4,<<,ACC1             	;ACC1+=a6*d4;
mac.l 		a6,d3,<<,(a3)+,a6,ACC0    	;ACC0+=a6*d3; a6=*pCurCoef++;

addq.l 		#4,d2							;//k+=4;
bra  		.FORk4							;//jumping to .FORk4
 
.ENDFORk4:									;}//end of inner loop #6

move.l		d0,d2							;//k=(N-1)%4
subq.l		#1,d2
andi.l		#3,d2
;//cycle of multiplying 4 input samples on 1 coefficient per iteration
.FORk5:										;for(k=(N-1)%4; k>0; k--) { //begin of inner loop #7
cmpi.l		#0,d2							;//comparing k with 0
beq			.ENDFORk5						;//if (k=0) then jump to .ENDFORk5

mac.l		a6,d5,<<,ACC3				;ACC3+=a6*d5;
mac.l		a6,d4,<<,ACC2				;ACC2+=a6*d4;
mac.l		a6,d3,<<,ACC1				;ACC1+=a6*d3;
mac.l		a6,d6,<<,(a3)+,a6,ACC0		;ACC0+=a6*d6; a6=*pCurCoef++;

move.l		d4,d5							;d5=d4;
move.l		d3,d4							;d4=d3;
move.l		d6,d3							;d3=d6;

move.l		-(a1),d6						;d6=*--pCurX;
subq.l		#1,d2							;//decrementing k
bra			.FORk5							;//jumping to .FORk5

.ENDFORk5:									;}//end of inner loop #7

;//multiplying currently computing samples on coefficients and storing results
movclr.l	ACC0,d4							;d4=ACC0; ACC0=0;
move.l		d4,(a0)+						;(*pCurY++)=d4;
movclr.l	ACC1,d4							;d4=ACC1; ACC1=0;
move.l		d4,(a0)+						;(*pCurY++)=d4;
movclr.l	ACC2,d4							;d4=ACC2; ACC2=0;
move.l		d4,(a0)+						;(*pCurY++)=d4;
movclr.l	ACC3,d4							;d4=ACC3; ACC3=0;
move.l		d4,(a0)+						;(*pCurY++)=d4;

addq.l		#4,d1							;//i+=4
bra			.FORi3							;//jumping to .FORi3
.ENDFORi3:									;}//end of outer loop #3
											
move.l 		d7,d5							;d5=(n-N)%4;
sub.l		d0,d5    
andi.l		#3,d5
move.l		d7,d1							;d1=n-d5+1;
sub.l		d5,d1
addq.l		#1,d1
											;}//end if #6
;//computing a "tail" of output samples
.FORi4:										;for(i=d1; i<=n; i++) { //begin of outer loop #4
cmp.l  		d7,d1							;//comparing i with n
bhi 		.ENDFORi4 						;//if (i>n) then jump to .ENDFORi4

move.l 		68(a7),a6   					;pCurX=pX+i;
lea 		(0,a6,d1.l*4),a1
move.l 		(a2),a3       					;pCurCoef=pFIR->pFirCoef;

moveq		#0,d2             				;for(k=0;k<N;k++)  {//begin of inner loop #8
move.l 		(a3)+,d4         				;d4=*pCurCoef++;
.FORk41:	
move.l 		-(a1),d3         				;d3=*--pCurX;
mac.l		d3,d4,<<,(a3)+,d4,ACC0 		;ACC0+=d3*d4; d4=pCurCoef++;
addq.l 		#1,d2            				;//Incrementing k
cmp.l		d0,d2             				;//Comparing k with N
bcs 		.FORk41              			;//If (k<N) then jump to .FORk41
											;} //end of inner loop #8
movclr.l 	ACC0,d6            				;d6=ACC0; ACC0=0;
move.l 		d6,(a0)+          				;(*pCurY++)=d6;
addq.l 		#1,d1             				;//Incrementing i
bra 		.FORi4               			;//Jumping to .FORi4
.ENDFORi4:                     				;}//end of outer loop #4
;---====== Begin of History Buffer Loading ======---
sub.l		d0,d7
move.l		68(a7),a5
lea 		(4,a5,d7.l*4),a1					;pCurX=pX+N+1;
move.l 		8(a2),a4            				;pCurHistory=pFIR->pFirHistory;
moveq		#1,d1             					;for(i=1;i<N;i++)  
.FORbuf:
cmp.l		d0,d1             					;//Comparing i with N
bcc 		.ENDbuf	            				;//If (i=>N) then jump to .ENDbuf
move.l 		(a1)+,(a4)+      					;*pCurHistory++=*pCurX++;
addq.l 		#1,d1            					;//Incrementing i
bra 		.FORbuf             				;//Jumping to .FORbuf
.ENDbuf:                      					;}
subq.l	 	#1,d1            					;pFIR->iFirHistoryCount=N-1;
move.l 		d1,12(a2)        					; 	}//end 
; ---====== End of History Buffer Loading ======--

;-=Restoring values of used registers=-
lea			-4(a7),a7
move.l		(a7),d0
move.l		d0,MACSR
lea			4(a7),a7
movem.l 	(a7),d0-d7/a0-a6;
lea 		60(a7),a7
rts

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -