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

📄 32dct_asm.asm

📁 blackfin VisualDSP++ 下的音频32点IDCT变换汇编代码
💻 ASM
字号:
.section    L1_code;
.global     __r32dct;
.align      8;
    
__r32dct:

/******************************* Function Prologue ***************************/
    [--SP] = (R7:4, P5:3);  //Pushing the Registers on stack.
    B0 = R0;                //Pointer to Input matrix.
    B2 = R1;                //Pointer to Temporary matrix.

    I0 = B0;                //I0 points to Input Element (0, 0)
    I1 = B2;                //I1 Pointer to Temporary Element (0, 0)
    M3 = -4; P3 =4;
    M0 = 64; M1 =-60; M2 = 60; P4 = 16; P5 =1;

//********** horizontal setps process (4 times)*****************/ 
// loop1: M0 = 64; M1 =-60; M2 = 60; P4 = 16; P5 = 1;
// loop2: M0 = 32; M1 =-28; M2 = 28; P4 =  8; P5 = 2;
// loop3: M0 = 16; M1 =-12; M2 = 12; P4 =  4; P5 = 4;
// loop4: M0 =  8; M1 = -4; M2 =  4; P4 =  2; P5 = 8;

//    LSETUP (STEPSH_START, STEPSH_END) LC0 = P3;     
//STEPSH_START:

//    [--SP] = LC0; [--SP] = LT0; [--SP] = LB0;   
//    [--SP] = I0; [--SP] = I1;
    
/********** Vertical setps process (p5 times)*****************/ 
    LSETUP (STEPSV_START, STEPSV_END) LC0 = P5;     
STEPSV_START:
     
//********** Arrange the ordinal Npoints to evens-odds order*****************/     
    R0=[ I0 ++ ];
LSETUP (ARRANGE_START, ARRANGE_END) LC1 = P4;    

ARRANGE_START:
    [ I1 ++ M0 ]= R0 || R1=[ I0 ++ ];
ARRANGE_END:   [ I1 ++ M1 ]= R1 || R0=[ I0++ ]; 

//********** Adddown the latter N/2points *************************************/
    I1 += M2;
    I2 = I1;
    I2 += M3;
    P4 += -1;
    LSETUP (ADDDOWN_START, ADDDOWN_END) LC1 = P4;
ADDDOWN_START:
    R0 = [ I1 ] || R1 = [ I2 -- ];
    R0 = R0 + R1(s);   
ADDDOWN_END: [ I1 -- ] = R0;    
    I1 += M0;//I0 += M3;
STEPSV_END:  P4 += 1; 
/*---------------------------------------------------------------*/
    M0 = 32; M1 =-28; M2 = 28; P4 = 8; P5 =2;
    I0 = B2; I1 = B0;
    LSETUP (STEPSV0_START, STEPSV0_END) LC0 = P5;     
STEPSV0_START:
     
//********** Arrange the ordinal Npoints to evens-odds order*****************/     
    R0=[ I0 ++ ];
    LSETUP (ARRANGE0_START, ARRANGE0_END) LC1 = P4;    
ARRANGE0_START:
    [ I1 ++ M0 ]= R0 || R1=[ I0 ++ ];
ARRANGE0_END:   [ I1 ++ M1 ]= R1 || R0=[ I0++ ]; 

//********** Adddown the latter N/2points *************************************/
    I1 += M2;
    I2 = I1;
    I2 += M3;
    P4 += -1;
    LSETUP (ADDDOWN0_START, ADDDOWN0_END) LC1 = P4;
ADDDOWN0_START:
    R0 = [ I1 ] || R1 = [ I2 -- ];
    R0 = R0 + R1(s);   
ADDDOWN0_END: [ I1 -- ] = R0;    
    I1 += M0;I0 += M3;
STEPSV0_END:  P4 += 1; 
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
    M0 = 16; M1 =-12; M2 = 12; P4 = 4; P5 =4;
    I1 = B2; I0 = B0;
    LSETUP (STEPSV1_START, STEPSV1_END) LC0 = P5;     
STEPSV1_START:
     
//********** Arrange the ordinal Npoints to evens-odds order*****************/     
    R0=[ I0 ++ ];
    LSETUP (ARRANGE1_START, ARRANGE1_END) LC1 = P4;    
ARRANGE1_START:
    [ I1 ++ M0 ]= R0 || R1=[ I0 ++ ];
ARRANGE1_END:   [ I1 ++ M1 ]= R1 || R0=[ I0++ ]; 

//********** Adddown the latter N/2points *************************************/
    I1 += M2;
    I2 = I1;
    I2 += M3;
    P4 += -1;
    LSETUP (ADDDOWN1_START, ADDDOWN1_END) LC1 = P4;
ADDDOWN1_START:
    R0 = [ I1 ] || R1 = [ I2 -- ];
    R0 = R0 + R1(s);   
ADDDOWN1_END: [ I1 -- ] = R0;    
    I1 += M0;I0 += M3;
STEPSV1_END:  P4 += 1; 
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
    M0 = 8; M1 =-4; M2 = 4; P4 = 2; P5 =8;
    I1 = B0; I0 = B2;
    LSETUP (STEPSV2_START, STEPSV2_END) LC0 = P5;     
STEPSV2_START:
     
//********** Arrange the ordinal Npoints to evens-odds order*****************/     
    R0=[ I0 ++ ];
    LSETUP (ARRANGE2_START, ARRANGE2_END) LC1 = P4;    
ARRANGE2_START:
    [ I1 ++ M0 ]= R0 || R1=[ I0 ++ ];
ARRANGE2_END:   [ I1 ++ M1 ]= R1 || R0=[ I0++ ]; 

//********** Adddown the latter N/2points *************************************/
    I1 += M2;
    I2 = I1;
    I2 += M3;
    P4 += -1;
    LSETUP (ADDDOWN2_START, ADDDOWN2_END) LC1 = P4;
ADDDOWN2_START:
    R0 = [ I1 ] || R1 = [ I2 -- ];
    R0 = R0 + R1(s);   
ADDDOWN2_END: [ I1 -- ] = R0;    
    I1 += M0;I0 += M3;
STEPSV2_END:  P4 += 1; 
/*--------------------------------------------------------------------*/

//I1 += M0; 
//    R0=M0; R1=M1; R2=M2;
//    R0 >>>=1; R1 >>>=1; R2 >>>=1;
//    R1 += 2; R2 += -2;
//    M0 = R0; M1 = R1; M2 = R2; 
//    P4 = P4>>1; P5 = P5<<1;
//    LB0 = [SP++]; LT0 = [SP++]; LC0 = [SP++];    
//    I0 = [SP++];I1 = [SP++];
//STEPSH_END: nop;
TERMINATE:
    (R7:4,P5:3)=[SP++];     //Pop the registers before returning.
    RTS;                    //Return.
    NOP;                    //to avoid one stall if LINK or UNLINK happens to be
                            //the next instruction after RTS in the memory.

⌨️ 快捷键说明

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