Расширение байта до DWORD

Тема в разделе "WASM.BEGINNERS", создана пользователем Xerx, 3 янв 2008.

  1. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Нужно "расширить" байт, сохраненный в ячейке памяти value до регистра EDX.
    Т.е. для value=7F получить в EDX=7f7f7f7f.
    Я делаю так:
    Код (Text):
    1.         mov     dl,     value
    2.         mov     al,     dl
    3.         shl     edx,    8
    4.         mov     dl,     al
    5.         mov     ah,     al
    6.         shl     edx,    16
    7.         xchg    dx,     ax
    А быстрее можно?

    И заодно, как наиболее эффективно сделать аналогичное расширение из байта в MMX регистр?
    У меня так:
    Код (Text):
    1.         movd    mm0,    edx
    2.         psllq   mm0,    32
    3.         movd    mm1,    edx
    4.         por     mm0,    mm1
    Заранее спасибо!
     
  2. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Xerx

    Расширение -- это нечто другое ;) Есть инструкции MOVZX и MOVSX -- первая расширяет число без знака (дополнительные старшие разряды будут нулевыми), вторая -- со знаком (будут равны знаку расширяемого числа).

    У Вас же не расширение числа, а скорей его размножение :)

    Код (Text):
    1. mov   dl, Value
    2. mov   dh, dl
    3. bswap edx
    4. mov   dl, Value
    5. mov   dh, dl
     
  3. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    SII
    >Расширение -- это нечто другое
    Я в курсе ) Потому и взял в кавычки. Просто не смог сходу слова лучше подобрать, не называть же "клонированием"...

    А насчет кода - а не будет ли это медленнее моего варианта? Две выборки рдного байта из памяти плюс 5 неспариваемых команд? Я думал над таким вариантом, но гложат меня сомнения...
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. mov al,Value
    2. mov   dl, al
    3. mov   dh, al
    4. bswap edx
    5. mov   dl, al
    6. mov   dh, al
    так поидее исчо быстрее
     
  5. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Freeman
    Ну остается проблема спаривания команд: первая и вторая не спарятся, аналогично вторая и третья, про bswap молчу, ну и так далее.

    Оба эти варианта у меня были. Есть ли способ быстрее? Мне не хватило фантазии, вот и спросил совета у спецов )

    Кстати, как там с MMX ?
     
  6. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    value*1010101h
     
  7. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    W4FhLF
    Вот, это уже хорошо. Особенно, если учесть, что это можно заменить на сдвиги. Пасибо!
     
  8. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Для mmx

    movzx edx, BYTE [Value]
    mov dh, dl
    movd mm0, edx
    pshufw mm0, mm0, 0

    Хотя можно, наверное, получше сделать. Но мне лень
     
  9. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Miller Rabin
    Совсем не подумал про pshufw ( Опыта в MMX маловато. Спасибо!
     
  10. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Xerx

    Можно заменить MOV DH, DL на MOV DH, Value -- загрузка из одной и той же ячейки памяти, значит, реальное обращение к ОЗУ будет максимум одно, дальше будет извлекаться из кэша. В принципе, два подряд идущих MOV в этом случае могут выполняться параллельно (но вот будут ли -- не знаю, а документацию внимательно изучать лень). Плюс растёт длина кода -- в некоторых случаях это может оказаться для производительности как раз хуже.
     
  11. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    SII
    две команды пишут в один регистр - вряд ли будет спаривание (
     
  12. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Xerx

    Вообще-то в разные регистры (разные байты одного регистра, но байты, доступные независимо). Технически реализовать можно...
     
  13. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Код (Text):
    1. mov al,Value
    2. mov   ah, al
    3. mov   dx, ax
    4. shl     eax, 16
    5. or      ax, dx
     
  14. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    SII
    Это байты одного регистра - не получится спарить. Где-то на сайте было описание, там про EBX и его части пример неспариваемых команд.

    t00x
    Пока это самый хороший код. Вряд ли можно лучше )
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Xerx/SII
    Насколько я знаю, спаривание таки возможно, но разные части регистра не на всех процессорах реализованы разными регистрами. Если не ошибаюсь на P4 - это один и тот же регистр (ну т.е. части одного и того же). На каких-то более ранних процессорах эти части реализованы разными регистрами, а при обращении к бОльшему регистру происходит копирование, что, разумеется, занимает время. Как на новых, без понятия.
    Но не стоит верить чайнику на слово. :)
     
  16. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Xerx
    По скорости, вероятно, равен моему (потому что команды тоже неспариваемые), по объёму -- наверное, лучше. Единственный минус -- использует дополнительный регистр (EAX), что в конкретной ситуации может оказаться хуже.
     
  17. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Код (Text):
    1. mov al,b
    2. imul eax,01010101h
    11 байт

    По манам Intel'a для Core 2 Duo для imul здесь Latency == 3, для AMD 8-10h поколений тоже. Чтение из кэша в регистр Latency == 4.
     
  18. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Xerx
    W4FhLF получше код написал.
     
  19. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    W4FhLF
    Совсем забыл про #6 - все с готовым кодом разбирался.
    t00x
    Да, только он после моего "Пока это..." выложил пример.

    Все, всем спасибо. Тема закрыта.