|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM乘法指令完成2个寄存器中数据的乘法。按产生结果的位宽一般分为2类:一类是2个32位二进制相乘的结果是64位;另一类是2个32位二进制相乘,仅保留最低有效32位。
; n. O) b ]$ }, c% ^* ]这2种类型都有“乘一累加”的变形,即将乘积连续相加成为总和,而且有符号和无符号操作数都能使用。0 [' e* t* D- }1 E1 ^" s
对于有符号和无符号操作数,结果的最低有效32位是一样的,所以对于只保留32位的结果的乘法指令,无须区分有符号数和无符号数2种指令格式。/ J( J& p6 _1 r9 m0 \6 @% m
二进制编码
* ?; B4 {, P8 A! G: Q2 e乘法的二进制编码: y0 R* h# S5 Q) g f5 j/ U$ U/ X
说明8 j( R0 |" C3 k4 x
表列出了各种形式乘法功能,对指令编码及表中使用的寄存器表示符号解释如下:5 I0 ~ V' }: }. f- a4 K
对于32位乘积结果指令,Rd为结果寄存器,Rm、Rs、Rn为操作数寄存器。R15不能用作Rd、Rm、Rs或Rn。且Rd不能与Rm相同。
) \- h5 c' \( n; F- H对于64位乘积结果指令,RdLo、RdHi为结果寄存器,“RdLo:RdHi”是由RdHi(最高有效32位)和RdLo(最低有效32位)连接形成64位乘积结果,Rm、Rs为操作数寄存器。R15不能用作RdLo、RdHi、Rm或Rs,且RdLo、RdHi不能与Rm相同。6 R% N! P4 P5 n. A! x4 [
选择[31:0]意指只选取乘积结果的最低有效32位。9 g" J5 j$ s: }7 \
简单的赋值由“<-”表示。
. @7 u; g0 ^7 N% Y累加(将右边加到左边)是由“+=”表示。1 w5 H9 e6 Y; p# t
与其他数据处理指令一样,S位控制条件码的设置。当在指令中设置了S位时:5 }) \: n' g3 v k. V' ^8 }
根据结果更新标志位N和Z。对于产生32结果的指令形式,N标志位设置为Rd的第3位的值;对于产生64位结果的指令形式,N标志位设置的是RdHi的第31位的值;如果Rd或RdHi和RdLo为0,则Z标志设置位。
9 ]; @( R- |- ^- }在ARMV4及以前版本中,标志C和V不可靠;, ~/ w: \8 ^7 T& D! h% q/ |2 D
在ARMV5及以后版本中,不影响标志C和V。, G8 E" } W8 |* y* N+ i
汇编格式 ~! Q' z- s5 f& {9 J. e/ N! `& i; F* l
产生最低有效32位乘积的指令:
7 X) ?4 K/ y2 Y+ f8 L4 jMUL{<cond>}{S} Rd,Rm,Rs n& {) i9 {3 h4 ?) }8 c
MULA{<cond>}{S} Rd,Rm,Rs,Rn
2 j& Q- k" C9 ^+ ]% m" g3 x产生64位乘积的命令:
7 s( ?0 t+ D- V E<mul>{<cond>}{S}RdHi,RdLo,Rm,Rs \- t9 S! x( _. J% C
在此<mul>是64位乘法类型(UMULL、UMLAL、SMULL、SMLAL)。
. Z' I- H7 U& Y# A* }; U例子
8 l% k- J n: F- L$ \; ~2 M( r形成两个矢量的标量积:# |( n' G% Z% N' N- Q* `4 m
MOV R11,#20 ;初始化循环计数- l' h/ ]7 i8 E6 ~ A- }$ F
MOV R10,#0 ;初始化总和
' r u/ s+ r: v. y! jLOOP LDR R0,[R8],#4 ;读取第一分量# d! |# t3 o) h# g- B
LDR R1,[R9],#4 ;读取第二分量- K8 H6 L D' q2 y* B; w
MLA R10,R0,R1,R0 ;乘积累加$ r3 ^% T' f) o
SUBS R11,R11,#1 ;减循环计数3 {/ C* i n' L% v' P% P4 V
BNE LOOP
9 U& \& S4 Q6 N% H乘以一个常数可由调一个常数到寄存器,然后使用这些指令中的一种来实现。但是使用移位和加法或减法构成一小段数据处理指令通常更加有效。例如,将R0乘以35:
, S Q3 t" ^# Y/ I& s: nADD R0,R0,R0,LSL#2 ;R0`<-5×R0. J5 ~6 v/ X) B( }: L0 m! K) f
RSB R0,R0,R0,LSL#3 ;R0``<-7×R0`9 F, V) o# ?$ P6 K
注意事项, s* }( W& }: B3 b7 f4 R1 H! n
它与其他数据处理指令的重要区别为:- d3 u& ~ e; s& }
—不支持第2操作数为立即数) A+ n9 P& i" a7 ]- o
—结果寄存器不能同时为第一源寄存器,即Rd、RdHi、RdLo不能与Rm为同一寄存器,RdHi和RdLo不能为同一寄存器。 Q+ c5 c+ L3 \6 G4 r4 K/ c1 u
应避免R15为任意操作数或结果寄存器。/ {# o( i; B; d' j/ M
早期的ARM处理器仅支持32位乘法指令。ARM7版本和后续的在名字中有M的处理器才支持64位乘法指令。 |
|