· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Сравнение одним махом

<< . 1 . 2 . 3 . 4 .

Посл.отвђт Сообщенiе


Дата: Янв 12, 2004 15:29:07

Edmond
S_T_A_S_

Ну так есть готовый исходник, плевать на степень общности?
А то малтимидия мне на 64 тормоза вставляет: 3 такта на доставку в малтимидиа юнит, 3 обратно. Из-за этого 8 байт крутятся в конвеере 3 итерации, а могли бы 2! Скорость тогда была бы 4 байта за такт, а если 4 итерации - то 8-8*(1/4)=6 (чертверть на bubbles) Как тока кто покажет - сразу перепишу. Вот это сравнение одним махом будет!


Дата: Янв 12, 2004 16:00:55

volodya
Спасибо, перепишу на асм, посмотрим... :))
Но я тебе советую посмотреть мой вариант.. (правда там только сравнение с 1 символом, но смысл в принципе тот же) где-то в ULIB я кидал...


Дата: Янв 12, 2004 16:22:51

Valery
Я уже с этим совсем запутался :) Как хорошо буржуям с их всеобъемлющим you ;)


Edmond
Как там с "тем" исходником?
А то мне все покоя не дают эти XORы :)
Хотя, имхо, уже кажется "одним махом" сложновато - все упирается в разницу между какой-либо границей и аргументом. Если она > 80 то результат отличается от того, когда она меньше (уже и сам запутался)

Возможное решение для некоторых последовательностей (требует дополнительных проверок) - немного "размазать границы":
shr ecx
and ecx, 7f7f7f7fh
;; теперь сравниваем. Границы тоже надо сдвинуть. Если нашли, то доп. точная проверка


Дата: Янв 12, 2004 16:57:09

Что-то пошли темы о компиляторах :))
Ага, а это подсказка или нет? Может все символы 20<=x<80h ? :)

И еще. Каков будет примерный результат sub edi, esi?
А то может Valery напрасно такты считает, там 50 Мб надо сканировать?


Дата: Янв 12, 2004 17:08:31

S_T_A_S_

"одним махом" не бывает напрасно:)
Да, неплохо бы потребовать от вызывающего хорошего выравнивания.


Дата: Янв 12, 2004 17:15:53

S_T_A_S_
Что-то Edmond придумал с XOR, но молчит :)

Ну хорошо, просто нет времени, извини.

Всё тупо...

Смотрим раз

1. Есть число 4 байта

Обозначим эти байта x1,x2,x3,x4

x4x3x2x1 -- 4 байта

Итак, мы должны сравнить поток из 4-х чисел c числом y

Например нужно провреить условие,

xx < y

Если выполнить операцию вычитания,

x4x3x2x1
-
yyyyyyyy

То если хотя бы в одном случае условие выполнится, происходит переполнение.

!!!!!

Вот именно на этом эффекте и построен алгоритм.

Далее, дело техники.

XOR нужен для учёта знаков.
То есть если

xx-yy ==
-xx-yy ==
-xx-(-yy) ==

А вот если известно, что yy > 0, тогда, процедура очень проста. Без XOR


Дата: Янв 12, 2004 17:17:45

Valery
Я всегда соблюдаю выравнивание.
его можно соблюсти програмно.


Дата: Янв 12, 2004 17:20:33

Если она > 80 то результат отличается от того, когда она меньше (уже и сам запутался)

Вот для этого XOR и нужен!!!!!!!!!!!!!
Он учитывает знак...

Если бит знака x1 == 0
И бит знака yy == 0
тогда условие выполнения Бит результата == 1

Если бит знака x1 == 1
И бит знака yy == 1
тогда условие выполнения Бит результата == 1

Если бит знака x1 == 0
И бит знака yy == 1
тогда условие выполнения Бит результата == 0

Если бит знака x1 == 1
И бит знака yy == 0
тогда условие выполнения Бит результата == 1

Я надеюсь уже понятнее стало?

Ой, бегу, бегу..
Прошу прощения.... убегаю :))


Дата: Янв 12, 2004 18:36:34 · Поправил: Valery

Ну вот это другое дело! Нам нужен хотя бы один факт переполнения, а не его отсутствие где либо. Это слабее, чем параллельная операция, но для наших целей достаточно. А то я кретин уже хотел доказывать теорему "Параллельная операция cmp сводима к не более чем трем обычным"!:)


Дата: Янв 12, 2004 19:26:08

Edmond
А-А-А-А-А!!!!! каких-то 2 долбаных XORа (по одному на границу) отделяли меня от результата. И я свернул с пути..


Valery
Да, Edmond и мне объяснил мои мысли лучше, чем я сам их понял :) (см. мой первый пример)


Дата: Янв 12, 2004 20:32:59

bsl_zcs
mov ecx,eax / xor ecx,eax - тут опечатка, edx вместо eax надо в одной из команд. А я тоже думал, что за хрень ;)

<< . 1 . 2 . 3 . 4 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066