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

📄 fullinser.asm

📁 用ADI DSP汇编指令编写的全内插函数(包括水平、垂直、交叉内插)
💻 ASM
字号:
/**********************************************

   该函数的功能主要是进行整帧的图象内插
   在该函数内一次完成,水平,垂直和交叉
   内插。
完成r8*8的基础块内插耗时为:374cycles
此函数比原函数增加四句,在后面有标注
**********************************************/
.section L1_code;
.global __fullinterpolate;
.align 8;
__fullinterpolate:
       [--SP] = (R7:4,P5:3);
       P0 = R0;                //输入数据的地址
       P1 = R1;                //水平内插的输出地址
       P2 = R2;                //垂直内插的输出地址
       P3 = [SP+40];           //交叉内插的输出地址
       P4 = [SP+44];           //Whide
       R3 = [SP+48];           //Hight
       R4 = [SP+52];           //stride
       M0 = R3;     //高
       M1 = R4;     //跨距
       R5 = P4;     //宽
       I2 = P0;     //输入数据
       L2 = 0;
       I3 = M0;     //高
       P5 = I3;     //高
       M3 = 1;
       R3 = R4-R5(S)||I2 += M1;             //stride-Whide;I2指向下一行
       M2 = R3;                         //stride-Whide
       I3 = P0;                       //输入数据
       I1 = M2;          //比原函数添加句1
       I1+=4;           //添加句2
       P0 = I1;         //添加句3
       I0 = 0;
       LSETUP(INSERTO_ST,INSERTO_END) LC1 = P5; //核心算法开始
INSERTO_ST:
       P5 = P4;
       P5 = P5>>2; 
       R6=B[P5--](x);     //添加句4                 //调整循环的次数,相当于P5=P5-1,将内循环的最后一次循环放在后面执行;
       LSETUP(INSERTI_ST,INSERTI_END) LC0 = P5;
INSERTI_ST:
       R0 = [I3++]||R2 = [I2++];                //P0指向输入数据的第n行
                                                //I2指向输入数据的第n+1行
       I1 = 0;
       R4 = BYTEOP1P(R1:0,R3:2)||R1 = [I3--]||R3 = [I2];                //垂直内插的计算
       R4 = BYTEOP2P(R1:0,R3:2)(RNDL)||[P2++] = R4;          //交叉内插的计算
       I0 = 1;
       I1 = 1;
       R5 = BYTEOP2P(R1:0,R3:2)(RNDH);          //4四个8位数取平均结果放在高位字节
       R4 = R4+|+R5||I0 -= M3||R2 =[I3++];    //I0=0
       R3 = R1;
       R4 = BYTEOP1P(R1:0,R3:2)||[P3++] = R4;                //水平内插的计算
INSERTI_END: [P1++] =R4;
       R0 = [I3++]||R2 = [I2++];                //P0指向输入数据的第n行
                                                //I2指向输入数据的第n+1行
       I1 = 0;
       R4 = BYTEOP1P(R1:0,R3:2)||R1 = [I3--]||R3 = [I2];                //垂直内插的计算
       R6 = BYTEOP2P(R1:0,R3:2)(RNDL);          //交叉内插的计算
       [P2++P0] = R4;
       I0 = 1;
       I1 = 1;
       R7 = BYTEOP2P(R1:0,R3:2)(RNDH);          //4四个8位数取平均结果放在高位字节
       R6 = R6+|+R7||I0 -= M3||R2 =[I3++];    //I0=0
       R3 = R1;
       R4 = BYTEOP1P(R1:0,R3:2);                //水平内插的计算
       [P3++P0] = R6;
       [P1++P0] =R4;                         //输出数据换行,原函数编程只是输入数据换行,没有实现输出数据换行
                           
                                 
INSERTO_END:  R7 = [I2++M2]||R6 = [I3++M2]; //输入的数据换行
      (R7:4,P5:3) = [SP++];
       RTS;                                    //函数返回
       NOP; 
__fullinterpolate.end:

⌨️ 快捷键说明

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