Умножение (MULL) и Умножение с накоплением (MLAL) с 64-битным результатом (long)
Эти команды будут выполнены, если условие истинно. Все различные условия их выполнения перечислены в таблице 6. Машинный код обеих команд приведен на рис.22.
Команды MULL и MLAL позволяют выполнить целочисленное умножение двух 32-битных операндов и получить 64-битный результат. Умножение со знаком и без знака может быть как с накоплением, так и без него. Поэтому существуют четыре разновидности умножения с 64-битным результатом.
Рис. 22. Команды умножения с 64-битным результатом
В обеих командах умножения без накопления (UMULL и SMULL) используется следующая форма записи: RdHi,RdLo := Rm*Rs. Младшие 32 бита результата заносятся в регистр RdLo, а старшие 32 бита - в регистр RdHi.
В обеих командах умножения c накоплением (UMLAL и SMLAL) используют два 32-битных регистра, которые умножаются друг на друга, и к полученному результату добавляется 64-битное слагаемое: RdHi,RdLo := Rm*Rs + RdHi,RdLo. Младшие 32 бита добавляемого к результату умножения слагаемого вычитываются их регистра RdLo, а старшие 32 бита - из регистра RdHi. После чего младшие 32 бита результата заносятся в регистр RdLo, а старшие 32 бита - в регистр RdHi.
Команды UMULL и UMLAL производят действия только над целыми двоичными числами без знака (unsigned) и результат своего выполнения записывают как 64-битное целое число без знака. Команды SMULL и SMLAL производят действия только над целыми двоичными числами со знаком (signed) с дополнением до 2-х, а результат своего выполнения записывают как 64-битное целое число со знаком.
Ограничения операнда
Недопустимо использование регистра R15 в качестве регистра-операнда или регистра-результата.
Регистры RdHi, RdLo и Rm должны быть определены как различные регистры.
Флаги регистра CPSR
Возможность воздействия на флаги регистра CPSR определяется битом S в соответствующем поле команды. Флаги N и Z устанавливаются в соответствии с результатом умножения: флаг N становится равным 63-му биту результата, а флаг Z устанавливается только, если все 64 бита результата - нули. Флаги С и V устанавливается в неизвестные состояния.
Число машинных тактов при выполнении
Команда MULL выполняется за 1S + I(m + 1) машинных тактов, а команда MLAL - за 1S + I(m + 2) машинных тактов, где S и I зависят от типа машинных тактов, m - количество 8-битных множителей, необходимых для выполнения умножения, и зависит содержимого операнда-множителя Rs. Возможные значения m перечислены ниже.
Для команд умножения со знаком (SMULL, SMLAL):
- m = 1, если биты [31:8] операнда-множителя - либо все нули, либо все единицы.
- m = 2, если биты [31:16] операнда-множителя - либо все нули, либо все единицы.
- m = 3, если биты [31:24] операнда-множителя - либо все нули, либо все единицы.
- m = 4: во всех остальных случаях.
Для команд умножения без знака (UMULL, UMLAL):
- m = 1, если биты [31:8] операнда-множителя - либо все нули.
- m = 2, если биты [31:16] операнда-множителя - либо все нули.
- m = 3, если биты [31:24] операнда-множителя - либо все нули.
- m = 4: во всех остальных случаях.
Синтаксис в ассемблере
Таблица 9. Синтаксис команд умножения с 64-битным результатом
Мнемоника в ассемблере |
Описание |
Выполняемые действия |
UMULL{cond}{S}RdLo,RdHi,Rm,Rs |
Умножение без знака |
32 x 32 = 64 |
UMLAL{cond}{S}RdLo,RdHi,Rm,Rs |
Умножение без знака с накоплением |
32 x 32 + 64 = 64 |
SMULL{cond}{S}RdLo,RdHi,Rm,Rs |
Умножение со знаком |
32 x 32 = 64 |
SMLAL{cond}{S}RdLo,RdHi,Rm,Rs |
Умножение со знаком и с накоплением |
32 x 32 + 64 = 64 |
{cond}: |
двухсимвольная мнемоника условия выполнения команды (см. табл. 6). |
{S}: |
разрешить воздействие на флаги регистра CPSR, если S указано. |
RdLo, RdHo, Rm и Rs: |
выражения, которые определяют номер регистра общего назначения (кроме регистра R15). |
Примеры
UMULL R1,R4,R2,R3 ; R4,R1:=R2*R3
UMLALS R1,R5,R2,R3 ; R5,R1:=R2*R3+R5,R1, также разрешить
; воздействие на флаги CPSR выполнения (S)
|
<---- Вернуться к Системе команд --->
|