📄 idct01.s
字号:
;//************************************
;//File Name: idct.s
;//Author: Anna
;//Date:
;//************************************
C2 EQU 118
C4 EQU 91
C6 EQU 49
Q EQU 69
R EQU 167
;//quantizer EQU 1
;//q_scale EQU 1
q_2scale EQU 2
q_add EQU 1
AREA IDCT,CODE,READONLY
EXPORT AAN_INT
CODE32
AAN_INT
;//vertical idct
LDR R12,=quant_idct_matrix
MOV R1,#8
LOOP1
LDRSH R2,[R0] ;//dct_buf[0][j]
LDR R11,[R12] ;//read the number_value of the matrix
B VER_IDCT
RE_VER
LDRSH R2,[R0,#2]! ;// the first address move to the next number
LDR R11,[R12,#4]! ;//the first address move to the next number
SUBS R1,R1,#1
BNE LOOP1
;//horizontal idct
MOV R1,#8
MOV R3,#16
SUB R0,R0,R3
LOOP2
LDRSH R2,[R0] ;//dct_buf[j][0]
B HOR_IDCT
RE_HOR
LDRSH R2,[R0,#16]!
SUBS R1,R1,#1
BNE LOOP2
MOV PC,LR ;//return
VER_IDCT
LDR R10,=q_2scale
LDR R9,=q_add
CMP R1,#8
BNE ac_iquant
MUL R2,R11,R2 ;//dc iquant
MOV R2,R2,ASR#12
B read_buf1
ac_iquant
;//LDR R3,=q_2scale
;//LDR R4,=q_add
CMP R2,#0
BGT coef0_hi_zero
RSB R2,R2,#0
MLA R2,R10,R2,R9
MUL R2,R11,R2
MOV R2,R2,ASR#12
RSB R2,R2,#0
B read_buf1
coef0_hi_zero
MLA R2,R10,R2,R9
MUL R2,R11,R2
MOV R2,R2,ASR#12
read_buf1
LDRSH R3,[R0,#16] ;//dct_buf[1][j]
LDR R11,[R12,#32]
;//LDR R4,=q_2scale
;// LDR R5,=q_add
CMP R3,#0
BGT coef1_hi_zero
RSB R3,R3,#0
MLA R3,R10,R3,R9
MUL R3,R11,R3
MOV R3,R3,ASR#12
RSB R3,R3,#0
B read_buf2
coef1_hi_zero
MLA R3,R10,R3,R9
MUL R3,R11,R3
MOV R3,R3,ASR#12
read_buf2
LDRSH R4,[R0,#32] ;//dct_buf[2][j]
LDR R11,[R12,#64]
;// LDR R5,=q_2scale
;// LDR R6,=q_add
CMP R4,#0
BGT coef2_hi_zero
RSB R4,R4,#0
MLA R4,R10,R4,R9
MUL R4,R11,R4
MOV R4,R4,ASR#12
RSB R4,R4,#0
B read_buf3
coef2_hi_zero
MLA R4,R10,R4,R9
MUL R4,R11,R4
MOV R4,R4,ASR#12
read_buf3
LDRSH R5,[R0,#48] ;//dct_buf[3][j]
LDR R11,[R12,#96]
;//LDR R6,=q_2scale
;//LDR R7,=q_add
CMP R5,#0
BGT coef3_hi_zero
RSB R5,R5,#0
MLA R5,R10,R5,R9
MUL R5,R11,R5
MOV R5,R5,ASR#12
RSB R5,R5,#0
B read_buf4
coef3_hi_zero
MLA R5,R10,R5,R9
MUL R5,R11,R5
MOV R5,R5,ASR#12
read_buf4
LDRSH R6,[R0,#64] ;//dct_buf[4][j]
LDR R11,[R12,#128]
;// LDR R7,=q_2scale
;// LDR R8,=q_add
CMP R6,#0
BGT coef4_hi_zero
RSB R6,R6,#0
MLA R6,R10,R6,R9
MUL R6,R11,R6
MOV R6,R6,ASR#12
RSB R6,R6,#0
B read_buf5
coef4_hi_zero
MLA R6,R10,R6,R9
MUL R6,R11,R6
MOV R6,R6,ASR#12
read_buf5
LDRSH R7,[R0,#80] ;//dct_buf[5][j]
LDR R11,[R12,#160]
;// LDR R8,=q_2scale
;// LDR R9,=q_add
CMP R7,#0
BGT coef5_hi_zero
RSB R7,R7,#0
MLA R7,R10,R7,R9
MUL R7,R11,R7
MOV R7,R7,ASR#12
RSB R7,R7,#0
B read_buf6
coef5_hi_zero
MLA R7,R10,R7,R9
MUL R7,R11,R7
MOV R7,R7,ASR#12
read_buf6
LDRSH R8,[R0,#96] ;//dct_buf[6][j]
LDR R11,[R12,#192]
;// LDR R9,=q_2scale
;// LDR R10,=q_add
CMP R8,#0
BGT coef6_hi_zero
RSB R8,R8,#0
MLA R8,R10,R8,R9
MUL R8,R11,R8
MOV R8,R8,ASR#12
RSB R8,R8,#0
B read_buf7
coef6_hi_zero
MLA R8,R10,R8,R9
MUL R8,R11,R8
MOV R8,R8,ASR#12
read_buf7
LDRSH R9,[R0,#112] ;//dct_buf[7][j]
;// LDR R11,[R12,#224]
;// LDR R10,=q_2scale
LDR R11,=q_add
CMP R9,#0
BGT coef7_hi_zero
RSB R9,R9,#0
MLA R9,R10,R9,R11
LDR R11,[R12,#224]
MUL R9,R11,R9
MOV R9,R9,ASR#12
RSB R9,R9,#0
B main_idct
coef7_hi_zero
MLA R9,R10,R9,R11
LDR R11,[R12,#224]
MUL R9,R11,R9
MOV R9,R9,ASR#12
main_idct
;//step 1
MOV R2,R2,ASR#1 ;//a0
;// MOV R6,R6,LSL#1 ;//a1
SUB R4,R4,R8
ADD R8,R4,R8,LSL#1
;//MOV R4,R4,LSL#1 ;//a2
;// MOV R8,R8,LSL#1 ;//a3
SUB R7,R7,R5
ADD R5,R7,R5,LSL#1
;//MOV R7,R7,LSL#1 ;//a4
;// MOV R5,R5,LSL#1 ;//temp2
ADD R3,R3,R9
SUB R9,R3,R9,LSL#1
;// MOV R3,R3,LSL#1 ;//temp1
;// MOV R9,R9,LSL#1 ;//a6
SUB R3,R3,R5 ;//a5
ADD R5,R3,R5,LSL#1 ;//a7
LDR R10,=C6
ADD R11,R7,R9
MUL R10,R11,R10
MOV R10,R10,ASR#6 ;//tmp4
;//step2
LDR R11,=C4
MUL R4,R11,R4
MOV R4,R4,ASR#6 ;//a2
MUL R3,R11,R3
MOV R3,R3,ASR#6 ;//a5
LDR R11,=Q
MUL R7,R11,R7
;//MOV R7,R7,ASR#6
ADD R7,R10,R7,ASR#6
RSB R7,R7,#0
;//SUB R7,R7,R10 ;//a4
LDR R11,=R
MUL R9,R11,R9
;// MOV R9,R9,ASR#6
;// SUB R9,R9,R10 ;//a6
RSB R9,R10,R9,ASR#6
;//step3
SUB R10,R9,R5 ;//temp3
MOV R9,R8 ;//a6
SUB R4,R4,R8 ;//a2
ADD R8,R2,R6 ;//a3
SUB R6,R2,R6 ;//a1
SUB R2,R10,R3 ;//a0
MOV R3,R7 ;//a5
MOV R7,R10 ;//a4
;//step4
MOV R10,R2 ;//temp1
MOV R11,R7 ;//temp2
MOV R2,R5 ;//a0
ADD R7,R8,R9 ;//a4
SUB R9,R8,R9 ;//a6
SUB R5,R3,R10 ;//a7
ADD R8,R6,R4 ;//a3
SUB R3,R6,R4 ;//a5
MOV R4,R11 ;//a2
MOV R6,R10 ;//a1
;//step5
ADD R10,R7,R2
STRH R10,[R0] ;//dct_buf[0][j]
ADD R10,R8,R4
STRH R10,[R0,#16] ;//dct_buf[1][j]
SUB R10,R3,R6
STRH R10,[R0,#32] ;//dct_buf[2][j]
SUB R10,R9,R5
STRH R10,[R0,#48] ;//dct_buf[3][j]
ADD R10,R9,R5
STRH R10,[R0,#64] ;//dct_buf[4][j]
ADD R10,R3,R6
STRH R10,[R0,#80] ;//dct_buf[5][j]
SUB R10,R8,R4
STRH R10,[R0,#96] ;//dct_buf[6][j]
SUB R10,R7,R2
STRH R10,[R0,#112] ;//dct_buf[7][j]
B RE_VER
HOR_IDCT
LDRSH R3,[R0,#2] ;//dct_buf[j][1]
LDRSH R4,[R0,#4] ;//dct_buf[j][2]
LDRSH R5,[R0,#6] ;//dct_buf[j][3]
LDRSH R6,[R0,#8] ;//dct_buf[j][4]
LDRSH R7,[R0,#10] ;//dct_buf[j][5]
LDRSH R8,[R0,#12] ;//dct_buf[j][6]
LDRSH R9,[R0,#14] ;//dct_buf[j][7]
;//step 1
MOV R2,R2,ASR#1 ;//a0
;// MOV R6,R6,LSL#1 ;//a1
SUB R4,R4,R8
ADD R8,R4,R8,LSL#1
;// MOV R4,R4,LSL#1 ;//a2
;// MOV R8,R8,LSL#1 ;//a3
SUB R7,R7,R5
ADD R5,R7,R5,LSL#1
;// MOV R7,R7,LSL#1 ;//a4
;// MOV R5,R5,LSL#1 ;//temp2
ADD R3,R3,R9
SUB R9,R3,R9,LSL#1
;// MOV R3,R3,LSL#1 ;//temp1
;// MOV R9,R9,LSL#1 ;//a6
SUB R3,R3,R5 ;//a5
ADD R5,R3,R5,LSL#1 ;//a7
LDR R10,=C6
ADD R11,R7,R9
MUL R10,R11,R10 ;//tmp4
MOV R10,R10,ASR#6
;//step2
LDR R11,=C4
MUL R4,R11,R4
MOV R4,R4,ASR#6 ;//a2
MUL R3,R11,R3
MOV R3,R3,ASR#6 ;//a5
LDR R11,=Q
MUL R7,R11,R7
;//MOV R7,R7,ASR#6
ADD R7,R10,R7,ASR#6
RSB R7,R7,#0
;//SUB R7,R7,R10 ;//a4
LDR R11,=R
MUL R9,R11,R9
;// MOV R9,R9,ASR#6
;// SUB R9,R9,R10 ;//a6
RSB R9,R10,R9,ASR#6
;//step3
SUB R10,R9,R5 ;//temp3
MOV R9,R8 ;//a6
SUB R4,R4,R8 ;//a2
ADD R8,R2,R6 ;//a3
SUB R6,R2,R6 ;//a1
SUB R2,R10,R3 ;//a0
MOV R3,R7 ;//a5
MOV R7,R10 ;//a4
;//step4
MOV R10,R2 ;//temp1
MOV R11,R7 ;//temp2
MOV R2,R5 ;//a0
ADD R7,R8,R9 ;//a4
SUB R9,R8,R9 ;//a6
SUB R5,R3,R10 ;//a7
ADD R8,R6,R4 ;//a3
SUB R3,R6,R4 ;//a5
MOV R4,R11 ;//a2
MOV R6,R10 ;//a1
;//step5
ADD R10,R7,R2
ADD R10,R10,#32
MOV R10,R10,LSR#6
STRH R10,[R0] ;//dct_buf[j][0]
ADD R10,R8,R4
ADD R10,R10,#32
MOV R10,R10,LSR#6
STRH R10,[R0,#2] ;//dct_buf[j][1]
SUB R10,R3,R6
ADD R10,R10,#32
MOV R10,R10,LSR#6
STRH R10,[R0,#4] ;//dct_buf[j][2]
SUB R10,R9,R5
ADD R10,R10,#32
MOV R10,R10,LSR#6
STRH R10,[R0,#6] ;//dct_buf[j][3]
ADD R10,R9,R5
ADD R10,R10,#32
MOV R10,R10,LSR#6
STRH R10,[R0,#8] ;//dct_buf[j][4]
ADD R10,R3,R6
ADD R10,R10,#32
MOV R10,R10,LSR#6
STRH R10,[R0,#10] ;//dct_buf[j][5]
SUB R10,R8,R4
ADD R10,R10,#32
MOV R10,R10,LSR#6
STRH R10,[R0,#12] ;//dct_buf[j][6]
SUB R10,R7,R2
ADD R10,R10,#32
MOV R10,R10,LSR#6
STRH R10,[R0,#14] ;//dct_buf[j][7]
B RE_HOR
quant_idct_matrix DCD 131044,90862,85749,77106,65522,51404,35476,18100
DCD 90862,63001,59487,53463,45431,35642,24589,12550
DCD 85794,59487,56169,50481,42897,33654,23226,11850
DCD 77106,53463,50481,45369,38553,30246,20874,10650
DCD 65522,45431,42897,38553,32761,25702,17738,9050
DCD 51404,35642,33654,30246,25702,20164,13916,7100
DCD 35476,24598,23226,20874,17738,13916,9604,4900
DCD 18100,12550,11850,10650,9050,7100,4900,2500
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -