Установить бит по индексу

Тема в разделе "WASM.A&O", создана пользователем Spectrum, 10 фев 2009.

  1. Spectrum

    Spectrum Member

    Публикаций:
    0
    Регистрация:
    8 дек 2005
    Сообщения:
    43
    Адрес:
    Одесса
    Есть массив битов.
    Нужно установить по индексу один из них.

    Интересует оптимизация по скорости или по количеству команд (размер не важен)

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


    mov ecx, 555 ; индекс бита
    mov eax, ecx
    sar eax, 3 ; приращение в dword'ах
    and ecx, 31 ; индекс бита в пределах dword'а
    mov ebx, 1 ; да, 5 байт, но вроде быстрее xor inc
    sal ebx, cl ; подготовить бит
    lea eax, Mass[eax]
    or [eax], ebx ; установить бит

    Есть идеи?
     
  2. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Код (Text):
    1. mov eax,[bitindex]
    2. bts [Mass],eax
     
  3. Spectrum

    Spectrum Member

    Публикаций:
    0
    Регистрация:
    8 дек 2005
    Сообщения:
    43
    Адрес:
    Одесса
    Нда, намудрил я со сдвигами )
    Ну, на две команды меньше. Спасибо


    Код (Text):
    1.     mov ecx, индекс
    2.     sar eax, 3
    3.     and ecx, 31
    4.     lea eax, Mass[eax]
    5.     bts [eax], ecx
     
  4. _tmp17628

    _tmp17628 New Member

    Публикаций:
    0
    Регистрация:
    7 фев 2009
    Сообщения:
    144
    Могу ошибаться, но вроде битовые операции типа BTS и т.п. медленные...
     
  5. Spectrum

    Spectrum Member

    Публикаций:
    0
    Регистрация:
    8 дек 2005
    Сообщения:
    43
    Адрес:
    Одесса
    По количеству команд во всяком случае.

    Хотя затрудняюсь сказать, что быстрее.
    bts или mov reg,immed + sal reg,cl + or mem, reg

    По идее - bts
     
  6. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Spectrum
    Повторяю
    Код (Text):
    1. mov eax,[bitindex]
    2. bts [Mass],eax
    Индекс может быть больше 31! Ограничение существует только для непосредственного операнда.

    На атлонах bts не спаривается и занимает 9 тактов. Вполне возможно, что твой код будет быстрее. Измерь производительность.
     
  7. Spectrum

    Spectrum Member

    Публикаций:
    0
    Регистрация:
    8 дек 2005
    Сообщения:
    43
    Адрес:
    Одесса
    Извиняюсь, уже понял.

    Я и не знал, что процы такие умные бывают, думал, они только на деревьях кричать умеют )
     
  8. Spectrum

    Spectrum Member

    Публикаций:
    0
    Регистрация:
    8 дек 2005
    Сообщения:
    43
    Адрес:
    Одесса
    mov eax,[bitindex]
    bts [Mass],eax

    В два раза быстрее чем первый вариант
     
  9. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
  10. Spectrum

    Spectrum Member

    Публикаций:
    0
    Регистрация:
    8 дек 2005
    Сообщения:
    43
    Адрес:
    Одесса
    reverser
    Хорошо бы еще и интегралы одним действием...
     
  11. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    RtlSetBits