📄 fullinser.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 + -