jidctint.txt
来自「STM32F103ZET6+UCOSII+UCGUI源码」· 文本 代码 · 共 592 行 · 第 1/2 页
TXT
592 行
; generated by ARM C/C++ Compiler with , RVCT4.0 [Build 524] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o.\Obj\jidctint.o --depend=.\Obj\jidctint.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\jidctint.c]
THUMB
AREA ||i.jpeg_idct_islow||, CODE, READONLY, ALIGN=2
jpeg_idct_islow PROC
;;;147 GLOBAL(void)
;;;148 jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
000000 e92d4fff PUSH {r0-r11,lr}
;;;149 JCOEFPTR coef_block,
;;;150 JSAMPARRAY output_buf, JDIMENSION output_col)
;;;151 {
;;;152 INT32 tmp0, tmp1, tmp2, tmp3;
;;;153 INT32 tmp10, tmp11, tmp12, tmp13;
;;;154 INT32 z1, z2, z3, z4, z5;
;;;155 JCOEFPTR inptr;
;;;156 ISLOW_MULT_TYPE * quantptr;
;;;157 int * wsptr;
;;;158 JSAMPROW outptr;
;;;159 JSAMPLE *range_limit = IDCT_range_limit(cinfo);
;;;160 int ctr;
;;;161 int workspace[DCTSIZE2]; /* buffers data between passes */
;;;162 SHIFT_TEMPS
;;;163
;;;164 /* Pass 1: process columns from input, store into work array. */
;;;165 /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
;;;166 /* furthermore, we scale the results by 2**PASS1_BITS. */
;;;167
;;;168 inptr = coef_block;
;;;169 quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
000004 f8d03144 LDR r3,[r0,#0x144]
000008 b0ca SUB sp,sp,#0x128 ;151
00000a 6d09 LDR r1,[r1,#0x50]
;;;170 wsptr = workspace;
00000c 4668 MOV r0,sp
00000e 3380 ADDS r3,r3,#0x80 ;159
;;;171 for (ctr = DCTSIZE; ctr > 0; ctr--) {
000010 f04f0b08 MOV r11,#8
|L1.20|
;;;172 /* Due to quantization, we will usually find that many of the input
;;;173 * coefficients are zero, especially the AC terms. We can exploit this
;;;174 * by short-circuiting the IDCT calculation for any column in which all
;;;175 * the AC terms are zero. In that case each output is equal to the
;;;176 * DC coefficient (with scale factor as needed).
;;;177 * With typical images and quantization tables, half or more of the
;;;178 * column DCT calculations can be simplified this way.
;;;179 */
;;;180
;;;181 if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
000014 f9b24010 LDRSH r4,[r2,#0x10]
000018 46a0 MOV r8,r4
00001a bb0c CBNZ r4,|L1.96|
00001c 8c14 LDRH r4,[r2,#0x20]
00001e b9fc CBNZ r4,|L1.96|
;;;182 inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
000020 8e14 LDRH r4,[r2,#0x30]
000022 b9ec CBNZ r4,|L1.96|
000024 f8b24040 LDRH r4,[r2,#0x40]
000028 b9d4 CBNZ r4,|L1.96|
;;;183 inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
00002a f8b24050 LDRH r4,[r2,#0x50]
00002e b9bc CBNZ r4,|L1.96|
000030 f8b24060 LDRH r4,[r2,#0x60]
000034 b9a4 CBNZ r4,|L1.96|
;;;184 inptr[DCTSIZE*7] == 0) {
000036 f8b24070 LDRH r4,[r2,#0x70]
00003a b98c CBNZ r4,|L1.96|
;;;185 /* AC terms all zero */
;;;186 int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
00003c f9b24000 LDRSH r4,[r2,#0]
000040 680d LDR r5,[r1,#0]
000042 436c MULS r4,r5,r4
000044 00a4 LSLS r4,r4,#2
;;;187
;;;188 wsptr[DCTSIZE*0] = dcval;
;;;189 wsptr[DCTSIZE*1] = dcval;
000046 6004 STR r4,[r0,#0]
;;;190 wsptr[DCTSIZE*2] = dcval;
000048 6204 STR r4,[r0,#0x20]
;;;191 wsptr[DCTSIZE*3] = dcval;
00004a 6404 STR r4,[r0,#0x40]
;;;192 wsptr[DCTSIZE*4] = dcval;
00004c 6604 STR r4,[r0,#0x60]
;;;193 wsptr[DCTSIZE*5] = dcval;
00004e f8c04080 STR r4,[r0,#0x80]
;;;194 wsptr[DCTSIZE*6] = dcval;
000052 f8c040a0 STR r4,[r0,#0xa0]
;;;195 wsptr[DCTSIZE*7] = dcval;
000056 f8c040c0 STR r4,[r0,#0xc0]
;;;196
;;;197 inptr++; /* advance pointers to next column */
;;;198 quantptr++;
;;;199 wsptr++;
;;;200 continue;
00005a f8c040e0 STR r4,[r0,#0xe0]
00005e e0b9 B |L1.468|
|L1.96|
;;;201 }
;;;202
;;;203 /* Even part: reverse the even part of the forward DCT. */
;;;204 /* The rotator is sqrt(2)*c(-6). */
;;;205
;;;206 z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
;;;207 z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
000060 f9b27060 LDRSH r7,[r2,#0x60]
000064 f8d140c0 LDR r4,[r1,#0xc0]
000068 f9b26020 LDRSH r6,[r2,#0x20] ;206
00006c 6c0d LDR r5,[r1,#0x40] ;206
00006e 4367 MULS r7,r4,r7
000070 436e MULS r6,r5,r6 ;206
;;;208
;;;209 z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
000072 19f5 ADDS r5,r6,r7
000074 f2411451 MOV r4,#0x1151
000078 4365 MULS r5,r4,r5
;;;210 tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
00007a 4cc6 LDR r4,|L1.916|
00007c 4367 MULS r7,r4,r7
;;;211 tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
00007e f640443f MOV r4,#0xc3f
000082 4366 MULS r6,r4,r6
000084 eb070c05 ADD r12,r7,r5 ;210
000088 eb050e46 ADD lr,r5,r6,LSL #1
;;;212
;;;213 z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
00008c f9b24000 LDRSH r4,[r2,#0]
;;;214 z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
000090 f9b26040 LDRSH r6,[r2,#0x40]
000094 680d LDR r5,[r1,#0] ;213
000096 f8d17080 LDR r7,[r1,#0x80]
00009a 436c MULS r4,r5,r4 ;213
00009c 437e MULS r6,r7,r6
;;;215
;;;216 tmp0 = (z2 + z3) << CONST_BITS;
00009e 19a5 ADDS r5,r4,r6
;;;217 tmp1 = (z2 - z3) << CONST_BITS;
0000a0 1ba4 SUBS r4,r4,r6
0000a2 036d LSLS r5,r5,#13 ;216
;;;218
;;;219 tmp10 = tmp0 + tmp3;
0000a4 eb05060e ADD r6,r5,lr
;;;220 tmp13 = tmp0 - tmp3;
0000a8 eba5050e SUB r5,r5,lr
0000ac 0364 LSLS r4,r4,#13 ;217
;;;221 tmp11 = tmp1 + tmp2;
0000ae 9544 STR r5,[sp,#0x110]
0000b0 eb04050c ADD r5,r4,r12
;;;222 tmp12 = tmp1 - tmp2;
0000b4 eba4040c SUB r4,r4,r12
0000b8 9647 STR r6,[sp,#0x11c] ;221
;;;223
;;;224 /* Odd part per figure 8; the matrix is unitary and hence its
;;;225 * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
;;;226 */
;;;227
;;;228 tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
0000ba 9546 STR r5,[sp,#0x118]
0000bc 9445 STR r4,[sp,#0x114]
;;;229 tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
0000be f9b27050 LDRSH r7,[r2,#0x50]
0000c2 f8d150a0 LDR r5,[r1,#0xa0]
0000c6 f9b2c070 LDRSH r12,[r2,#0x70] ;228
0000ca fb07f905 MUL r9,r7,r5
0000ce f8d140e0 LDR r4,[r1,#0xe0] ;228
;;;230 tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
;;;231 tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
0000d2 6a0f LDR r7,[r1,#0x20]
0000d4 fb0cfc04 MUL r12,r12,r4 ;228
0000d8 f9b24030 LDRSH r4,[r2,#0x30] ;230
0000dc 6e0d LDR r5,[r1,#0x60] ;230
0000de fb08f607 MUL r6,r8,r7
0000e2 fb04fa05 MUL r10,r4,r5 ;230
;;;232
;;;233 z1 = tmp0 + tmp3;
;;;234 z2 = tmp1 + tmp2;
;;;235 z3 = tmp0 + tmp2;
0000e6 eb0c050a ADD r5,r12,r10
;;;236 z4 = tmp1 + tmp3;
0000ea eb090706 ADD r7,r9,r6
0000ee eb09040a ADD r4,r9,r10 ;234
;;;237 z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
0000f2 eb050e07 ADD lr,r5,r7
0000f6 9442 STR r4,[sp,#0x108]
0000f8 f24254a1 MOV r4,#0x25a1
0000fc eb0c0806 ADD r8,r12,r6 ;233
000100 fb0efe04 MUL lr,lr,r4
;;;238
;;;239 tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
000104 f640148e MOV r4,#0x98e
000108 fb0cfc04 MUL r12,r12,r4
00010c 9541 STR r5,[sp,#0x104] ;237
;;;240 tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
00010e f24414b3 MOV r4,#0x41b3
000112 fb09f904 MUL r9,r9,r4
;;;241 tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
000116 f2462554 MOV r5,#0x6254
00011a fb0afa05 MUL r10,r10,r5
;;;242 tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
;;;243 z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
00011e 4c9e LDR r4,|L1.920|
000120 f243050b MOV r5,#0x300b ;242
000124 436e MULS r6,r5,r6 ;242
000126 fb08f804 MUL r8,r8,r4
;;;244 z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
00012a 4d9c LDR r5,|L1.924|
00012c 9c42 LDR r4,[sp,#0x108]
00012e 9648 STR r6,[sp,#0x120]
000130 436c MULS r4,r5,r4
;;;245 z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
000132 9d41 LDR r5,[sp,#0x104]
000134 9740 STR r7,[sp,#0x100] ;237
000136 eba52605 SUB r6,r5,r5,LSL #8
00013a ebc61686 RSB r6,r6,r6,LSL #6
00013e eba60585 SUB r5,r6,r5,LSL #2
;;;246 z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
000142 4e97 LDR r6,|L1.928|
;;;247
;;;248 z3 += z5;
;;;249 z4 += z5;
000144 9f40 LDR r7,[sp,#0x100]
000146 4475 ADD r5,r5,lr ;248
000148 fb07ee06 MLA lr,r7,r6,lr
;;;250
;;;251 tmp0 += z1 + z3;
00014c eb080605 ADD r6,r8,r5
000150 44b4 ADD r12,r12,r6
;;;252 tmp1 += z2 + z4;
000152 eb04060e ADD r6,r4,lr
000156 eb060709 ADD r7,r6,r9
;;;253 tmp2 += z2 + z3;
00015a 4425 ADD r5,r5,r4
00015c eb05040a ADD r4,r5,r10
;;;254 tmp3 += z1 + z4;
000160 9e48 LDR r6,[sp,#0x120]
000162 eb08050e ADD r5,r8,lr
000166 4435 ADD r5,r5,r6
;;;255
;;;256 /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
;;;257
;;;258 wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
000168 9e47 LDR r6,[sp,#0x11c]
00016a 442e ADD r6,r6,r5
00016c f5066680 ADD r6,r6,#0x400
000170 12f6 ASRS r6,r6,#11
;;;259 wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
000172 6006 STR r6,[r0,#0]
000174 9e47 LDR r6,[sp,#0x11c]
000176 1b75 SUBS r5,r6,r5
000178 f5056580 ADD r5,r5,#0x400
00017c 12ed ASRS r5,r5,#11
;;;260 wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
00017e f8c050e0 STR r5,[r0,#0xe0]
000182 9d46 LDR r5,[sp,#0x118]
000184 4425 ADD r5,r5,r4
000186 f5056580 ADD r5,r5,#0x400
00018a 12ed ASRS r5,r5,#11
;;;261 wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
00018c 6205 STR r5,[r0,#0x20]
00018e 9d46 LDR r5,[sp,#0x118]
000190 1b2c SUBS r4,r5,r4
000192 f5046480 ADD r4,r4,#0x400
000196 12e4 ASRS r4,r4,#11
;;;262 wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
000198 f8c040c0 STR r4,[r0,#0xc0]
00019c 9c45 LDR r4,[sp,#0x114]
00019e 443c ADD r4,r4,r7
0001a0 f5046480 ADD r4,r4,#0x400
0001a4 12e4 ASRS r4,r4,#11
;;;263 wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
0001a6 6404 STR r4,[r0,#0x40]
0001a8 9c45 LDR r4,[sp,#0x114]
0001aa 1be4 SUBS r4,r4,r7
0001ac f5046480 ADD r4,r4,#0x400
0001b0 12e4 ASRS r4,r4,#11
;;;264 wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
0001b2 f8c040a0 STR r4,[r0,#0xa0]
0001b6 9d44 LDR r5,[sp,#0x110]
0001b8 eb05040c ADD r4,r5,r12
0001bc f5046480 ADD r4,r4,#0x400
0001c0 12e4 ASRS r4,r4,#11
;;;265 wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
0001c2 6604 STR r4,[r0,#0x60]
0001c4 9d44 LDR r5,[sp,#0x110]
0001c6 eba5040c SUB r4,r5,r12
0001ca f5046480 ADD r4,r4,#0x400
0001ce 12e4 ASRS r4,r4,#11
0001d0 f8c04080 STR r4,[r0,#0x80]
|L1.468|
;;;266
;;;267 inptr++; /* advance pointers to next column */
0001d4 1c92 ADDS r2,r2,#2
;;;268 quantptr++;
0001d6 1d09 ADDS r1,r1,#4
;;;269 wsptr++;
0001d8 1d00 ADDS r0,r0,#4
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?