📄 mpegimdf.a
字号:
;------------------------------------------------------------------------------;; File : MPEGIMDF.a;; Author : St閜hane TAVENARD;; $VER: MPEGIMDF.a 0.0 (03/06/1997);; (C) Copyright 1997-1997 St閜hane TAVENARD; All Rights Reserved;; #Rev| Date | Comment; ----|----------|--------------------------------------------------------; 0 |03/06/1997| Initial revision ST;; ------------------------------------------------------------------------;; MPEG IMDCT optimized ! (FPU Version);;------------------------------------------------------------------------------ XDEF @MPEGIMDF_hybrid XDEF _MPEGIMDF_hybrid XDEF @MPEGIMDF_long XDEF _MPEGIMDF_long XDEF @MPEGIMDF_short XDEF _MPEGIMDF_short section ASMCODE,codeSSIZE equ 4 ; Source size in bytesDSIZE equ 4 ; Destination size in bytesTSIZE equ 4 ; Temp data size in bytesWSIZE equ 4 ; Window data size in bytesSSLIMIT equ 18SBLIMIT equ 32; MOVM <reg>,<ea>; MOVM <ea>,<reg>; Move a value from/to memoryMOVM MACRO fmove.s \1,\2 ENDM; MOVR <reg1>,<reg2>; Move a from register to registerMOVR MACRO fmove.x \1,\2 ENDM; ADDR <imm>,<ea>; Add a register value with <ea>ADDR MACRO fadd.x \1,\2 ENDM; ADDM <ea>,<ea>; Add a memory value with <ea>ADDM MACRO fadd.s \1,\2 ENDM; SUBR <imm>,<ea>; Sub a register value with <ea>SUBR MACRO fsub.x \1,\2 ENDM; SUBM <ea>,<ea>; Sub a memory value with <ea>SUBM MACRO fsub.s \1,\2 ENDM; NEGR <reg>; Negate a registerNEGR MACRO fneg.x \1 ENDM; MULI <imm>,<ea>; Multiply immediate value with <ea>MULI MACRO fmul.s #\1,\2 ENDM; MULR <reg>,<ea>; Multiply a register value with <ea>MULR MACRO fmul.x \1,\2 ENDM; MULM <imm>,<ea>; Multiply memory value with <ea>MULM MACRO fmul.s \1,\2 ENDM; COPY_PREV <i>; copy *prev value to out[i*32]; clear *prev; prev++; Note: d0.l must contain 0COPY_PREV MACRO move.l (a3),32*DSIZE*\1(a1) move.l d0,(a3)+ ENDM; Perform an IMDCT;; a0: in array (float *); a1: out array (float *); a2: prev block (float *); d0.w: block type; d1.w: mixed; d2.w: sb_max;@MPEGIMDF_hybrid_MPEGIMDF_hybrid movem.l d2-d7/a2-a6,-(sp) fmovem.x fp0-fp7,-(sp) move.l a2,a3 ; a3 = prev block move.l d0,d3 ; d3 = block type clr.l d4 ; d4 = sb move.l #SSLIMIT*SSIZE,d5 tst.w d1 beq MPEGIMDF_imd0 ; mixed block (long block, win = 0) lea imdct_e_win0,a2 ; even win0 bsr imdct_l add.l d5,a0 ; in += SSLIMIT add.l d5,a3 ; prev += SSLIMIT addq.l #DSIZE,a1 ; out++ addq.w #1,d4 cmp.w d2,d4 bge MPEGIMDF_imd9 lea imdct_o_win0,a2 ; odd win0 bsr imdct_l add.l d5,a0 ; in += SSLIMIT add.l d5,a3 ; prev += SSLIMIT addq.l #DSIZE,a1 ; out++ addq.w #1,d4 cmp.w d2,d4 bge MPEGIMDF_imd9MPEGIMDF_imd0 cmp.w #2,d3 bne MPEGIMDF_imd5 ; Long blocksMPEGIMDF_imd1 ; Short blocks lea imdct_e_win2,a2 ; even win2 bsr imdct_s add.l d5,a0 ; in += SSLIMIT add.l d5,a3 ; prev += SSLIMIT addq.l #DSIZE,a1 ; out++ addq.w #1,d4 cmp.w d2,d4 bge MPEGIMDF_imd9 lea imdct_o_win2,a2 ; odd win2 bsr imdct_s add.l d5,a0 ; in += SSLIMIT add.l d5,a3 ; prev += SSLIMIT addq.l #DSIZE,a1 ; out++ addq.w #1,d4 cmp.w d2,d4 bge MPEGIMDF_imd9 bra MPEGIMDF_imd1MPEGIMDF_imd5 ; Long blocks lea imdct_e_win,a2 move.l (a2,d3*4),a2 ; even win bsr imdct_l add.l d5,a0 ; in += SSLIMIT add.l d5,a3 ; prev += SSLIMIT addq.l #DSIZE,a1 ; out++ addq.w #1,d4 cmp.w d2,d4 bge MPEGIMDF_imd9 lea imdct_o_win,a2 move.l (a2,d3*4),a2 ; odd win bsr imdct_l add.l d5,a0 ; in += SSLIMIT add.l d5,a3 ; prev += SSLIMIT addq.l #DSIZE,a1 ; out++ addq.w #1,d4 cmp.w d2,d4 bge MPEGIMDF_imd9 bra MPEGIMDF_imd5MPEGIMDF_imd9 ; Fill remaining blocks with help of prev blocks moveq.l #0,d0MPEGIMDF_imd91 cmp.w #SBLIMIT,d4 bge MPEGIMDF_imde COPY_PREV 0 COPY_PREV 1 COPY_PREV 2 COPY_PREV 3 COPY_PREV 4 COPY_PREV 5 COPY_PREV 6 COPY_PREV 7 COPY_PREV 8 COPY_PREV 9 COPY_PREV 10 COPY_PREV 11 COPY_PREV 12 COPY_PREV 13 COPY_PREV 14 COPY_PREV 15 COPY_PREV 16 COPY_PREV 17 addq.l #DSIZE,a1 ; out++ addq.w #1,d4 bra MPEGIMDF_imd91MPEGIMDF_imde fmovem.x (sp)+,fp0-fp7 movem.l (sp)+,d2-d7/a2-a6 rts; Perform a long IMDCT;; a0: in array (float *); a1: out array (float *); a2: window (float *); a3: prev block (float *);@MPEGIMDF_long_MPEGIMDF_long movem.l d2-d7/a2-a6,-(sp) fmovem.x fp0-fp7,-(sp) bsr imdct_l fmovem.x (sp)+,fp0-fp7 movem.l (sp)+,d2-d7/a2-a6 rts; Perform a short IMDCT;; a0: in array (float *); a1: out array (float *); a2: window (float *); a3: prev block (float *);@MPEGIMDF_short_MPEGIMDF_short movem.l d2-d7/a2-a6,-(sp) fmovem.x fp0-fp7,-(sp) bsr imdct_s fmovem.x (sp)+,fp0-fp7 movem.l (sp)+,d2-d7/a2-a6 rts; COS9_x = cos( pi / 18 * x)COS9_1 fequ 9.848077530e-1COS9_2 fequ 9.396926208e-1COS9_3 fequ 8.660254038e-1COS9_4 fequ 7.660444431e-1COS9_5 fequ 6.427876097e-1COS9_6 fequ 5e-1COS9_7 fequ 3.420201433e-1COS9_8 fequ 1.736481777e-1; COST36_x = 0.5 / cos( pi * (2x+1) / 36 )COST36_0 fequ 5.019099188e-1COST36_1 fequ 5.176380902e-1COST36_2 fequ 5.516889595e-1COST36_3 fequ 6.103872944e-1COST36_4 fequ 7.071067812e-1COST36_5 fequ 8.717233978e-1COST36_6 fequ 1.183100792COST36_7 fequ 1.931851653COST36_8 fequ 5.736856623; Get input even samples; GET_I0 <num>,<reg>GET_I0 MACRO MOVM \1*2*SSIZE(a0),\2 ENDM; Get input odd samples; GET_I1 <num>,<reg>GET_I1 MACRO MOVM \1*2*SSIZE+SSIZE(a0),\2 ENDM; Add input even samples; ADD_I0 <num>,<reg>ADD_I0 MACRO ADDM \1*2*SSIZE(a0),\2 ENDM; Add input odd samples; ADD_I1 <num>,<reg>ADD_I1 MACRO ADDM \1*2*SSIZE+SSIZE(a0),\2 ENDM; Sub input even samples; SUB_I0 <num>,<reg>SUB_I0 MACRO SUBM \1*2*SSIZE(a0),\2 ENDM; Sub input odd samples; SUB_I1 <num>,<reg>SUB_I1 MACRO SUBM \1*2*SSIZE+SSIZE(a0),\2 ENDM; Compute CM( I0(i), <cos> ) -> <reg>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -