Скачиваний:
75
Добавлен:
01.05.2014
Размер:
1.22 Mб
Скачать

Команда умножения числа со знаком и с накоплением

(Signed Multiply Accumulate Long)

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

SMLAL{<cond>}{S}<RdLo>, <RdH1>, <Rm>,<Rs>

Формат команды представлен на рис. 1.

Описание

{<cond>} – поле условия (см. таблицу 1)

{S} – устанавливает S-бит ­– бит условия (см. таблицу 1)

<RdLo>, <RdH1> -выражения, которые определяют номер регистра общего назначения

<Rm> - определяет регистр сопроцессора, содержащий второй операнд (см. таблицу 1)

<Rs> - определяет регистр сопроцессора, содержащий первый операнд

SMLAL <x> <y> выполняет умножение с накоплением чисел со знаком.

Команда умножения c накоплением используют два 32-битных регистра, которые умножаются друг на друга, и к полученному результату добавляется 64-битное слагаемое: RdHi,RdLo := Rm*Rs + RdHi,RdLo. Младшие 32 бита добавляемого к результату умножения слагаемого вычитываются их регистра RdLo, а старшие 32 бита - из регистра RdHi. После чего младшие 32 бита результата заносятся в регистр RdLo, а старшие 32 бита - в регистр RdHi.

Мнемоника ассемблера

Действие

SMLAL{cond}{S}RdLo,RdHi,Rm,Rs

RdHi,RdLo := Rm*Rs + RdHi,RdLo

Команда умножения числа со знаком и накоплением

Примеры

SMLAL Rd,Rt,Rm,Rn ; переполнение при умножении с ; накоплением чисел со знаком с 32- ; битным результатом

TEQ Rt,Rd, ASR#31 ; От 4 до 7 (включительно) машинных ; тактов

BNE overflow ; +1 такт при переполнении регистра

SMLAW<y> ARM

Знаковая операция умножения и сложения

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

SMLAW<y> {<cond>} <Rd>, <Rm>, <Rs>, <Rn>

Формат команды представлен на рис. 1.

Описание

<y> – Определяет, какя часть исходного регистра <Rs> использует, как второй умножающий операнд. Если <y> - B, то y == 0 и используется в основании (биты[15:0]) регистра <Rs>. Если <y > - T, то y == 1 и используется в начале (биты[31:16]) регистра <Rs>.

<cond> – поле условия (см. таблицу 1).

<Rd> – регистр результата (см. таблицу 1).

<Rs> – Определяет исходный регистр, отобранный - <y> - основание или первая часть, второго умножающего операнда.

<Rn> – регистр первого операнда (см. таблицу 1).

<Rm> – регистр второго операнда (см. таблицу 1).

Команда SMLAW<y> выполняет знаковую операцию умножения и сложения. Операция умножения применяется в 32-битовом и 16-битовом данном регистре, с последним взятым с вершины или от основания его части. Вторая часть регистра игнорируется. Первые 32 бита из 48 битов добавляются к 32 битам с помощью операции сложения и результат записывается в регистр. Последние 16 битов из 48 битов игнорируются. Выходя за пределы при операции сложения ставим флаг Q в CPSR. При умножении не происходит переполнения, потому что используются 32 бита из 48.

Мнемоника ассемблера

Действие

SMLAW<y>

if ConditionPassed(cond) then

if (y == o) then

operand2 = SignExtend(Rs[15:0])

else /* y == 1 */

operand2 = SignExtend(Rs[31:16])

Rd = (Rm ♦ operand2) [47:16] + Rn /*Знаковоеумножение */

if OverflowFrom((Rm * operand2)[47:16] + Rn) the Q Flag = 1

Команда знакового умножения и сложения.

Использование

В дополнение к его прямому использованию – умножение и сложения целого числа, есть более быстрая альтернатива следующих команд Q31 x Q15 + Q31 —> Q31 синтезируемых от SMULW<y> и QDADD. Обстоятельства, при которых это условие возможно и выгодно, очень схоже с SMLA<x><y> командой.

Примеры

Следующий листинг производит точечный продукт четырех Ql5 чисел к R0 и R1 четырьмя числами Q15 в R2 и R3:

SMLAWB R4, RO, R2, Rm, Rn

QADD R4, R4, R4

SMLAWT R5, RO, R2, Rm, Rn

QDADD R4, R4, R5

SMLAWB R5, Rl, R3, Rm, Rn

QDADD R4, R4, R5

SMLAWT R5, Rl, R3, Rm, Rn

QDADD R4, R4, R5

SMUL<x><y> – ARM