📄 32dct_asm.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 + -