(mov al, byte [esi] + add esi, 1) vs lodsb

Тема в разделе "WASM.BEGINNERS", создана пользователем dyn, 10 янв 2011.

  1. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    leo про это выше уже писал.
    Строковые команды с rep обрабатываются процессором отдельно и как раз оптимизированы, тормозные только варианты без префикса.
    Т.е. movsd для пересылки dword'а будет медленнее чем mov reg,[mem1]/mov [mem2],reg.
    Но rep movsd для копирования блока памяти работает быстро, и чем больше блок памяти тем лучше.
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    rep мovs и rep stos и так оптимизированы для сравнительно большого числа повторений (более 16-20). Это ограничение связано с тем, что они реализуются без условных переходов - просто когда декодер встречает команду rep movs, он стопорится и ждет когда выполнится предыдущая команда инициализации регистра ecx и затем программирует MicroCode ROM на выдачу непрерывной последовательности микроопов в соответсвии с заданным числом повторений из ecx. Соотв-но и величина оверхеда (задержки исполнения) в тактах примерно равна длине конвеера - чтобы команда mov ecx,X прошла через конвеер и выполнилась. Но зато по сравнению с обычным циклом, у rep отстутствует пенальти на непредсказанный переход при выходе из цикла. Т.е. обычный цикл имеет пенальти в конце, а rep примерно ту де задержку в начале. Поскольку rep movs\stos не имеют мопов управления циклом (декремент счетчика + усл.переход), то по скорости они оказываются примерно эквиваленты циклу развернутому на 4 и более