Нужно "расширить" байт, сохраненный в ячейке памяти value до регистра EDX. Т.е. для value=7F получить в EDX=7f7f7f7f. Я делаю так: Код (Text): mov dl, value mov al, dl shl edx, 8 mov dl, al mov ah, al shl edx, 16 xchg dx, ax А быстрее можно? И заодно, как наиболее эффективно сделать аналогичное расширение из байта в MMX регистр? У меня так: Код (Text): movd mm0, edx psllq mm0, 32 movd mm1, edx por mm0, mm1 Заранее спасибо!
Xerx Расширение -- это нечто другое Есть инструкции MOVZX и MOVSX -- первая расширяет число без знака (дополнительные старшие разряды будут нулевыми), вторая -- со знаком (будут равны знаку расширяемого числа). У Вас же не расширение числа, а скорей его размножение Код (Text): mov dl, Value mov dh, dl bswap edx mov dl, Value mov dh, dl
SII >Расширение -- это нечто другое Я в курсе ) Потому и взял в кавычки. Просто не смог сходу слова лучше подобрать, не называть же "клонированием"... А насчет кода - а не будет ли это медленнее моего варианта? Две выборки рдного байта из памяти плюс 5 неспариваемых команд? Я думал над таким вариантом, но гложат меня сомнения...
Код (Text): mov al,Value mov dl, al mov dh, al bswap edx mov dl, al mov dh, al так поидее исчо быстрее
Freeman Ну остается проблема спаривания команд: первая и вторая не спарятся, аналогично вторая и третья, про bswap молчу, ну и так далее. Оба эти варианта у меня были. Есть ли способ быстрее? Мне не хватило фантазии, вот и спросил совета у спецов ) Кстати, как там с MMX ?
Для mmx movzx edx, BYTE [Value] mov dh, dl movd mm0, edx pshufw mm0, mm0, 0 Хотя можно, наверное, получше сделать. Но мне лень
Xerx Можно заменить MOV DH, DL на MOV DH, Value -- загрузка из одной и той же ячейки памяти, значит, реальное обращение к ОЗУ будет максимум одно, дальше будет извлекаться из кэша. В принципе, два подряд идущих MOV в этом случае могут выполняться параллельно (но вот будут ли -- не знаю, а документацию внимательно изучать лень). Плюс растёт длина кода -- в некоторых случаях это может оказаться для производительности как раз хуже.
Xerx Вообще-то в разные регистры (разные байты одного регистра, но байты, доступные независимо). Технически реализовать можно...
SII Это байты одного регистра - не получится спарить. Где-то на сайте было описание, там про EBX и его части пример неспариваемых команд. t00x Пока это самый хороший код. Вряд ли можно лучше )
Xerx/SII Насколько я знаю, спаривание таки возможно, но разные части регистра не на всех процессорах реализованы разными регистрами. Если не ошибаюсь на P4 - это один и тот же регистр (ну т.е. части одного и того же). На каких-то более ранних процессорах эти части реализованы разными регистрами, а при обращении к бОльшему регистру происходит копирование, что, разумеется, занимает время. Как на новых, без понятия. Но не стоит верить чайнику на слово.
Xerx По скорости, вероятно, равен моему (потому что команды тоже неспариваемые), по объёму -- наверное, лучше. Единственный минус -- использует дополнительный регистр (EAX), что в конкретной ситуации может оказаться хуже.
Код (Text): mov al,b imul eax,01010101h 11 байт По манам Intel'a для Core 2 Duo для imul здесь Latency == 3, для AMD 8-10h поколений тоже. Чтение из кэша в регистр Latency == 4.
W4FhLF Совсем забыл про #6 - все с готовым кодом разбирался. t00x Да, только он после моего "Пока это..." выложил пример. Все, всем спасибо. Тема закрыта.