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 + -
显示快捷键?