📄 jdhuff.txt
字号:
; generated by ARM C/C++ Compiler with , RVCT4.0 [Build 524] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o.\Obj\jdhuff.o --depend=.\Obj\jdhuff.d --device=DARMSTM --apcs=interwork -O3 -I..\..\include -I..\..\..\FWLib\library\inc -I..\..\..\USBLib\library\inc -I..\..\Config -I..\..\GUI\Core -I..\..\GUI\Font -I..\..\GUI\ConvertColor -I..\..\GUI\AntiAlias -I..\..\GUI\ConvertMono -I..\..\GUI\JPEG -I..\..\GUI\MemDev -I..\..\GUI\MultiLayer -I..\..\GUI\Widget -I..\..\GUI\WM -IC:\Keil\ARM\INC\ST\STM32F10x ..\..\GUI\JPEG\jdhuff.c]
THUMB
AREA ||i.decode_mcu||, CODE, READONLY, ALIGN=2
decode_mcu PROC
;;;516 METHODDEF(boolean)
;;;517 decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
000000 e92d4ff3 PUSH {r0,r1,r4-r11,lr}
;;;518 {
000004 4605 MOV r5,r0
;;;519 huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
;;;520 int blkn;
;;;521 BITREAD_STATE_VARS;
;;;522 savable_state state;
;;;523
;;;524 /* Process restart marker if needed; may have to suspend */
;;;525 if (cinfo->restart_interval) {
000006 f8d041bc LDR r4,[r0,#0x1bc]
00000a f8d00114 LDR r0,[r0,#0x114]
00000e b08b SUB sp,sp,#0x2c ;518
000010 46a1 MOV r9,r4 ;519
000012 b330 CBZ r0,|L1.98|
;;;526 if (entropy->restarts_to_go == 0)
000014 f8d90024 LDR r0,[r9,#0x24]
000018 bb18 CBNZ r0,|L1.98|
00001a 6920 LDR r0,[r4,#0x10]
00001c f8d511b8 LDR r1,[r5,#0x1b8]
000020 17c3 ASRS r3,r0,#31
000022 698a LDR r2,[r1,#0x18]
000024 eb007053 ADD r0,r0,r3,LSR #29
000028 eb0200e0 ADD r0,r2,r0,ASR #3
00002c 2600 MOVS r6,#0
00002e 6188 STR r0,[r1,#0x18]
000030 6126 STR r6,[r4,#0x10]
000032 f8d501b8 LDR r0,[r5,#0x1b8]
000036 6881 LDR r1,[r0,#8]
000038 4628 MOV r0,r5
00003a 4788 BLX r1
00003c 2800 CMP r0,#0
|L1.62|
00003e d07e BEQ |L1.318|
000040 2000 MOVS r0,#0
000042 e003 B |L1.76|
|L1.68|
000044 eb040180 ADD r1,r4,r0,LSL #2
000048 1c40 ADDS r0,r0,#1
00004a 614e STR r6,[r1,#0x14]
|L1.76|
00004c f8d51148 LDR r1,[r5,#0x148]
000050 4281 CMP r1,r0
000052 dcf7 BGT |L1.68|
000054 f8d50114 LDR r0,[r5,#0x114]
000058 6260 STR r0,[r4,#0x24]
00005a f8d501a0 LDR r0,[r5,#0x1a0]
00005e b900 CBNZ r0,|L1.98|
000060 60a6 STR r6,[r4,#8]
|L1.98|
;;;527 if (! process_restart(cinfo))
;;;528 return FALSE;
;;;529 }
;;;530
;;;531 /* If we've run out of data, just leave the MCU set to zeroes.
;;;532 * This way, we return uniform gray for the remainder of the segment.
;;;533 */
;;;534 if (! entropy->pub.insufficient_data) {
000062 f8d90008 LDR r0,[r9,#8]
000066 2800 CMP r0,#0
000068 d16a BNE |L1.320|
;;;535
;;;536 /* Load up working state */
;;;537 BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
00006a 9509 STR r5,[sp,#0x24]
;;;538 ASSIGN_STATE(state, entropy->saved);
00006c f1090114 ADD r1,r9,#0x14
000070 69a8 LDR r0,[r5,#0x18]
000072 910a STR r1,[sp,#0x28] ;537
000074 6803 LDR r3,[r0,#0] ;537
000076 9305 STR r3,[sp,#0x14] ;537
000078 6840 LDR r0,[r0,#4] ;537
00007a 9006 STR r0,[sp,#0x18] ;537
00007c c98e LDM r1,{r1-r3,r7} ;537
00007e e9d96003 LDRD r6,r0,[r9,#0xc] ;537
000082 ac01 ADD r4,sp,#4
000084 c48e STM r4!,{r1-r3,r7} ;537
;;;539
;;;540 /* Outer loop handles each block in the MCU */
;;;541
;;;542 for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
000086 f04f0800 MOV r8,#0
00008a 4631 MOV r1,r6 ;537
00008c 4602 MOV r2,r0 ;537
00008e e0fb B |L1.648|
|L1.144|
;;;543 JBLOCKROW block = MCU_data[blkn];
000090 980c LDR r0,[sp,#0x30]
;;;544 d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn];
;;;545 d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn];
;;;546 register int s, k, r;
;;;547
;;;548 /* Decode a single block's worth of coefficients */
;;;549
;;;550 /* Section F.2.2.1: decode the DC coefficient difference */
;;;551 HUFF_DECODE(s, br_state, dctbl, return FALSE, label1);
000092 2a08 CMP r2,#8
000094 f850a028 LDR r10,[r0,r8,LSL #2] ;543
000098 eb090088 ADD r0,r9,r8,LSL #2 ;544
00009c 6f07 LDR r7,[r0,#0x70]
00009e 6c84 LDR r4,[r0,#0x48]
0000a0 4683 MOV r11,r0 ;544
0000a2 da0b BGE |L1.188|
0000a4 2300 MOVS r3,#0
0000a6 a805 ADD r0,sp,#0x14
0000a8 f7fffffe BL jpeg_fill_bit_buffer
0000ac 2800 CMP r0,#0
0000ae d0c6 BEQ |L1.62|
0000b0 e9dd1207 LDRD r1,r2,[sp,#0x1c]
0000b4 2a08 CMP r2,#8
0000b6 da01 BGE |L1.188|
0000b8 2301 MOVS r3,#1
0000ba e00f B |L1.220|
|L1.188|
0000bc f1a20008 SUB r0,r2,#8
0000c0 fa41f000 ASR r0,r1,r0
0000c4 b2c0 UXTB r0,r0
0000c6 eb040380 ADD r3,r4,r0,LSL #2
0000ca f8d33090 LDR r3,[r3,#0x90]
0000ce b123 CBZ r3,|L1.218|
0000d0 4420 ADD r0,r0,r4
0000d2 1ad2 SUBS r2,r2,r3
0000d4 f8904490 LDRB r4,[r0,#0x490]
0000d8 e009 B |L1.238|
|L1.218|
0000da 2309 MOVS r3,#9
|L1.220|
0000dc 9300 STR r3,[sp,#0]
0000de 4623 MOV r3,r4
0000e0 a805 ADD r0,sp,#0x14
0000e2 f7fffffe BL jpeg_huff_decode
0000e6 1e04 SUBS r4,r0,#0
0000e8 db29 BLT |L1.318|
0000ea e9dd1207 LDRD r1,r2,[sp,#0x1c]
|L1.238|
;;;552 if (s) {
0000ee b1dc CBZ r4,|L1.296|
;;;553 CHECK_BIT_BUFFER(br_state, s, return FALSE);
0000f0 42a2 CMP r2,r4
0000f2 da07 BGE |L1.260|
0000f4 4623 MOV r3,r4
0000f6 a805 ADD r0,sp,#0x14
0000f8 f7fffffe BL jpeg_fill_bit_buffer
0000fc 2800 CMP r0,#0
0000fe d09e BEQ |L1.62|
000100 e9dd1207 LDRD r1,r2,[sp,#0x1c]
|L1.260|
;;;554 r = GET_BITS(s);
000104 1b12 SUBS r2,r2,r4
000106 fa41f002 ASR r0,r1,r2
00010a 2301 MOVS r3,#1
00010c 40a3 LSLS r3,r3,r4
00010e 1e5b SUBS r3,r3,#1
000110 4018 ANDS r0,r0,r3
;;;555 s = HUFF_EXTEND(r, s);
000112 4b69 LDR r3,|L1.696|
000114 f8533024 LDR r3,[r3,r4,LSL #2]
000118 4283 CMP r3,r0
00011a dd04 BLE |L1.294|
00011c 4b66 LDR r3,|L1.696|
00011e 3340 ADDS r3,r3,#0x40
000120 f8533024 LDR r3,[r3,r4,LSL #2]
000124 4418 ADD r0,r0,r3
|L1.294|
000126 4604 MOV r4,r0
|L1.296|
;;;556 }
;;;557
;;;558 if (entropy->dc_needed[blkn]) {
000128 f8db0098 LDR r0,[r11,#0x98]
00012c b170 CBZ r0,|L1.332|
;;;559 /* Convert DC difference to actual value, update last_dc_val */
;;;560 int ci = cinfo->MCU_membership[blkn];
00012e eb050088 ADD r0,r5,r8,LSL #2
000132 f8d00168 LDR r0,[r0,#0x168]
;;;561 s += state.last_dc_val[ci];
000136 ae01 ADD r6,sp,#4
000138 f8563020 LDR r3,[r6,r0,LSL #2]
00013c e001 B |L1.322|
|L1.318|
00013e e091 B |L1.612|
|L1.320|
000140 e0b3 B |L1.682|
|L1.322|
000142 4423 ADD r3,r3,r4
;;;562 state.last_dc_val[ci] = s;
000144 f8463020 STR r3,[r6,r0,LSL #2]
;;;563 /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */
;;;564 (*block)[0] = (JCOEF) s;
000148 f8aa3000 STRH r3,[r10,#0]
|L1.332|
;;;565 }
;;;566
;;;567 if (entropy->ac_needed[blkn]) {
00014c f8db00c0 LDR r0,[r11,#0xc0]
000150 2800 CMP r0,#0
000152 d054 BEQ |L1.510|
;;;568
;;;569 /* Section F.2.2.2: decode the AC coefficients */
;;;570 /* Since zeroes are skipped, output area must be cleared beforehand */
;;;571 for (k = 1; k < DCTSIZE2; k++) {
000154 2601 MOVS r6,#1
|L1.342|
;;;572 HUFF_DECODE(s, br_state, actbl, return FALSE, label2);
000156 2a08 CMP r2,#8
000158 da0b BGE |L1.370|
00015a 2300 MOVS r3,#0
00015c a805 ADD r0,sp,#0x14
00015e f7fffffe BL jpeg_fill_bit_buffer
000162 2800 CMP r0,#0
000164 d07e BEQ |L1.612|
000166 e9dd1207 LDRD r1,r2,[sp,#0x1c]
00016a 2a08 CMP r2,#8
00016c da01 BGE |L1.370|
00016e 2301 MOVS r3,#1
000170 e00f B |L1.402|
|L1.370|
000172 f1a20008 SUB r0,r2,#8
000176 fa41f000 ASR r0,r1,r0
00017a b2c0 UXTB r0,r0
00017c eb070380 ADD r3,r7,r0,LSL #2
000180 f8d33090 LDR r3,[r3,#0x90]
000184 b123 CBZ r3,|L1.400|
000186 4438 ADD r0,r0,r7
000188 1ad2 SUBS r2,r2,r3
00018a f8900490 LDRB r0,[r0,#0x490]
00018e e009 B |L1.420|
|L1.400|
000190 2309 MOVS r3,#9
|L1.402|
000192 9300 STR r3,[sp,#0]
000194 463b MOV r3,r7
000196 a805 ADD r0,sp,#0x14
000198 f7fffffe BL jpeg_huff_decode
00019c 2800 CMP r0,#0
00019e db63 BLT |L1.616|
0001a0 e9dd1207 LDRD r1,r2,[sp,#0x1c]
|L1.420|
;;;573
;;;574 r = s >> 4;
0001a4 1103 ASRS r3,r0,#4
;;;575 s &= 15;
0001a6 f010040f ANDS r4,r0,#0xf
;;;576
;;;577 if (s) {
0001aa d021 BEQ |L1.496|
;;;578 k += r;
0001ac 441e ADD r6,r6,r3
;;;579 CHECK_BIT_BUFFER(br_state, s, return FALSE);
0001ae 42a2 CMP r2,r4
0001b0 da07 BGE |L1.450|
0001b2 4623 MOV r3,r4
0001b4 a805 ADD r0,sp,#0x14
0001b6 f7fffffe BL jpeg_fill_bit_buffer
0001ba 2800 CMP r0,#0
0001bc d054 BEQ |L1.616|
0001be e9dd1207 LDRD r1,r2,[sp,#0x1c]
|L1.450|
;;;580 r = GET_BITS(s);
0001c2 1b12 SUBS r2,r2,r4
0001c4 fa41f002 ASR r0,r1,r2
0001c8 2301 MOVS r3,#1
0001ca 40a3 LSLS r3,r3,r4
0001cc 1e5b SUBS r3,r3,#1
0001ce 4018 ANDS r0,r0,r3
;;;581 s = HUFF_EXTEND(r, s);
0001d0 4b39 LDR r3,|L1.696|
0001d2 f8533024 LDR r3,[r3,r4,LSL #2]
0001d6 4283 CMP r3,r0
0001d8 dd04 BLE |L1.484|
0001da 4b37 LDR r3,|L1.696|
0001dc 3340 ADDS r3,r3,#0x40
0001de f8533024 LDR r3,[r3,r4,LSL #2]
0001e2 4418 ADD r0,r0,r3
|L1.484|
;;;582 /* Output coefficient in natural (dezigzagged) order.
;;;583 * Note: the extra entries in jpeg_natural_order[] will save us
;;;584 * if k >= DCTSIZE2, which could happen if the data is corrupted.
;;;585 */
;;;586 (*block)[jpeg_natural_order[k]] = (JCOEF) s;
0001e4 4b35 LDR r3,|L1.700|
0001e6 f8533026 LDR r3,[r3,r6,LSL #2]
0001ea f82a0013 STRH r0,[r10,r3,LSL #1]
0001ee e002 B |L1.502|
|L1.496|
;;;587 } else {
;;;588 if (r != 15)
0001f0 2b0f CMP r3,#0xf
0001f2 d147 BNE |L1.644|
;;;589 break;
;;;590 k += 15;
0001f4 360f ADDS r6,r6,#0xf
|L1.502|
0001f6 1c76 ADDS r6,r6,#1 ;571
0001f8 2e40 CMP r6,#0x40 ;571
0001fa dbac BLT |L1.342|
0001fc e042 B |L1.644|
|L1.510|
;;;591 }
;;;592 }
;;;593
;;;594 } else {
;;;595
;;;596 /* Section F.2.2.2: decode the AC coefficients */
;;;597 /* In this path we just discard the values */
;;;598 for (k = 1; k < DCTSIZE2; k++) {
0001fe 2401 MOVS r4,#1
|L1.512|
;;;599 HUFF_DECODE(s, br_state, actbl, return FALSE, label3);
000200 2a08 CMP r2,#8
000202 da0a BGE |L1.538|
000204 2300 MOVS r3,#0
000206 a805 ADD r0,sp,#0x14
000208 f7fffffe BL jpeg_fill_bit_buffer
00020c b350 CBZ r0,|L1.612|
00020e e9dd1207 LDRD r1,r2,[sp,#0x1c]
000212 2a08 CMP r2,#8
000214 da01 BGE |L1.538|
000216 2301 MOVS r3,#1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -