Про XLAT

Тема в разделе "WASM.A&O", создана пользователем persicum, 20 ноя 2008.

  1. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    1) Чем xlat отличается от xlatb

    2) кроме ebx можно ли использовать другие регистры или выражения?
    например, откомпилил xlat [esi] хотя код и работу не проверял.

    3) нужно заменить по очереди четыре байта в eax
    Есть ли что нибудь лучше, чем тупо вызывать xlat 4-ре раза?
    SIMD может помочь в векторизации-ускорении xlat?

    или только тупо

    xlat
    mov cl,al
    mov al,ah
    xlat
    mov ch,al
    ....

    и того 4-ре xlat и еще куча пересылок байтов...
    может быть есть какой-нибудь rep?

    4) как лучше всего заменить все 4-байта в eax по байтовой таблице?
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    persicum
    ничем
    xlat не требует аргументов, любой аргумент игнорируется компилятором и это не более чем комментарий. Некоторые ассемблеры (напр. nasm) генерируют синтаксическую ошибку в данном случае.

    p.s. Если волнует оптимизация по скорости, то я бы использовал mov вместо xlat. Еще, xlat не спаривается никогда.
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    persicum
    XLAT можно сэмулировать -- например, mov eax,table[eax], а "xlat [esi]" == lodsb ;)
     
  4. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    я думаю, вряд ли можно придумать что-то лучшее, чем последовательная замена байтов по одному.

    p.s. не могу не добавить к
    что такой инстркукции нет. Адрес таблицы xlat всегда берет из (e)bx
     
  5. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Кажется, немного подразобрался...
    Это 16-битный xlat берет данные только с адреса bx,
    а 32-битный xlat может брать откуда хошь [выражение].
    У меня компилятор вообще xlat не отрабатывает, а только xlat [ebx]
    Может правильнее xlatb писать - не пробовал.
    Во всех учебниках полная путаница...

    Ага волнует, но xlat может последовательно отработать регистр только в пространстве регистров (кусок кода я приводил), а "эмуляции" будут с памятью работать...

    А что такое спаривается?
     
  6. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    persicum
    нет. xlat берет адрес таблицы в 16-битном режиме всегда из bx, а в 32-битном всегда из ebx (если нет префикса 0x67). Я уже говорил (#2), что любой аргумент xlat'а либо игнорируется компилятором (напр. masm), либо вызывает синтаксическую ошибку (напр. nasm).

    да, некоторые компиляторы немного различают xlat и xlatb, xlat предполагает наличие фиктивного аргумента, xlatb - нет. Хотя в конечном итоге в обоих случах команда скомпилируется в один байт 0xD7.

    в Зубкове очень хорошо описано и про xlat, и про xlatb и про фиктивный аргумент.

    xlat тоже работает с памятью, неявно.

    советую почитать статью Агнера Фога (www.agner.org) по оптимизации, там все подробно расписано, что это и для чего. Здесь, на васме, даже перевод лежит.
     
  7. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Проверил, похоже что так оно и есть.
    Больше всего меня прикалывает, что xlat требует фиктивный адрес, причем требует чтобы потом его проигнорировать!!! Нужно было принять очевидное, чтобы синтаксис допускал только конструкцию xlat [ebx] и не было бы такого бардака и предупреждений об особенности команды xlat. Авторы пишут всюду, не забудьте типа загрузить таблицу в ebx а уж потом пишите xlat [таблица]. Бред какойто, как будто инициализация не требуется для любых задач и переменных...

    Меня интересует возможность векторизации кода, фрагмент которого производит замену по таблице.
    Стало быть, есть есть замена байт по таблице то быстодействие всегда будет "8-битное"?
    И никакие SIMD и регистры на 128-бит не помогут? В случае графических вычислений там хитрее можно типа вращать квадратные регистры. Хотя в SSE2 есть всякие там SHUFD...
     
  8. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    persicum
    используй xlatb
    имхо, правильней всего поступает nasm: xlat и xlatb синонимы, без аргументов (иначе будет синтаксическая ошибка)
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    persicum
    Ес-но, т.к. SIMD работают только с непрерывными блоками памяти, а тебе нужно "надергать" 4 байта по разным адресам