Глубокая оптимизация подсчёта количества бит на MMX

Тема в разделе "WASM.ZEN", создана пользователем t00x, 26 сен 2007.

  1. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    старая процедура, требуется оптимизировать по скорости:
    Код (Text):
    1. call InitMMX4_7
    2. mov edi, data64
    3. call MMX_Calc1
    4.  
    5. ; preload MMX registers
    6. proc  InitMMX4_7
    7.     push ebx
    8.     mov ebx, t0x5555
    9.     movq mm7, qword [ebx]         ;0x5555
    10.     movq mm6, qword [ebx+8]       ;0x3333
    11.     movq mm5, qword [ebx+16]      ;0x0F0F
    12.     movq mm4, qword [ebx+24]      ;0x00FF
    13.     pop ebx
    14.  
    15.     ret
    16. endp
    17.  
    18. ; edi - pointer to Data (2 qword's)
    19. ; eax, edx - Result first, second qword
    20. ; Use eax, edx, edi, mm0 - mm3, (mm4 - mm7 from InitMMX4_7)
    21. proc MMX_Calc1
    22.     movq mm0, qword [edi]       ;
    23.     movq mm2, qword [edi+64]    ;
    24. ;        pxor mm0, qword [ebp]          ; load data
    25.                                         ;
    26.     movq mm1, mm0                   ;
    27.     movq mm3, mm2                   ;
    28.  
    29.     psrld mm1, 1                    ;
    30.     psrld mm3, 1                    ;
    31.     pand mm0, mm7                   ;
    32.     pand mm2, mm7                   ; first step
    33.     pand mm1, mm7                   ;
    34.     pand mm3, mm7                   ;
    35.     paddd mm0, mm1                  ;
    36.     paddd mm2, mm3                  ;
    37.  
    38.     movq mm1, mm0                   ; load data
    39.     movq mm3, mm2                   ;
    40.  
    41.     pand mm0, mm6                   ;
    42.     pand mm2, mm6                   ;
    43.     psrld mm1, 2                    ;
    44.     psrld mm3, 2                    ; second step
    45.     pand mm1, mm6                   ;
    46.     pand mm3, mm6                   ;
    47.     paddd mm0, mm1                  ;
    48.     paddd mm2, mm3                  ;
    49.  
    50.     movq mm1, mm0                   ; load data
    51.     movq mm3, mm2                   ;
    52.  
    53.     psrld mm1, 4
    54.     psrld mm3, 4
    55.     pand mm0, mm5
    56.     pand mm2, mm5
    57.     pand mm1, mm5
    58.     pand mm3, mm5
    59.     paddd mm0, mm1              ; Result in every byte (8)
    60.     paddd mm2, mm3                  ;
    61.  
    62.     movq mm1, mm0
    63.     movq mm3, mm2
    64.  
    65.     pand mm0, mm4
    66.     pand mm2, mm4
    67.     psrld mm1, 8
    68.     psrld mm3, 8
    69.     pand mm1, mm4
    70.     pand mm3, mm4
    71.     paddd mm0, mm1              ; Result in every word (4)
    72.     paddd mm2, mm3                  ;
    73.  
    74.     movq mm1, mm0
    75.     movq mm3, mm2
    76.  
    77.     psrld mm0, 16
    78.     psrld mm2, 16
    79.     paddd mm1, mm0                  ;mm1,mm3   00000000 00000000
    80.     paddd mm3, mm2                  ;mm1,mm3 =  Result1  Result2
    81.  
    82.     movq mm0, mm1
    83.     movq mm2, mm3
    84.     psrlq mm0, 32
    85.     psrlq mm2, 32
    86.     paddw mm1, mm0
    87.     paddw mm3, mm2
    88.  
    89.     movd eax, mm1         ; EAX = 00 R0 00 RA = result
    90.     movd edx, mm3
    91.     and eax, 0x0000001F
    92.     and edx, 0x0000001F
    93.     ret
    94. endp
    95.  
    96.   t0x5555 dq 0x5555555555555555
    97.   t0x3333 dq 0x3333333333333333
    98.   t0x0F0F dq 0x0F0F0F0F0F0F0F0F
    99.   t0x00FF dq 0x00FF00FF00FF00FF
    P.S. emms вставить по необходимости
    P.P.S пардон, это оптимизированный вариант