📄 jidctfst.txt
字号:
00014a 6603 STR r3,[r0,#0x60]
|L1.332|
;;;271
;;;272 inptr++; /* advance pointers to next column */
00014c 1c92 ADDS r2,r2,#2
;;;273 quantptr++;
00014e 1d09 ADDS r1,r1,#4
;;;274 wsptr++;
000150 1d00 ADDS r0,r0,#4
000152 f1a80801 SUB r8,r8,#1 ;190
000156 f1b80f00 CMP r8,#0 ;190
00015a f73faf5d BGT |L1.24|
;;;275 }
;;;276
;;;277 /* Pass 2: process rows from work array, store into output array. */
;;;278 /* Note that we must descale the results by a factor of 8 == 2**3, */
;;;279 /* and also undo the PASS1_BITS scaling. */
;;;280
;;;281 wsptr = workspace;
00015e 4668 MOV r0,sp
;;;282 for (ctr = 0; ctr < DCTSIZE; ctr++) {
000160 f04f0e00 MOV lr,#0
|L1.356|
;;;283 outptr = output_buf[ctr] + output_col;
000164 9946 LDR r1,[sp,#0x118]
000166 f851202e LDR r2,[r1,lr,LSL #2]
00016a 9950 LDR r1,[sp,#0x140]
00016c 4411 ADD r1,r1,r2
;;;284 /* Rows of zeroes can be exploited in the same way as we did with columns.
;;;285 * However, the column calculation has created many nonzero AC terms, so
;;;286 * the simplification applies less often (typically 5% to 10% of the time).
;;;287 * On machines with very fast multiplication, it's possible that the
;;;288 * test takes more time than it's worth. In that case this section
;;;289 * may be commented out.
;;;290 */
;;;291
;;;292 #ifndef NO_ZERO_ROW_TEST
;;;293 if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
00016e 6842 LDR r2,[r0,#4]
000170 4691 MOV r9,r2
000172 b9ca CBNZ r2,|L1.424|
000174 6882 LDR r2,[r0,#8]
000176 b9ba CBNZ r2,|L1.424|
000178 68c2 LDR r2,[r0,#0xc]
00017a b9aa CBNZ r2,|L1.424|
00017c 6902 LDR r2,[r0,#0x10]
00017e b99a CBNZ r2,|L1.424|
;;;294 wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
000180 6942 LDR r2,[r0,#0x14]
000182 b98a CBNZ r2,|L1.424|
000184 6982 LDR r2,[r0,#0x18]
000186 b97a CBNZ r2,|L1.424|
000188 69c2 LDR r2,[r0,#0x1c]
00018a b96a CBNZ r2,|L1.424|
;;;295 /* AC terms all zero */
;;;296 JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3)
00018c 6802 LDR r2,[r0,#0]
00018e f3c21249 UBFX r2,r2,#5,#10
000192 f81c2002 LDRB r2,[r12,r2]
;;;297 & RANGE_MASK];
;;;298
;;;299 outptr[0] = dcval;
000196 700a STRB r2,[r1,#0]
;;;300 outptr[1] = dcval;
000198 704a STRB r2,[r1,#1]
;;;301 outptr[2] = dcval;
00019a 708a STRB r2,[r1,#2]
;;;302 outptr[3] = dcval;
00019c 70ca STRB r2,[r1,#3]
;;;303 outptr[4] = dcval;
00019e 710a STRB r2,[r1,#4]
;;;304 outptr[5] = dcval;
0001a0 714a STRB r2,[r1,#5]
;;;305 outptr[6] = dcval;
0001a2 718a STRB r2,[r1,#6]
;;;306 outptr[7] = dcval;
0001a4 71ca STRB r2,[r1,#7]
;;;307
;;;308 wsptr += DCTSIZE; /* advance pointer to next row */
;;;309 continue;
0001a6 e070 B |L1.650|
|L1.424|
;;;310 }
;;;311 #endif
;;;312
;;;313 /* Even part */
;;;314
;;;315 tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);
;;;316 tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);
;;;317
;;;318 tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);
;;;319 tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562)
0001a8 6985 LDR r5,[r0,#0x18]
0001aa 6884 LDR r4,[r0,#8]
0001ac 6903 LDR r3,[r0,#0x10] ;316
0001ae 6802 LDR r2,[r0,#0] ;316
0001b0 1b66 SUBS r6,r4,r5
0001b2 eba20a03 SUB r10,r2,r3 ;316
0001b6 442c ADD r4,r4,r5 ;318
0001b8 441a ADD r2,r2,r3 ;315
0001ba f44f77b5 MOV r7,#0x16a
;;;320 - tmp13;
;;;321
;;;322 tmp0 = tmp10 + tmp13;
0001be eb020804 ADD r8,r2,r4
0001c2 437e MULS r6,r7,r6 ;319
;;;323 tmp3 = tmp10 - tmp13;
0001c4 1b12 SUBS r2,r2,r4
;;;324 tmp1 = tmp11 + tmp12;
;;;325 tmp2 = tmp11 - tmp12;
;;;326
;;;327 /* Odd part */
;;;328
;;;329 z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3];
0001c6 9241 STR r2,[sp,#0x104]
0001c8 ebc42526 RSB r5,r4,r6,ASR #8 ;319
;;;330 z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3];
0001cc 68c3 LDR r3,[r0,#0xc]
0001ce 6942 LDR r2,[r0,#0x14]
;;;331 z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7];
;;;332 z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7];
0001d0 69c4 LDR r4,[r0,#0x1c]
0001d2 eb0a0b05 ADD r11,r10,r5 ;324
0001d6 ebaa0a05 SUB r10,r10,r5 ;325
0001da 1ad7 SUBS r7,r2,r3 ;330
0001dc eb090504 ADD r5,r9,r4 ;331
0001e0 441a ADD r2,r2,r3 ;329
0001e2 eba90604 SUB r6,r9,r4
;;;333
;;;334 tmp7 = z11 + z13; /* phase 5 */
0001e6 18ac ADDS r4,r5,r2
;;;335 tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
0001e8 1aab SUBS r3,r5,r2
0001ea f44f72b5 MOV r2,#0x16a
0001ee 4353 MULS r3,r2,r3
0001f0 ea4f2923 ASR r9,r3,#8
;;;336
;;;337 z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
0001f4 19ba ADDS r2,r7,r6
0001f6 f24013d9 MOV r3,#0x1d9
0001fa 435a MULS r2,r3,r2
;;;338 tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
0001fc f2401315 MOV r3,#0x115
000200 435e MULS r6,r3,r6
;;;339 tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
000202 f46f7327 MVN r3,#0x29c
000206 435f MULS r7,r3,r7
;;;340
;;;341 tmp6 = tmp12 - tmp7; /* phase 2 */
;;;342 tmp5 = tmp11 - tmp6;
;;;343 tmp4 = tmp10 + tmp5;
;;;344
;;;345 /* Final output stage: scale down by a factor of 8 and range-limit */
;;;346
;;;347 outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)
000208 eb080304 ADD r3,r8,r4
00020c f3c31349 UBFX r3,r3,#5,#10
000210 f81c3003 LDRB r3,[r12,r3]
000214 1212 ASRS r2,r2,#8 ;337
000216 700b STRB r3,[r1,#0]
000218 ebc22526 RSB r5,r2,r6,ASR #8 ;338
;;;348 & RANGE_MASK];
;;;349 outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)
00021c eba80304 SUB r3,r8,r4
000220 eb022227 ADD r2,r2,r7,ASR #8 ;339
000224 f3c31349 UBFX r3,r3,#5,#10
000228 1b12 SUBS r2,r2,r4 ;341
00022a f81c3003 LDRB r3,[r12,r3]
00022e 71cb STRB r3,[r1,#7]
;;;350 & RANGE_MASK];
;;;351 outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)
000230 eb0b0302 ADD r3,r11,r2
000234 eba90602 SUB r6,r9,r2 ;342
000238 f3c31349 UBFX r3,r3,#5,#10
00023c f81c3003 LDRB r3,[r12,r3]
;;;352 & RANGE_MASK];
;;;353 outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)
000240 ebab0202 SUB r2,r11,r2
000244 704b STRB r3,[r1,#1] ;351
000246 f3c21249 UBFX r2,r2,#5,#10
00024a f81c2002 LDRB r2,[r12,r2]
00024e 718a STRB r2,[r1,#6]
;;;354 & RANGE_MASK];
;;;355 outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)
000250 eb0a0206 ADD r2,r10,r6
000254 f3c21249 UBFX r2,r2,#5,#10
000258 f81c2002 LDRB r2,[r12,r2]
00025c 708a STRB r2,[r1,#2]
;;;356 & RANGE_MASK];
;;;357 outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)
00025e ebaa0206 SUB r2,r10,r6
000262 f3c21249 UBFX r2,r2,#5,#10
000266 f81c2002 LDRB r2,[r12,r2]
00026a 714a STRB r2,[r1,#5]
;;;358 & RANGE_MASK];
;;;359 outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)
00026c 9a41 LDR r2,[sp,#0x104]
00026e 4435 ADD r5,r5,r6 ;343
000270 442a ADD r2,r2,r5
000272 f3c21249 UBFX r2,r2,#5,#10
000276 f81c2002 LDRB r2,[r12,r2]
00027a 710a STRB r2,[r1,#4]
;;;360 & RANGE_MASK];
;;;361 outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)
00027c 9a41 LDR r2,[sp,#0x104]
00027e 1b52 SUBS r2,r2,r5
000280 f3c21249 UBFX r2,r2,#5,#10
000284 f81c2002 LDRB r2,[r12,r2]
000288 70ca STRB r2,[r1,#3]
|L1.650|
;;;362 & RANGE_MASK];
;;;363
;;;364 wsptr += DCTSIZE; /* advance pointer to next row */
00028a 3020 ADDS r0,r0,#0x20
00028c f10e0e01 ADD lr,lr,#1 ;282
000290 f1be0f08 CMP lr,#8 ;282
000294 f6ffaf66 BLT |L1.356|
;;;365 }
;;;366 }
000298 b047 ADD sp,sp,#0x11c
00029a e8bd8ff0 POP {r4-r11,pc}
;;;367
ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -