?? iir32_emac.s.list
字號:
;************************************************************************
;*
;* Copyright:
;* Freescale Semiconductor, INC. All Rights Reserved.
;* You are hereby granted a copyright license to use, modify, and
;* distribute the SOFTWARE so long as this entire notice is
;* retained without alteration in any modified and/or redistributed
;* versions, and that such modified versions are clearly identified
;* as such. No licenses are granted by implication, estoppel or
;* otherwise under any patents or trademarks of Freescale Semiconductor,
;* Inc. This software is provided on an "AS IS" basis and without warranty.
;*
;* To the maximum extent permitted by applicable law, FREESCALE
;* DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
;* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
;* PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
;* SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
;* ACCOMPANYING WRITTEN MATERIALS.
;*
;* To the maximum extent permitted by applicable law, IN NO EVENT
;* SHALL FREESCALE BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
;* WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
;* INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
;* LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
;*
;* Freescale assumes no responsibility for the maintenance and support
;* of this software
;*********************************************
;* FILENAME: iir32.s
;*
;* PURPOSE: IIR32 module source file, containing functions for allocating/deallocating
;* data structures for filter and computing an Infinite Impulse
;* Responce filter.
;*
;* AUTHOR: original code was written by Andrey Butok,
;* optimized for eMAC unit by Dmitriy Karpenko
;*********************************************
.section .text ;-=Locate the code in the ".text" section.=-
;#define __EMAC_H
;#include "emac.h"
.align 4
.xdef _IIR32_EMAC
.extern _malloc
.extern _free
;******************************************************
;* NAME: void IIR32( struct tIirStruct *pIIR, Frac32* pX, Frac32* pY, unsigned int n)
;*
;* DESCRIPTION: Computes a Infinite Impulse Response (IIR) filter for a array of 32-bit fractional data values.
;******************************************************
;* a2 pIIR - Pointer to a data structure containing private data for the iir filter
;* 68(a7) pX - Pointer to the input vector of n data elements
;* 72(a7) pY - Pointer to the output vector of n data elements
;* d2 k - Counter for inner loop
;* d1 i - Counter for outer loop
;* d0 N - Length of coefficients vector(N<=n)
;* a0 pCurY - Pointer to the current Y
;* a1 pCurX - Pointer to the current X
;* a3 pCurCoef - Pointer to the current coefficient
;* a4 pCurHistory - Pointer to the current element of history buffer
;* a5 pPredY - Pointer to the previous Y
;******************************************************
_IIR32_EMAC
;---=Saving values of used registers=---
0x00000000: 4fefffc4 lea -60(a7),a7
0x00000004: 48d77fff movem.l d0-d7/a0-a6,(a7)
;
0x00000008: 4feffffc lea -4(a7),a7
0x0000000c: a980 move.l MACSR,d0
0x0000000e: 2e80 move.l d0,(a7)
0x00000010: 4fef0004 lea 4(a7),a7
;
;#ifdef __FRACT_M
0x00000014: a93c00000030 move.l #0x00000030,MACSR
;#else
;move.l #0x00000000,MACSR
;#endif
;---=Most useful parameters are moved from stack to registers.=---
0x0000001a: 206f0048 move.l 72(a7),a0 ; pCurY=pY; -= Pointer to the current Y.=-
0x0000001e: 226f0044 move.l 68(a7),a1 ; pCurX=pX; -= Pointer to the current X.=-
0x00000022: 246f0040 move.l 64(a7),a2 ; N=pIIR->iIirCoefCount/2+1;
0x00000026: 202a0004 move.l 4(a2),d0
0x0000002a: e288 lsr.l #1,d0
0x0000002c: 5280 addq.l #1,d0
;---====== Begin of getting Y[1]..Y[N] ======---
0x0000002e: a13c00000000 move.l #0,ACC0 ;-=accumulators initialization=-
0x00000034: a33c00000000 move.l #0,ACC1
0x0000003a: a53c00000000 move.l #0,ACC2
0x00000040: a73c00000000 move.l #0,ACC3
;
0x00000046: 7204 moveq.l #4,d1 ; for(i=4;i<=N;i+=4) {
.FORi1
0x00000048: b280 cmp.l d0,d1 ;
0x0000004a: 62000410 bhi .ENDFORi1 ;
0x0000004e: 2c6f0044 move.l 68(a7),a6 ; pCurX=pX+i-4;
0x00000052: 43f61cf0 lea (-16,a6,d1.l*4),a1
0x00000056: 2652 move.l (a2),a3 ; pCurCoef=pIIR->pIirCoef;
0x00000058: 4cd10078 movem.l (a1),d3-d6 ;d3=*pCurX++; d4=*pCurX++; d5=*pCurX++; d6=*pCurX; pCurX-=3;
0x0000005c: 2c5b move.l (a3)+,a6 ;a6=*pCurCoef++;
0x0000005e: ac216ade mac.l a6,d6,<<,-(a1),d6,ACC3 ;ACC3+=a6*d6; d6=*--pCurX;
0x00000062: aa0e0ad0 mac.l a6,d5,<<,ACC2 ;ACC2+=a6*d5;
0x00000066: a88e0ac0 mac.l a6,d4,<<,ACC1 ;ACC1+=a6*d4;
0x0000006a: acdb3ace mac.l a6,d3,<<,(a3)+,a6,ACC0 ;ACC0+=a6*d3; a6=*pCurCoef++;
;
0x0000006e: 243c00000004 move.l #4,d2 ;for(k=4; k<i; k+=4) {
.FORk1
0x00000074: b481 cmp.l d1,d2 ;
0x00000076: 6400005e bcc .ENDFORk1 ;
0x0000007a: d7fc00000004 adda.l #4,a3 ;pCurCoef++;
0x00000080: aa215ade mac.l a6,d5,<<,-(a1),d5,ACC3 ;ACC3+=a6*d5; d5=*--pCurX;
0x00000084: a80e0ad0 mac.l a6,d4,<<,ACC2 ;ACC2+=a6*d4;
0x00000088: a68e0ac0 mac.l a6,d3,<<,ACC1 ;ACC1+=a6*d3;
0x0000008c: acdb6ace mac.l a6,d6,<<,(a3)+,a6,ACC0 ;ACC0+=a6*d6; a6=*pCurCoef++;
0x00000090: d7fc00000004 adda.l #4,a3 ;pCurCoef++;
0x00000096: a8214ade mac.l a6,d4,<<,-(a1),d4,ACC3 ;ACC3+=a6*d4; d4=*--pCurX;
0x0000009a: a60e0ad0 mac.l a6,d3,<<,ACC2 ;ACC2+=a6*d3;
0x0000009e: ac8e0ac0 mac.l a6,d6,<<,ACC1 ;ACC1+=a6*d6;
0x000000a2: acdb5ace mac.l a6,d5,<<,(a3)+,a6,ACC0 ;ACC0+=a6*d5; a6=*pCurCoef++;
0x000000a6: d7fc00000004 adda.l #4,a3 ;pCurCoef++;
0x000000ac: a6213ade mac.l a6,d3,<<,-(a1),d3,ACC3 ;ACC3+=a6*d3; d3=*--pCurX;
0x000000b0: ac0e0ad0 mac.l a6,d6,<<,ACC2 ;ACC2+=a6*d6;
0x000000b4: aa8e0ac0 mac.l a6,d5,<<,ACC1 ;ACC1+=d6*d5;
0x000000b8: acdb4ace mac.l a6,d4,<<,(a3)+,a6,ACC0 ;ACC0+=a6*d4; a6=*pCurCoef++;
0x000000bc: d7fc00000004 adda.l #4,a3 ;pCurCoef++;
0x000000c2: ac216ade mac.l a6,d6,<<,-(a1),d6,ACC3 ;ACC3+=a6*d6; d6=*--pCurX;
0x000000c6: aa0e0ad0 mac.l a6,d5,<<,ACC2 ;ACC2+=a6*d5;
0x000000ca: a88e0ac0 mac.l a6,d4,<<,ACC1 ;ACC1+=a6*d4;
0x000000ce: acdb3ace mac.l a6,d3,<<,(a3)+,a6,ACC0 ;ACC0+=a6*d3; a6=*pCurCoef++;
0x000000d2: 5882 addq.l #4,d2 ;
0x000000d4: 609e bra .FORk1 ;
.ENDFORk1 ;}
;
0x000000d6: d7fc00000004 adda.l #4,a3 ;pCurCoef++;
0x000000dc: a68e0ac0 mac.l a6,d3,<<,ACC1 ;ACC1+=a6*d3;
0x000000e0: a80e0ad0 mac.l a6,d4,<<,ACC2 ;ACC2+=a6*d4;
0x000000e4: ac5b5ade mac.l a6,d5,<<,(a3)+,a6,ACC3 ;ACC3+=a6*d5; a6=*pCurCoef++;
0x000000e8: d7fc00000004 adda.l #4,a3 ;pCurCoef++;
0x000000ee: a60e0ad0 mac.l a6,d3,<<,ACC2 ;ACC2+=a6*d3;
0x000000f2: ac5b4ade mac.l a6,d4,<<,(a3)+,a6,ACC3 ;ACC3+=a6*d4; a6=*pCurCoef++;
0x000000f6: d7fc00000004 adda.l #4,a3 ;pCurCoef++;
0x000000fc: a68e0ad0 mac.l a6,d3,<<,ACC3 ;ACC3+=a6*d3;
;
0x00000100: 4aaa000c tst.l 12(a2) ;if (pIIR=>iIirHistoryCount>0) {
0x00000104: 6700027c beq .ENDBUFy ;
0x00000108: 2c6a0008 move.l 8(a2),a6 ;pCurX=pIIR->pIirHistory+i*2-7;
0x0000010c: e389 lsl.l #1,d1
0x0000010e: 43f61ce4 lea (-28,a6,d1.l*4),a1
0x00000112: e289 lsr.l #1,d1
0x00000114: 2c52 move.l (a2),a6 ;pCurCoef=pIIR->pIirCoef+N*2-2;
0x00000116: e388 lsl.l #1,d0
0x00000118: 47f60cf8 lea (-8, a6, d0.l*4), a3
0x0000011c: e288 lsr.l #1,d0
0x0000011e: 2619 move.l (a1)+,d3 ;d3=*pCurX++;
0x00000120: d3fc00000004 adda.l #4,a1 ;pCurX++;
0x00000126: 2819 move.l (a1)+,d4 ;d4=*pCurX++;
0x00000128: d3fc00000004 adda.l #4,a1 ;pCurX++;
0x0000012e: 2a19 move.l (a1)+,d5 ;d5=*pCurX++;
0x00000130: d3fc00000004 adda.l #4,a1 ;pCurX++;
0x00000136: 2c19 move.l (a1)+,d6 ;d6=*pCurX++;
0x00000138: d3fc00000004 adda.l #4,a1 ;pCurX++;
0x0000013e: 2c63 move.l -(a3),a6 ;a6=*--pCurCoef;
0x00000140: 97fc00000004 suba.l #4,a3 ;pCurCoef--;
0x00000146: b280 cmp.l d0,d1 ;if (N==i) {
0x00000148: 6600002a bne .CONT ;
;
0x0000014c: a60e0ac0 mac.l a6,d3,<<,ACC0 ;ACC0+=a6*d3;
0x00000150: a88e0ac0 mac.l a6,d4,<<,ACC1 ;ACC1+=a6*d4;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -