|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM乘法指令完成2个寄存器中数据的乘法。按产生结果的位宽一般分为2类:一类是2个32位二进制相乘的结果是64位;另一类是2个32位二进制相乘,仅保留最低有效32位。% p! x, \2 M; ^% I
这2种类型都有“乘一累加”的变形,即将乘积连续相加成为总和,而且有符号和无符号操作数都能使用。2 r7 T* L8 z$ Z5 E+ f
对于有符号和无符号操作数,结果的最低有效32位是一样的,所以对于只保留32位的结果的乘法指令,无须区分有符号数和无符号数2种指令格式。" D' P: |3 y" t; t( [( c4 s
二进制编码& J0 ~" U8 V% j* u" @; P3 ^& r
乘法的二进制编码
8 O2 A6 n/ g( t) T! w6 \说明
& G) ^; X2 h) b9 M( v+ Y. ~( a+ F9 d表列出了各种形式乘法功能,对指令编码及表中使用的寄存器表示符号解释如下:1 b2 A) O2 B U# G% W# v' ^! s# e
对于32位乘积结果指令,Rd为结果寄存器,Rm、Rs、Rn为操作数寄存器。R15不能用作Rd、Rm、Rs或Rn。且Rd不能与Rm相同。
2 ~7 { p+ }( M L/ P0 c, s- D+ Y对于64位乘积结果指令,RdLo、RdHi为结果寄存器,“RdLo:RdHi”是由RdHi(最高有效32位)和RdLo(最低有效32位)连接形成64位乘积结果,Rm、Rs为操作数寄存器。R15不能用作RdLo、RdHi、Rm或Rs,且RdLo、RdHi不能与Rm相同。# o7 Q0 @. S6 ?( q- f2 K' ~
选择[31:0]意指只选取乘积结果的最低有效32位。5 C! u: D$ g e4 d5 e
简单的赋值由“<-”表示。
9 u2 z& ?' k, f0 `3 {累加(将右边加到左边)是由“+=”表示。
4 X( O) y" T0 J0 K/ q0 h* K与其他数据处理指令一样,S位控制条件码的设置。当在指令中设置了S位时:
8 X9 D( W3 j9 A$ ?( f+ d* `( M( y q1 z根据结果更新标志位N和Z。对于产生32结果的指令形式,N标志位设置为Rd的第3位的值;对于产生64位结果的指令形式,N标志位设置的是RdHi的第31位的值;如果Rd或RdHi和RdLo为0,则Z标志设置位。- w) {$ v9 x; ~' O, C5 J8 l7 H
在ARMV4及以前版本中,标志C和V不可靠;
' t \! ~/ H: v4 _2 ?! q: ?在ARMV5及以后版本中,不影响标志C和V。5 ^+ y$ q6 @" A8 J! ^
汇编格式
, I5 d, A1 f, \产生最低有效32位乘积的指令:) f4 ]& H7 S2 P5 ~1 b( x( `. R
MUL{<cond>}{S} Rd,Rm,Rs
" x( ?7 x- c ]: a0 KMULA{<cond>}{S} Rd,Rm,Rs,Rn. F. r6 b D! g! }
产生64位乘积的命令:
7 I1 L" S0 f2 p" e( w<mul>{<cond>}{S}RdHi,RdLo,Rm,Rs
" {& ^0 E ^2 J在此<mul>是64位乘法类型(UMULL、UMLAL、SMULL、SMLAL)。
9 b/ @! l' ~4 L3 }* e例子4 `: I% Z9 ]0 ?
形成两个矢量的标量积:6 ?7 _" S$ R6 D+ h& R
MOV R11,#20 ;初始化循环计数
# i2 s2 h+ S. C. lMOV R10,#0 ;初始化总和% k& m @* ]& I0 C
LOOP LDR R0,[R8],#4 ;读取第一分量% g; S9 D4 g9 ]
LDR R1,[R9],#4 ;读取第二分量8 Q2 x m* G& t8 m$ j+ m( R
MLA R10,R0,R1,R0 ;乘积累加
+ A) A7 D# {) Q5 K; _: p$ R SUBS R11,R11,#1 ;减循环计数. ?5 S( |( K' n) `% f3 c' A% s2 w) L5 p
BNE LOOP 7 I9 d9 V8 |" D `* R0 X$ \
乘以一个常数可由调一个常数到寄存器,然后使用这些指令中的一种来实现。但是使用移位和加法或减法构成一小段数据处理指令通常更加有效。例如,将R0乘以35:
/ b- x6 Z% J% \# e% OADD R0,R0,R0,LSL#2 ;R0`<-5×R0
* E- J+ _- ~% f- {# C9 wRSB R0,R0,R0,LSL#3 ;R0``<-7×R0`9 y6 I A+ o. D$ W9 D7 o5 C5 t
注意事项+ @+ R9 A) P) a. h; R1 m z3 H7 D
它与其他数据处理指令的重要区别为:
0 c7 U! u) P1 n# w—不支持第2操作数为立即数" P" U6 ^0 P9 t7 J8 M
—结果寄存器不能同时为第一源寄存器,即Rd、RdHi、RdLo不能与Rm为同一寄存器,RdHi和RdLo不能为同一寄存器。
b' s) q6 v+ k, c' J. g5 \ \1 Z应避免R15为任意操作数或结果寄存器。
9 I) G4 g6 \2 E; o+ s8 j早期的ARM处理器仅支持32位乘法指令。ARM7版本和后续的在名字中有M的处理器才支持64位乘法指令。 |
|