GSaha567/seq_level_training_data
052
1text,length,is_long_context,metric_val,label_metric2";3; jidctint.asm - accurate integer IDCT (SSE2)4;5; Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB6;7; Based on8; x86 SIMD extension for IJG JPEG library9; Copyright (C) 1999-2006, MIYASAKA Masaru.10; For conditions of distribution and use, see copyright notice in jsimdext.inc11;12; This file should be assembled with NASM (Netwide Assembler),13; can *not* be assembled with Microsoft's MASM or any compatible14; assembler (including Borland's Turbo Assembler).15; NASM is available from http://nasm.sourceforge.net/ or16; http://sourceforge.net/project/showfiles.php?group_id=620817;18; This file contains a slow-but-accurate integer implementation of the19; inverse DCT (Discrete Cosine Transform). The following code is based20; directly on the IJG's original jidctint.c; see the jidctint.c for21; more details.22;23; [TAB8]24 25%include ""jsimdext.inc""26%include ""jdct.inc""27 28; --------------------------------------------------------------------------29 30%define CONST_BITS 1331%define PASS1_BITS 232 33%define DESCALE_P1 (CONST_BITS-PASS1_BITS)34%define DESCALE_P2 (CONST_BITS+PASS1_BITS+3)35 36%if CONST_BITS == 1337F_0_298 equ 2446 ; FIX(0.298631336)38F_0_390 equ 3196 ; FIX(0.390180644)39F_0_541 equ 4433 ; FIX(0.541196100)40F_0_765 equ 6270 ; FIX(0.765366865)41F_0_899 equ 7373 ; FIX(0.899976223)42F_1_175 equ 9633 ; FIX(1.175875602)43F_1_501 equ 12299 ; FIX(1.501321110)44F_1_847 equ 15137 ; FIX(1.847759065)45F_1_961 equ 16069 ; FIX(1.961570560)46F_2_053 equ 16819 ; FIX(2.053119869)47F_2_562 equ 20995 ; FIX(2.562915447)48F_3_072 equ 25172 ; FIX(3.072711026)49%else50; NASM cannot do compile-time arithmetic on floating-point constants.51%define DESCALE(x,n) (((x)+(1<<((n)-1)))>>(n))52F_0_298 equ DESCALE( 320652955,30-CONST_BITS) ; FIX(0.298631336)53F_0_390 equ DESCALE( 418953276,30-CONST_BITS) ; FIX(0.390180644)54F_0_541 equ DESCALE( 581104887,30-CONST_BITS) ; FIX(0.541196100)55F_0_765 equ DESCALE( 821806413,30-CONST_BITS) ; FIX(0.765366865)56F_0_899 equ DESCALE( 966342111,30-CONST_BITS) ; FIX(0.899976223)57F_1_175 equ DESCALE(1262586813,30-CONST_BITS) ; FIX(1.175875602)58F_1_501 equ DESCALE(1612031267,30-CONST_BITS) ; FIX(1.501321110)59F_1_847 equ DESCALE(1984016188,30-CONST_BITS) ; FIX(1.847759065)60F_1_961 equ DESCALE(2106220350,30-CONST_BITS) ; FIX(1.961570560)61F_2_053 equ DESCALE(2204520673,30-CONST_BITS) ; FIX(2.053119869)62F_2_562 equ DESCALE(2751909506,30-CONST_BITS) ; FIX(2.562915447)63F_3_072 equ DESCALE(3299298341,30-CONST_BITS) ; FIX(3.072711026)64%endif65 66; --------------------------------------------------------------------------67 SECTION SEG_CONST68 69 alignz 1670 global EXTN(jconst_idct_islow_sse2) PRIVATE71 72EXTN(jconst_idct_islow_sse2):73 74PW_F130_F054 times 4 dw (F_0_541+F_0_765), F_0_54175PW_F054_MF130 times 4 dw F_0_541, (F_0_541-F_1_847)76PW_MF078_F117 times 4 dw (F_1_175-F_1_961), F_1_17577PW_F117_F078 times 4 dw F_1_175, (F_1_175-F_0_390)78PW_MF060_MF089 times 4 dw (F_0_298-F_0_899),-F_0_89979PW_MF089_F060 times 4 dw -F_0_899, (F_1_501-F_0_899)80PW_MF050_MF256 times 4 dw (F_2_053-F_2_562),-F_2_56281PW_MF256_F050 times 4 dw -F_2_562, (F_3_072-F_2_562)82PD_DESCALE_P1 times 4 dd 1 << (DESCALE_P1-1)83PD_DESCALE_P2 times 4 dd 1 << (DESCALE_P2-1)84PB_CENTERJSAMP times 16 db CENTERJSAMPLE85 86 alignz 1687 88; --------------------------------------------------------------------------89 SECTION SEG_TEXT90 BITS 3291;92; Perform dequantization and inverse DCT on one block of coefficients.93;94; GLOBAL(void)95; jsimd_idct_islow_sse2 (void *dct_table, JCOEFPTR coef_block,96; JSAMPARRAY output_buf, JDIMENSION output_col)97;98 99%define dct_table(b) (b)+8 ; jpeg_component_info *compptr100%define coef_block(b) (b)+12 ; JCOEFPTR coef_block101%define output_buf(b) (b)+16 ; JSAMPARRAY output_buf102%define output_col(b) (b)+20 ; JDIMENSION output_col103 104%define original_ebp ebp+0105%define wk(i) ebp-(WK_NUM-(i))*SIZEOF_XMMWORD ; xmmword wk[WK_NUM]106%define WK_NUM 12107 108 align 16109 global EXTN(jsimd_idct_islow_sse2) PRIVATE110 111EXTN(jsimd_idct_islow_sse2):112 push ebp113 mov eax,esp ; eax = original ebp114 sub esp, byte 4115 and esp, byte (-SIZEOF_XMMWORD) ; align to 128 bits116 mov [esp],eax117 mov ebp,esp ; ebp = aligned ebp118 lea esp, [wk(0)]119 pushpic ebx120; push ecx ; unused121; push edx ; need not be preserved122 push esi123 push edi124 125 get_GOT ebx ; get GOT address126 127 ; ---- Pass 1: process columns from input.128 129; mov eax, [original_ebp]130 mov edx, POINTER [dct_table(eax)] ; quantptr131 mov esi, JCOEFPTR [coef_block(eax)] ; inptr132 133%ifndef NO_ZERO_COLUMN_TEST_ISLOW_SSE2134 mov eax, DWORD [DWBLOCK(1,0,esi,SIZEOF_JCOEF)]135 or eax, DWORD [DWBLOCK(2,0,esi,SIZEOF_JCOEF)]136 jnz near .columnDCT137 138 movdqa xmm0, XMMWORD [XMMBLOCK(1,0,esi,SIZEOF_JCOEF)]139 movdqa xmm1, XMMWORD [XMMBLOCK(2,0,esi,SIZEOF_JCOEF)]140 por xmm0, XMMWORD [XMMBLOCK(3,0,esi,SIZEOF_JCOEF)]141 por xmm1, XMMWORD [XMMBLOCK(4,0,esi,SIZEOF_JCOEF)]142 por xmm0, XMMWORD [XMMBLOCK(5,0,esi,SIZEOF_JCOEF)]143 por xmm1, XMMWORD [XMMBLOCK(6,0,esi,SIZEOF_JCOEF)]144 por xmm0, XMMWORD [XMMBLOCK(7,0,esi,SIZEOF_JCOEF)]145 por xmm1,xmm0146 packsswb xmm1,xmm1147 packsswb xmm1,xmm1148 movd eax,xmm1149 test eax,eax150 jnz short .columnDCT151 152 ; -- AC terms all zero153 154 movdqa xmm5, XMMWORD [XMMBLOCK(0,0,esi,SIZEOF_JCOEF)]155 pmullw xmm5, XMMWORD [XMMBLOCK(0,0,edx,SIZEOF_ISLOW_MULT_TYPE)]156 157 psllw xmm5,PASS1_BITS158 159 movdqa xmm4,xmm5 ; xmm5=in0=(00 01 02 03 04 05 06 07)160 punpcklwd xmm5,xmm5 ; xmm5=(00 00 01 01 02 02 03 03)161 punpckhwd xmm4,xmm4 ; xmm4=(04 04 05 05 06 06 07 07)162 163 pshufd xmm7,xmm5,0x00 ; xmm7=col0=(00 00 00 00 00 00 00 00)164 pshufd xmm6,xmm5,0x55 ; xmm6=col1=(01 01 01 01 01 01 01 01)165 pshufd xmm1,xmm5,0xAA ; xmm1=col2=(02 02 02 02 02 02 02 02)166 pshufd xmm5,xmm5,0xFF ; xmm5=col3=(03 03 03 03 03 03 03 03)167 pshufd xmm0,xmm4,0x00 ; xmm0=col4=(04 04 04 04 04 04 04 04)168 pshufd xmm3,xmm4,0x55 ; xmm3=col5=(05 05 05 05 05 05 05 05)169 pshufd xmm2,xmm4,0xAA ; xmm2=col6=(06 06 06 06 06 06 06 06)170 pshufd xmm4,xmm4,0xFF ; xmm4=col7=(07 07 07 07 07 07 07 07)171 172 movdqa XMMWORD [wk(8)], xmm6 ; wk(8)=col1173 movdqa XMMWORD [wk(9)], xmm5 ; wk(9)=col3174 movdqa XMMWORD [wk(10)], xmm3 ; wk(10)=col5175 movdqa XMMWORD [wk(11)], xmm4 ; wk(11)=col7176 jmp near .column_end177 alignx 16,7178%endif179.columnDCT:180 181 ; -- Even part182 183 movdqa xmm0, XMMWORD [XMMBLOCK(0,0,esi,SIZEOF_JCOEF)]184 movdqa xmm1, XMMWORD [XMMBLOCK(2,0,esi,SIZEOF_JCOEF)]185 pmullw xmm0, XMMWORD [XMMBLOCK(0,0,edx,SIZEOF_ISLOW_MULT_TYPE)]186 pmullw xmm1, XMMWORD [XMMBLOCK(2,0,edx,SIZEOF_ISLOW_MULT_TYPE)]187 movdqa xmm2, XMMWORD [XMMBLOCK(4,0,esi,SIZEOF_JCOEF)]188 movdqa xmm3, XMMWORD [XMMBLOCK(6,0,esi,SIZEOF_JCOEF)]189 pmullw xmm2, XMMWORD [XMMBLOCK(4,0,edx,SIZEOF_ISLOW_MULT_TYPE)]190 pmullw xmm3, XMMWORD [XMMBLOCK(6,0,edx,SIZEOF_ISLOW_MULT_TYPE)]191 192 ; (Original)193 ; z1 = (z2 + z3) * 0.541196100;194 ; tmp2 = z1 + z3 * -1.847759065;195 ; tmp3 = z1 + z2 * 0.765366865;196 ;197 ; (This implementation)198 ; tmp2 = z2 * 0.541196100 + z3 * (0.541196100 - 1.847759065);199 ; tmp3 = z2 * (0.541196100 + 0.765366865) + z3 * 0.541196100;200 201 movdqa xmm4,xmm1 ; xmm1=in2=z2202 movdqa xmm5,xmm1203 punpcklwd xmm4,xmm3 ; xmm3=in6=z3204 punpckhwd xmm5,xmm3205 movdqa xmm1,xmm4206 movdqa xmm3,xmm5207 pmaddwd xmm4,[GOTOFF(ebx,PW_F130_F054)] ; xmm4=tmp3L208 pmaddwd xmm5,[GOTOFF(ebx,PW_F130_F054)] ; xmm5=tmp3H209 pmaddwd xmm1,[GOTOFF(ebx,PW_F054_MF130)] ; xmm1=tmp2L210 pmaddwd xmm3,[GOTOFF(ebx,PW_F054_MF130)] ; xmm3=tmp2H211 212 movdqa xmm6,xmm0213 paddw xmm0,xmm2 ; xmm0=in0+in4214 psubw xmm6,xmm2 ; xmm6=in0-in4215 216 pxor xmm7,xmm7217 pxor xmm2,xmm2218 punpcklwd xmm7,xmm0 ; xmm7=tmp0L219 punpckhwd xmm2,xmm0 ; xmm2=tmp0H220 psrad xmm7,(16-CONST_BITS) ; psrad xmm7,16 & pslld xmm7,CONST_BITS221 psrad xmm2,(16-CONST_BITS) ; psrad xmm2,16 & pslld xmm2,CONST_BITS222 223 movdqa xmm0,xmm7224 paddd xmm7,xmm4 ; xmm7=tmp10L225 psubd xmm0,xmm4 ; xmm0=tmp13L226 movdqa xmm4,xmm2227 paddd xmm2,xmm5 ; xmm2=tmp10H228 psubd xmm4,xmm5 ; xmm4=tmp13H229 230 movdqa XMMWORD [wk(0)], xmm7 ; wk(0)=tmp10L231 movdqa XMMWORD [wk(1)], xmm2 ; wk(1)=tmp10H232 movdqa XMMWORD [wk(2)], xmm0 ; wk(2)=tmp13L233 movdqa XMMWORD [wk(3)], xmm4 ; wk(3)=tmp13H234 235 pxor xmm5,xmm5236 pxor xmm7,xmm7237 punpcklwd xmm5,xmm6 ; xmm5=tmp1L238 punpckhwd xmm7,xmm6 ; xmm7=tmp1H239 psrad xmm5,(16-CONST_BITS) ; psrad xmm5,16 & pslld xmm5,CONST_BITS240 psrad xmm7,(16-CONST_BITS) ; psrad xmm7,16 & pslld xmm7,CONST_BITS241 242 movdqa xmm2,xmm5243 paddd xmm5,xmm1 ; xmm5=tmp11L244 psubd xmm2,xmm1 ; xmm2=tmp12L245 movdqa xmm0,xmm7246 paddd xmm7,xmm3 ; xmm7=tmp11H247 psubd xmm0,xmm3 ; xmm0=tmp12H248 249 movdqa XMMWORD [wk(4)], xmm5 ; wk(4)=tmp11L250 movdqa XMMWORD [wk(5)], xmm7 ; wk(5)=tmp11H251 movdqa XMMWORD [wk(6)], xmm2 ; wk(6)=tmp12L252 movdqa XMMWORD [wk(7)], xmm0 ; wk(7)=tmp12H253 254 ; -- Odd part255 256 movdqa xmm4, XMMWORD [XMMBLOCK(1,0,esi,SIZEOF_JCOEF)]257 movdqa xmm6, XMMWORD [XMMBLOCK(3,0,esi,SIZEOF_JCOEF)]258 pmullw xmm4, XMMWORD [XMMBLOCK(1,0,edx,SIZEOF_ISLOW_MULT_TYPE)]259 pmullw xmm6, XMMWORD [XMMBLOCK(3,0,edx,SIZEOF_ISLOW_MULT_TYPE)]260 movdqa xmm1, XMMWORD [XMMBLOCK(5,0,esi,SIZEOF_JCOEF)]261 movdqa xmm3, XMMWORD [XMMBLOCK(7,0,esi,SIZEOF_JCOEF)]262 pmullw xmm1, XMMWORD [XMMBLOCK(5,0,edx,SIZEOF_ISLOW_MULT_TYPE)]263 pmullw xmm3, XMMWORD [XMMBLOCK(7,0,edx,SIZEOF_ISLOW_MULT_TYPE)]264 265 movdqa xmm5,xmm6266 movdqa xmm7,xmm4267 paddw xmm5,xmm3 ; xmm5=z3268 paddw xmm7,xmm1 ; xmm7=z4269 270 ; (Original)271 ; z5 = (z3 + z4) * 1.175875602;272 ; z3 = z3 * -1.961570560; z4 = z4 * -0.390180644;273 ; z3 += z5; z4 += z5;274 ;275 ; (This implementation)276 ; z3 = z3 * (1.175875602 - 1.961570560) + z4 * 1.175875602;277 ; z4 = z3 * 1.175875602 + z4 * (1.175875602 - 0.390180644);278 279 movdqa xmm2,xmm5280 movdqa xmm0,xmm5281 punpcklwd xmm2,xmm7282 punpckhwd xmm0,xmm7283 movdqa xmm5,xmm2284 movdqa xmm7,xmm0285 pmaddwd xmm2,[GOTOFF(ebx,PW_MF078_F117)] ; xmm2=z3L286 pmaddwd xmm0,[GOTOFF(ebx,PW_MF078_F117)] ; xmm0=z3H287 pmaddwd xmm5,[GOTOFF(ebx,PW_F117_F078)] ; xmm5=z4L288 pmaddwd xmm7,[GOTOFF(ebx,PW_F117_F078)] ; xmm7=z4H289 290 movdqa XMMWORD [wk(10)], xmm2 ; wk(10)=z3L291 movdqa XMMWORD [wk(11)], xmm0 ; wk(11)=z3H292 293 ; (Original)294 ; z1 = tmp0 + tmp3; z2 = tmp1 + tmp2;295 ; tmp0 = tmp0 * 0.298631336; tmp1 = tmp1 * 2.053119869;296 ; tmp2 = tmp2 * 3.072711026; tmp3 = tmp3 * 1.501321110;297 ; z1 = z1 * -0.899976223; z2 = z2 * -2.562915447;298 ; tmp0 += z1 + z3; tmp1 += z2 + z4;299 ; tmp2 += z2 + z3; tmp3 += z1 + z4;300 ;301 ; (This implementation)302 ; tmp0 = tmp0 * (0.298631336 - 0.899976223) + tmp3 * -0.899976223;303 ; tmp1 = tmp1 * (2.053119869 - 2.562915447) + tmp2 * -2.562915447;304 ; tmp2 = tmp1 * -2.562915447 + tmp2 * (3.072711026 - 2.562915447);305 ; tmp3 = tmp0 * -0.899976223 + tmp3 * (1.501321110 - 0.899976223);306 ; tmp0 += z3; tmp1 += z4;307 ; tmp2 += z3; tmp3 += z4;308 309 movdqa xmm2,xmm3310 movdqa xmm0,xmm3311 punpcklwd xmm2,xmm4312 punpckhwd xmm0,xmm4313 movdqa xmm3,xmm2314 movdqa xmm4,xmm0315 pmaddwd xmm2,[GOTOFF(ebx,PW_MF060_MF089)] ; xmm2=tmp0L316 pmaddwd xmm0,[GOTOFF(ebx,PW_MF060_MF089)] ; xmm0=tmp0H317 pmaddwd xmm3,[GOTOFF(ebx,PW_MF089_F060)] ; xmm3=tmp3L318 pmaddwd xmm4,[GOTOFF(ebx,PW_MF089_F060)] ; xmm4=tmp3H319 320 paddd xmm2, XMMWORD [wk(10)] ; xmm2=tmp0L321 paddd xmm0, XMMWORD [wk(11)] ; xmm0=tmp0H322 paddd xmm3,xmm5 ; xmm3=tmp3L323 paddd xmm4,xmm7 ; xmm4=tmp3H324 325 movdqa XMMWORD [wk(8)], xmm2 ; wk(8)=tmp0L326 movdqa XMMWORD [wk(9)], xmm0 ; wk(9)=tmp0H327 328 movdqa xmm2,xmm1329 movdqa xmm0,xmm1330 punpcklwd xmm2,xmm6331 punpckhwd xmm0,xmm6332 movdqa xmm1,xmm2333 movdqa xmm6,xmm0334 pmaddwd xmm2,[GOTOFF(ebx,PW_MF050_MF256)] ; xmm2=tmp1L335 pmaddwd xmm0,[GOTOFF(ebx,PW_MF050_MF256)] ; xmm0=tmp1H336 pmaddwd xmm1,[GOTOFF(ebx,PW_MF256_F050)] ; xmm1=tmp2L337 pmaddwd xmm6,[GOTOFF(ebx,PW_MF256_F050)] ; xmm6=tmp2H338 339 paddd xmm2,xmm5 ; xmm2=tmp1L340 paddd xmm0,xmm7 ; xmm0=tmp1H341 paddd xmm1, XMMWORD [wk(10)] ; xmm1=tmp2L342 paddd xmm6, XMMWORD [wk(11)] ; xmm6=tmp2H343 344 movdqa XMMWORD [wk(10)], xmm2 ; wk(10)=tmp1L345 movdqa XMMWORD [wk(11)], xmm0 ; wk(11)=tmp1H346 347 ; -- Final output stage348 349 movdqa xmm5, XMMWORD [wk(0)] ; xmm5=tmp10L350 movdqa xmm7, XMMWORD [wk(1)] ; xmm7=tmp10H351 352 movdqa xmm2,xmm5353 movdqa xmm0,xmm7354 paddd xmm5,xmm3 ; xmm5=data0L355 paddd xmm7,xmm4 ; xmm7=data0H356 psubd xmm2,xmm3 ; xmm2=data7L357 psubd xmm0,xmm4 ; xmm0=data7H358 359 movdqa xmm3,[GOTOFF(ebx,PD_DESCALE_P1)] ; xmm3=[PD_DESCALE_P1]360 361 paddd xmm5,xmm3362 paddd xmm7,xmm3363 psrad xmm5,DESCALE_P1364 psrad xmm7,DESCALE_P1365 paddd xmm2,xmm3366 paddd xmm0,xmm3367 psrad xmm2,DESCALE_P1368 psrad xmm0,DESCALE_P1369 370 packssdw xmm5,xmm7 ; xmm5=data0=(00 01 02 03 04 05 06 07)371 packssdw xmm2,xmm0 ; xmm2=data7=(70 71 72 73 74 75 76 77)372 373 movdqa xmm4, XMMWORD [wk(4)] ; xmm4=tmp11L374 movdqa xmm3, XMMWORD [wk(5)] ; xmm3=tmp11H375 376 movdqa xmm7,xmm4377 movdqa xmm0,xmm3378 paddd xmm4,xmm1 ; xmm4=data1L379 paddd xmm3,xmm6 ; xmm3=data1H380 psubd xmm7,xmm1 ; xmm7=data6L381 psubd xmm0,xmm6 ; xmm0=data6H382 383 movdqa xmm1,[GOTOFF(ebx,PD_DESCALE_P1)] ; xmm1=[PD_DESCALE_P1]384 385 paddd xmm4,xmm1386 paddd xmm3,xmm1387 psrad xmm4,DESCALE_P1388 psrad xmm3,DESCALE_P1389 paddd xmm7,xmm1390 paddd xmm0,xmm1391 psrad xmm7,DESCALE_P1392 psrad xmm0,DESCALE_P1393 394 packssdw xmm4,xmm3 ; xmm4=data1=(10 11 12 13 14 15 16 17)395 packssdw xmm7,xmm0 ; xmm7=data6=(60 61 62 63 64 65 66 67)396 397 movdqa xmm6,xmm5 ; transpose coefficients(phase 1)398 punpcklwd xmm5,xmm4 ; xmm5=(00 10 01 11 02 12 03 13)399 punpckhwd xmm6,xmm4 ; xmm6=(04 14 05 15 06 16 07 17)400 movdqa xmm1,xmm7 ; transpose coefficients(phase 1)401 punpcklwd xmm7,xmm2 ; xmm7=(60 70 61 71 62 72 63 73)402 punpckhwd xmm1,xmm2 ; xmm1=(64 74 65 75 66 76 67 77)403 404 movdqa xmm3, XMMWORD [wk(6)] ; xmm3=tmp12L405 movdqa xmm0, XMMWORD [wk(7)] ; xmm0=tmp12H406 movdqa xmm4, XMMWORD [wk(10)] ; xmm4=tmp1L407 movdqa xmm2, XMMWORD [wk(11)] ; xmm2=tmp1H408 409 movdqa XMMWORD [wk(0)], xmm5 ; wk(0)=(00 10 01 11 02 12 03 13)410 movdqa XMMWORD [wk(1)], xmm6 ; wk(1)=(04 14 05 15 06 16 07 17)411 movdqa XMMWORD [wk(4)], xmm7 ; wk(4)=(60 70 61 71 62 72 63 73)412 movdqa XMMWORD [wk(5)], xmm1 ; wk(5)=(64 74 65 75 66 76 67 77)413 414 movdqa xmm5,xmm3415 movdqa xmm6,xmm0416 paddd xmm3,xmm4 ; xmm3=data2L417 paddd xmm0,xmm2 ; xmm0=data2H418 psubd xmm5,xmm4 ; xmm5=data5L419 psubd xmm6,xmm2 ; xmm6=data5H420 421 movdqa xmm7,[GOTOFF(ebx,PD_DESCALE_P1)] ; xmm7=[PD_DESCALE_P1]422 423 paddd xmm3,xmm7424 paddd xmm0,xmm7425 psrad xmm3,DESCALE_P1426 psrad xmm0,DESCALE_P1427 paddd xmm5,xmm7428 paddd xmm6,xmm7429 psrad xmm5,DESCALE_P1430 psrad xmm6,DESCALE_P1431 432 packssdw xmm3,xmm0 ; xmm3=data2=(20 21 22 23 24 25 26 27)433 packssdw xmm5,xmm6 ; xmm5=data5=(50 51 52 53 54 55 56 57)434 435 movdqa xmm1, XMMWORD [wk(2)] ; xmm1=tmp13L436 movdqa xmm4, XMMWORD [wk(3)] ; xmm4=tmp13H437 movdqa xmm2, XMMWORD [wk(8)] ; xmm2=tmp0L438 movdqa xmm7, XMMWORD [wk(9)] ; xmm7=tmp0H439 440 movdqa xmm0,xmm1441 movdqa xmm6,xmm4442 paddd xmm1,xmm2 ; xmm1=data3L443 paddd xmm4,xmm7 ; xmm4=data3H444 psubd xmm0,xmm2 ; xmm0=data4L445 psubd xmm6,xmm7 ; xmm6=data4H446 447 movdqa xmm2,[GOTOFF(ebx,PD_DESCALE_P1)] ; xmm2=[PD_DESCALE_P1]448 449 paddd xmm1,xmm2450 paddd xmm4,xmm2451 psrad xmm1,DESCALE_P1452 psrad xmm4,DESCALE_P1453 paddd xmm0,xmm2454 paddd xmm6,xmm2455 psrad xmm0,DESCALE_P1456 psrad xmm6,DESCALE_P1457 458 packssdw xmm1,xmm4 ; xmm1=data3=(30 31 32 33 34 35 36 37)459 packssdw xmm0,xmm6 ; xmm0=data4=(40 41 42 43 44 45 46 47)460 461 movdqa xmm7, XMMWORD [wk(0)] ; xmm7=(00 10 01 11 02 12 03 13)462 movdqa xmm2, XMMWORD [wk(1)] ; xmm2=(04 14 05 15 06 16 07 17)463 464 movdqa xmm4,xmm3 ; transpose coefficients(phase 1)465 punpcklwd xmm3,xmm1 ; xmm3=(20 30 21 31 22 32 23 33)466 punpckhwd xmm4,xmm1 ; xmm4=(24 34 25 35 26 36 27 37)467 movdqa xmm6,xmm0 ; transpose coefficients(phase 1)468 punpcklwd xmm0,xmm5 ; xmm0=(40 50 41 51 42 52 43 53)469 punpckhwd xmm6,xmm5 ; xmm6=(44 54 45 55 46 56 47 57)470 471 movdqa xmm1,xmm7 ; transpose coefficients(phase 2)472 punpckldq xmm7,xmm3 ; xmm7=(00 10 20 30 01 11 21 31)473 punpckhdq xmm1,xmm3 ; xmm1=(02 12 22 32 03 13 23 33)474 movdqa xmm5,xmm2 ; transpose coefficients(phase 2)475 punpckldq xmm2,xmm4 ; xmm2=(04 14 24 34 05 15 25 35)476 punpckhdq xmm5,xmm4 ; xmm5=(06 16 26 36 07 17 27 37)477 478 movdqa xmm3, XMMWORD [wk(4)] ; xmm3=(60 70 61 71 62 72 63 73)479 movdqa xmm4, XMMWORD [wk(5)] ; xmm4=(64 74 65 75 66 76 67 77)480 481 movdqa XMMWORD [wk(6)], xmm2 ; wk(6)=(04 14 24 34 05 15 25 35)482 movdqa XMMWORD [wk(7)], xmm5 ; wk(7)=(06 16 26 36 07 17 27 37)483 484 movdqa xmm2,xmm0 ; transpose coefficients(phase 2)485 punpckldq xmm0,xmm3 ; xmm0=(40 50 60 70 41 51 61 71)486 punpckhdq xmm2,xmm3 ; xmm2=(42 52 62 72 43 53 63 73)487 movdqa xmm5,xmm6 ; transpose coefficients(phase 2)488 punpckldq xmm6,xmm4 ; xmm6=(44 54 64 74 45 55 65 75)489 punpckhdq xmm5,xmm4 ; xmm5=(46 56 66 76 47 57 67 77)490 491 movdqa xmm3,xmm7 ; transpose coefficients(phase 3)492 punpcklqdq xmm7,xmm0 ; xmm7=col0=(00 10 20 30 40 50 60 70)493 punpckhqdq xmm3,xmm0 ; xmm3=col1=(01 11 21 31 41 51 61 71)494 movdqa xmm4,xmm1 ; transpose coefficients(phase 3)495 punpcklqdq xmm1,xmm2 ; xmm1=col2=(02 12 22 32 42 52 62 72)496 punpckhqdq xmm4,xmm2 ; xmm4=col3=(03 13 23 33 43 53 63 73)497 498 movdqa xmm0, XMMWORD [wk(6)] ; xmm0=(04 14 24 34 05 15 25 35)499 movdqa xmm2, XMMWORD [wk(7)] ; xmm2=(06 16 26 36 07 17 27 37)500 501 movdqa XMMWORD [wk(8)], xmm3 ; wk(8)=col1502 movdqa XMMWORD [wk(9)], xmm4 ; wk(9)=col3503 504 movdqa xmm3,xmm0 ; transpose coefficients(phase 3)505 punpcklqdq xmm0,xmm6 ; xmm0=col4=(04 14 24 34 44 54 64 74)506 punpckhqdq xmm3,xmm6 ; xmm3=col5=(05 15 25 35 45 55 65 75)507 movdqa xmm4,xmm2 ; transpose coefficients(phase 3)508 punpcklqdq xmm2,xmm5 ; xmm2=col6=(06 16 26 36 46 56 66 76)509 punpckhqdq xmm4,xmm5 ; xmm4=col7=(07 17 27 37 47 57 67 77)510 511 movdqa XMMWORD [wk(10)], xmm3 ; wk(10)=col5512 movdqa XMMWORD [wk(11)], xmm4 ; wk(11)=col7513.column_end:514 515 ; -- Prefetch the next coefficient block516 517 prefetchnta [esi + DCTSIZE2*SIZEOF_JCOEF + 0*32]518 prefetchnta [esi + DCTSIZE2*SIZEOF_JCOEF + 1*32]519 prefetchnta [esi + DCTSIZE2*SIZEOF_JCOEF + 2*32]520 prefetchnta [esi + DCTSIZE2*SIZEOF_JCOEF + 3*32]521 522 ; ---- Pass 2: process rows from work array, store into output array.523 524 mov eax, [original_ebp]525 mov edi, JSAMPARRAY [output_buf(eax)] ; (JSAMPROW *)526 mov eax, JDIMENSION [output_col(eax)]527 528 ; -- Even part529 530 ; xmm7=col0, xmm1=col2, xmm0=col4, xmm2=col6531 532 ; (Original)533 ; z1 = (z2 + z3) * 0.541196100;534 ; tmp2 = z1 + z3 * -1.847759065;535 ; tmp3 = z1 + z2 * 0.765366865;536 ;537 ; (This implementation)538 ; tmp2 = z2 * 0.541196100 + z3 * (0.541196100 - 1.847759065);539 ; tmp3 = z2 * (0.541196100 + 0.765366865) + z3 * 0.541196100;540 541 movdqa xmm6,xmm1 ; xmm1=in2=z2542 movdqa xmm5,xmm1543 punpcklwd xmm6,xmm2 ; xmm2=in6=z3544 punpckhwd xmm5,xmm2545 movdqa xmm1,xmm6546 movdqa xmm2,xmm5547 pmaddwd xmm6,[GOTOFF(ebx,PW_F130_F054)] ; xmm6=tmp3L548 pmaddwd xmm5,[GOTOFF(ebx,PW_F130_F054)] ; xmm5=tmp3H549 pmaddwd xmm1,[GOTOFF(ebx,PW_F054_MF130)] ; xmm1=tmp2L550 pmaddwd xmm2,[GOTOFF(ebx,PW_F054_MF130)] ; xmm2=tmp2H551 552 movdqa xmm3,xmm7553 paddw xmm7,xmm0 ; xmm7=in0+in4554 psubw xmm3,xmm0 ; xmm3=in0-in4555 556 pxor xmm4,xmm4557 pxor xmm0,xmm0558 punpcklwd xmm4,xmm7 ; xmm4=tmp0L559 punpckhwd xmm0,xmm7 ; xmm0=tmp0H560 psrad xmm4,(16-CONST_BITS) ; psrad xmm4,16 & pslld xmm4,CONST_BITS561 psrad xmm0,(16-CONST_BITS) ; psrad xmm0,16 & pslld xmm0,CONST_BITS562 563 movdqa xmm7,xmm4564 paddd xmm4,xmm6 ; xmm4=tmp10L565 psubd xmm7,xmm6 ; xmm7=tmp13L566 movdqa xmm6,xmm0567 paddd xmm0,xmm5 ; xmm0=tmp10H568 psubd xmm6,xmm5 ; xmm6=tmp13H569 570 movdqa XMMWORD [wk(0)], xmm4 ; wk(0)=tmp10L571 movdqa XMMWORD [wk(1)], xmm0 ; wk(1)=tmp10H572 movdqa XMMWORD [wk(2)], xmm7 ; wk(2)=tmp13L573 movdqa XMMWORD [wk(3)], xmm6 ; wk(3)=tmp13H574 575 pxor xmm5,xmm5576 pxor xmm4,xmm4577 punpcklwd xmm5,xmm3 ; xmm5=tmp1L578 punpckhwd xmm4,xmm3 ; xmm4=tmp1H579 psrad xmm5,(16-CONST_BITS) ; psrad xmm5,16 & pslld xmm5,CONST_BITS580 psrad xmm4,(16-CONST_BITS) ; psrad xmm4,16 & pslld xmm4,CONST_BITS581 582 movdqa xmm0,xmm5583 paddd xmm5,xmm1 ; xmm5=tmp11L584 psubd xmm0,xmm1 ; xmm0=tmp12L585 movdqa xmm7,xmm4586 paddd xmm4,xmm2 ; xmm4=tmp11H587 psubd xmm7,xmm2 ; xmm7=tmp12H588 589 movdqa XMMWORD [wk(4)], xmm5 ; wk(4)=tmp11L590 movdqa XMMWORD [wk(5)], xmm4 ; wk(5)=tmp11H591 movdqa XMMWORD [wk(6)], xmm0 ; wk(6)=tmp12L592 movdqa XMMWORD [wk(7)], xmm7 ; wk(7)=tmp12H593 594 ; -- Odd part595 596 movdqa xmm6, XMMWORD [wk(9)] ; xmm6=col3597 movdqa xmm3, XMMWORD [wk(8)] ; xmm3=col1598 movdqa xmm1, XMMWORD [wk(11)] ; xmm1=col7599 movdqa xmm2, XMMWORD [wk(10)] ; xmm2=col5600 601 movdqa xmm5,xmm6602 movdqa xmm4,xmm3603 paddw xmm5,xmm1 ; xmm5=z3604 paddw xmm4,xmm2 ; xmm4=z4605 606 ; (Original)607 ; z5 = (z3 + z4) * 1.175875602;608 ; z3 = z3 * -1.961570560; z4 = z4 * -0.390180644;609 ; z3 += z5; z4 += z5;610 ;611 ; (This implementation)612 ; z3 = z3 * (1.175875602 - 1.961570560) + z4 * 1.175875602;613 ; z4 = z3 * 1.175875602 + z4 * (1.175875602 - 0.390180644);614 615 movdqa xmm0,xmm5616 movdqa xmm7,xmm5617 punpcklwd xmm0,xmm4618 punpckhwd xmm7,xmm4619 movdqa xmm5,xmm0620 movdqa xmm4,xmm7621 pmaddwd xmm0,[GOTOFF(ebx,PW_MF078_F117)] ; xmm0=z3L622 pmaddwd xmm7,[GOTOFF(ebx,PW_MF078_F117)] ; xmm7=z3H623 pmaddwd xmm5,[GOTOFF(ebx,PW_F117_F078)] ; xmm5=z4L624 pmaddwd xmm4,[GOTOFF(ebx,PW_F117_F078)] ; xmm4=z4H625 626 movdqa XMMWORD [wk(10)], xmm0 ; wk(10)=z3L627 movdqa XMMWORD [wk(11)], xmm7 ; wk(11)=z3H628 629 ; (Original)630 ; z1 = tmp0 + tmp3; z2 = tmp1 + tmp2;631 ; tmp0 = tmp0 * 0.298631336; tmp1 = tmp1 * 2.053119869;632 ; tmp2 = tmp2 * 3.072711026; tmp3 = tmp3 * 1.501321110;633 ; z1 = z1 * -0.899976223; z2 = z2 * -2.562915447;634 ; tmp0 += z1 + z3; tmp1 += z2 + z4;635 ; tmp2 += z2 + z3; tmp3 += z1 + z4;636 ;637 ; (This implementation)638 ; tmp0 = tmp0 * (0.298631336 - 0.899976223) + tmp3 * -0.899976223;639 ; tmp1 = tmp1 * (2.053119869 - 2.562915447) + tmp2 * -2.562915447;640 ; tmp2 = tmp1 * -2.562915447 + tmp2 * (3.072711026 - 2.562915447);641 ; tmp3 = tmp0 * -0.899976223 + tmp3 * (1.501321110 - 0.899976223);642 ; tmp0 += z3; tmp1 += z4;643 ; tmp2 += z3; tmp3 += z4;644 645 movdqa xmm0,xmm1646 movdqa xmm7,xmm1647 punpcklwd xmm0,xmm3648 punpckhwd xmm7,xmm3649 movdqa xmm1,xmm0650 movdqa xmm3,xmm7651 pmaddwd xmm0,[GOTOFF(ebx,PW_MF060_MF089)] ; xmm0=tmp0L652 pmaddwd xmm7,[GOTOFF(ebx,PW_MF060_MF089)] ; xmm7=tmp0H653 pmaddwd xmm1,[GOTOFF(ebx,PW_MF089_F060)] ; xmm1=tmp3L654 pmaddwd xmm3,[GOTOFF(ebx,PW_MF089_F060)] ; xmm3=tmp3H655 656 paddd xmm0, XMMWORD [wk(10)] ; xmm0=tmp0L657 paddd xmm7, XMMWORD [wk(11)] ; xmm7=tmp0H658 paddd xmm1,xmm5 ; xmm1=tmp3L659 paddd xmm3,xmm4 ; xmm3=tmp3H660 661 movdqa XMMWORD [wk(8)], xmm0 ; wk(8)=tmp0L662 movdqa XMMWORD [wk(9)], xmm7 ; wk(9)=tmp0H663 664 movdqa xmm0,xmm2665 movdqa xmm7,xmm2666 punpcklwd xmm0,xmm6667 punpckhwd xmm7,xmm6668 movdqa xmm2,xmm0669 movdqa xmm6,xmm7670 pmaddwd xmm0,[GOTOFF(ebx,PW_MF050_MF256)] ; xmm0=tmp1L671 pmaddwd xmm7,[GOTOFF(ebx,PW_MF050_MF256)] ; xmm7=tmp1H672 pmaddwd xmm2,[GOTOFF(ebx,PW_MF256_F050)] ; xmm2=tmp2L673 pmaddwd xmm6,[GOTOFF(ebx,PW_MF256_F050)] ; xmm6=tmp2H674 675 paddd xmm0,xmm5 ; xmm0=tmp1L676 paddd xmm7,xmm4 ; xmm7=tmp1H677 paddd xmm2, XMMWORD [wk(10)] ; xmm2=tmp2L678 paddd xmm6, XMMWORD [wk(11)] ; xmm6=tmp2H679 680 movdqa XMMWORD [wk(10)], xmm0 ; wk(10)=tmp1L681 movdqa XMMWORD [wk(11)], xmm7 ; wk(11)=tmp1H682 683 ; -- Final output stage684 685 movdqa xmm5, XMMWORD [wk(0)] ; xmm5=tmp10L686 movdqa xmm4, XMMWORD [wk(1)] ; xmm4=tmp10H687 688 movdqa xmm0,xmm5689 movdqa xmm7,xmm4690 paddd xmm5,xmm1 ; xmm5=data0L691 paddd xmm4,xmm3 ; xmm4=data0H692 psubd xmm0,xmm1 ; xmm0=data7L693 psubd xmm7,xmm3 ; xmm7=data7H694 695 movdqa xmm1,[GOTOFF(ebx,PD_DESCALE_P2)] ; xmm1=[PD_DESCALE_P2]696 697 paddd xmm5,xmm1698 paddd xmm4,xmm1699 psrad xmm5,DESCALE_P2700 psrad xmm4,DESCALE_P2701 paddd xmm0,xmm1702 paddd xmm7,xmm1703 psrad xmm0,DESCALE_P2704 psrad xmm7,DESCALE_P2705 706 packssdw xmm5,xmm4 ; xmm5=data0=(00 10 20 30 40 50 60 70)707 packssdw xmm0,xmm7 ; xmm0=data7=(07 17 27 37 47 57 67 77)708 709 movdqa xmm3, XMMWORD [wk(4)] ; xmm3=tmp11L710 movdqa xmm1, XMMWORD [wk(5)] ; xmm1=tmp11H711 712 movdqa xmm4,xmm3713 movdqa xmm7,xmm1714 paddd xmm3,xmm2 ; xmm3=data1L715 paddd xmm1,xmm6 ; xmm1=data1H716 psubd xmm4,xmm2 ; xmm4=data6L717 psubd xmm7,xmm6 ; xmm7=data6H718 719 movdqa xmm2,[GOTOFF(ebx,PD_DESCALE_P2)] ; xmm2=[PD_DESCALE_P2]720 721 paddd xmm3,xmm2722 paddd xmm1,xmm2723 psrad xmm3,DESCALE_P2724 psrad xmm1,DESCALE_P2725 paddd xmm4,xmm2726 paddd xmm7,xmm2727 psrad xmm4,DESCALE_P2728 psrad xmm7,DESCALE_P2729 730 packssdw xmm3,xmm1 ; xmm3=data1=(01 11 21 31 41 51 61 71)731 packssdw xmm4,xmm7 ; xmm4=data6=(06 16 26 36 46 56 66 76)732 733 packsswb xmm5,xmm4 ; xmm5=(00 10 20 30 40 50 60 70 06 16 26 36 46 56 66 76)734 packsswb xmm3,xmm0 ; xmm3=(01 11 21 31 41 51 61 71 07 17 27 37 47 57 67 77)735 736 movdqa xmm6, XMMWORD [wk(6)] ; xmm6=tmp12L737 movdqa xmm2, XMMWORD [wk(7)] ; xmm2=tmp12H738 movdqa xmm1, XMMWORD [wk(10)] ; xmm1=tmp1L739 movdqa xmm7, XMMWORD [wk(11)] ; xmm7=tmp1H740 741 movdqa XMMWORD [wk(0)], xmm5 ; wk(0)=(00 10 20 30 40 50 60 70 06 16 26 36 46 56 66 76)742 movdqa XMMWORD [wk(1)], xmm3 ; wk(1)=(01 11 21 31 41 51 61 71 07 17 27 37 47 57 67 77)743 744 movdqa xmm4,xmm6745 movdqa xmm0,xmm2746 paddd xmm6,xmm1 ; xmm6=data2L747 paddd xmm2,xmm7 ; xmm2=data2H748 psubd xmm4,xmm1 ; xmm4=data5L749 psubd xmm0,xmm7 ; xmm0=data5H750 751 movdqa xmm5,[GOTOFF(ebx,PD_DESCALE_P2)] ; xmm5=[PD_DESCALE_P2]752 753 paddd xmm6,xmm5754 paddd xmm2,xmm5755 psrad xmm6,DESCALE_P2756 psrad xmm2,DESCALE_P2757 paddd xmm4,xmm5758 paddd xmm0,xmm5759 psrad xmm4,DESCALE_P2760 psrad xmm0,DESCALE_P2761 762 packssdw xmm6,xmm2 ; xmm6=data2=(02 12 22 32 42 52 62 72)763 packssdw xmm4,xmm0 ; xmm4=data5=(05 15 25 35 45 55 65 75)764 765 movdqa xmm3, XMMWORD [wk(2)] ; xmm3=tmp13L766 movdqa xmm1, XMMWORD [wk(3)] ; xmm1=tmp13H767 movdqa xmm7, XMMWORD [wk(8)] ; xmm7=tmp0L768 movdqa xmm5, XMMWORD [wk(9)] ; xmm5=tmp0H769 770 movdqa xmm2,xmm3771 movdqa xmm0,xmm1772 paddd xmm3,xmm7 ; xmm3=data3L773 paddd xmm1,xmm5 ; xmm1=data3H774 psubd xmm2,xmm7 ; xmm2=data4L775 psubd xmm0,xmm5 ; xmm0=data4H776 777 movdqa xmm7,[GOTOFF(ebx,PD_DESCALE_P2)] ; xmm7=[PD_DESCALE_P2]778 779 paddd xmm3,xmm7780 paddd xmm1,xmm7781 psrad xmm3,DESCALE_P2782 psrad xmm1,DESCALE_P2783 paddd xmm2,xmm7784 paddd xmm0,xmm7785 psrad xmm2,DESCALE_P2786 psrad xmm0,DESCALE_P2787 788 movdqa xmm5,[GOTOFF(ebx,PB_CENTERJSAMP)] ; xmm5=[PB_CENTERJSAMP]789 790 packssdw xmm3,xmm1 ; xmm3=data3=(03 13 23 33 43 53 63 73)791 packssdw xmm2,xmm0 ; xmm2=data4=(04 14 24 34 44 54 64 74)792 793 movdqa xmm7, XMMWORD [wk(0)] ; xmm7=(00 10 20 30 40 50 60 70 06 16 26 36 46 56 66 76)794 movdqa xmm1, XMMWORD [wk(1)] ; xmm1=(01 11 21 31 41 51 61 71 07 17 27 37 47 57 67 77)795 796 packsswb xmm6,xmm2 ; xmm6=(02 12 22 32 42 52 62 72 04 14 24 34 44 54 64 74)797 packsswb xmm3,xmm4 ; xmm3=(03 13 23 33 43 53 63 73 05 15 25 35 45 55 65 75)798 799 paddb xmm7,xmm5800 paddb xmm1,xmm5801 paddb xmm6,xmm5802 paddb xmm3,xmm5803 804 movdqa xmm0,xmm7 ; transpose coefficients(phase 1)805 punpcklbw xmm7,xmm1 ; xmm7=(00 01 10 11 20 21 30 31 40 41 50 51 60 61 70 71)806 punpckhbw xmm0,xmm1 ; xmm0=(06 07 16 17 26 27 36 37 46 47 56 57 66 67 76 77)807 movdqa xmm2,xmm6 ; transpose coefficients(phase 1)808 punpcklbw xmm6,xmm3 ; xmm6=(02 03 12 13 22 23 32 33 42 43 52 53 62 63 72 73)809 punpckhbw xmm2,xmm3 ; xmm2=(04 05 14 15 24 25 34 35 44 45 54 55 64 65 74 75)810 811 movdqa xmm4,xmm7 ; transpose coefficients(phase 2)812 punpcklwd xmm7,xmm6 ; xmm7=(00 01 02 03 10 11 12 13 20 21 22 23 30 31 32 33)813 punpckhwd xmm4,xmm6 ; xmm4=(40 41 42 43 50 51 52 53 60 61 62 63 70 71 72 73)814 movdqa xmm5,xmm2 ; transpose coefficients(phase 2)815 punpcklwd xmm2,xmm0 ; xmm2=(04 05 06 07 14 15 16 17 24 25 26 27 34 35 36 37)816 punpckhwd xmm5,xmm0 ; xmm5=(44 45 46 47 54 55 56 57 64 65 66 67 74 75 76 77)817 818 movdqa xmm1,xmm7 ; transpose coefficients(phase 3)819 punpckldq xmm7,xmm2 ; xmm7=(00 01 02 03 04 05 06 07 10 11 12 13 14 15 16 17)820 punpckhdq xmm1,xmm2 ; xmm1=(20 21 22 23 24 25 26 27 30 31 32 33 34 35 36 37)821 movdqa xmm3,xmm4 ; transpose coefficients(phase 3)822 punpckldq xmm4,xmm5 ; xmm4=(40 41 42 43 44 45 46 47 50 51 52 53 54 55 56 57)823 punpckhdq xmm3,xmm5 ; xmm3=(60 61 62 63 64 65 66 67 70 71 72 73 74 75 76 77)824 825 pshufd xmm6,xmm7,0x4E ; xmm6=(10 11 12 13 14 15 16 17 00 01 02 03 04 05 06 07)826 pshufd xmm0,xmm1,0x4E ; xmm0=(30 31 32 33 34 35 36 37 20 21 22 23 24 25 26 27)827 pshufd xmm2,xmm4,0x4E ; xmm2=(50 51 52 53 54 55 56 57 40 41 42 43 44 45 46 47)828 pshufd xmm5,xmm3,0x4E ; xmm5=(70 71 72 73 74 75 76 77 60 61 62 63 64 65 66 67)829 830 mov edx, JSAMPROW [edi+0*SIZEOF_JSAMPROW]831 mov esi, JSAMPROW [edi+2*SIZEOF_JSAMPROW]832 movq XMM_MMWORD [edx+eax*SIZEOF_JSAMPLE], xmm7833 movq XMM_MMWORD [esi+eax*SIZEOF_JSAMPLE], xmm1834 mov edx, JSAMPROW [edi+4*SIZEOF_JSAMPROW]835 mov esi, JSAMPROW [edi+6*SIZEOF_JSAMPROW]836 movq XMM_MMWORD [edx+eax*SIZEOF_JSAMPLE], xmm4837 movq XMM_MMWORD [esi+eax*SIZEOF_JSAMPLE], xmm3838 839 mov edx, JSAMPROW [edi+1*SIZEOF_JSAMPROW]840 mov esi, JSAMPROW [edi+3*SIZEOF_JSAMPROW]841 movq XMM_MMWORD [edx+eax*SIZEOF_JSAMPLE], xmm6842 movq XMM_MMWORD [esi+eax*SIZEOF_JSAMPLE], xmm0843 mov edx, JSAMPROW [edi+5*SIZEOF_JSAMPROW]844 mov esi, JSAMPROW [edi+7*SIZEOF_JSAMPROW]845 movq XMM_MMWORD [edx+eax*SIZEOF_JSAMPLE], xmm2846 movq XMM_MMWORD [esi+eax*SIZEOF_JSAMPLE], xmm5847 848 pop edi849 pop esi850; pop edx ; need not be preserved851; pop ecx ; unused852 poppic ebx853 mov esp,ebp ; esp <- aligned ebp854 pop esp ; esp <- original ebp855 pop ebp856 ret857 858; For some reason, the OS X linker does not honor the request to align the859; segment unless we do this.860 align 16861",16300,True,4069.9141629684154,median862"863/*864 TODO: check for maximum when changing CVs 31 ... 34865 TODO: implement change of direction --> forward / backward866*/867 868/* **********************************************************************************869THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ""AS IS"" AND ANY 870EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 871OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 872SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,873SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 874OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 875HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 876OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 877USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.878********************************************************************************** */879 880 881#include <avr/wdt.h> // Needed for automatic reset functions.882 883 884/* ******************************************************************************* */885 886// The next line is there to prevent large in-rush currents during PWM cycly.887#define SOFTPWM_OUTPUT_DELAY888 889#include <SoftPWM.h>890 891SOFTPWM_DEFINE_CHANNEL( 1, DDRD, PORTD, PORTD7); //Arduino pin D7 --> LS1892SOFTPWM_DEFINE_CHANNEL( 2, DDRC, PORTC, PORTC1); //Arduino pin A1 --> LS2893SOFTPWM_DEFINE_CHANNEL( 3, DDRD, PORTD, PORTD5); //Arduino pin D5 --> LS3894SOFTPWM_DEFINE_CHANNEL( 4, DDRD, PORTD, PORTD3); //Arduino pin D3 --> LS4895SOFTPWM_DEFINE_CHANNEL( 5, DDRD, PORTD, PORTD6); //Arduino pin D6 --> LB1896SOFTPWM_DEFINE_CHANNEL( 6, DDRC, PORTC, PORTC0); //Arduino pin A0 --> LB2897SOFTPWM_DEFINE_CHANNEL( 7, DDRD, PORTD, PORTD4); //Arduino pin D4 --> LB3898 899#if defined( LAMPS36 )900 901 SOFTPWM_DEFINE_CHANNEL( 8, DDRC, PORTC, PORTC3); //Arduino pin A3 --> LB4902 SOFTPWM_DEFINE_CHANNEL( 9, DDRC, PORTC, PORTC4); //Arduino pin A4 --> LB5903 SOFTPWM_DEFINE_CHANNEL(10, DDRC, PORTC, PORTC5); //Arduino pin A5 --> LB6904 SOFTPWM_DEFINE_CHANNEL(11, DDRB, PORTB, PORTB0); //Arduino pin D8 --> AX1905 SOFTPWM_DEFINE_CHANNEL(12, DDRB, PORTB, PORTB1); //Arduino pin D9 --> AX2906 SOFTPWM_DEFINE_CHANNEL(13, DDRB, PORTB, PORTB2); //Arduino pin 10 --> AX3907 SOFTPWM_DEFINE_CHANNEL(14, DDRC, PORTC, PORTC2); //Arduino pin A2 --> AX4908 909#endif910 911SOFTPWM_DEFINE_CHANNEL(15, DDRB, PORTB, PORTB5); //Arduino pin 13 --> LED912 913SOFTPWM_DEFINE_OBJECT_WITH_PWM_LEVELS( 15, 100); // Set 15 pulsed outputs914 915 916//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////917//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////918//919// ***** Uncomment to use the PinChangeInterrupts iso External Interrupts *****920// #define PIN_CHANGE_INT921 922#include <NmraDcc.h>923 924NmraDcc Dcc ;925DCC_MSG Packet ;926 927 928//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////929//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////930//931// ******** UNLESS YOU WANT ALL CV'S RESET UPON EVERY POWER UP REMOVE THE ""//"" IN THE FOLLOWING LINE!!932#define DECODER_LOADED933 934// ******** REMOVE THE ""//"" IN THE FOLLOWING LINE TO SEND DEBUGGING INFO TO THE SERIAL OUTPUT935// #define DEBUG36936 937// ******** REMOVE THE ""//"" IN THE NEXT LINE IF YOU WANT TO USE YOUR SERIAL PORT FOR COMMANDS938// #define MONITOR939 940// ******** REMOVE THE ""//"" IN THE FOLLOWING LINE TO USE AS A '6LAMP PCB WITH AUX PORTS' ELSE IT'S A '3LAMP W/O AUX PORTS'941// #define LAMPS36942 943 944#ifdef DEBUG36945 #define _PP( a ) Serial.print( a );946 #define _PL( a ) Serial.println( a );947 #define _2P(a,b) Serial.print( a, b );948 #define _2L(a,b) Serial.println(a, b);949#else950 #define _PP( a )951 #define _PL( a )952 #define _2P(a,b)953 #define _2L(a,b)954#endif955 956 957#ifdef MONITOR958 #define _MP( a ) Serial.print( a );959 #define _ML( a ) Serial.println( a );960 #define _3P(a,b) Serial.print( a, b);961 #define _3L(a,b) Serial.println(a, b);962#else963 #define _MP( a )964 #define _ML( a )965 #define _3P(a,b)966 #define _3L(a,b)967#endif968 969 970//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////971//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////972 973 974extern int __heap_start, *__brkval;975 976#ifdef MONITOR977 978 char bomMarker = '<'; // Begin of message marker.979 char eomMarker = '>'; // End of message marker.980 char commandString[ 32] ; // Max length for a buffer.981 char sprintfBuffer[ 32] ; // Max length for a buffer.982 boolean foundBom = false; // Found begin of messages.983 boolean foundEom = false; // Founf end of messages.984 985#endif986 987 988/* ******************************************************************************* */989 990 991int tim_delay = 500;992int numfpins = 17;993byte fpins [] = { 11, 7, 15, 5, 3, 6, 14, 4, 17, 18, 19, 8, 9, 10, 16, 13, 12};994// pinnames: > DNU, PD7, PC1, PD5, PD3, PD6, PC0, PD4, PC3, PC4, PC5, PB0, PB1, PB2, PC2, PB5, DNU <995 996const int FunctionPinRx = 0; // PD0 Tx0997const int FunctionPinTx = 1; // PD1 Rx1998const int FunctionPinDcc = 2; // PD2 DCC999 1000const int FunctionPin0 = 3; // PD3 LS41001const int FunctionPin1 = 4; // PD4 LB31002const int FunctionPin2 = 5; // PD5 LS31003const int FunctionPin3 = 6; // PD6 LB11004const int FunctionPin4 = 7; // PD7 LS11005const int FunctionPin5 = 8; // PB0 AX11006const int FunctionPin6 = 9; // PB1 AX21007const int FunctionPin7 = 10; // PB2 AX31008const int FunctionPin8 = 11; // PB3 DNU1009const int FunctionPin9 = 12; // PB4 DNU1010const int FunctionPinLed = 13; // PB5 LED1011const int FunctionPin10 = 14; // PC0 LB21012const int FunctionPin11 = 15; // PC1 LS21013const int FunctionPin12 = 16; // PC2 AX41014const int FunctionPin13 = 17; // PC3 LB41015const int FunctionPin14 = 18; // PC4 LB51016const int FunctionPin15 = 19; // PC5 LB61017 1018// AD0 = LB2 PD0 = Rx1 PB0 = AX11019// AD1 = LS2 PD1 = Tx0 PB1 = AX21020// AD2 = AX4 PD2 = DCC PB2 = AX31021// AD3 = LB4 PD3 = LS4 PB3 = ICSP1022// AD4 = LB5 PD4 = LB3 PB4 = ICSP1023// AD5 = LB6 PD5 = LS3 PB5 = ICSP1024// AD6 = DNU PD6 = LB1 PB6 = Xtal11025// AD7 = DNU PD7 = LS1 PB7 = Xtal21026 1027 1028/* ******************************************************************************* */1029 1030 1031#define SET_CV_Address 24 // THIS ADDRESS IS FOR SETTING CV'S (LIKE A LOCO)1032#define Accessory_Address 140 // THIS ADDRESS IS THE ADDRESS OF THIS DCC DECODER1033 1034uint8_t CV_DECODER_MASTER_RESET = 120; // THIS IS THE CV ADDRESS OF THE FULL RESET1035#define CV_To_Store_SET_CV_Address 1211036#define CV_Accessory_Address CV_ACCESSORY_DECODER_ADDRESS_LSB1037 1038struct QUEUE1039{1040 int inUse; // output in use or not1041 unsigned long previousMicros; // last time for fading1042 unsigned long waitMicros; // interval in micros()1043 int fadeCounter; // count of fadinglevel1044 int maxLevel; // maximum output level1045 bool upDown; // travel direction led1046 unsigned long previousMillis; // last time we blinked1047 unsigned long blinkInterval; // interval in millis()1048 int ledState; // state of this output1049 int previousState; // previous outputstate1050};1051QUEUE volatile *ftn_queue = new QUEUE[ 17 ];1052 1053struct CVPair1054{1055 uint16_t CV;1056 uint8_t Value;1057};1058 1059CVPair FactoryDefaultCVs [] =1060{1061 // These two CVs define the Long Accessory Address1062 {CV_ACCESSORY_DECODER_ADDRESS_LSB, Accessory_Address & 0xFF},1063 {CV_ACCESSORY_DECODER_ADDRESS_MSB, (Accessory_Address >> 8) & 0x07},1064 1065 {CV_MULTIFUNCTION_EXTENDED_ADDRESS_MSB, 0},1066 {CV_MULTIFUNCTION_EXTENDED_ADDRESS_LSB, 0},1067 1068// Speed Steps don't matter for this decoder, only for loc decoders1069// ONLY uncomment 1 CV_29_CONFIG line below as approprate DEFAULT IS SHORT ADDRESS1070// {CV_29_CONFIG, 0}, // Short Address 14 Speed Steps1071 {CV_29_CONFIG, CV29_F0_LOCATION}, // Short Address 28/128 Speed Steps1072// {CV_29_CONFIG, CV29_EXT_ADDRESSING | CV29_F0_LOCATION}, // Long Address 28/128 Speed Steps1073// {CV_29_CONFIG, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE | CV29_F0_LOCATION}, // Accesory Decoder Short Address1074// {CV_29_CONFIG, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE | CV29_EXT_ADDRESSING | CV29_F0_LOCATION}, // Accesory Decoder Long Address1075 1076 {CV_DECODER_MASTER_RESET, 0},1077 1078 {CV_To_Store_SET_CV_Address, SET_CV_Address & 0xFF }, // LSB Set CV Address1079 {CV_To_Store_SET_CV_Address + 1, (SET_CV_Address >> 8) & 0x3F }, // MSB Set CV Address1080 1081 { 30, 0}, // GEN 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1082 { 31, 50}, // Maximum level outputs (100 max)1083 { 32, 100}, // Waitmicros (250 * 100,000 max)1084 { 33, 5}, // Waitmicros divider (standard 5)1085 { 34, 100}, // Standard blink interval (* 10)1086 { 35, 0}, // LS1 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1087 { 36, 50}, // Maximum level this output1088 { 37, 100}, // Waitmicros output highend1089 { 38, 5}, // Waitmicros output divider1090 { 39, 100}, // Blinkinterval this output1091 { 40, 0}, // LS2 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1092 { 41, 50}, // Maximum level this output1093 { 42, 100}, // Waitmicros output highend1094 { 43, 5}, // Waitmicros output divider1095 { 44, 100}, // Blinkinterval this output1096 { 45, 0}, // LS3 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1097 { 46, 50}, // Maximum level this output1098 { 47, 100}, // Waitmicros output highend1099 { 48, 5}, // Waitmicros output divider1100 { 49, 100}, // Blinkinterval this output1101 { 50, 0}, // LS4 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1102 { 51, 50}, // Maximum level this output1103 { 52, 100}, // Waitmicros output highend1104 { 53, 5}, // Waitmicros output divider1105 { 54, 100}, // Blinkinterval this output1106 { 55, 0}, // LB1 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1107 { 56, 50}, // Maximum level this output1108 { 57, 100}, // Waitmicros output highend1109 { 58, 5}, // Waitmicros output divider1110 { 59, 100}, // Blinkinterval this output1111 { 60, 0}, // LB2 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1112 { 61, 50}, // Maximum level this output1113 { 62, 100}, // Waitmicros output highend1114 { 63, 5}, // Waitmicros output divider1115 { 64, 100}, // Blinkinterval this output1116 { 65, 0}, // LB3 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1117 { 66, 50}, // Maximum level this output1118 { 67, 100}, // Waitmicros output highend1119 { 68, 5}, // Waitmicros output divider1120 { 69, 100}, // Blinkinterval this output1121 1122#if defined( LAMPS36 )1123 1124 { 70, 0}, // LB4 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1125 { 71, 50}, // Maximum level this output1126 { 72, 100}, // Waitmicros output highend1127 { 73, 5}, // Waitmicros output divider1128 { 74, 100}, // Blinkinterval this output1129 { 75, 0}, // LB5 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1130 { 76, 50}, // Maximum level this output1131 { 77, 100}, // Waitmicros output highend1132 { 78, 5}, // Waitmicros output divider1133 { 79, 100}, // Blinkinterval this output1134 { 80, 0}, // LB6 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1135 { 81, 50}, // Maximum level this output1136 { 82, 100}, // Waitmicros output highend1137 { 83, 5}, // Waitmicros output divider1138 { 84, 100}, // Blinkinterval this output1139 { 85, 0}, // AX1 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1140 { 86, 0}, // Maximum level this output1141 { 87, 0}, // Waitmicros output highend1142 { 88, 0}, // Waitmicros output divider1143 { 89, 0}, // Blinkinterval this output1144 { 90, 0}, // AX2 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1145 { 91, 0}, // Maximum level this output1146 { 92, 0}, // Waitmicros output highend1147 { 93, 0}, // Waitmicros output divider1148 { 94, 0}, // Blinkinterval this output1149 { 95, 0}, // AX3 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1150 { 96, 0}, // Maximum level this output1151 { 97, 0}, // Waitmicros output highend1152 { 98, 0}, // Waitmicros output divider1153 { 99, 0}, // Blinkinterval this output1154 {100, 0}, // AX4 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1155 {101, 0}, // Maximum level this output1156 {102, 0}, // Waitmicros output highend1157 {103, 0}, // Waitmicros output divider1158 {104, 0}, // Blinkinterval this output1159 1160#endif // LAMPS361161 1162 {105, 1}, // LED 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1163 {106, 50}, // Maximum level this output1164 {107, 100}, // Waitmicros output highend1165 {108, 5}, // Waitmicros output divider1166 {109, 100}, // Blinkinterval this output1167 {110, 0}, // DNU 0 = Off, 1 = On, 2 = Blink Off, 3 = Blink On, 4 = Fade Off, 5 = Fade On1168 {111, 0}, // Maximum level this output1169 {112, 0}, // Waitmicros output highend1170 {113, 0}, // Waitmicros output divider1171 {114, 0}, // Blinkinterval this output1172};1173 1174volatile uint8_t FactoryDefaultCVIndex = sizeof( FactoryDefaultCVs ) / sizeof( CVPair );1175 1176// These are the absolute maximums allowed !!!1177volatile uint8_t M_maxLevel = Dcc.getCV( 31 );1178volatile uint8_t M_highend = Dcc.getCV( 32 );1179volatile uint8_t M_divider = Dcc.getCV( 33 );1180volatile uint8_t M_interval = Dcc.getCV( 34 );1181 1182// This is the switch between F0 or F1 - F141183volatile uint8_t C_between = Dcc.getCV(111 );1184 1185 1186/* ******************************************************************************* */1187 1188 1189void setup()1190{1191 noInterrupts();1192 1193 // initialize the digital pins as outputs1194 for (int i = 1; i < numfpins - 1; i++) 1195 {1196 digitalWrite( fpins[ i ], 0 ); // Switch the pin off first.1197 pinMode( fpins[ i ], OUTPUT ); // Then set it as an output.1198 }1199 1200 // Start SoftPWM with 60hz pwm frequency