Пишу инструкцию для процессора ARMv7. Я хотел бы знать, почему мне не разрешено иметь постоянное значение в самой инструкции MUL? Вам разрешено использовать инструкции ADD и SUB, так почему бы не MUL?
Ваше здоровье
Пишу инструкцию для процессора ARMv7. Я хотел бы знать, почему мне не разрешено иметь постоянное значение в самой инструкции MUL? Вам разрешено использовать инструкции ADD и SUB, так почему бы не MUL?
Ваше здоровье
Если вы посмотрите на таблицу кодирования инструкций ARM ISA вы увидите, что только инструкции по обработке данных поддерживают непосредственные операнды (кстати, с интересной кодировкой); только они имеют 12-битный operand2, все остальные имеют не более 4-битных полей для Rs и Rm (пробел, который остается между ними, используется для устранения неоднозначности с другими категориями инструкций ).
Это решение, вероятно, исходит из того факта, что встраивание непосредственных значений в инструкции умножения не представляет особого интереса; если множитель известен, mul
часто является плохим выбором, так как обычно есть более быстрые последовательности добавления/сдвига/подчинения. Кроме того, стоимость инструкции умножения может быть такой, что выигрыш в задержке, полученный за счет наличия в инструкции непосредственной прямой строки, не оправдывает «кражи» слота из 16, доступных в кодировке для инструкций обработки данных.
imul r32, r/m32, imm8
, если пропускная способность имеет большее значение, чем задержка, но 3 LEA того не стоят.
- person Peter Cordes; 13.03.2018
Именно так работает эта архитектура процессора. Разные архитектуры предъявляют разные требования.
Как правило, такой выбор является компромиссным решением для оптимизации других операций/доступа к памяти/использования кэша. Компромисс обычно гораздо более выгоден, чем включение этой инструкции на кремний.
поскольку arm использует несколько фиксированную длину инструкций, осталось не так много битов, хотя есть бочкообразный сдвиг, так что подумайте о научной нотации, вы можете сдвинуть кластер битов, но не распределить биты (кроме сдвига сверху), поэтому 0x00000099, 0x00099000, 0x09900000 обычно подходят в зависимости от инструкции/набора, но 0x00900090, скорее всего, нет, уж точно не 0x12345678, что не имеет смысла. Это RISC, а не CISC, и он не предназначен для того, чтобы каждая инструкция могла делать все, подумайте о том, чтобы загрузить архитектуру хранилища больше, чем CISC...