jidctint.txt
来自「STM32F103ZET6+UCOSII+UCGUI源码」· 文本 代码 · 共 592 行 · 第 1/2 页
TXT
592 行
0001da f1ab0b01 SUB r11,r11,#1 ;171
0001de f1bb0f00 CMP r11,#0 ;171
0001e2 f73faf17 BGT |L1.20|
;;;270 }
;;;271
;;;272 /* Pass 2: process rows from work array, store into output array. */
;;;273 /* Note that we must descale the results by a factor of 8 == 2**3, */
;;;274 /* and also undo the PASS1_BITS scaling. */
;;;275
;;;276 wsptr = workspace;
0001e6 4668 MOV r0,sp
;;;277 for (ctr = 0; ctr < DCTSIZE; ctr++) {
0001e8 2200 MOVS r2,#0
|L1.490|
;;;278 outptr = output_buf[ctr] + output_col;
0001ea 994d LDR r1,[sp,#0x134]
0001ec f8514022 LDR r4,[r1,r2,LSL #2]
0001f0 9957 LDR r1,[sp,#0x15c]
0001f2 4421 ADD r1,r1,r4
;;;279 /* Rows of zeroes can be exploited in the same way as we did with columns.
;;;280 * However, the column calculation has created many nonzero AC terms, so
;;;281 * the simplification applies less often (typically 5% to 10% of the time).
;;;282 * On machines with very fast multiplication, it's possible that the
;;;283 * test takes more time than it's worth. In that case this section
;;;284 * may be commented out.
;;;285 */
;;;286
;;;287 #ifndef NO_ZERO_ROW_TEST
;;;288 if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
0001f4 6844 LDR r4,[r0,#4]
0001f6 46a2 MOV r10,r4
0001f8 b9cc CBNZ r4,|L1.558|
0001fa 6884 LDR r4,[r0,#8]
0001fc b9bc CBNZ r4,|L1.558|
0001fe 68c4 LDR r4,[r0,#0xc]
000200 b9ac CBNZ r4,|L1.558|
000202 6904 LDR r4,[r0,#0x10]
000204 b99c CBNZ r4,|L1.558|
;;;289 wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
000206 6944 LDR r4,[r0,#0x14]
000208 b98c CBNZ r4,|L1.558|
00020a 6984 LDR r4,[r0,#0x18]
00020c b97c CBNZ r4,|L1.558|
00020e 69c4 LDR r4,[r0,#0x1c]
000210 b96c CBNZ r4,|L1.558|
;;;290 /* AC terms all zero */
;;;291 JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
000212 6804 LDR r4,[r0,#0]
000214 3410 ADDS r4,r4,#0x10
000216 f3c41449 UBFX r4,r4,#5,#10
00021a 5d1c LDRB r4,[r3,r4]
;;;292 & RANGE_MASK];
;;;293
;;;294 outptr[0] = dcval;
00021c 700c STRB r4,[r1,#0]
;;;295 outptr[1] = dcval;
00021e 704c STRB r4,[r1,#1]
;;;296 outptr[2] = dcval;
000220 708c STRB r4,[r1,#2]
;;;297 outptr[3] = dcval;
000222 70cc STRB r4,[r1,#3]
;;;298 outptr[4] = dcval;
000224 710c STRB r4,[r1,#4]
;;;299 outptr[5] = dcval;
000226 714c STRB r4,[r1,#5]
;;;300 outptr[6] = dcval;
000228 718c STRB r4,[r1,#6]
;;;301 outptr[7] = dcval;
00022a 71cc STRB r4,[r1,#7]
;;;302
;;;303 wsptr += DCTSIZE; /* advance pointer to next row */
;;;304 continue;
00022c e0a9 B |L1.898|
|L1.558|
;;;305 }
;;;306 #endif
;;;307
;;;308 /* Even part: reverse the even part of the forward DCT. */
;;;309 /* The rotator is sqrt(2)*c(-6). */
;;;310
;;;311 z2 = (INT32) wsptr[2];
;;;312 z3 = (INT32) wsptr[6];
;;;313
;;;314 z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
00022e 6987 LDR r7,[r0,#0x18]
000230 6885 LDR r5,[r0,#8]
000232 f2411651 MOV r6,#0x1151
000236 19ec ADDS r4,r5,r7
000238 4374 MULS r4,r6,r4
;;;315 tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
00023a 4e56 LDR r6,|L1.916|
00023c 4377 MULS r7,r6,r7
;;;316 tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
00023e f640463f MOV r6,#0xc3f
000242 eb070c04 ADD r12,r7,r4 ;315
000246 4375 MULS r5,r6,r5
;;;317
;;;318 tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;
;;;319 tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;
000248 6907 LDR r7,[r0,#0x10]
00024a 6806 LDR r6,[r0,#0]
00024c eb040545 ADD r5,r4,r5,LSL #1 ;316
000250 1bf4 SUBS r4,r6,r7
000252 443e ADD r6,r6,r7 ;318
000254 0376 LSLS r6,r6,#13 ;318
;;;320
;;;321 tmp10 = tmp0 + tmp3;
000256 1977 ADDS r7,r6,r5
;;;322 tmp13 = tmp0 - tmp3;
000258 1b75 SUBS r5,r6,r5
00025a 0364 LSLS r4,r4,#13 ;319
;;;323 tmp11 = tmp1 + tmp2;
;;;324 tmp12 = tmp1 - tmp2;
00025c 9544 STR r5,[sp,#0x110]
00025e eb04060c ADD r6,r4,r12 ;323
000262 eba4050c SUB r5,r4,r12
000266 9747 STR r7,[sp,#0x11c]
000268 9646 STR r6,[sp,#0x118]
;;;325
;;;326 /* Odd part per figure 8; the matrix is unitary and hence its
;;;327 * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
;;;328 */
;;;329
;;;330 tmp0 = (INT32) wsptr[7];
00026a 9545 STR r5,[sp,#0x114]
;;;331 tmp1 = (INT32) wsptr[5];
;;;332 tmp2 = (INT32) wsptr[3];
;;;333 tmp3 = (INT32) wsptr[1];
;;;334
;;;335 z1 = tmp0 + tmp3;
00026c 69c4 LDR r4,[r0,#0x1c]
00026e f8d0900c LDR r9,[r0,#0xc]
000272 6945 LDR r5,[r0,#0x14]
000274 eb04070a ADD r7,r4,r10
;;;336 z2 = tmp1 + tmp2;
;;;337 z3 = tmp0 + tmp2;
000278 eb040c09 ADD r12,r4,r9
;;;338 z4 = tmp1 + tmp3;
00027c eb050e0a ADD lr,r5,r10
;;;339 z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
000280 9743 STR r7,[sp,#0x10c]
000282 eb0c060e ADD r6,r12,lr
000286 f24257a1 MOV r7,#0x25a1
00028a fb06fb07 MUL r11,r6,r7
;;;340
;;;341 tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
00028e f640178e MOV r7,#0x98e
000292 eb050809 ADD r8,r5,r9 ;336
000296 437c MULS r4,r7,r4
;;;342 tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
;;;343 tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
000298 9449 STR r4,[sp,#0x124]
00029a f8cd8108 STR r8,[sp,#0x108] ;339
00029e f24416b3 MOV r6,#0x41b3 ;342
0002a2 f2462454 MOV r4,#0x6254
0002a6 4375 MULS r5,r6,r5 ;342
0002a8 fb09f804 MUL r8,r9,r4
;;;344 tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
0002ac 4656 MOV r6,r10
0002ae f243040b MOV r4,#0x300b
0002b2 4366 MULS r6,r4,r6
0002b4 9f43 LDR r7,[sp,#0x10c]
;;;345 z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
0002b6 4c38 LDR r4,|L1.920|
0002b8 46c2 MOV r10,r8 ;343
0002ba fb07f904 MUL r9,r7,r4
;;;346 z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
0002be 4c37 LDR r4,|L1.924|
0002c0 f8dd8108 LDR r8,[sp,#0x108]
0002c4 9648 STR r6,[sp,#0x120]
0002c6 fb08f804 MUL r8,r8,r4
;;;347 z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
0002ca ebac240c SUB r4,r12,r12,LSL #8
0002ce ebc41484 RSB r4,r4,r4,LSL #6
0002d2 eba4048c SUB r4,r4,r12,LSL #2
;;;348 z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
0002d6 4e32 LDR r6,|L1.928|
;;;349
;;;350 z3 += z5;
0002d8 eb040c0b ADD r12,r4,r11
;;;351 z4 += z5;
0002dc fb06b60e MLA r6,r6,lr,r11
;;;352
;;;353 tmp0 += z1 + z3;
0002e0 9c49 LDR r4,[sp,#0x124]
0002e2 eb09070c ADD r7,r9,r12
0002e6 eb070e04 ADD lr,r7,r4
;;;354 tmp1 += z2 + z4;
0002ea eb080406 ADD r4,r8,r6
;;;355 tmp2 += z2 + z3;
;;;356 tmp3 += z1 + z4;
0002ee eb090706 ADD r7,r9,r6
0002f2 9e48 LDR r6,[sp,#0x120]
0002f4 442c ADD r4,r4,r5 ;354
0002f6 443e ADD r6,r6,r7
;;;357
;;;358 /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
;;;359
;;;360 outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3,
0002f8 9f47 LDR r7,[sp,#0x11c]
0002fa eb08050c ADD r5,r8,r12 ;355
0002fe 4437 ADD r7,r7,r6
000300 f5073700 ADD r7,r7,#0x20000
000304 4455 ADD r5,r5,r10 ;355
000306 f3c74789 UBFX r7,r7,#18,#10
00030a 5ddf LDRB r7,[r3,r7]
00030c 700f STRB r7,[r1,#0]
;;;361 CONST_BITS+PASS1_BITS+3)
;;;362 & RANGE_MASK];
;;;363 outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3,
00030e 9f47 LDR r7,[sp,#0x11c]
000310 1bbe SUBS r6,r7,r6
000312 f5063600 ADD r6,r6,#0x20000
000316 f3c64689 UBFX r6,r6,#18,#10
00031a 5d9e LDRB r6,[r3,r6]
00031c 71ce STRB r6,[r1,#7]
;;;364 CONST_BITS+PASS1_BITS+3)
;;;365 & RANGE_MASK];
;;;366 outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2,
00031e 9e46 LDR r6,[sp,#0x118]
000320 442e ADD r6,r6,r5
000322 f5063600 ADD r6,r6,#0x20000
000326 f3c64689 UBFX r6,r6,#18,#10
00032a 5d9e LDRB r6,[r3,r6]
00032c 704e STRB r6,[r1,#1]
;;;367 CONST_BITS+PASS1_BITS+3)
;;;368 & RANGE_MASK];
;;;369 outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2,
00032e 9e46 LDR r6,[sp,#0x118]
000330 1b75 SUBS r5,r6,r5
000332 f5053500 ADD r5,r5,#0x20000
000336 f3c54589 UBFX r5,r5,#18,#10
00033a 5d5d LDRB r5,[r3,r5]
00033c 718d STRB r5,[r1,#6]
;;;370 CONST_BITS+PASS1_BITS+3)
;;;371 & RANGE_MASK];
;;;372 outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1,
00033e 9d45 LDR r5,[sp,#0x114]
000340 4425 ADD r5,r5,r4
000342 f5053500 ADD r5,r5,#0x20000
000346 f3c54589 UBFX r5,r5,#18,#10
00034a 5d5d LDRB r5,[r3,r5]
00034c 708d STRB r5,[r1,#2]
;;;373 CONST_BITS+PASS1_BITS+3)
;;;374 & RANGE_MASK];
;;;375 outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1,
00034e 9d45 LDR r5,[sp,#0x114]
000350 1b2c SUBS r4,r5,r4
000352 f5043400 ADD r4,r4,#0x20000
000356 f3c44489 UBFX r4,r4,#18,#10
00035a 5d1c LDRB r4,[r3,r4]
00035c 714c STRB r4,[r1,#5]
;;;376 CONST_BITS+PASS1_BITS+3)
;;;377 & RANGE_MASK];
;;;378 outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0,
00035e 9d44 LDR r5,[sp,#0x110]
000360 eb05040e ADD r4,r5,lr
000364 f5043400 ADD r4,r4,#0x20000
000368 f3c44489 UBFX r4,r4,#18,#10
00036c 5d1c LDRB r4,[r3,r4]
00036e 70cc STRB r4,[r1,#3]
;;;379 CONST_BITS+PASS1_BITS+3)
;;;380 & RANGE_MASK];
;;;381 outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0,
000370 9d44 LDR r5,[sp,#0x110]
000372 eba5040e SUB r4,r5,lr
000376 f5043400 ADD r4,r4,#0x20000
00037a f3c44489 UBFX r4,r4,#18,#10
00037e 5d1c LDRB r4,[r3,r4]
000380 710c STRB r4,[r1,#4]
|L1.898|
;;;382 CONST_BITS+PASS1_BITS+3)
;;;383 & RANGE_MASK];
;;;384
;;;385 wsptr += DCTSIZE; /* advance pointer to next row */
000382 3020 ADDS r0,r0,#0x20
000384 1c52 ADDS r2,r2,#1 ;277
000386 2a08 CMP r2,#8 ;277
000388 f6ffaf2f BLT |L1.490|
;;;386 }
;;;387 }
00038c b04e ADD sp,sp,#0x138
00038e e8bd8ff0 POP {r4-r11,pc}
;;;388
ENDP
000392 0000 DCW 0x0000
|L1.916|
DCD 0xffffc4df
|L1.920|
DCD 0xffffe333
|L1.924|
DCD 0xffffadfd
|L1.928|
DCD 0xfffff384
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?