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

📄 math.asm

📁 TI C54写的G729代码,视线8kbps高质量语音编码,汇编优化
💻 ASM
字号:
;==========================================================================
;  File Name
;  ----------
;  MATH.ASM
;
;  Brief Description of the Code:
;  ------------------------------
;  This file contains MATH functions use in G.729A.
;
;  Ref
;  ------
;  BASIC_OP.C and OPER_32B.C
;==========================================================================
        .mmregs

        .include ..\include\ld8amem.h

        .text
        .def   MPY32
        .def   MPY32_16
        .def   DIV16
        .def   DIV32

;----------------------------------------------------
;  MPY32 :
;
;       input :
;                X(32) = | Xhi(16) | Xlo(16) |
;                Y(32) = | Yhi(16) | Ylo(16) |
;
;                AR4 -> Xlo
;                AR5 -> Ylo
;
;       output : A  = X(32) * Y(32)
;
;                AR4 -> Xhi
;                AR5 -> Yhi
;----------------------------------------------------
MPY32:
        LD       *AR4 , T
        MPYU     *AR5-, A
        LD       A, -16, A
        MACSU    *AR4-, *AR5+, A
        MACSU    *AR5-, *AR4 , A
        RETD
        LD       A, -16, A
        MAC      *AR4, *AR5, A


;----------------------------------------------------
;  MPY32_16 :
;
;       input :
;                X(16)
;                Y(32) = | Yhi(16) | Ylo(16) |
;
;                AR4 -> X
;                AR5 -> Ylo
;
;       output : A  = X(16) * Y(32)
;
;                AR4 -> X
;                AR5 -> Yhi
;----------------------------------------------------
MPY32_16:
        LD       #0, A
        MACSU    *AR5-, *AR4, A
        RETD
        LD       A, -16, A
        MAC      *AR4, *AR5, A

;----------------------------------------------------
;  DIV16 :
;
;       input :
;                NUMER(16)
;                DENOM(16)
;
;                AR4 -> NUMER
;                AR5 -> DENOM
;
;       output : A  = REM(16) / QUOT(16)
;----------------------------------------------------
DIV16:
        LD      *AR5, 16, A
        BC      EXIT_DIV16, ALEQ
        LD      *AR4, 16, A
        BC      EXIT_DIV16, ALT

        RPT     #15-1
        SUBC    *AR5, A
        RET

EXIT_DIV16:
        RETD
        LD      #0, A
        NOP

;----------------------------------------------------
;  DIV32 : 32 bit fractional division
;          abs(NUMER)<=abs(DENOM), DENOM>0, NUMER>=0
;
;       input :
;                NUMER(32) = | Nhi(16) | Nlo(16) |
;                DENOM(32) = | Dhi(16) | Dlo(16) |
;
;                AR4 -> Nhi
;                AR5 -> Dhi
;
;       output :
;                if  ((DENOM>0) && (NUMER>0))
;                      A = QUOT(32)
;                else  A = 0
;
;       Modified Registers : AR3, AR5
;----------------------------------------------------
		
        .asg     "Addr_local_buf1 + 128", L_32

        .asg     "AR3", pB
        .asg     "AR3", pL_32
        .asg     "AR4", pNum
        .asg     "AR5", pDen


DIV32:
        DLD     *pDen, B
        LD      #0, A
        RC      BLEQ

;DIV16
        LD      #03fffh, 16, B    ; approx = div_s( (Word16)0x3fff, denom_hi);
        RPT     #15-1
                SUBC    *pDen, B        ; BL = approx
        STLM    B, T                    ; T = approx >= 0 since Den > 0

;MPY32_16
        MAR     *pDen+          ; L_32 = Mpy_32_16(denom, approx)
        MPYU    *pDen-, A
        LD      A, -16, A
        MAC     *pDen, A

        LD      #4000h, 16, B   ; L_32 = L_sub( (Word32)0x7fffffffL, L_32);
        LD      B, 1, B
        SUB     A, B            ; B = L_32

        STM     #BL, pB

;MPY32_16
        MPYU    *pB+, A
        LD      A, -16, A
        MAC     *pB-, A       ; A = L_32

        STM     #L_32, pL_32
        DST     A, *pL_32
        MAR     *pL_32+

;MPY32
        LD      #0, A
        MACSU   *pL_32-, *pNum+, A
        MACSU   *pNum-, *pL_32 , A
        LD      A, -16, A

        RETD
        MAC     *pB, *pNum, A
        LD      A, 2, A

⌨️ 快捷键说明

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