📄 mpegimdf.a
字号:
; CM0 i,<cos>,<reg>CM0 MACRO GET_I0 \1,\3 MULI \2,\3 ENDM; Compute CM( I1(i), <cos> ) -> <reg>; CM1 i,<cos>,<reg>CM1 MACRO GET_I1 \1,\3 MULI \2,\3 ENDM; Multiply and Add input even samples; fp0 is modified; ADCM0 <i>,<cos>,<reg>ADCM0 MACRO CM0 \1,\2,fp0 ADDR fp0,\3 ENDM; Multiply and Add input odd samples; fp0 is modified; ADCM1 <i>,<cos>,<reg>ADCM1 MACRO CM1 \1,\2,fp0 ADDR fp0,\3 ENDM; Multiply and Sub input even samples; fp0 is modified; SUCM0 <i>,<cos>,<reg>SUCM0 MACRO CM0 \1,\2,fp0 SUBR fp0,\3 ENDM; Multiply and Sub input odd samples; fp0 is modified; SUCM1 <i>,<cos>,<reg>SUCM1 MACRO CM1 \1,\2,fp0 SUBR fp0,\3 ENDM; Set a value to out block; SET_OUT <i>,<reg>SET_OUT MACRO MOVM \2,32*DSIZE*\1(a1) ENDM; Set a value to previous block; SET_PREV <i>,<reg>SET_PREV MACRO MOVM \2,DSIZE*\1(a3) ENDM; Store output pair; uses fp0 & fp1 (sum0 & sum1); fp0..fp2 are modified; ST_PAIR <v>ST_PAIR MACRO MOVR fp0,fp2 ADDR fp1,fp2 ; fp2 = tmp = sum0 + sum1 SUBR fp1,fp0 ; fp0 = sum0 - sum1 MOVR fp0,fp1 ; ts[SBLIMIT*(8-(v))] = prev[8-(v)] + WIN_MULT( sum0, 8-(v) ) MULM WSIZE*8-WSIZE*\1(a2),fp1 ADDM DSIZE*8-DSIZE*\1(a3),fp1 MOVM fp1,32*DSIZE*8-32*DSIZE*\1(a1) ; prev[8-(v)] = WIN_MULT( tmp, 26-(v) ) MOVR fp2,fp1 MULM WSIZE*26-WSIZE*\1(a2),fp1 MOVM fp1,DSIZE*8-DSIZE*\1(a3) ; ts[SBLIMIT*(9+(v))] = prev[9+(v)] + WIN_MULT( sum0, 9+(v) ) MULM WSIZE*9+WSIZE*\1(a2),fp0 ADDM DSIZE*9+DSIZE*\1(a3),fp0 MOVM fp0,32*DSIZE*9+32*DSIZE*\1(a1) ; prev[9+(v)] = WIN_MULT( tmp, 27+(v) ) MULM WSIZE*27+WSIZE*\1(a2),fp2 MOVM fp2,DSIZE*9+DSIZE*\1(a3) ENDM; Store low output; uses fp4..fp7 (tmp1a..tmp2b); fp0..fp2 are modified; ST1 <cost36>, <v>ST1 MACRO MOVR fp4,fp0 ADDR fp6,fp0 ; fp0 = sum0 = tmp1a + tmp2a MOVR fp5,fp1 ADDR fp7,fp1 MULI \1,fp1 ; fp1 = sum1 = T36_MULT( tmp1b + tmp2b, v ) ST_PAIR \2 ENDM; Store high output; uses fp4..fp7 (tmp1a..tmp2b); fp0..fp2 are modified; ST2 <cost36>, <v>ST2 MACRO MOVR fp6,fp0 SUBR fp4,fp0 ; fp0 = sum0 = tmp2a - tmp1a MOVR fp7,fp1 SUBR fp5,fp1 MULI \1,fp1 ; fp1 = sum1 = T36_MULT( tmp2b - tmp1b, v ) ST_PAIR \2 ENDM; Add inputs; ADD_IN <i1>,<i2> ie <i1> + <i2> -> <i1>ADD_IN MACRO MOVM \1*SSIZE(a0),fp0 ADDM \2*SSIZE(a0),fp0 MOVM fp0,\1*SSIZE(a0) ENDM;; IMDCT for Long blocks;; a0: input array (float *); a1: output out (float *); a2: window array (float *); a3: prev block (float *)imdct_l; THERE IS A BUG IN GENAM; BAD HANDLE OF FLOATING POINT CONTANTS !!!; 0.5 is coded as 0.05 !!!; MOVM #0.5019099188,fp0; MOVM #5.019099188e-1,fp0; MOVM #0.05019099188,fp0; MOVM #5.019099188e-2,fp0; MOVM #5.019099188,fp0 link a6,#-4*4 ; need 4 floats lea -4*4(a6),a4 ; ta33..tb66 needs 4 floats ADD_IN 17,16 ; in[17] += in[16] ADD_IN 16,15 ADD_IN 15,14 ADD_IN 14,13 ADD_IN 13,12 ADD_IN 12,11 ADD_IN 11,10 ADD_IN 10,9 ADD_IN 9,8 ADD_IN 8,7 ADD_IN 7,6 ADD_IN 6,5 ADD_IN 5,4 ADD_IN 4,3 ADD_IN 3,2 ADD_IN 2,1 ADD_IN 1,0 ADD_IN 17,15 ADD_IN 15,13 ADD_IN 13,11 ADD_IN 11,9 ADD_IN 9,7 ADD_IN 7,5 ADD_IN 5,3 ADD_IN 3,1 ; Calculate ta33, ta66, tb33 & tb66 ; x(a4) -> 0 1 2 3 ; CM0 3,8.660254038e-1,fp0 MOVM fp0,0*TSIZE(a4) CM0 6,5e-1,fp0 MOVM fp0,1*TSIZE(a4) CM1 3,8.660254038e-1,fp0 MOVM fp0,2*TSIZE(a4) CM1 6,5e-1,fp0 MOVM fp0,3*TSIZE(a4) ; STEP 1 ; ; fp4 = tmp1a = CF( CM( I0(1), 1 ) + ta33 + CM( I0(5), 5 ) + CM( I0(7), 7 ) ) MOVM 0*TSIZE(a4),fp4 ADCM0 1,9.848077530e-1,fp4 ADCM0 5,6.427876097e-1,fp4 ADCM0 7,3.420201433e-1,fp4 ; fp5 = tmp1b = CF( CM( I1(1), 1 ) + tb33 + CM( I1(5), 5 ) + CM( I1(7), 7 ) ) MOVM 2*TSIZE(a4),fp5 ADCM1 1,9.848077530e-1,fp5 ADCM1 5,6.427876097e-1,fp5 ADCM1 7,3.420201433e-1,fp5 ; fp6 = tmp2a = CF( CM1( I0(0) ) + CM( I0(2), 2 ) + CM( I0(4), 4 ) + ta66 + CM( I0(8), 8 ) ) MOVM 1*TSIZE(a4),fp6 ADD_I0 0,fp6 ADCM0 2,9.396926208e-1,fp6 ADCM0 4,7.660444431e-1,fp6 ADCM0 8,1.736481777e-1,fp6 ; fp7 = tmp2b = CF( CM1( I1(0) ) + CM( I1(2), 2 ) + CM( I1(4), 4 ) + tb66 + CM( I1(8), 8 ) ) MOVM 3*TSIZE(a4),fp7 ADD_I1 0,fp7 ADCM1 2,9.396926208e-1,fp7 ADCM1 4,7.660444431e-1,fp7 ADCM1 8,1.736481777e-1,fp7 ; ST1 5.019099188e-1,0 ; COST36_0 ST2 5.736856623,8 ; COST36_8 ; STEP 2 ; ; fp4 = tmp1a = CF( CM( I0(1) - I0(5) - I0(7), 3 ) ) GET_I0 1,fp4 SUB_I0 5,fp4 SUB_I0 7,fp4 MULI 8.660254038e-1,fp4 ; fp5 = tmp1b = CF( CM( I1(1) - I1(5) - I1(7), 3 ) ) GET_I1 1,fp5 SUB_I1 5,fp5 SUB_I1 7,fp5 MULI 8.660254038e-1,fp5 ; fp6 = tmp2a = CF( CM( I0(2) - I0(4) - I0(8), 6 ) + CM1( I0(0) - I0(6) ) ) GET_I0 2,fp6 SUB_I0 4,fp6 SUB_I0 8,fp6 MULI 5e-1,fp6 ADD_I0 0,fp6 SUB_I0 6,fp6 ; fp7 = tmp2b = CF( CM( I1(2) - I1(4) - I1(8), 6 ) + CM1( I1(0) - I1(6) ) ) GET_I1 2,fp7 SUB_I1 4,fp7 SUB_I1 8,fp7 MULI 5e-1,fp7 ADD_I1 0,fp7 SUB_I1 6,fp7 ; ST1 5.176380902e-1,1 ; COST36_1 ST2 1.931851653,7 ; COST36_7 ; STEP 3 ; ; fp4 = tmp1a = CF( CM( I0(1), 5 ) - ta33 - CM( I0(5), 7 ) + CM( I0(7), 1 ) ) CM0 1,6.427876097e-1,fp4 SUBM 0*TSIZE(a4),fp4 SUCM0 5,3.420201433e-1,fp4 ADCM0 7,9.848077530e-1,fp4 ; fp5 = tmp1b = CF( CM( I1(1), 5 ) - tb33 - CM( I1(5), 7 ) + CM( I1(7), 1 ) ) CM1 1,6.427876097e-1,fp5 SUBM 2*TSIZE(a4),fp5 SUCM1 5,3.420201433e-1,fp5 ADCM1 7,9.848077530e-1,fp5 ; fp6 = tmp2a = CF( CM1( I0(0) ) - CM( I0(2), 8 ) - CM( I0(4), 2 ) + ta66 + CM( I0(8), 4 ) ) GET_I0 0,fp6 SUCM0 2,1.736481777e-1,fp6 SUCM0 4,9.396926208e-1,fp6 ADDM 1*TSIZE(a4),fp6 ADCM0 8,7.660444431e-1,fp6 ; fp7 = tmp2b = CF( CM1( I1(0) ) - CM( I1(2), 8 ) - CM( I1(4), 2 ) + tb66 + CM( I1(8), 4 ) ) GET_I1 0,fp7 SUCM1 2,1.736481777e-1,fp7 SUCM1 4,9.396926208e-1,fp7 ADDM 3*TSIZE(a4),fp7 ADCM1 8,7.660444431e-1,fp7 ; ST1 5.516889595e-1,2 ; COST36_2 ST2 1.183100792,6 ; COST36_6 ; STEP 4 ; ; fp4 = tmp1a = CF( CM( I0(1), 7 ) - ta33 + CM( I0(5), 1 ) - CM( I0(7), 5 ) ) CM0 1,3.420201433e-1,fp4 SUBM 0*TSIZE(a4),fp4 ADCM0 5,9.848077530e-1,fp4 SUCM0 7,6.427876097e-1,fp4 ; fp5 = tmp1b = CF( CM( I1(1), 7 ) - tb33 + CM( I1(5), 1 ) - CM( I1(7), 5 ) ) CM1 1,3.420201433e-1,fp5 SUBM 2*TSIZE(a4),fp5 ADCM1 5,9.848077530e-1,fp5 SUCM1 7,6.427876097e-1,fp5 ; fp6 = tmp2a = CF( CM1( I0(0) ) - CM( I0(2), 4 ) + CM( I0(4), 8 ) + ta66 - CM( I0(8), 2 ) ) GET_I0 0,fp6 SUCM0 2,7.660444431e-1,fp6 ADCM0 4,1.736481777e-1,fp6 ADDM 1*TSIZE(a4),fp6 SUCM0 8,9.396926208e-1,fp6 ; fp7 = tmp2b = CF( CM1( I1(0) ) - CM( I1(2), 4 ) + CM( I1(4), 8 ) + tb66 - CM( I1(8), 2 ) ) GET_I1 0,fp7 SUCM1 2,7.660444431e-1,fp7 ADCM1 4,1.736481777e-1,fp7 ADDM 3*TSIZE(a4),fp7 SUCM1 8,9.396926208e-1,fp7 ; ST1 6.103872944e-1,3 ; COST36_3 ST2 8.717233978e-1,5 ; COST36_5 ; STEP 5 ; ; sum0 = CF( CM1( I0(0) - I0(2) + I0(4) - I0(6) + I0(8) ) ) GET_I0 0,fp0 SUB_I0 2,fp0 ADD_I0 4,fp0 SUB_I0 6,fp0 ADD_I0 8,fp0 ; sum1 = T36_MULT( CF( CM1( I1(0) - I1(2) + I1(4) - I1(6) + I1(8) ) ), 4 ) GET_I1 0,fp1 SUB_I1 2,fp1 ADD_I1 4,fp1 SUB_I1 6,fp1 ADD_I1 8,fp1 MULI 7.071067812e-1,fp1 ; COST36_4 ST_PAIR 4 unlk a6 rts; COS6_x = cos( pi / 6 * x )COS6_1 fequ 8.660254038e-1COS6_2 fequ 5e-1; COST36_x = 0.5 / cos( pi * (2x+1) / 12 )COST12_0 fequ 5.176380902e-1COST12_1 fequ 7.071067812e-1COST12_2 fequ 1.931851653
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -