можно ли это оптимизировать?

Discussion in 'WASM.BEGINNERS' started by t00x, Aug 27, 2007.

  1. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    Code (Text):
    1. ; in - al=byte
    2. ;out - ebx = bit field
    3. ;out - dl = al (если al (0xA0..0xAF)
    4.         mov bl, al      ; save al
    5.         and bl, 11110000b
    6.         cmp bl, 0xA0        ; 0xA0 - 0xAF
    7.         jne @notA0
    8.         mov dl, al
    9.     xor bl, bl
    10.         jmp @next_byte
    11. @notA0:
    12.     xor bl, bl
    13.     xor ecx, ecx       
    14.     mov cl, 12
    15.         lea edi, [table_]      
    16.  
    17.     cld
    18.     repne scasb
    19.     bts ebx, ecx
    20.  
    21. @next_byte:
    22.  
    23. table_ db 0xF0, 0xF8, 0xFC, 0x34, 0x35, 0x36, 0x37, 0x8D, 0xF2, 0x88, 0x0F, 0
     
  2. Twister

    Twister New Member

    Blog Posts:
    0
    Joined:
    Oct 12, 2005
    Messages:
    720
    Location:
    Алматы
    По скорости или размеру?
     
  3. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    по скорости конечно.
     
  4. Twister

    Twister New Member

    Blog Posts:
    0
    Joined:
    Oct 12, 2005
    Messages:
    720
    Location:
    Алматы
    А... а я по размеру начал и увидел, что mov dl, al можно заменить на xchg edx, eax ;)
     
  5. nobodyzzz

    nobodyzzz New Member

    Blog Posts:
    0
    Joined:
    Jul 13, 2005
    Messages:
    475
    ну если по скорости то можно как минимум отказаться от партиальных регистров т.к. арифметический операций нет то безболезненно =)
     
  6. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    al ещё понадобится (; save al )
     
  7. n0name

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    xor bl, bl вынести перед проверкой. и размер и скорость.

    xor ecx, ecx
    mov cl, 12

    а что мешает mov ecx, 12 ?
     
  8. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    -
    P.S. не получится так x) JNE = JNZ
     
  9. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    думал, может что-нибудь с
    cld
    repne scasb
    bts ebx, ecx

    сделать.
    по rdtsc проходит за 240 тиков, а без этого всего за 60.
     
  10. nobodyzzz

    nobodyzzz New Member

    Blog Posts:
    0
    Joined:
    Jul 13, 2005
    Messages:
    475
    ну да достаточно тормозные конструкции...
    как самый очевидный вариант =)
    @@:
    mov dl, [edi]
    inc edi
    inc ecx
    cmp al, dl
    jnz @B
    mov edx, 1
    shl edx, cl
    or ebx, edx
    test ebx, edx
     
  11. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    пробовал cmp ... + sub ecx... + ...
    получается вообще >400.
    table_ маленькая, может можно без неё обойтись
     
  12. n0name

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    Code (Text):
    1. @@:
    2.       cmp al, [edi]
    3.       inc edi
    4.       shl edx, 1
    5.       jnz @B
     
  13. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    Code (Text):
    1.         mov eax, 0x0F
    2.         mov bl, al              ; save al
    3.         and bl, 11110000b
    4.         cmp bl, 0xA0            ; 0xA0 - 0xAF
    5.         jne @notA0
    6.         mov dl, al
    7.         xor bl, bl
    8.         jmp @next_byte
    9. @notA0:
    10.         mov ecx, 11     ;12
    11.         mov edi, table_
    12.         xor bl, bl
    13. @@:
    14.     mov dl, [edi]
    15.     inc edi
    16.     dec ecx
    17.     jz @next_byte
    18.     cmp al, dl
    19.     jne @B
    20.     bts ebx, ecx
    21. @next_byte:
    22.     xor dl, dl
    23.  
    24. table_  db 0xF0, 0xF8, 0xFC, 0x34, 0x35, 0x36, 0x37, 0x8D, 0xF2, 0x88, 0x0F, 0
    этот код выполняется за 180 тиков.
    n0name
    меняю mov dl, edi + cmp dl, al на cmp al, [edi] - 320!
     
  14. leo

    leo Active Member

    Blog Posts:
    0
    Joined:
    Aug 4, 2004
    Messages:
    2,542
    Location:
    Russia
    bts это отстой ;)
    Code (Text):
    1. ; in - al=byte
    2. ;out - ebx = bit field
    3. ;out - dl = al (если al (0xA0..0xAF)
    4.   mov dl, al        ; save al
    5.   and al, 0xF0
    6.   cmp al, 0xA0      ; 0xA0 - 0xAF
    7.   je @next_byte
    8.   mov ecx,11            ;12 ?
    9.   lea edi,[ecx+table_]
    10.   mov ebx,1             ;или lea ebx,[ecx-10] для мелочной экономии размера ;)
    11.   neg ecx
    12. ;align 16
    13. @notA0:
    14.   cmp dl,[edi+ecx]
    15.   jz @found
    16.   add ebx,ebx            ;=shl ebx,1
    17.   add ecx,1
    18.   jnz @notA0
    19. @nextbyte:
    20.   xor ebx,ebx
    21. @found:
    22.   ;mov al,dl  ;если нужно сохранить al
    23.  
    24. table_ db ... ;<инвертировать в обратном порядке по сравн. c bts ebx,ecx>
     
  15. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    leo
    cупер! 110 тиков.