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

📄 idct.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 S
📖 第 1 页 / 共 3 页
字号:
;--------------------------------------

	mov	AGRAdr0, r6
	mov	AGRAdr1, r7
	mov	AGRAdr3, r14		;cos coeffs
	nop				;pipeline
	mov	r0, a0(1*4)
	sub	r1, r0, a1(-1*4)
		
;--------------------------------------
	
	loop	r12, dct_butterfly_loop_2_2
	mulf	r2, r1, a3(0*4)		;pipeline
	mov	r0, a0(1*4)
	rnd	r2
	shr	r17, a3(1*4), 24	//get integer portion
	mult	r16, r17, r1
	sub	r1, r0, a1(-1*4)
	add	r2, r16
//	add	r3, r9			//rnd
//	shr	r3, 19			//to 4 LSBs
//	shl	r2, 4			//scaled by 16
//	or	r2, r3			//append
	sub	r3, r2, r4
	blte	check_neg_2_2
	mov	r2, r4
	j	save_r2_2_2
check_neg_2_2:
	sub	r3, r2, r5
	bgte	save_r2_2_2
	mov	r2, r5
save_r2_2_2:	
	mov	a2(1*4), r2		//append. rnd to saturate ??
dct_butterfly_loop_2_2:
;--------------------------------------
	add	r6, r15			;to next group
	add	r7, r15
dct_group_loop_2:
;======================================
	shl	r11, 1			;double group count
	shr	r12, 1			;half butterfly count
	shr	r13, 1			;half offset	
	shr	r15, 1			;??
	addi	r10, 1			;inc pass count
	andi	r10, 1			// RH 10-14-97
	add	r14, r15		;to next set of cos coeffs
dct_pass_loop_2:
        SET_TrapReg
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

;----------------------- copy the results to new_v buffer ----------

	movi	AGRAdr0, local_p_buffer_byte + 13*4
	movi	AGRAdr2, local_new_v_byte + 1*4

	movi	r2, 0

	.if	NO_SAT
	mov	r0, a0(2*4)		;p13
	add	r0, a0(-14*4)		;tmp=p13+p15
	add	r1, r0, a0(8*4)		;tmp+p1
	add	r1, a0(-4*4)		;tmp+p1+p9
	mov	a2(4*4), r1		;new_v[1]=p1+p9+tmp
	add	r1, r0, a0(2*4)		;tmp+p5
	add	r1, a0(4*4)		;tmp+p5+p7
	add	r1, a0(-2*4)		;tmp+p5+p7+p11
	mov	a2(11*4), r1 
	.else

	mulf	r10, r4, a0(2*4); p13
	madd	r10, r4, a0(-14*4); tmp=p13+p15
	nop
	rnd	r12, r10	; r12=tmp
	madd	r10, r4, a0(8*4); tmp+p1
	madd	r10, r4, a0(-4*4); tmp+p1+p9
	nop
	rnd	a2(4*4), r10	; new_v[1]=p1+p9+tmp
	mulf	r10, r4, r12	; tmp
	madd	r10, r4, a0(2*4); tmp+p5
	madd	r10, r4, a0(4*4); tmp+p5+p7
	madd	r10, r4, a0(-2*4);  tmp+p5+p7+p11
	nop
	rnd	a2(11*4), r10
	.endif
	
	.if	NO_SAT
	add	r0, a0(-8*4)		;tmp += p9
	add	r1, r0, a0(13*4)	;tmp+p1
	add	r1, a0(-9*4)		;tmp+p1+p14
	sub	a2(-13*4), r2, r1	;new_v[16]= -(p1+p14+tmp)
	add	r0, a0(2*4)		
	add	r0, a0(-1*4)		;tmp += p5+p7
	mov	a2(15*4), r0		;new_v[3]=tmp
	add	r1, r0, a0(8*4)		;tmp+p6
	add	r1, a0(-4*4)		;tmp+p6+p14
	sub	a2(4*4), r2, r1		;new_v[18]= -(p6+p14+tmp)
	.else

	mulf	r10, r5, r12	; -tmp
	madd	r10, r5, a0(-8*4); tmp+=p9
	nop
	rnd	r12, r10	; r12=-tmp
	madd	r10, r5, a0(13*4); -tmp-p1
	madd	r10, r5, a0(-9*4); -tmp-p1-p14
	nop
	rnd	a2(-13*4), r10	; new_v[16]= -(p1+p14+tmp)
	mulf	r10, r5, r12	; tmp
	madd	r10, r4, a0(2*4)
	madd	r10, r4, a0(-1*4);tmp += p5+p7
	nop
	rnd	r12, r10	; r12=tmp
	mov	a2(15*4), r12	; new_v[3]=tmp
	mulf	r10, r5, r12	; -tmp
	madd	r10, r5, a0(8*4); -tmp-p6
	madd	r10, r5, a0(-4*4); -tmp-p6-p14
	nop
	rnd	a2(4*4), r10	; new_v[18]= -(p6+p14+tmp)
	.endif

#if 0
	.if	NO_SAT
	mov	r0, a0(1*4)		;p10
	add	r0, a0(1*4)		;+p11
	add	r0, a0(1*4)		;+p12
	add	r0, a0(1*4)		;+p13
	add	r0, a0(1*4)		;+p14
	add	r0, a0(-13*4)		;tmp=p10+p12+p13+p14+p15
	.else
	

	mulf	r10, r4, a0(1*4); p10
	madd	r10, r4, a0(1*4); +p11
	madd	r10, r4, a0(1*4); +p12
	madd	r10, r4, a0(1*4); +p13
	madd	r10, r4, a0(1*4); +p14
	madd	r10, r4, a0(-13*4); +p15
	nop
	rnd	r12, r10	; r12=tmp=p10+p12+p13+p14+p15
	.endif
	
		
	.if	NO_SAT
	add	r1, r0, a0(1*4)		;tmp+p2
	add	r1, a0(9*4)		;+p3	
	sub	r1, a0(-8*4)		;-p12
	sub	a2(4*4), r2, r1		;new_v[22]= -(p2+p3+tmp-p12)
	add	r1, r0, a0(2*4)		;tmp+p4
	add	r1, a0(1*4)		;+p6
	add	r1, a0(6*4)		;+p7
	sub	r1, a0(-8*4)		;-p13
	sub	a2(-6*4), r2, r1	;new_v[26]= -(p4+p6+p7+tmp-p13)
	.else


	mulf	r10, r5, r12	; -tmp
	madd	r10, r5, a0(1*4);-tmp-p2
	madd	r10, r5, a0(9*4); -p3
	madd	r10, r4, a0(-8*4); +p12
	nop
	rnd	a2(4*4), r10	; new_v[22]= -(p2+p3+tmp-p12)
	mulf	r10, r5, r12	; -tmp
	madd	r10, r5, a0(2*4); -p4
	madd	r10, r5, a0(1*4); -p6
	madd	r10, r5, a0(6*4); -p7
	madd	r10, r4, a0(-8*4); +p13
	nop
	rnd	a2(-6*4), r10	; new_v[26]= -(p4+p6+p7+tmp-p13)
	.endif

	.if	NO_SAT
	add	r1, r0, a0(1*4)		;tmp+p5
	add	r1, a0(1*4)		;+p6
	add	r1, a0(5*4)		;+p7
	sub	r1, a0(-10*4)		;-p12
	sub	a2(4*4), r2, r1		;new_v[20]= -(p5+p6+p7+tmp-p12)
	add	r1, r0, a0(1*4)		;tmp+p2
	add	r1, a0(10*4)		;+p3
	sub	r1, a0(-5*4)		;-p13
	sub	a2(6*4), r2, r1		;new_v[24]= -(p2+p3+tmp-p13)
	.else

	mulf	r10, r5, r12	; -tmp
	madd	r10, r5, a0(1*4); -p5
	madd	r10, r5, a0(1*4); -p6
	madd	r10, r5, a0(5*4); -p7
	madd	r10, r4, a0(-10*4); +p12
	nop
	rnd	a2(4*4), r10	; new_v[20]= -(p5+p6+p7+tmp-p12)
	mulf	r10, r5, r12	; -tmp
	madd	r10, r5, a0(1*4); -p2
	madd	r10, r5, a0(10*4); -p3
	madd	r10, r4, a0(-5*4); +p13
	nop
	rnd	a2(6*4), r10	; new_v[24]= -(p2+p3+tmp-p13)
	.endif
#endif

//------------ More dynamic range --------------------
        .if     NO_SAT_1
	mov	r0, a0(1*4)		;p10
//      add     r0, a0(1*4)             ;+p11
        add     r0, a0(3*4)             ;+p11
//      add     r0, a0(1*4)             ;+p12
//      add     r0, a0(1*4)             ;+p13
	add	r0, a0(1*4)		;+p14
//      add     r0, a0(-13*4)           ;tmp=p10+p11+p12+p13+p14+p15
        add     r0, a0(-13*4)           ;tmp=p10+p11+p14+p15

	add	r1, r0, a0(1*4)		;tmp+p2
//      add     r1, a0(9*4)             ;+p3 
        add     r1, a0(1*4)             ;+p3 
//      sub     r1, a0(-8*4)            ;-p12
//      sub     a2(4*4), r2, r1         ;new_v[22]= -(p2+p3+tmp-p12)
        sub     a2(4*4), r2, r1         ;new_v[22]= -(p2+p3+tmp)
	add	r1, r0, a0(2*4)		;tmp+p4
	add	r1, a0(1*4)		;+p6
//      add     r1, a0(6*4)             ;+p7
        add     r1, a0(-2*4)            ;+p7
//      sub     r1, a0(-8*4)            ;-p13
//      sub     a2(-6*4), r2, r1        ;new_v[26]= -(p4+p6+p7+tmp-p13)
        sub     a2(-6*4), r2, r1        ;new_v[26]= -(p4+p6+p7+tmp)

	add	r1, r0, a0(1*4)		;tmp+p5
	add	r1, a0(1*4)		;+p6
//      add     r1, a0(5*4)             ;+p7
        add     r1, a0(-5*4)            ;+p7
//      sub     r1, a0(-10*4)           ;-p12
//      sub     a2(4*4), r2, r1         ;new_v[20]= -(p5+p6+p7+tmp-p12)
        sub     a2(4*4), r2, r1         ;new_v[20]= -(p5+p6+p7+tmp)
	add	r1, r0, a0(1*4)		;tmp+p2
//      add     r1, a0(10*4)            ;+p3
        add     r1, a0(5*4)             ;+p3
//      sub     r1, a0(-5*4)            ;-p13
//      sub     a2(6*4), r2, r1         ;new_v[24]= -(p2+p3+tmp-p13)
        sub     a2(6*4), r2, r1         ;new_v[24]= -(p2+p3+tmp)
//---
        .else
#if 0
	mulf	r10, r4, a0(1*4); p10
//      madd    r10, r4, a0(1*4); +p11
        madd    r10, r4, a0(3*4); +p11
//      madd    r10, r4, a0(1*4); +p12
//      madd    r10, r4, a0(1*4); +p13
	madd	r10, r4, a0(1*4); +p14
	madd	r10, r4, a0(-13*4); +p15
	nop
//      rnd     r12, r10        ; r12=tmp=p10+p11+p12+p13+p14+p15
        rnd     r12, r10        ; r12=tmp=p10+p11+p14+p15

	mulf	r10, r5, r12	; -tmp
	madd	r10, r5, a0(1*4);-tmp-p2
//      madd    r10, r5, a0(9*4); -p3
        madd    r10, r5, a0(1*4); -p3
//      madd    r10, r4, a0(-8*4); +p12
	nop
	rnd	a2(4*4), r10	; new_v[22]= -(p2+p3+tmp-p12)
	mulf	r10, r5, r12	; -tmp
	madd	r10, r5, a0(2*4); -p4
	madd	r10, r5, a0(1*4); -p6
//      madd    r10, r5, a0(6*4); -p7
        madd    r10, r5, a0(-2*4); -p7
//      madd    r10, r4, a0(-8*4); +p13
	nop
	rnd	a2(-6*4), r10	; new_v[26]= -(p4+p6+p7+tmp-p13)

	mulf	r10, r5, r12	; -tmp
	madd	r10, r5, a0(1*4); -p5
	madd	r10, r5, a0(1*4); -p6
//      madd    r10, r5, a0(5*4); -p7
        madd    r10, r5, a0(-5*4); -p7
//      madd    r10, r4, a0(-10*4); +p12
	nop
	rnd	a2(4*4), r10	; new_v[20]= -(p5+p6+p7+tmp-p12)
	mulf	r10, r5, r12	; -tmp
	madd	r10, r5, a0(1*4); -p2
//      madd    r10, r5, a0(10*4); -p3
        madd    r10, r5, a0(5*4); -p3
//      madd    r10, r4, a0(-5*4); +p13
	nop
	rnd	a2(6*4), r10	; new_v[24]= -(p2+p3+tmp-p13)
#endif
        // new_v[22]= -(p2+p3+p10+p11+p13+p14+p15)
        mulf    r10, r5, a0(-7*4); -p10
        madd    r10, r5, a0(8*4); -p3
        madd    r10, r5, a0(-9*4); -p11
        madd    r10, r5, a0(11*4); -p2
        madd    r10, r5, a0(1*4); -p13
        madd    r10, r5, a0(1*4); -p14
        madd    r10, r5, a0(-5*4); -p15
	nop
        rnd     a2(4*4), r10    ; new_v[22]

        // new_v[26]= -(p4+p6+p7+p10+p11+p12+p14+p15)
        mulf    r10, r5, a0(-3*4); -p10
        madd    r10, r5, a0(4*4); -p7
        madd    r10, r5, a0(-5*4); -p11
        madd    r10, r5, a0(6*4); -p6
        madd    r10, r5, a0(-8*4); -p12
        madd    r10, r5, a0(10*4); -p4
        madd    r10, r5, a0(1*4); -p14
        madd    r10, r5, a0(-5*4); -p15
	nop
        rnd     a2(-6*4), r10    ; new_v[26]

        // new_v[20]= -(p5+p6+p7+p10+p11+p13+p14+p15)
        mulf    r10, r5, a0(-3*4); -p10
        madd    r10, r5, a0(4*4); -p7
        madd    r10, r5, a0(-5*4); -p11
        madd    r10, r5, a0(7*4); -p6
        madd    r10, r5, a0(-8*4); -p13
        madd    r10, r5, a0(9*4); -p5
        madd    r10, r5, a0(1*4); -p14
        madd    r10, r5, a0(-5*4); -p15
	nop
        rnd     a2(4*4), r10    ; new_v[20]

        // new_v[24]= -(p2+p3+p10+p11+p12+p14+p15)
        mulf    r10, r5, a0(-7*4); -p10
        madd    r10, r5, a0(8*4); -p3
        madd    r10, r5, a0(-9*4); -p11
        madd    r10, r5, a0(10*4); -p2
        madd    r10, r5, a0(2*4); -p12
        madd    r10, r5, a0(1*4); -p14
        madd    r10, r5, a0(-7*4); -p15
	nop
        rnd     a2(6*4), r10    ; new_v[24]

        .endif
//----------------------------------------------------

	.if	NO_SAT
	mov	r0, a0(4*4)		;p8
	add	r0, a0(2*4)		;+p12
	add	r0, a0(1*4)		;+p14
	add	r0, a0(-15*4)		;tmp=p8+p12+p14+p15
	add	r1, r0, a0(4*4)		;p0+tmp
	sub	a2(-2*4), r2, r1	;new_v[30]= -(p0+tmp)
	add	r1, r0, a0(2*4)		;p4+tmp
	add	r1, a0(1*4)		;+p6
	add	r1, a0(4*4)		;+p7
	sub	a2(-17*4), r2, r1	;new_v[28]= -(p4+p6+p7+tmp)
	.else

	mulf	r10, r5, a0(4*4); -p8
	madd	r10, r5, a0(2*4); -p12
	madd	r10, r5, a0(1*4); -p14
	madd	r10, r5, a0(-15*4); -p15
	nop
	rnd	r12, r10	;r12=-tmp
	madd	r10, r5, a0(4*4); -p0
	nop
	rnd	a2(-2*4), r10	; new_v[30]= -(p0+tmp)
	mulf	r10, r4, r12	; -tmp
	madd	r10, r5, a0(2*4); -p4
	madd	r10, r5, a0(1*4); -p6
	madd	r10, r5, a0(4*4); -p7
	nop
	rnd	a2(-17*4), r10	; new_v[28]= -(p4+p6+p7+tmp)
	.endif
	
	.if	NO_SAT
	mov	r0, a0(4*4)		;p11
	add	r0, a0(-8*4)		;tmp=p11+p15
	add	r1, r0, a0(-4*4)	;+p7
	mov	a2(-2*4), r1		;new[11]=p7+tmp
	add	r0, a0(10*4)		;tmp += p3
	mov	a2(-2*4), r0		;new_v[9]=tmp
	add	r1, r0, a0(2*4)	;+p13
	mov	a2(6*4), r1		;new_v[7]=p13+tmp
	.else

	mulf	r10, r4, a0(4*4); p11
	madd	r10, r4, a0(-8*4); +p15
	nop
	rnd	r12, r10	; tmp
	madd	r10, r4, a0(-4*4); +p7
	nop
	rnd	a2(-2*4), r10	; new[11]=p7+tmp
	mulf	r10, r4, r12	; tmp
	madd	r10, r4, a0(10*4); tmp+=p3
	nop
	rnd	a2(-2*4), r10	; new_v[9]=tmp
	madd	r10, r4, a0(2*4); +p13
	nop
	rnd	a2(6*4), r10	;new_v[7]=p13+tmp
	.endif
	
	.if	NO_SAT	
	mov	r0, a0(-8*4)		;p15
	add	r1, r0, a0(0*4)		;+p7
	mov	a2(2*4), r1		;new_v[13]=p7+p15
	mov	a2(0*4), r0		;new_v[15]=p15
	.else

	mulf	r10, r4, a0(-8*4); p15
	nop
	rnd	r12, r10
	madd	r10, r4, a0(0*4); p7
	nop
	rnd	a2(2*4), r10	; new_v[13]=p7+p15
	mov	a2(0*4), r12
	.endif

//============== scale dct_out up by 2 bit to restore data =======

	.if	1
	movi	AGRAdr0, local_new_v_byte 
        CLR_TrapReg
	loop	32, scale_dct_out
	mulf	r0, r4, a0(0)
	madd	r0, r4, a0(0)
	madd	r0, r4, a0(0)
	madd	r0, r4, a0(0)
//------- Try --------
//	madd	r0, r4, a0(0)
//	madd	r0, r4, a0(0)
//	madd	r0, r4, a0(0)
//	madd	r0, r4, a0(0)
//---- End of try ----
	nop
	rnd	a0(1*4), r0
scale_dct_out:
        SET_TrapReg
	.endif
	
	.if	DB_DCT_OUT

	movi	r10,local_new_v_byte
	rswi	r10,0x500	// begining of dump addr
	movi	r10,local_new_v_byte+32*4
	rswi	r10,0x504	// end of dump addr
	movi	r10,1
	rswi	r10,0x508	// start dumping
	
	.endif
	

	j	r29			;return to calling routine

⌨️ 快捷键说明

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