首页 理论教育ARMCortex-M4体系结构中的乘法和乘加指令

ARMCortex-M4体系结构中的乘法和乘加指令

【摘要】:Cortex-M4处理器中也有许多乘法和乘加指令。本节中,我们将讨论一些可供使用的乘和乘加指令。1.MUL、MLA和MLS指令MUL、MLA和MLS指令适用有符号或无符号32位操作数的乘法、乘加和乘减,结果取低32位。3.SMULWy和SMLAWy指令SMULWy和SMLAWy指令表示有符号扩大乘法和有符号扩大乘加,采用一个32位操作数和一个16位操作数,结果取高32位。7.SMLAD和SMLSD指令SMLAD和SMLSD指令表示两次16位有符号乘法,对乘积相加或相减并进行32位累加。

Cortex-M4处理器中也有许多乘法和乘加指令。本节中,我们将讨论一些可供使用的乘和乘加指令。

1.MUL、MLA和MLS指令

MUL、MLA和MLS指令适用有符号或无符号32位操作数的乘法、乘加和乘减,结果取低32位。其语法如下:

其中:cond——一个可选的条件代码;

S——一个可选的后缀,如果指定S,则会更新运算结果的条件代码标记;

Rd——目标寄存器;

Rn、Rm——存放乘数的寄存器;

Ra——存放被加数和被减数的寄存器。

这3个指令的用法如下:

(1)MUL指令可将Rn和Rm中的值相乘,并将所得结果的低32位存入Rd。

(2)MLA指令可先将Rn和Rm中的值相乘,再将乘积与Ra中的值相加,最后将所得和的低32位存入Rd。

(3)MLS指令可将Rn和Rm中的值相乘,再从Ra中的值中减去乘积,最后将所得差的低32位存入Rd。

注意:不要将R15用作Rd、Rn、Rm或Ra。

2.UMULL、UMLAL、SMULL和SMLAL指令

UMULL、UMLAL、SMULL和SMLAL指令采用32位操作数及64位结果,表示累加器的有符号长乘法与无符号长乘法(可选择进行累加)。其语法如下:

其中:Op——UMULL、UMLAL、SMULL或SMLAL之一;

S——一个可选后缀,仅可用于ARM状态,如果指定S,则会更新运算结果的条件代码标记;

cond——一个可选的条件代码;

RdLo、RdHi——目标寄存器,对于UMLAL和SMLAL,它们还用于存放累加值。

注意:RdLo和RdHi必须为不同的寄存器,Rn、Rm是存放操作数的ARM寄存器。不要将R15用作RdHi、RdLo、Rn或Rm。

指令的用法如下:

(1)UMULL指令会将Rn和Rm中的值解释为无符号整数。它会先求这两个整数的乘积,然后将结果的低32位存入RdLo,高32位存入RdHi。

(2)UMLAL指令会将Rn和Rm中的值解释为无符号整数。它会先求这两个整数的乘积,然后将64位结果与RdHi和RdLo中所包含的64位无符号整数相加。

(3)SMULL指令会将Rn和Rm中的值解释为有符号整数的二进制补码。它会先求这两个整数的乘积,然后将结果的低32位存入RdLo,高32位存入RdHi。

(4)SMLAL指令会将Rn和Rm中的值解释为有符号整数的二进制补码。它先求这两个整数的乘积,然后将64位结果与RdHi和RdLo中的64位有符号整数相加。

3.SMULWy和SMLAWy指令

SMULWy和SMLAWy指令表示有符号扩大乘法和有符号扩大乘加,采用一个32位操作数和一个16位操作数,结果取高32位。其语法如下:

其中:<y>——B或T,B表示使用Rm的低16位(位[15:0]),T表示使用Rm的高16位(位[31:16]);

cond——一个可选的条件代码;

Rd——目标寄存器,Rn、Rm存放要相乘的值的寄存器;

Ra——存放要相加的值的寄存器。

指令的用法如下:

(1)SMULW<y>可将选自Rm的16位有符号整数与Rn中的有符号整数相乘,并将48位结果的高32位存入Rd。

(2)SMLAW<y>可将选自Rm的16位有符号整数与Rn中的有符号整数相乘,并将32位结果与Ra中的32位值相加,结果存入Rd。

4.SMLALxy指令

SMLALxy指令表示有符号乘加,采用16位操作数和64位累加器。其语法如下:

其中:<x>——B或T,B表示使用Rn的低16位(位[15:0]),T表示使用Rn的高16位(位[31:16]);

<y>——B或T,B表示使用Rm的低16位(位[15:0]),T表示使用Rm的高16位(位[31:16]);

cond——一个可选的条件代码;

RdHi、RdLo——目标寄存器,它们也存放累加值,RdHi和RdLo必须为不同的寄存器;

Rn、Rm——存放要相乘的值的寄存器。

指令的用法如下:SMLALxy可将选自Rm的16位有符号整数与选自Rn的16位有符号整数相乘,然后将32位乘积结果与RdHi和RdLo中的64位值相加。

5.SMUAD{X}和SMUSD{X}指令

SMUAD{X}和SMUSD{X}指令表示先做两次16位有符号乘法,然后将两个乘积相加或相减,可选择交换操作数的高半字和低半字。其语法如下:

其中:op——SMUAD或SMUSD之一;(www.chuimin.cn)

X——一个可选的参数,如果有X,则在相乘之前,会先交换第2个操作数的高半字和低半字;

cond——一个可选的条件代码;

Rd——目标寄存器;

Rn、Rm——存放操作数的寄存器。

指令的用法如下:

(1)SMUAD可先将Rn的低半字与Rm的低半字相乘,Rn的高半字与Rm的高半字相乘,然后将两个乘积相加,并将结果存入Rd。

(2)SMUSD可先将Rn的低半字与Rm的低半字相乘,Rn的高半字与Rm的高半字相乘,然后从第1个乘积中减去第2个乘积,并将差值存入Rd。

6.SMMUL、SMMLA和SMMLS指令

SMMUL、SMMLA和SMMLS指令表示有符号高字乘法、有符号高字乘加和有符号高字乘减。这些指令的操作数为32位,结果仅取高32位。其语法如下:

其中:R——一个可选的参数,如果存在R,则对结果进行舍入,否则将其截断;

cond——一个可选的条件代码;

Rd——目标寄存器;

Rn、Rm——存放操作数的寄存器;

Ra——存放被加数和被减数的寄存器。

指令的用法如下:

(1)SMMUL可先将Rn和Rm中的值相乘,然后将64位结果的高32位存入Rd。

(2)SMMLA可先将Rn和Rm中的值相乘,然后将Ra中的值与乘积的高32位相加,将结果存入Rd。

(3)SMMLS可先将Rn和Rm中的值相乘,然后将Ra中的值左移32位,从移位后的值中减去乘积,最后将差的高32位存入Rd。

如果指定了可选参数R,则在截取结果的高32位前,会先加上0x80000000,对结果的舍入有影响。

7.SMLAD和SMLSD指令

SMLAD和SMLSD指令表示两次16位有符号乘法,对乘积相加或相减并进行32位累加。其语法如下:

其中:op——SMLAD或SMLSD之一;

cond——一个可选的条件代码;

X——一个可选的参数,如果有X,则在相乘之前,会先交换第2个操作数的高半字和低半字;

Rd——目标寄存器;

Rn、Rm——存放操作数的寄存器;

Ra——存放累加操作数的寄存器。

指令的用法如下:

(1)SMLAD可先将Rn的低半字与Rm的低半字相乘,将Rn的高半字与Rm的高半字相乘,然后将两个乘积与Ra中的值相加,并将和存入Rd。

(2)SMLSD可先将Rn的低半字与Rm的低半字相乘,将Rn的高半字与Rm的高半字相乘,然后从第1个乘积中减去第2个乘积,接着将所得的差与Ra中的值相加,最后将结果存入Rd。

8.MIA、MIAPH和MIAxy指令

(1)MIA指令表示带内部累加的乘法(32位乘32位,40位累加)。

(2)MIAPH指令表示带内部累加的乘法,组合半字(16位乘16位两次,40位累加)。

(3)MIAxy指令表示带内部累加的乘法(16位乘16位,40位累加)。

其语法如下:

其中:cond——一个可选的条件代码;

Acc——内部累加器,标准名称为accx,其中x为0~n范围内的整数,n的值取决于处理器,在目前的处理器中它是0;

Rn、Rm——存放要相乘的值的ARM寄存器;

<x><y>——BB、BT、TB、TT中的一个。

指令的用法如下:

(1)MIA指令可先将Rn和Rm中的两个有符号整数值相乘,然后将乘积与Acc中的40位值相加。

(2)MIAPH指令可先将Rn和Rm的低半部有符号整数相乘,将Rn和Rm的高半部有符号整数相乘,然后将两个32位乘积与Acc中的40位值相加。

(3)MIAxy指令可先将选自Rs的16位有符号整数与选自Rm的16位有符号整数相乘,然后将32位乘积与Acc中的40位值相加。<x>==B表示使用Rn的低16位(位[15:0]),<x>==T表示使用Rn的高16位(位[31:16])。<y>==B表示使用Rm的低16位(位[15:0]),<y>==T表示使用Rm的高16位(位[31:16])。