CoolFace
Datasetpublic

GSaha567/seq_level_training_data

sourceHugging Faceupdated 8mo agoView on Hugging Face
0likes52downloads
shard_000019.csv63120 linesDownload Raw Back to root
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

Showing the first 1,200 of 63120 lines. Download the file for the rest.