Почему нельзя использовать непосредственное значение в инструкции mul?

Пишу инструкцию для процессора ARMv7. Я хотел бы знать, почему мне не разрешено иметь постоянное значение в самой инструкции MUL? Вам разрешено использовать инструкции ADD и SUB, так почему бы не MUL?

Ваше здоровье


person Sam Rolls    schedule 13.03.2018    source источник
comment
Потому что так говорит ISA   -  person Matteo Italia    schedule 13.03.2018
comment
Часто постоянные множители представляют собой степень двойки и могут быть выполнены со сдвигами. ARM поддерживает это (очень хорошо), так что у него есть большая часть базы.   -  person Peter Cordes    schedule 13.03.2018


Ответы (3)


Если вы посмотрите на таблицу кодирования инструкций ARM ISA вы увидите, что только инструкции по обработке данных поддерживают непосредственные операнды (кстати, с интересной кодировкой); только они имеют 12-битный operand2, все остальные имеют не более 4-битных полей для Rs и Rm (пробел, который остается между ними, используется для устранения неоднозначности с другими категориями инструкций ).

Это решение, вероятно, исходит из того факта, что встраивание непосредственных значений в инструкции умножения не представляет особого интереса; если множитель известен, mul часто является плохим выбором, так как обычно есть более быстрые последовательности добавления/сдвига/подчинения. Кроме того, стоимость инструкции умножения может быть такой, что выигрыш в задержке, полученный за счет наличия в инструкции непосредственной прямой строки, не оправдывает «кражи» слота из 16, доступных в кодировке для инструкций обработки данных.

person Matteo Italia    schedule 13.03.2018
comment
Современный x86 обычно имеет безумно мощное целочисленное умножение (например, задержка в 3 цикла для любого размера операнда до 64-бит). Я предполагаю, что ARM не тратит столько транзисторов, но насколько она медленная в наши дни? Когда разрабатывалась ARM ISA, множители, вероятно, были медленнее, чем сейчас. Я предполагаю, что со встроенным бочкообразным переключателем ARM очень эффективно сдвигать и добавлять или уменьшать множитель с помощью нескольких установленных битов, но каков безубыток на типичном процессоре ARM? На x86 стоит использовать 2 инструкции LEA вместо imul r32, r/m32, imm8, если пропускная способность имеет большее значение, чем задержка, но 3 LEA того не стоят. - person Peter Cordes; 13.03.2018
comment
от начала процессоров до сегодняшнего дня скорость mul определяется тем, сколько места в чипе вы хотите сжечь, один такт, 2, 4, 32 и т. Д. Архитектура (/ возраст) не имеет значения, умножение существует дольше, чем электричество намного меньше цифровых процессоров. Если вы посмотрите на TRM ARM, вы увидите, что некоторые из них имеют опции для одного или нескольких часов во время компиляции, поэтому, как разработчик микросхем, вы можете сами выбрать потребление. С x86 вы получаете то, что получаете, выбирает Intel. - person old_timer; 13.03.2018

Именно так работает эта архитектура процессора. Разные архитектуры предъявляют разные требования.

Как правило, такой выбор является компромиссным решением для оптимизации других операций/доступа к памяти/использования кэша. Компромисс обычно гораздо более выгоден, чем включение этой инструкции на кремний.

person David Hoelzer    schedule 13.03.2018

поскольку arm использует несколько фиксированную длину инструкций, осталось не так много битов, хотя есть бочкообразный сдвиг, так что подумайте о научной нотации, вы можете сдвинуть кластер битов, но не распределить биты (кроме сдвига сверху), поэтому 0x00000099, 0x00099000, 0x09900000 обычно подходят в зависимости от инструкции/набора, но 0x00900090, скорее всего, нет, уж точно не 0x12345678, что не имеет смысла. Это RISC, а не CISC, и он не предназначен для того, чтобы каждая инструкция могла делать все, подумайте о том, чтобы загрузить архитектуру хранилища больше, чем CISC...

person old_timer    schedule 13.03.2018