Есть ли какое-либо действительное использование для сохраняющего знак сдвига влево? - PullRequest
6 голосов
/ 04 июня 2019

Существует три основных сдвига:

  • Логический сдвиг влево: полностью игнорирует знаковый бит.
  • Логический сдвиг вправо: очищает бит знака, если сдвиг> 0.
  • Арифметическое смещение влево: то же, что и логическое смещение влево.
  • Арифметическое смещение вправо: сохраняет старший бит.

У Intel есть и sal, и shl, но они отображаются на одно и то жеОперационный код и большинство других архитектур, по-видимому, имеют только три мнемоники.

Вы можете перестроить сетку с точки зрения сохранения знака, а не:

  • Логическое + арифметическое смещение влево: без сохранения знака.
  • Логический сдвиг вправо: без сохранения знака.
  • Арифметический сдвиг вправо: сохранение знака.

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

И теперь у меня есть пара вопросов:

  1. Это any Реальное использование?
  2. Реализует ли это какая-либо архитектура?

Редактировать: Чтобы пояснить, что я имею в виду под "сохранением знака",для примера сдвига влево на 1 и ширины бита 8:

Not sign-preserving:
S A B C D E F G
 / / / / / / /
A B C D E F G 0

Sign-preserving:
S A B C D E F G
|  / / / / / /
S B C D E F G 0

Надеюсь, это поможет!


Сноска 1: Интересный факт:x86 имеет второй недокументированный код операции для сдвига влево, например, d0 /4 и d0 /6 оба сдвига влево на 1 байт. Sandpile даже заявляет , что один из них - SHL, а другой - SAL, но в текущих руководствах Intel x86 документируется только кодировка /4 как для SAL, так и для SHL.

Неясно, был ли на самом деле оригинальный 8086предназначен для использования отдельных кодов операций для двух имен для одной и той же операции, или если код операции псевдонима всегда был недокументирован.Какова бы ни была история, modern x86 больше не документирует отдельные коды операций.(8 команд разделяют один и тот же начальный байт с полем /r, различая их: ROL / ROR, RCL / RCR, SHL / SHR и SAL / SAR. Вставка некоторых других команд без сдвига в кодировку /6 будет стоитьтранзисторы и их неисправность, вероятно, также стоили бы больше транзисторов, поэтому имеет смысл, что оригинальный 8086 был разработан с избыточной кодировкой для сдвига влево, единственный вопрос - если / как это было задокументировано исторически.)

Но это совершенно не соответствует реальному вопросу: SAL для x86 составляет , а не сдвиг, сохраняющий знаковые биты.

1 Ответ

2 голосов
/ 04 июня 2019

Инструкция Intel 80960 shli ведет себя таким образом. В описании говорится: «Если сдвинутые биты не совпадают со знаковым битом, возникает ошибка переполнения. Если происходит переполнение, знак результата совпадает со знаком операнда src. »(Ошибка переполнения может быть замаскирована. Даже если он не замаскирован, операнд-адресат записывается с результатом.)

...