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

📄 qua_gain-v2.asm

📁 TI C54写的G729代码,视线8kbps高质量语音解码,汇编优化
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;----------------------------------------------------------------------
;  Word16 Qua_gain(
;     Word16 code[],       /* (i) Q13 :Innovative vector.             */
;     Word16 g_coeff[],    /* (i)     :Correlations <xn y1> -2<y1 y1> */
;                          /*            <y2,y2>, -2<xn,y2>, 2<y1,y2> */
;     Word16 exp_coeff[],  /* (i)     :Q-Format g_coeff[]             */
;     Word16 L_subfr,      /* (i)     :Subframe length.               */
;     Word16 *gain_pit,    /* (o) Q14 :Pitch gain.                    */
;     Word16 *gain_cod,    /* (o) Q1  :Code gain.                     */
;     Word16 tameflag      /* (i)     : set to 1 if taming is needed  */
;  )
;----------------------------------------------------------------------
;  Constants : Addr_cn -> code
;              Addr_g_coeff_cs -> g_coeff
;              Addr_exp_g_coeff_cs -> exp_coeff
;
;              Addr_gain_pit -> gain_pit
;              Addr_gain_code -> gain_cod
;              Addr_TempFlag -> &tameflag
;
;              L_SUBFR = L_subfr
;
;  Pointers :  ptr_prev_qua_eng -> past_qua_en
;
;  Return   :  AL = Qua_Gain
;----------------------------------------------------------------------
;  Modified Registers : AR0, AR1, AR2, AR3, AR4, AR5, BRC, DP
;-----------------------------------------------------------------------
		.mmregs
		.include ../include/const.h
		.include ../include/ld8amem.h
		.include ../include/tab_ld8a.h
		.include ../include/qua_gain.h

		.text
		.def     Qua_gain
		.ref     Gain_predict
		.ref     Gbk_presel
		.ref     Gain_update

		.asg     "AR2", pG_coeff
		.asg     "AR3", pExp_coeff
		.asg     "AR4", pCoeff
		.asg     "AR5", pExp_min

		.asg     "AR2", pGbk1
		.asg     "AR3", pGbk2

Qua_gain:
	CALL    Gain_predict

	LD      #Addr_local_buf1, DP
	STL     A, gcode0
	STL     B, exp_gcode0

	STM     #0, BK
	STM     #2, AR0
	STM     #Addr_g_coeff_cs, AR2           ; pG_coeff   -> g_coeff[0]
	STM     #Addr_exp_g_coeff_cs, AR3       ; pExp_coeff -> exp_coeff[0]

;-----------------------------------------------------------------
;  tmp = -1./(4.*coeff[0]*coeff[2]-coeff[4]*coeff[4]);
;-----------------------------------------------------------------

	LD      *pG_coeff+0, T          ; pG_coeff -> g_coeff[2]
	MPY     *pG_coeff+0, A          ; pG_coeff -> g_coeff[4], A = L_tmp1
	SQUR    *pG_coeff-0, B          ; pG_coeff -> g_coeff[2], B = L_tmp2
	DST     A, L_tmp1
	DST     B, L_tmp2

	LD      #1-2, A
	ADD     *pExp_coeff+0, A        ; pExp_coeff -> exp_coeff[2]
	ADD     *pExp_coeff+0, A        ; pExp_coeff -> exp_coeff[4], A = exp1
	LD      #1, B
	ADD     *pExp_coeff-0%, 1, B    ; pExp_coeff -> exp_coeff[2], B = exp2

	SUB     B, A                    ; A = exp1 - exp2 , B = exp2
	BC      Else1, ALEQ
If1:
	STL     B, exp
	NEG     A
	BC      Rar0,AGT
	          ABS     A,B
	         SUB     #31,B
	         BC      Comm0,BLT
		  LD      L_tmp1,A
		NOP 
                    	NOP
            		XC       1,ALT
		           LD   #-1,A
	                XC      1,AGEQ
		          LD  #0,A

		B       Endm0		           
Rar0:
	LD      A,B
         	SUB     #31,B
	BC      Comm0,BLT
	          LD      L_tmp1,A
	          BC      Ltm0,ALT
		    LD  #0X7fff,16,A
		    OR  #0xFFFF,A
	        B    Endm0
Ltm0:         
            	LD      #0X8000,16,A
	B       Endm0

Comm0:
	SFTA    A, -1
	STL     A, shift
	LD      shift, ASM
	DLD     L_tmp1, A
	XC      1, C
	          LD      A, 1, A

	LD      A, ASM, A
	LD      A, ASM, A

Endm0:
	BD      Next1
	DLD     L_tmp2, B
	SUB     B, A            ; A = L_tmp

Else1:
	ADD     A, B            ; if (A <= 0) B = exp1
	STL     B, exp
	BC      Tarm11,AGT
	            ABS     A,B
	            SUB     #31,B
	            BC      Comm11,BLT
		     LD      L_tmp2,B
			NOP 
                    NOP
            XC     1,BLT
			       LD   #-1,B

            XC     1,BGEQ
			       LD  #0,B
           B       Endm11		           
Tarm11:
            LD      A,B
			SUB     #31,B
			BC      Comm11,BLT
			LD      L_tmp2,B
			BC      Lt11,BLT
			        LD  #0X7fff,16,B
				OR  #0xFFFF,B
			B    Endm11
Ltm11:         
            LD      #0X8000,16,B
	B       Endm11

Comm11:
			SFTA    A, -1
			STL     A, shift
			LD      shift, ASM
			DLD     L_tmp2, B
			XC      1, C
				LD      B, 1, B

			LD      B, ASM, B
			LD      B, ASM, B
Endm11:
		DLD     L_tmp1, A

		SUB     B, A            ; A = L_tmp
Next1:
	EXP     A
	NOP
	LDM     T, B
	NORM    A
	STL     A,-16,inv_denom

	LD      #4000h, 16, A
	RPT     #15-1
		SUBC    inv_denom, A

	NEG     A
	STL     A, inv_denom

	ADD     exp, B
	SUB     #14+15+16, B, A
	NEG     A
	STL     A, exp_inv_denom

;-----------------------------------------------------------------
;  best_gain[0] = (2.*coeff[2]*coeff[1]-coeff[3]*coeff[4])*tmp;
;-----------------------------------------------------------------

	LD      *pG_coeff-, T           ; pG_coeff -> g_coeff[1]
	MPY     *pG_coeff+0, A          ; pG_coeff -> g_coeff[3], A = L_tmp1
	LD      *pG_coeff+, T           ; pG_coeff -> g_coeff[4]
	MPY     *pG_coeff-, B           ; pG_coeff -> g_coeff[3], B = L_tmp2
	DST     A, L_tmp1
	DST     B, L_tmp2

	LD      *pExp_coeff-, A         ; pExp_coeff -> exp_coeff[1]
	ADD     *pExp_coeff+0, A        ; pExp_coeff -> exp_coeff[3], A = exp1
	LD      #1, B
	ADD     *pExp_coeff+, B         ; pExp_coeff -> exp_coeff[4]
	ADD     *pExp_coeff-, B         ; pExp_coeff -> exp_coeff[3], B = exp2

	SUB     B, A                    ; A = exp1 - exp2 , B = exp2
	BC      Else2, ALEQ
If2:
		SUB     #1, B
		STL     B, exp

		ADD     #1, A
		NEG     A
		BC      Tar0,AGT
		            ABS     A,B
			SUB     #31,B
			BC      Com0,BLT
			LD      L_tmp1,A
			NOP 
                     NOP
            XC     1,ALT
	       LD   #-1,A
            XC     1,AGEQ
	       LD  #0,A
	
	B       End0		           
Tar0:
            LD      A,B
	SUB     #31,B
	BC      Com0,BLT
		LD      L_tmp1,A
			BC      Lt0,ALT
			        LD  #0X7fff,16,A
			OR  #0xFFFF,A
			B    End0
Lt0:         
            LD      #0X8000,16,A
	B       End0

Com0:
	SFTA    A, -1
	STL     A, shift
	LD      shift, ASM
	DLD     L_tmp1, A
	XC      1, C
		LD      A, 1, A

	LD      A, ASM, A
	LD      A, ASM, A

End0:
	BD      Next2
	DLD     L_tmp2, B
	SUB     B, -1, A            ; A = L_tmp

Else2:
	ADD     A, B            ; if (A <= 0) B = exp1
	SUB     #1, B
	STL     B, exp

	SUB     #1, A
	BC      Tar11,AGT
	            ABS     A,B
		SUB     #31,B
		BC      Com11,BLT
			LD      L_tmp2,B
			NOP
                     NOP 
            XC     1,BLT
			       LD   #-1,B
            XC     1,BGEQ
			       LD  #0,B

	B       End11		           
Tar11:
            LD      A,B
	SUB     #31,B
	BC      Com11,BLT
		LD      L_tmp2,B
		BC      Lt11,BLT
		        LD  #0X7fff,16,B
		        OR  #0xFFFF,B
		B    End11
Lt11:         
            LD      #0X8000,16,B
	B       End11

Com11:
	SFTA    A, -1
	STL     A, shift
	LD      shift, ASM
	DLD     L_tmp2, B
	XC      1, C
		LD      B, 1, B

	LD      B, ASM, B
	LD      B, ASM, B
End11:
		DLD     L_tmp1, A
		LD      A, -1, A
		SUB     B, A            ; A = L_tmp
Next2:
	EXP     A
	NOP
	NORM    A                       ; A = nume

	LDM     T, B
	ADD     exp, B
	ADD     exp_inv_denom, B
	SUB     #16+9+16-1, B
	NEG     B

		SFTA    B, -1
		STL     B, shift
		LD      shift, ASM
	    MPYA    inv_denom
		XC      1, C
			LD      B, 1, B
		LD      B, ASM, B
		LD      B, ASM, B

	SAT     B
	STL     B, -16,best_gain0

	LD      #Addr_TempFlag, DP
	CMPM    Addr_TempFlag, 1
	LD      #GPCLIP2, 16, A
	SUB     A, B
	LD      #Addr_local_buf1, DP
	MAR     *AR0+                   ; AR0 = 3
	XC      2, TC, C
		STL     A,-16,best_gain0

;-----------------------------------------------------------------
;  best_gain[1] = (2.*coeff[0]*coeff[3]-coeff[1]*coeff[4])*tmp ;
;-----------------------------------------------------------------

	LD      *pG_coeff-0, T          ; pG_coeff -> g_coeff[0]
	MPY     *pG_coeff+, A           ; pG_coeff -> g_coeff[1], A = L_tmp1
	LD      *pG_coeff+0, T          ; pG_coeff -> g_coeff[4]
	MPY     *pG_coeff, B            ; pG_coeff -> g_coeff[4], B = L_tmp2
	DST     A, L_tmp1
	DST     B, L_tmp2

	LD      *pExp_coeff-0, A        ; pExp_coeff -> exp_coeff[0]
	ADD     *pExp_coeff+, A         ; pExp_coeff -> exp_coeff[1], A = exp1
	LD      #1, B
	ADD     *pExp_coeff+0, B        ; pExp_coeff -> exp_coeff[4]
	ADD     *pExp_coeff, B          ; pExp_coeff -> exp_coeff[4], B = exp2

	SUB     B, A                    ; A = exp1 - exp2 , B = exp2
	BC      Else3, ALEQ
If3:
		SUB     #1, B
		STL     B, exp

		ADD     #1, A
		NEG     A
		BC      Tar,AGT
		            ABS     A,B
			SUB     #31,B
			BC      Com,BLT
			LD      L_tmp1,A
			NOP 
                     NOP
            XC     1,ALT
			       LD   #-1,A
            XC     1,AGEQ
			       LD  #0,A
	B       End		           
Tar:
            LD      A,B
	SUB     #31,B
	BC      Com,BLT
		LD      L_tmp1,A
		BC      Lt,ALT
		        LD  #0X7fff,16,A
			OR  #0xFFFF,A
		B    End
Lt:         
            LD      #0X8000,16,A
	B       End

Com:
	SFTA    A, -1
	STL     A, shift
	LD      shift, ASM
	DLD     L_tmp1, A
	XC      1, C
	          LD      A, 1, A
		
	LD      A, ASM, A
	LD      A, ASM, A
End:
	BD      Next3
	DLD     L_tmp2, B
	SUB     B, -1, A            ; A = L_tmp

Else3:
		ADD     A, B            ; if (A <= 0) B = exp1
		SUB     #1, B
		STL     B, exp

		SUB     #1, A
		BC      Tar1,AGT
		            ABS     A,B
			SUB     #31,B
			BC      Com1,BLT
			LD      L_tmp2,B
			NOP 
                     NOP
            XC     1,BLT
			       LD   #-1,B

⌨️ 快捷键说明

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