|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM乘法指令完成2个寄存器中数据的乘法。按产生结果的位宽一般分为2类:一类是2个32位二进制相乘的结果是64位;另一类是2个32位二进制相乘,仅保留最低有效32位。' d/ D+ Z- T% J
这2种类型都有“乘一累加”的变形,即将乘积连续相加成为总和,而且有符号和无符号操作数都能使用。
0 f& K4 _- w& L. z对于有符号和无符号操作数,结果的最低有效32位是一样的,所以对于只保留32位的结果的乘法指令,无须区分有符号数和无符号数2种指令格式。
, Y, f7 T3 T) X: @二进制编码! _/ c8 r( J4 d ~' R( r" V8 t
乘法的二进制编码: Z# }" ^; c6 K: Y" [
说明
8 l& M7 h8 j% x3 ^% k0 T表列出了各种形式乘法功能,对指令编码及表中使用的寄存器表示符号解释如下:
+ \; f) Y( l' y/ K4 W1 g对于32位乘积结果指令,Rd为结果寄存器,Rm、Rs、Rn为操作数寄存器。R15不能用作Rd、Rm、Rs或Rn。且Rd不能与Rm相同。
8 A3 _ N1 g% e' o3 n对于64位乘积结果指令,RdLo、RdHi为结果寄存器,“RdLo:RdHi”是由RdHi(最高有效32位)和RdLo(最低有效32位)连接形成64位乘积结果,Rm、Rs为操作数寄存器。R15不能用作RdLo、RdHi、Rm或Rs,且RdLo、RdHi不能与Rm相同。
7 u! x' R: u; ~; g+ o选择[31:0]意指只选取乘积结果的最低有效32位。: S, |! |5 v- @& k
简单的赋值由“<-”表示。
0 G6 `% \; \* G, ]6 Y累加(将右边加到左边)是由“+=”表示。
: k0 K# E3 N+ l! G) p与其他数据处理指令一样,S位控制条件码的设置。当在指令中设置了S位时:
7 [/ r4 G! q a2 q$ i* o根据结果更新标志位N和Z。对于产生32结果的指令形式,N标志位设置为Rd的第3位的值;对于产生64位结果的指令形式,N标志位设置的是RdHi的第31位的值;如果Rd或RdHi和RdLo为0,则Z标志设置位。
7 D' x2 ?6 k2 W6 @- c4 D; }在ARMV4及以前版本中,标志C和V不可靠;& t2 R+ C8 H) c5 l2 C! d
在ARMV5及以后版本中,不影响标志C和V。
$ j! i5 R. Q- t汇编格式
! k/ }) i' h; ~/ O! e6 |9 P2 E4 q产生最低有效32位乘积的指令:4 m. E/ U/ L9 H" u% S+ E
MUL{<cond>}{S} Rd,Rm,Rs0 a1 A- s& _4 x2 j
MULA{<cond>}{S} Rd,Rm,Rs,Rn. p5 P5 c2 |2 b7 L3 \
产生64位乘积的命令:! T0 O% }4 d% x e& k4 t( x3 b- B
<mul>{<cond>}{S}RdHi,RdLo,Rm,Rs. l0 c& L4 a9 Z0 l7 K
在此<mul>是64位乘法类型(UMULL、UMLAL、SMULL、SMLAL)。9 N' P% g c4 D: z% @7 R4 u
例子
' @* M& Q% ]2 x! A; }* l* X9 @形成两个矢量的标量积:
) I' M, H5 ?# yMOV R11,#20 ;初始化循环计数& Y% i7 j0 ]1 ?: Y i- E& H
MOV R10,#0 ;初始化总和
& ]8 |( | r: K f* gLOOP LDR R0,[R8],#4 ;读取第一分量
# O+ v& a) h+ i* T; `2 c4 q& C LDR R1,[R9],#4 ;读取第二分量# |* R' n5 O7 r7 R4 V
MLA R10,R0,R1,R0 ;乘积累加
. f8 q2 N8 `1 L7 k$ q. ~3 e8 Y SUBS R11,R11,#1 ;减循环计数- Y8 s+ M; f2 b j: ]
BNE LOOP % @ }) X% I0 M+ A
乘以一个常数可由调一个常数到寄存器,然后使用这些指令中的一种来实现。但是使用移位和加法或减法构成一小段数据处理指令通常更加有效。例如,将R0乘以35:
3 M* s8 D& K9 i- n0 L4 g' QADD R0,R0,R0,LSL#2 ;R0`<-5×R0
2 s3 H% K6 x5 b; k- K6 [) ^& nRSB R0,R0,R0,LSL#3 ;R0``<-7×R0` ?0 `/ r3 c! U* q2 F8 _ O
注意事项
5 i: S4 h8 j# X它与其他数据处理指令的重要区别为:
! A, t6 Q' h( S6 Q—不支持第2操作数为立即数6 L. U, ?, r- t- f
—结果寄存器不能同时为第一源寄存器,即Rd、RdHi、RdLo不能与Rm为同一寄存器,RdHi和RdLo不能为同一寄存器。$ o2 p) h! g: A' y0 ]9 u: e+ X
应避免R15为任意操作数或结果寄存器。
# q3 G: z& x3 Q$ G1 W/ U早期的ARM处理器仅支持32位乘法指令。ARM7版本和后续的在名字中有M的处理器才支持64位乘法指令。 |
|