; generated by ARM/Thumb C/C++ Compiler, RVCT2.2 [Build 503] ; commandline armcc [--debug -c --asm --interleave -orv_tmp_Data\Debug\ObjectCode\jprocess.o -O3 -Otime --no_inline --diag_style=ide -J"..\..\..\..\DevTools\ARM\RVDS 2.2\RVCT\Data\2.2\349\include\windows" -J"..\..\..\..\DevTools\ARM\RVDS 2.2\RVCT\Data\2.2\349\include\windows\rw" --brief_diagnostics C:\Work\Proj\TempProj\rv_tmp\jprocess.c] ARM AREA ||.text||, CODE, READONLY, ALIGN=2 out_jheader PROC ;;;136 static __inline void out_jheader(UREG quality) ;;;137 { 000000 e92d4ff1 PUSH {r0,r4-r11,lr} ;;;138 UINT8 __flash *p=JHEADER_1; ;;;139 int l=sizeof(JHEADER_1); ;;;140 #ifdef USE_OUTBYTES ;;;141 UINT8 *wp=outbytes; 000004 e59f431c LDR r4,|L1.808| 000008 e59f0314 LDR r0,|L1.804| ;138 00000c e3a01007 MOV r1,#7 ;139 ;;;142 #endif ;;;143 UREG i; ;;;144 UINT32 sq; ;;;145 #ifdef USE_OUTBYTES ;;;146 do *wp++=*p++; while(--l); |L1.16| 000010 e4d02001 LDRB r2,[r0],#1 000014 e2511001 SUBS r1,r1,#1 000018 e4c42001 STRB r2,[r4],#1 00001c 1afffffb BNE |L1.16| ;;;147 #else ;;;148 do OUTSYM(*p++); while(--l); ;;;149 #endif ;;;150 p=JHEADER_Q; ;;;151 i=0; 000020 e59fa308 LDR r10,|L1.816| 000024 e59f9300 LDR r9,|L1.812| 000028 e3a05000 MOV r5,#0 00002c e24abc01 SUB r11,r10,#0x100 ;;;152 do ;;;153 { ;;;154 UREG zi=zigzag_index[i]; |L1.48| 000030 e59f02fc LDR r0,|L1.820| ;;;155 UREG q=JHEADER_Q[zi]/quality; 000034 e59d1000 LDR r1,[sp,#0] 000038 e7d07005 LDRB r7,[r0,r5] ;154 00003c e28000c1 ADD r0,r0,#0xc1 000040 e7d00007 LDRB r0,[r0,r7] 000044 ebfffffe BL __aeabi_uidivmod ;;;156 if (q<2) q=2; 000048 e3500002 CMP r0,#2 00004c e1a06000 MOV r6,r0 ;155 ;;;157 z_q[i].idx=dct_data+zi; 000050 e0850085 ADD r0,r5,r5,LSL #1 000054 e08a8100 ADD r8,r10,r0,LSL #2 000058 e08b1107 ADD r1,r11,r7,LSL #2 00005c e5881008 STR r1,[r8,#8] ;;;158 sq=(UINT32)aanscales[zi]*q; 000060 e0891087 ADD r1,r9,r7,LSL #1 000064 e1d110b0 LDRH r1,[r1,#0] 000068 33a06002 MOVCC r6,#2 ;156 00006c e0010196 MUL r1,r6,r1 ;;;159 z_q[i].q=sq>>11; 000070 e1a025a1 LSR r2,r1,#11 000074 e78a2100 STR r2,[r10,r0,LSL #2] ;;;160 #ifdef USE_MUL ;;;161 z_q[i].iq=((65536L<<11)+(sq>>1))/sq; 000078 e3a00302 MOV r0,#0x8000000 00007c e08000a1 ADD r0,r0,r1,LSR #1 000080 ebfffffe BL __aeabi_uidivmod ;;;162 #endif ;;;163 #ifdef USE_OUTBYTES ;;;164 *wp++=q; ;;;165 #else ;;;166 OUTSYM(q); ;;;167 #endif ;;;168 i++; 000084 e2855001 ADD r5,r5,#1 000088 e5880004 STR r0,[r8,#4] ;161 ;;;169 } ;;;170 while(i<64); 00008c e3550040 CMP r5,#0x40 000090 e4c46001 STRB r6,[r4],#1 ;164 000094 3affffe5 BCC |L1.48| ;;;171 p=JHEADER_2; 000098 e59f0298 LDR r0,|L1.824| ;;;172 l=sizeof(JHEADER_2); 00009c e3a010ef MOV r1,#0xef ;;;173 #ifdef USE_OUTBYTES ;;;174 do *wp++=*p++; while(--l); |L1.160| 0000a0 e4d02001 LDRB r2,[r0],#1 0000a4 e2511001 SUBS r1,r1,#1 0000a8 e4c42001 STRB r2,[r4],#1 0000ac 1afffffb BNE |L1.160| ;;;175 outbytes_p=wp; 0000b0 e59f0284 LDR r0,|L1.828| 0000b4 e5804000 STR r4,[r0,#0] ; outbytes_p ;;;176 #else ;;;177 do OUTSYM(*p++); while(--l); ;;;178 #endif ;;;179 } 0000b8 e8bd8ff8 POP {r3-r11,pc} ENDP out_jtail PROC ;;;182 static __inline unsigned int out_jtail(void) ;;;183 { 0000bc e59f3278 LDR r3,|L1.828| ;;;184 #ifdef USE_OUTBYTES ;;;185 UINT8 *wp=outbytes_p; ;;;186 #endif ;;;187 #ifdef USE_OUTBYTES ;;;188 if (bitstream_bit<32) 0000c0 e5931008 LDR r1,[r3,#8] ; outbytes_p, bitstream_bit 0000c4 e5930000 LDR r0,[r3,#0] 0000c8 e3510020 CMP r1,#0x20 0000cc 2a00001f BCS |L1.336| ;;;189 { ;;;190 UREG c; ;;;191 c=bitstream_byte>>24; 0000d0 e5931004 LDR r1,[r3,#4] ; bitstream_byte ;;;192 if ((*wp++=c)==0xFF) *wp++=0; 0000d4 e3a02000 MOV r2,#0 0000d8 e1a01c21 LSR r1,r1,#24 ;191 0000dc e35100ff CMP r1,#0xff 0000e0 e4c01001 STRB r1,[r0],#1 0000e4 04c02001 STRBEQ r2,[r0],#1 ;;;193 if (bitstream_bit<24) 0000e8 e5931008 LDR r1,[r3,#8] ; bitstream_bit 0000ec e3510018 CMP r1,#0x18 0000f0 2a000016 BCS |L1.336| ;;;194 { ;;;195 c=bitstream_byte>>16; 0000f4 e5931004 LDR r1,[r3,#4] ; bitstream_byte 0000f8 e1a01401 LSL r1,r1,#8 ;;;196 if ((*wp++=c)==0xFF) *wp++=0; 0000fc e1a01c21 LSR r1,r1,#24 000100 e35100ff CMP r1,#0xff 000104 e4c01001 STRB r1,[r0],#1 000108 04c02001 STRBEQ r2,[r0],#1 ;;;197 if (bitstream_bit<16) 00010c e5931008 LDR r1,[r3,#8] ; bitstream_bit 000110 e3510010 CMP r1,#0x10 000114 2a00000d BCS |L1.336| ;;;198 { ;;;199 c=bitstream_byte>>8; 000118 e5931004 LDR r1,[r3,#4] ; bitstream_byte 00011c e1a01801 LSL r1,r1,#16 ;;;200 if ((*wp++=c)==0xFF) *wp++=0; 000120 e1a01c21 LSR r1,r1,#24 000124 e35100ff CMP r1,#0xff 000128 e4c01001 STRB r1,[r0],#1 00012c 04c02001 STRBEQ r2,[r0],#1 ;;;201 if (bitstream_bit<8) 000130 e5931008 LDR r1,[r3,#8] ; bitstream_bit 000134 e3510008 CMP r1,#8 000138 2a000004 BCS |L1.336| ;;;202 { ;;;203 c=bitstream_byte; 00013c e5931004 LDR r1,[r3,#4] ; bitstream_byte ;;;204 if ((*wp++=c)==0xFF) *wp++=0; 000140 e20110ff AND r1,r1,#0xff 000144 e35100ff CMP r1,#0xff 000148 e4c01001 STRB r1,[r0],#1 00014c 04c02001 STRBEQ r2,[r0],#1 ;;;205 } ;;;206 } ;;;207 } ;;;208 #else ;;;209 OUTSYM(bitstream_byte); ;;;210 if (bitstream_byte==0xFF) OUTSYM(0); ;;;211 #endif ;;;212 } ;;;213 #ifdef USE_OUTBYTES ;;;214 *wp++=0xFF; |L1.336| 000150 e3a010ff MOV r1,#0xff 000154 e4c01001 STRB r1,[r0],#1 ;;;215 *wp++=0xD9; 000158 e3a010d9 MOV r1,#0xd9 00015c e4c01001 STRB r1,[r0],#1 ;;;216 return wp-outbytes; 000160 e59f11c0 LDR r1,|L1.808| 000164 e0400001 SUB r0,r0,r1 ;;;217 #else ;;;218 OUTSYM(0xFF); ;;;219 OUTSYM(0xD9); ;;;220 return 0; ;;;221 #endif ;;;222 } 000168 e12fff1e BX lr ENDP dct_pass1 PROC ;;;362 { ;;;363 DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; 00016c e92d0ff0 PUSH {r4-r11} ;;;364 DCTELEM tmp10, tmp11, tmp12, tmp13; ;;;365 DCTELEM z1, z2, z3, z4, z5, z11, z13; ;;;366 UREG ctr; ;;;367 ;;;368 /* Pass 1: process rows. */ ;;;369 ;;;370 ctr=DCTSIZE; ;;;371 do 000170 e3a0804e MOV r8,#0x4e 000174 e2888c01 ADD r8,r8,#0x100 000178 e3a06008 MOV r6,#8 ;;;372 { ;;;373 { ;;;374 DCTELEM l,r; ;;;375 #define GET_tmp(ldisp,rdisp,left,right) \ ;;;376 {l=inp[ldisp];r=inp[rdisp]; left=l+r-256; right=l-r;} ;;;377 GET_tmp(0,7,tmp0,tmp7); ;;;378 GET_tmp(1,6,tmp1,tmp6); |L1.380| 00017c e5d12000 LDRB r2,[r1,#0] 000180 e5d1c007 LDRB r12,[r1,#7] ;;;379 GET_tmp(2,5,tmp2,tmp5); 000184 e5d14001 LDRB r4,[r1,#1] 000188 e5d15006 LDRB r5,[r1,#6] 00018c e082300c ADD r3,r2,r12 ;378 000190 e042200c SUB r2,r2,r12 ;378 000194 e084c005 ADD r12,r4,r5 000198 e0445005 SUB r5,r4,r5 ;;;380 GET_tmp(3,4,tmp3,tmp4); 00019c e5d14002 LDRB r4,[r1,#2] 0001a0 e5d17005 LDRB r7,[r1,#5] ;;;381 #undef GET_tmp 0001a4 e5d1a004 LDRB r10,[r1,#4] 0001a8 e2433c01 SUB r3,r3,#0x100 ;378 0001ac e0849007 ADD r9,r4,r7 ;380 0001b0 e0444007 SUB r4,r4,r7 ;380 0001b4 e5d17003 LDRB r7,[r1,#3] 0001b8 e2499c01 SUB r9,r9,#0x100 ;380 0001bc e24ccc01 SUB r12,r12,#0x100 ;379 0001c0 e087b00a ADD r11,r7,r10 0001c4 e24bbc01 SUB r11,r11,#0x100 0001c8 e047700a SUB r7,r7,r10 ;;;382 } ;;;383 /*tmp0 = dataptr[0] + dataptr[7]; ;;;384 tmp7 = dataptr[0] - dataptr[7]; ;;;385 tmp1 = dataptr[1] + dataptr[6]; ;;;386 tmp6 = dataptr[1] - dataptr[6]; ;;;387 tmp2 = dataptr[2] + dataptr[5]; ;;;388 tmp5 = dataptr[2] - dataptr[5]; ;;;389 tmp3 = dataptr[3] + dataptr[4]; ;;;390 tmp4 = dataptr[3] - dataptr[4];*/ ;;;391 ;;;392 /* Even part */ ;;;393 ;;;394 tmp10 = tmp0 + tmp3; /* phase 2 */ ;;;395 tmp13 = tmp0 - tmp3; 0001cc e083a00b ADD r10,r3,r11 ;;;396 tmp11 = tmp1 + tmp2; 0001d0 e043300b SUB r3,r3,r11 ;;;397 tmp12 = tmp1 - tmp2; 0001d4 e08cb009 ADD r11,r12,r9 ;;;398 0001d8 e04cc009 SUB r12,r12,r9 ;;;399 dataptr[0] = tmp10 + tmp11; /* phase 3 */ ;;;400 dataptr[4] = tmp10 - tmp11; 0001dc e08a900b ADD r9,r10,r11 0001e0 e5809000 STR r9,[r0,#0] ;;;401 0001e4 e04a900b SUB r9,r10,r11 0001e8 e5809010 STR r9,[r0,#0x10] ;;;402 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ ;;;403 dataptr[2] = tmp13 + z1; /* phase 5 */ 0001ec e08c9003 ADD r9,r12,r3 0001f0 e089c289 ADD r12,r9,r9,LSL #5 0001f4 e08cc10c ADD r12,r12,r12,LSL #2 0001f8 e08cc209 ADD r12,r12,r9,LSL #4 0001fc e1a0c44c ASR r12,r12,#8 ;;;404 dataptr[6] = tmp13 - z1; 000200 e083900c ADD r9,r3,r12 ;;;405 000204 e043300c SUB r3,r3,r12 000208 e5803018 STR r3,[r0,#0x18] ;;;406 /* Odd part */ ;;;407 ;;;408 tmp10 = tmp4 + tmp5; /* phase 2 */ ;;;409 tmp11 = tmp5 + tmp6; 00020c e0873004 ADD r3,r7,r4 ;;;410 tmp12 = tmp6 + tmp7; 000210 e0844005 ADD r4,r4,r5 ;;;411 000214 e0857002 ADD r7,r5,r2 ;;;412 /* The rotator is modified from fig 4-8 to avoid extra negations. */ ;;;413 z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ ;;;414 z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ 000218 e0435007 SUB r5,r3,r7 00021c e085c205 ADD r12,r5,r5,LSL #4 000220 e08cc285 ADD r12,r12,r5,LSL #5 000224 e1a0c08c LSL r12,r12,#1 000228 e1a0544c ASR r5,r12,#8 ;;;415 z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ 00022c e063c203 RSB r12,r3,r3,LSL #4 000230 e08cc18c ADD r12,r12,r12,LSL #3 000234 e08c3103 ADD r3,r12,r3,LSL #2 000238 e0853443 ADD r3,r5,r3,ASR #8 ;;;416 // z4 = MULTIPLY(tmp12, FIX_0_306562965) + tmp12 + z5; /* c2+c6 */ 00023c e00c0798 MUL r12,r8,r7 000240 e085544c ADD r5,r5,r12,ASR #8 ;;;417 z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ ;;;418 000244 e084c284 ADD r12,r4,r4,LSL #5 000248 e08cc10c ADD r12,r12,r12,LSL #2 00024c e08cc204 ADD r12,r12,r4,LSL #4 000250 e1a0c44c ASR r12,r12,#8 ;;;419 z11 = tmp7 + z3; /* phase 5 */ ;;;420 z13 = tmp7 - z3; 000254 e082400c ADD r4,r2,r12 ;;;421 000258 e042200c SUB r2,r2,r12 ;;;422 dataptr[5] = z13 + z2; /* phase 6 */ ;;;423 dataptr[3] = z13 - z2; 00025c e082c003 ADD r12,r2,r3 ;;;424 dataptr[1] = z11 + z4; 000260 e0422003 SUB r2,r2,r3 000264 e580200c STR r2,[r0,#0xc] ;;;425 dataptr[7] = z11 - z4; 000268 e0842005 ADD r2,r4,r5 00026c e9800204 STMIB r0,{r2,r9} ;;;426 000270 e0442005 SUB r2,r4,r5 ;;;427 dataptr += DCTSIZE; /* advance pointer to next row */ ;;;428 inp-=IMG_WIDTH; //минус - потому как bmp вверх ногами ;;;429 } ;;;430 while(--ctr); ;;;431 } 000274 e5a0c014 STR r12,[r0,#0x14]! 000278 e5a02008 STR r2,[r0,#8]! 00027c e2566001 SUBS r6,r6,#1 000280 e2800004 ADD r0,r0,#4 000284 e2411d05 SUB r1,r1,#0x140 ;429 000288 1affffbb BNE |L1.380| ;;;432 00028c e8bd0ff0 POP {r4-r11} 000290 e12fff1e BX lr ENDP jprocess PROC ;;;671 { ;;;672 UREG ycount=0; 000294 e92d41f0 PUSH {r4-r8,lr} ;;;673 out_jheader(1); 000298 e3a08000 MOV r8,#0 ;;;674 LastDC=0; 00029c e3a00001 MOV r0,#1 0002a0 ebfffffe BL out_jheader ;;;675 bitstream_byte=0; 0002a4 e59f5090 LDR r5,|L1.828| 0002a8 e3a00000 MOV r0,#0 ;;;676 bitstream_bit=32; 0002ac e585000c STR r0,[r5,#0xc] ; LastDC 0002b0 e5850004 STR r0,[r5,#4] ; bitstream_byte ;;;677 do 0002b4 e59f7084 LDR r7,|L1.832| 0002b8 e3a00020 MOV r0,#0x20 0002bc e5850008 STR r0,[r5,#8] ; bitstream_bit ;;;678 { ;;;679 UREG xcount=0; ;;;680 do |L1.704| 0002c0 e0486088 SUB r6,r8,r8,LSL #1 0002c4 e0866106 ADD r6,r6,r6,LSL #2 0002c8 e3a04000 MOV r4,#0 ;;;681 { ;;;682 //Process DCT ;;;683 dct_pass1(dct_data,(inBMP+0x436+IMG_WIDTH*(IMG_HEIGHT-1))+xcount*DCTSIZE-ycount*IMG_WIDTH); ;;;684 dct_pass2(dct_data); |L1.716| 0002cc e0870184 ADD r0,r7,r4,LSL #3 0002d0 e0800306 ADD r0,r0,r6,LSL #6 0002d4 e2801801 ADD r1,r0,#0x10000 0002d8 e2811c2e ADD r1,r1,#0x2e00 0002dc e59f0060 LDR r0,|L1.836| 0002e0 e28110f6 ADD r1,r1,#0xf6 0002e4 ebfffffe BL dct_pass1 ;;;685 outbytes_p=z_and_q(bitstream_byte,bitstream_bit,outbytes_p,(unsigned int *)z_q); 0002e8 e59f0054 LDR r0,|L1.836| 0002ec ebfffffe BL dct_pass2 ;;;686 //Next block by X 0002f0 e59f3038 LDR r3,|L1.816| 0002f4 e9950003 LDMIB r5,{r0,r1} ; outbytes_p, bitstream_bit, bitstream_byte 0002f8 e5952000 LDR r2,[r5,#0] 0002fc ebfffffe BL z_and_q ;;;687 } ;;;688 while(++xcount<(IMG_WIDTH/DCTSIZE)); ;;;689 //Next block by Y 000300 e2844001 ADD r4,r4,#1 000304 e3540028 CMP r4,#0x28 000308 e5850000 STR r0,[r5,#0] ; outbytes_p 00030c 3affffee BCC |L1.716| ;;;690 } ;;;691 while((ycount+=DCTSIZE)<(IMG_HEIGHT)); ;;;692 return out_jtail(); 000310 e2888008 ADD r8,r8,#8 000314 e35800f0 CMP r8,#0xf0 000318 3affffe8 BCC |L1.704| ;;;693 } 00031c e8bd41f0 POP {r4-r8,lr} 000320 eafffffe B out_jtail |L1.804| 000324 00000000 DCD ||.constdata$1|| |L1.808| 000328 00000000 DCD ||.bss$5|| |L1.812| 00032c 00000048 DCD ||.constdata$1|| + 72 |L1.816| 000330 00008100 DCD ||.bss$5|| + 33024 |L1.820| 000334 00000007 DCD ||.constdata$1|| + 7 |L1.824| 000338 00000108 DCD ||.constdata$1|| + 264 |L1.828| 00033c 00000000 DCD ||.data$0|| |L1.832| 000340 00000000 DCD inBMP |L1.836| 000344 00008000 DCD ||.bss$5|| + 32768 ENDP AREA ||i.dct_pass2||, comgroup=dct_pass2, CODE, READONLY, ALIGN=2 dct_pass2 PROC ;;;435 { ;;;436 DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; 000000 e92d07f0 PUSH {r4-r10} ;;;437 DCTELEM tmp10, tmp11, tmp12, tmp13; ;;;438 DCTELEM z1, z2, z3, z4, z5, z11, z13; ;;;439 // DCTELEM *datap2; ;;;440 UREG ctr; ;;;441 ;;;442 /* Pass 2: process columns. */ ;;;443 ;;;444 ctr=DCTSIZE; ;;;445 do 000004 e3a0704e MOV r7,#0x4e 000008 e2877c01 ADD r7,r7,#0x100 00000c e3a05008 MOV r5,#8 ;;;446 { ;;;447 //datap2=dataptr+DCTSIZE*7; ;;;448 /*z1=*datap2; ;;;449 datap2-=DCTSIZE; ;;;450 tmp0 = dataptr[DCTSIZE*0] + z1; ;;;451 tmp7 = dataptr[DCTSIZE*0] - z1; ;;;452 ;;;453 z1=*datap2; ;;;454 datap2-=DCTSIZE; ;;;455 tmp1 = dataptr[DCTSIZE*1] + z1; ;;;456 tmp6 = dataptr[DCTSIZE*1] - z1; ;;;457 ;;;458 z1=*datap2; ;;;459 datap2-=DCTSIZE; ;;;460 tmp2 = dataptr[DCTSIZE*2] + z1; ;;;461 tmp5 = dataptr[DCTSIZE*2] - z1; ;;;462 ;;;463 z1=*datap2; ;;;464 //datap2-=DCTSIZE; ;;;465 tmp3 = dataptr[DCTSIZE*3] + z1; ;;;466 tmp4 = dataptr[DCTSIZE*3] - z1;*/ ;;;467 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; ;;;468 tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; |L2.16| 000010 e5901000 LDR r1,[r0,#0] 000014 e59030e0 LDR r3,[r0,#0xe0] ;;;469 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; ;;;470 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; 000018 e59040c0 LDR r4,[r0,#0xc0] 00001c e0812003 ADD r2,r1,r3 ;468 000020 e0411003 SUB r1,r1,r3 ;469 000024 e5903020 LDR r3,[r0,#0x20] ;;;471 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; ;;;472 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; 000028 e59060a0 LDR r6,[r0,#0xa0] 00002c e083c004 ADD r12,r3,r4 ;470 000030 e0434004 SUB r4,r3,r4 ;471 000034 e5903040 LDR r3,[r0,#0x40] ;;;473 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; ;;;474 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; 000038 e5909080 LDR r9,[r0,#0x80] 00003c e0838006 ADD r8,r3,r6 ;472 000040 e0433006 SUB r3,r3,r6 ;473 000044 e5906060 LDR r6,[r0,#0x60] ;;;475 ;;;476 ;;;477 /* Even part */ ;;;478 ;;;479 tmp10 = tmp0 + tmp3; /* phase 2 */ ;;;480 tmp13 = tmp0 - tmp3; ;;;481 tmp11 = tmp1 + tmp2; ;;;482 tmp12 = tmp1 - tmp2; ;;;483 ;;;484 dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ ;;;485 dataptr[DCTSIZE*4] = tmp10 - tmp11; ;;;486 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ ;;;487 dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ ;;;488 dataptr[DCTSIZE*6] = tmp13 - z1; ;;;489 ;;;490 /* Odd part */ ;;;491 ;;;492 tmp10 = tmp4 + tmp5; /* phase 2 */ ;;;493 tmp11 = tmp5 + tmp6; ;;;494 tmp12 = tmp6 + tmp7; ;;;495 ;;;496 /* The rotator is modified from fig 4-8 to avoid extra negations. */ ;;;497 z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ ;;;498 z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ ;;;499 z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ ;;;500 // z4 = MULTIPLY(tmp12, FIX_0_306562965) + tmp12 + z5; /* c2+c6 */ ;;;501 z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ ;;;502 ;;;503 z11 = tmp7 + z3; /* phase 5 */ ;;;504 z13 = tmp7 - z3; ;;;505 ;;;506 dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ ;;;507 dataptr[DCTSIZE*3] = z13 - z2; ;;;508 dataptr[DCTSIZE*1] = z11 + z4; ;;;509 dataptr[DCTSIZE*7] = z11 - z4; ;;;510 ;;;511 dataptr++; /* advance pointer to next column */ ;;;512 // datap2++; ;;;513 } ;;;514 while(--ctr); ;;;515 } 000048 e2555001 SUBS r5,r5,#1 00004c e086a009 ADD r10,r6,r9 ;474 000050 e0466009 SUB r6,r6,r9 ;475 000054 e082900a ADD r9,r2,r10 ;480 000058 e042200a SUB r2,r2,r10 ;481 00005c e08ca008 ADD r10,r12,r8 ;482 000060 e04cc008 SUB r12,r12,r8 ;483 000064 e089800a ADD r8,r9,r10 ;485 000068 e5808000 STR r8,[r0,#0] ;485 00006c e049800a SUB r8,r9,r10 ;486 000070 e5808080 STR r8,[r0,#0x80] ;486 000074 e08c8002 ADD r8,r12,r2 ;487 000078 e088c288 ADD r12,r8,r8,LSL #5 ;487 00007c e08cc10c ADD r12,r12,r12,LSL #2 ;487 000080 e08cc208 ADD r12,r12,r8,LSL #4 ;487 000084 e1a0c44c ASR r12,r12,#8 ;487 000088 e082800c ADD r8,r2,r12 ;488 00008c e042200c SUB r2,r2,r12 ;489 000090 e58020c0 STR r2,[r0,#0xc0] ;489 000094 e0862003 ADD r2,r6,r3 ;493 000098 e0833004 ADD r3,r3,r4 ;494 00009c e0846001 ADD r6,r4,r1 ;495 0000a0 e0424006 SUB r4,r2,r6 ;498 0000a4 e084c204 ADD r12,r4,r4,LSL #4 ;498 0000a8 e08cc284 ADD r12,r12,r4,LSL #5 ;498 0000ac e1a0c08c LSL r12,r12,#1 ;498 0000b0 e1a0444c ASR r4,r12,#8 ;498 0000b4 e062c202 RSB r12,r2,r2,LSL #4 ;499 0000b8 e08cc18c ADD r12,r12,r12,LSL #3 ;499 0000bc e08c2102 ADD r2,r12,r2,LSL #2 ;499 0000c0 e0842442 ADD r2,r4,r2,ASR #8 ;499 0000c4 e00c0697 MUL r12,r7,r6 ;500 0000c8 e084444c ADD r4,r4,r12,ASR #8 ;500 0000cc e083c283 ADD r12,r3,r3,LSL #5 ;502 0000d0 e08cc10c ADD r12,r12,r12,LSL #2 ;502 0000d4 e08c3203 ADD r3,r12,r3,LSL #4 ;502 0000d8 e1a03443 ASR r3,r3,#8 ;502 0000dc e081c003 ADD r12,r1,r3 ;504 0000e0 e0411003 SUB r1,r1,r3 ;505 0000e4 e0813002 ADD r3,r1,r2 ;507 0000e8 e0411002 SUB r1,r1,r2 ;508 0000ec e5801060 STR r1,[r0,#0x60] ;508 0000f0 e08c1004 ADD r1,r12,r4 ;509 0000f4 e5801020 STR r1,[r0,#0x20] ;509 0000f8 e5808040 STR r8,[r0,#0x40] 0000fc e04c1004 SUB r1,r12,r4 ;510 000100 e58030a0 STR r3,[r0,#0xa0] 000104 e58010e0 STR r1,[r0,#0xe0] 000108 e2800004 ADD r0,r0,#4 00010c 1affffbf BNE |L2.16| ;;;516 000110 e8bd07f0 POP {r4-r10} 000114 e12fff1e BX lr ENDP AREA ||i.z_and_q||, comgroup=z_and_q, CODE, READONLY, ALIGN=2 z_and_q PROC ;;;525 { ;;;526 //Encode DC 000000 e92d4ff0 PUSH {r4-r11,lr} ;;;527 { ;;;528 unsigned int cofac; ;;;529 int diff,coef; ;;;530 UREG s; ;;;531 unsigned int __q=*zqp++; ;;;532 #ifdef USE_MUL 000004 e2834004 ADD r4,r3,#4 ;;;533 unsigned int __iq=*zqp++; ;;;534 #endif 000008 e2845004 ADD r5,r4,#4 ;;;535 coef=*((DCTELEM*)(*zqp++)); ;;;536 if (coef<0) 00000c e5944004 LDR r4,[r4,#4] 000010 e1a0c000 MOV r12,r0 ;526 000014 e5944000 LDR r4,[r4,#0] 000018 e1a00002 MOV r0,r2 ;526 00001c e5932000 LDR r2,[r3,#0] ;532 000020 e5933004 LDR r3,[r3,#4] ;534 ;;;537 { 000024 e3540000 CMP r4,#0 000028 e2859004 ADD r9,r5,#4 ;536 00002c aa000007 BGE |L3.80| ;;;538 unsigned int tmp; ;;;539 tmp = -coef; ;;;540 tmp += __q>>1; /* for rounding */ 000030 e2644000 RSB r4,r4,#0 ;;;541 #ifdef USE_MUL 000034 e08440a2 ADD r4,r4,r2,LSR #1 ;;;542 coef = -(tmp>__q?MUL_U16(tmp, __iq):0); ;;;543 #else 000038 e1540002 CMP r4,r2 00003c 80020493 MULHI r2,r3,r4 000040 81a02822 LSRHI r2,r2,#16 000044 93a02000 MOVLS r2,#0 000048 e2623000 RSB r3,r2,#0 ;;;544 coef = -DIVIDE_(tmp, __q); ;;;545 #endif ;;;546 } ;;;547 else 00004c ea000004 B |L3.100| ;;;548 { ;;;549 unsigned int tmp; ;;;550 tmp = coef; ;;;551 tmp += __q>>1; /* for rounding */ ;;;552 #ifdef USE_MUL |L3.80| 000050 e08440a2 ADD r4,r4,r2,LSR #1 ;;;553 coef = tmp>__q?MUL_U16(tmp,__iq):0; ;;;554 #else 000054 e1540002 CMP r4,r2 000058 80020493 MULHI r2,r3,r4 00005c 81a03822 LSRHI r3,r2,#16 000060 93a03000 MOVLS r3,#0 ;;;555 coef = DIVIDE_(tmp, __q); ;;;556 #endif ;;;557 } ;;;558 diff = coef - LastDC; ;;;559 LastDC = coef; /* Do DPCM */ |L3.100| 000064 e59f43bc LDR r4,|L3.1064| ;;;560 cofac = abs(diff); ;;;561 if (cofac < 256) 000068 e59fa3bc LDR r10,|L3.1068| 00006c e594200c LDR r2,[r4,#0xc] ;559 ; LastDC 000070 e584300c STR r3,[r4,#0xc] ;560 ; LastDC 000074 e0532002 SUBS r2,r3,r2 ;559 000078 42623000 RSBMI r3,r2,#0 00007c 51a03002 MOVPL r3,r2 ;;;562 { 000080 e3530c01 CMP r3,#0x100 ;;;563 s = csize[cofac]; /* Find true size */ ;;;564 } ;;;565 else ;;;566 { ;;;567 cofac = cofac >> 8; ;;;568 s = csize[cofac] + 8; ;;;569 } 000084 27da3423 LDRBCS r3,[r10,r3,LSR #8] 000088 37da5003 LDRBCC r5,[r10,r3] ;564 00008c 22835008 ADDCS r5,r3,#8 ;;;570 EncodeHuffman(huff_dc,s); /* Encode size */ ;;;571 if (s) 000090 e59f3398 LDR r3,|L3.1072| 000094 e0834105 ADD r4,r3,r5,LSL #2 000098 e1d430b0 LDRH r3,[r4,#0] 00009c e1d460b2 LDRH r6,[r4,#2] 0000a0 e3a04000 MOV r4,#0 0000a4 e0413003 SUB r3,r1,r3 0000a8 e3530000 CMP r3,#0 0000ac c18c1316 ORRGT r1,r12,r6,LSL r3 0000b0 ca000016 BGT |L3.272| 0000b4 e2631000 RSB r1,r3,#0 0000b8 e1a03136 LSR r3,r6,r1 0000bc e183300c ORR r3,r3,r12 0000c0 e1a0cc23 LSR r12,r3,#24 0000c4 e35c00ff CMP r12,#0xff 0000c8 e4c0c001 STRB r12,[r0],#1 0000cc e1a0c403 LSL r12,r3,#8 0000d0 e1a0cc2c LSR r12,r12,#24 0000d4 04c04001 STRBEQ r4,[r0],#1 0000d8 e35c00ff CMP r12,#0xff 0000dc e4c0c001 STRB r12,[r0],#1 0000e0 e1a0c803 LSL r12,r3,#16 0000e4 e1a0cc2c LSR r12,r12,#24 0000e8 04c04001 STRBEQ r4,[r0],#1 0000ec e35c00ff CMP r12,#0xff 0000f0 e4c0c001 STRB r12,[r0],#1 0000f4 e20330ff AND r3,r3,#0xff 0000f8 04c04001 STRBEQ r4,[r0],#1 0000fc e35300ff CMP r3,#0xff 000100 e4c03001 STRB r3,[r0],#1 000104 e2613020 RSB r3,r1,#0x20 000108 e1a01316 LSL r1,r6,r3 00010c 04c04001 STRBEQ r4,[r0],#1 ;;;572 { |L3.272| 000110 e3550000 CMP r5,#0 000114 e3a0b001 MOV r11,#1 ;571 000118 0a00001f BEQ |L3.412| ;;;573 if (diff<0) /* Follow by significant bits */ ;;;574 { 00011c e3520000 CMP r2,#0 000120 aa000003 BGE |L3.308| ;;;575 diff--; ;;;576 diff&=(1<>1; /* for rounding */ 0001c0 e2666000 RSB r6,r6,#0 ;;;601 #ifdef USE_MUL 0001c4 e08660ac ADD r6,r6,r12,LSR #1 ;;;602 if (tmp<=__q) goto FAST_ZERO; ;;;603 data = -(cofac=MUL_U16(tmp, __iq)); 0001c8 e156000c CMP r6,r12 0001cc 9a00000b BLS |L3.512| ;;;604 #else 0001d0 e00c0695 MUL r12,r5,r6 0001d4 e1a0c82c LSR r12,r12,#16 0001d8 e26c6000 RSB r6,r12,#0 ;;;605 data = -(cofac=DIVIDE_(tmp, __q)); ;;;606 #endif ;;;607 } ;;;608 else 0001dc ea000005 B |L3.504| ;;;609 { ;;;610 unsigned int tmp; ;;;611 tmp = data; ;;;612 tmp += __q>>1; /* for rounding */ ;;;613 #ifdef USE_MUL |L3.480| 0001e0 e08660ac ADD r6,r6,r12,LSR #1 ;;;614 if (tmp<=__q) goto FAST_ZERO; ;;;615 data = cofac=MUL_U16(tmp, __iq); 0001e4 e156000c CMP r6,r12 0001e8 9a000004 BLS |L3.512| ;;;616 #else 0001ec e00c0695 MUL r12,r5,r6 0001f0 e1a0c82c LSR r12,r12,#16 0001f4 e1a0600c MOV r6,r12 ;;;617 data = cofac = DIVIDE_(tmp, __q); ;;;618 #endif ;;;619 } ;;;620 //cofac = abs(data); /* Find absolute size */ ;;;621 if (!cofac) /* Check for zeroes */ ;;;622 { |L3.504| 0001f8 e35c0000 CMP r12,#0 0001fc 1a00001f BNE |L3.640| ;;;623 FAST_ZERO: ;;;624 r++; /* Increment run-length of zeroes */ ;;;625 if (--k) goto FAST_LOOP; ;;;626 _WRITE_BITS_N(4,0x000A); //0 -> code 0x000A, size 4 |L3.512| 000200 e2588001 SUBS r8,r8,#1 000204 e2822001 ADD r2,r2,#1 ;625 000208 1affffe6 BNE |L3.424| ;;;627 break; 00020c e2433004 SUB r3,r3,#4 000210 e3530000 CMP r3,#0 000214 e3a0200a MOV r2,#0xa 000218 c1811312 ORRGT r1,r1,r2,LSL r3 00021c ca00007e BGT |L3.1052| 000220 e2633000 RSB r3,r3,#0 000224 e1a0c332 LSR r12,r2,r3 000228 e18c1001 ORR r1,r12,r1 00022c e1a0cc21 LSR r12,r1,#24 000230 e35c00ff CMP r12,#0xff 000234 e4c0c001 STRB r12,[r0],#1 000238 e1a0c401 LSL r12,r1,#8 00023c e1a0cc2c LSR r12,r12,#24 000240 04c04001 STRBEQ r4,[r0],#1 000244 e35c00ff CMP r12,#0xff 000248 e4c0c001 STRB r12,[r0],#1 00024c e1a0c801 LSL r12,r1,#16 000250 e1a0cc2c LSR r12,r12,#24 000254 04c04001 STRBEQ r4,[r0],#1 000258 e35c00ff CMP r12,#0xff 00025c e4c0c001 STRB r12,[r0],#1 000260 e20110ff AND r1,r1,#0xff 000264 04c04001 STRBEQ r4,[r0],#1 000268 e35100ff CMP r1,#0xff 00026c e4c01001 STRB r1,[r0],#1 000270 e2633020 RSB r3,r3,#0x20 000274 e1a01312 LSL r1,r2,r3 000278 04c04001 STRBEQ r4,[r0],#1 00027c ea000066 B |L3.1052| ;;;628 } ;;;629 else ;;;630 { ;;;631 if (cofac < 256) ;;;632 { |L3.640| 000280 e35c0c01 CMP r12,#0x100 ;;;633 ssss = csize[cofac]; ;;;634 } ;;;635 else ;;;636 { ;;;637 cofac = cofac >> 8; ;;;638 ssss = csize[cofac] + 8; ;;;639 } 000284 27dac42c LDRBCS r12,[r10,r12,LSR #8] ;;;640 //while(r > 15) /* If run-length > 15, time for */ ;;;641 goto L1; ;;;642 //#pragma diag_suppress=Pe128 ;;;643 do ;;;644 { /* Run-length extension */ ;;;645 _WRITE_BITS_N(11,0x07F9); //240 -> code 0x7F9, size 11 ;;;646 r -= 16; ;;;647 L1:; ;;;648 } 000288 e3a050f9 MOV r5,#0xf9 00028c e2855c07 ADD r5,r5,#0x700 000290 37da700c LDRBCC r7,[r10,r12] ;634 000294 228c7008 ADDCS r7,r12,#8 ;639 000298 ea00001b B |L3.780| |L3.668| 00029c e243300b SUB r3,r3,#0xb ;646 0002a0 e3530000 CMP r3,#0 ;646 0002a4 c1811315 ORRGT r1,r1,r5,LSL r3 ;646 0002a8 ca000016 BGT |L3.776| ;646 0002ac e263c000 RSB r12,r3,#0 ;646 0002b0 e1a03c35 LSR r3,r5,r12 ;646 0002b4 e1831001 ORR r1,r3,r1 ;646 0002b8 e1a03c21 LSR r3,r1,#24 ;646 0002bc e35300ff CMP r3,#0xff ;646 0002c0 e4c03001 STRB r3,[r0],#1 ;646 0002c4 e1a03401 LSL r3,r1,#8 ;646 0002c8 e1a03c23 LSR r3,r3,#24 ;646 0002cc 04c04001 STRBEQ r4,[r0],#1 ;646 0002d0 e35300ff CMP r3,#0xff ;646 0002d4 e4c03001 STRB r3,[r0],#1 ;646 0002d8 e1a03801 LSL r3,r1,#16 ;646 0002dc e1a03c23 LSR r3,r3,#24 ;646 0002e0 04c04001 STRBEQ r4,[r0],#1 ;646 0002e4 e35300ff CMP r3,#0xff ;646 0002e8 e4c03001 STRB r3,[r0],#1 ;646 0002ec e20110ff AND r1,r1,#0xff ;646 0002f0 04c04001 STRBEQ r4,[r0],#1 ;646 0002f4 e35100ff CMP r1,#0xff ;646 0002f8 e26c3020 RSB r3,r12,#0x20 ;646 0002fc e4c01001 STRB r1,[r0],#1 ;646 000300 e1a01315 LSL r1,r5,r3 ;646 000304 04c04001 STRBEQ r4,[r0],#1 ;646 |L3.776| 000308 e2422010 SUB r2,r2,#0x10 ;647 ;;;649 while(r > 15); ;;;650 //#pragma diag_default=Pe128 |L3.780| 00030c e352000f CMP r2,#0xf 000310 8affffe1 BHI |L3.668| ;;;651 ii = 16*r + ssss; /* Now we can find code byte */ ;;;652 r = 0; 000314 e087c202 ADD r12,r7,r2,LSL #4 ;;;653 EncodeHuffman(huff_ac,ii); /* Encode RLE code */ ;;;654 if (data<0) /* Follow by significant bits */ 000318 e08ec10c ADD r12,lr,r12,LSL #2 00031c e1dc50b0 LDRH r5,[r12,#0] 000320 e1dcc0b2 LDRH r12,[r12,#2] 000324 e3a02000 MOV r2,#0 ;653 000328 e0433005 SUB r3,r3,r5 00032c e3530000 CMP r3,#0 000330 c181131c ORRGT r1,r1,r12,LSL r3 000334 ca000016 BGT |L3.916| 000338 e2633000 RSB r3,r3,#0 00033c e1a0533c LSR r5,r12,r3 000340 e1851001 ORR r1,r5,r1 000344 e1a05c21 LSR r5,r1,#24 000348 e35500ff CMP r5,#0xff 00034c e4c05001 STRB r5,[r0],#1 000350 e1a05401 LSL r5,r1,#8 000354 e1a05c25 LSR r5,r5,#24 000358 04c04001 STRBEQ r4,[r0],#1 00035c e35500ff CMP r5,#0xff 000360 e4c05001 STRB r5,[r0],#1 000364 e1a05801 LSL r5,r1,#16 000368 e1a05c25 LSR r5,r5,#24 00036c 04c04001 STRBEQ r4,[r0],#1 000370 e35500ff CMP r5,#0xff 000374 e4c05001 STRB r5,[r0],#1 000378 e20110ff AND r1,r1,#0xff 00037c 04c04001 STRBEQ r4,[r0],#1 000380 e35100ff CMP r1,#0xff 000384 e2633020 RSB r3,r3,#0x20 000388 e4c01001 STRB r1,[r0],#1 00038c e1a0131c LSL r1,r12,r3 000390 04c04001 STRBEQ r4,[r0],#1 ;;;655 { |L3.916| 000394 e3560000 CMP r6,#0 000398 aa000003 BGE |L3.940| ;;;656 data--; ;;;657 data&=(1<