Множення (mul) і множення з накопиченням (mla) з 32-бітовим результатом

Ці команди будуть виконані, якщо умова істинна. Всі різні умови їх виконання перераховані в таблиці 6. Машинний код обох команд наведено на рис.21.

Обидві команди для виконання цілочисельного множення використовують алгоритм, заснований на ланцюжку операцій логічного зсуву і складання 8-бітних операндов (Booth's algorithm).


Мал. 21. Команди множення

У команді множення (MUL) використовується наступна форма запису: Rd: = Rm * Rs. Регістр Rn ігнорується і має дорівнювати нулю з метою сумісності з можливим в майбутньому розширенням системи команд.

У командах множення з накопиченням (MLA) використовується інша форма запису: Rd: = Rm * Rs + Rn. При Rm = 1 або Rs = 1 ця команда по своїм діям еквівалентна виконанню команди ADD.

Обидві команди дозволяють виконувати операції тільки з цілочисельними операндами як без знака так і зі знаком (додаток до 2-х).

Результати множення 32-бітних операндов зі знаком і 32-бітових операндів без знаку розрізняються лише своїми старшими 32-ма бітами, а молодші 32 біта обох результатів - однакові обох типів операндів. Оскільки результат виконання команд MUL і MLA тільки 32-бітний (старші 32 біта результату будуть відкинуті), то результат виконання цих команд буде однаковий як для операндів зі знаком, так без знака.

Наприклад, команда множення 0xFFFFFFF6 (операнд A) на 0x00000014 (операнд B) дасть результат, рівний 0xFFFFFF38.

Якщо операнди інтерпретуються як знакові

Нехай, операнд А = -10, а операнд B = 20, то результатом їх множення буде число -200, яке коректно записується так: 0xFFFFFF38.

Якщо операнди - без знака

Нехай, операнд А = 4294967286, а операнд B = 20, то результатом їх множення буде число 85899345720, яке коректно записується так: 0x13FFFFFF38, але старші 32 біта результату відкидаються, то остаточним результатом множення буде число 0xFFFFFF38.

Неприпустимо використання регістра-результату Rd одночасно як регістр-операнда (Rm, Rn або Rs). Також неприпустимо використання регістра R15 в якості регістру-операнда або регістра-результату.

Всі інші комбінації інших регістрів будуть давати коректний результат, а, якщо потрібно, то в ролі Rd, Rn і Rs може виступати один і той же регістр.

Прапори регістра CPSR

Можливість впливу на прапори регістра CPSR визначається бітом S у відповідному полі команди. Прапори N (мінус) і Z (нуль) встановлюються відповідно до результату множення: прапор N стає рівним 31-му битку результату, а прапор Z встановлюється тільки, якщо результат - нуль. Прапор С (перенесення) встановлюється в невідоме стан, а прапор V (переповнювання) - не використовується.

Число машинних тактів при виконанні

Команда MUL виконується за 1S + mI машинних тактів, а команда MLA - за 1S + I (m + 1) машинних тактів, де S і I залежать від типу машинних тактів, m - кількість 8-бітних множників, необхідних для виконання множення, і залежить вмісту операнда-множника Rs. Можливі значення m перераховані нижче:

m = 1, якщо біти [31: 8] операнда-множника - або всі нулі, або всі одиниці. m = 2, якщо біти [31:16] операнда-множника - або всі нулі, або всі одиниці. m = 3, якщо біти [31:24] операнда-множника - або всі нулі, або всі одиниці. m = 4: у всіх інших випадках.

Синтаксис в асемблері

Двосимвольні мнемоніка умови виконання команди (див. табл. 6).

Схожі статті