Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 [ 7 ] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

Большинство машин вычисляют эш отношения при помощи сечш команд (или шести при наличии команды и-не), что ничем не лучше результата, достигнутого в предыдущих формулах (от пяти до семи команд в зависимости от пблноты используемого множества команд).

Формулы, в которых используется функция "nlz", взяты из [56]. Ее использование позволяет вычислить результат отношения ж = у в виде 1 или О всего за три команды.

nlz(jc-y)3>5

Команды знакового сравнения с О встречаются достаточно часто, что заслуживает отдельного рассмотрения. Ниже приводится несколько формул, которые в основном непосредственно выведены из предыдущих выражений. Так же, как и ранее, результат сравнения отображается в позиции бита знака.

х=0: abs(jc)-l

abs(x +0x80000000)

nlz(x)<K26

nlz(x)3>5

-.{x\-x) -*&(x-l) хфО: nabs(x)

nlz(x)-32 x\-x

x»lj-x [10]

x<0: X x<Q: x\{x-\) xb-x x>Q: x®nabs(x)

(xil)-x x>0: -Л

Знаковое сравнение можно получить из беззнакового, увеличивая сравниваемые величины на 2. Обратное преобразование также справедливо. Таким образом получаем

х<у = х + 2"<у + 2, х<у = х-2" <у-2" .

Аналогичные соотношения выполняются для < и т.д. В данном случае прибавление и вычитание числа 2 - эквивалентные действия, так как обе операции инвертируют значение знакового разряда.



Еще один путь получения знакового сравнешга из беззнакового основан на том, что если х

ау имеют одинаковые знаки, то х <у = х<у ,а если их знаки различны, то х<у = х>у [42]. В этом случае также справедливы обратные преобразования; таким образом, получаем

х<у =

х<у

ФдГз.Фуз,,

Ж<у = (ж<у)ФЖз,ФУз,,

где х,у и Уз, представляют собой знаковые биты хиу соответственно. Аналогичные выражения получаются для отношений <, < и других.

Применение описанных способов позволяет вычислить все стандартные команды сравнения (кроме = и 5t) через другие команды сравнения с использованием не более трех дополнительных команд на большинстве машин. Например, возьмем в качестве исходной команды сравнения отношение хку , поскольку реализовать его проще других команд (как бит переноса у-х). Тогда остальные команды сравнения можно реализовать следующим образом:

-,y+2"x + 2"j

x + 2"Sy + 2" х + 2"у+2"

х<у хйу х>у х>у х<у

х>у хку

= у + 2"кх + 2" укх

х<у

Команды сравнения и бит переноса

Если процессор может легко поместить бит переноса в регистр общего назначения, то для некоторых операций отношения это позволяет получить очень лаконичный код. Ниже приводятся выражения такого рода для некоторых отношений. Запись сапу {выражение) означает, что разряд переноса генерируется при выполнении команды выражение. Предполагается, что бит переноса для разности х-у тот же, что и на выходе сумматора для выражения х + у +1, и является дополне!Нием "заема".

сапу(0-(х-у)), или

сапу((х + у) + 1), или

сапу((х-у-1) + 1)

сапу ((х - у) -1) = сапу ((х - у) + (-1))

-псапу((х + 2)-(у + 2"))

х = у;

х*у: х<у .

2.U. ПРЕДИКАТЫ СРАВНЕНИЯ



xiy: carry((y+2")-(x + 2"))

x<y:

-.carry (jc-jr) xky: cmy{y-x) x=0: cany(0-Jc), или carry(jc+l)

хф9: carry ( jc-1) = сапу (jc+ (-!))

x<0: carry(x + x)

XSO: cany(2"-(x + 2"))

Для X > у используется дополнение выражения для х < у ; то же справедливо и для других типов отношения "больше".

При вычислении условных выражений на ЮМ RS/6000 и близком к нему PowerPC была использована программа GNU Superoptimizer [17]. У RS/6000 имеются команды abs(x), nabs(x), doz(x,y) и ряд различных команд сложения и вычитания с использованием переноса. Как выяснилось, RS/6000 может вычислить все целочисленные условные выражения с помощью не более чем трех элементарных (выполняющихся за один такт) команд - результат, удививший даже самих создателей машины. В состав "всех условных выражений" входят шесть команд знакового сравнения и четыре команды беззнакового сравнения, а также их версии, в которых второй операнд равен нулю (при этом каждая из команд имеет два варианта - возвращающий результат 1/0 и возвращающий результат -1/0). Power PC, где нет функций abs(x), nabs(x) и doz(x,y), вычисляет все

перечисленные условные выражения не более чем за четыре элементарные команды.

Вычисление отношений

Большинство компьютеров возвращают однобитовый результат операции сравнения, который обычно размещается в "регистре условий", а на некоторых машинах (как, например, в нашей RISC-модели) - в регистре общего назначения. В любом случае вычисление отношений зачастую реализуется вычитанием операндов и некоторыми действиями над битами полученного результата, чтобы получить окончательный однобитовый результат работы команды сравнения.

Рассмотрим логику описанных выше действий. Пусть вместо разности х-у компью-

тф вычисляет сумму х + у +1, ив результате этих вычислений получаются следующие величины:

Со - перенос из старшего разряда в разряд переноса; С, - перенос в старший разряд;

- бит знака результата; Z - величина, равная 1, если полученный результат (за исключением Со) нуле вой, и О в противоположном случае.

Таким образом, в системе обозначений булевой алгебры для различных отношений получим приведенные ниже выражения (расположение рядом двух величин подразумевает операцию и, а оператор "+" означает операцию или).



0 1 2 3 4 5 6 [ 7 ] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87