|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM乘法指令完成2个寄存器中数据的乘法。按产生结果的位宽一般分为2类:一类是2个32位二进制相乘的结果是64位;另一类是2个32位二进制相乘,仅保留最低有效32位。* B/ @7 u* b: @
这2种类型都有“乘一累加”的变形,即将乘积连续相加成为总和,而且有符号和无符号操作数都能使用。- r7 W2 m$ V& O: ~2 }6 h- E8 D
对于有符号和无符号操作数,结果的最低有效32位是一样的,所以对于只保留32位的结果的乘法指令,无须区分有符号数和无符号数2种指令格式。, G1 h) t2 o( Z7 D' H) d. J$ q3 A
二进制编码
U( Z. Q% Y: W( h! j乘法的二进制编码# v( U5 i6 k6 ]! M# Z9 z/ j7 f* x
说明5 ^% {6 \9 o) F( y) l( H4 R% W
表列出了各种形式乘法功能,对指令编码及表中使用的寄存器表示符号解释如下:
5 b" b, u% f1 o" @% `对于32位乘积结果指令,Rd为结果寄存器,Rm、Rs、Rn为操作数寄存器。R15不能用作Rd、Rm、Rs或Rn。且Rd不能与Rm相同。- r+ L0 u6 P2 @! V4 ?
对于64位乘积结果指令,RdLo、RdHi为结果寄存器,“RdLo:RdHi”是由RdHi(最高有效32位)和RdLo(最低有效32位)连接形成64位乘积结果,Rm、Rs为操作数寄存器。R15不能用作RdLo、RdHi、Rm或Rs,且RdLo、RdHi不能与Rm相同。% A" o5 j* ]9 @9 W# \9 P
选择[31:0]意指只选取乘积结果的最低有效32位。
/ L* F$ q) v3 X7 N) v$ ^简单的赋值由“<-”表示。6 J/ k# V) `! D$ w
累加(将右边加到左边)是由“+=”表示。7 @6 Z' L3 y- n) t4 r( U9 Q
与其他数据处理指令一样,S位控制条件码的设置。当在指令中设置了S位时: f- B3 o( W5 ^* Q! a
根据结果更新标志位N和Z。对于产生32结果的指令形式,N标志位设置为Rd的第3位的值;对于产生64位结果的指令形式,N标志位设置的是RdHi的第31位的值;如果Rd或RdHi和RdLo为0,则Z标志设置位。+ T2 |" q2 O3 z' C! ^+ F
在ARMV4及以前版本中,标志C和V不可靠;
; t- g$ \9 D. i5 t在ARMV5及以后版本中,不影响标志C和V。
3 p1 D7 ]8 y% m( ~8 @, G i# @9 M! `汇编格式5 V& @! ^7 [; ~7 `0 w
产生最低有效32位乘积的指令:
' v. h" O0 ]; T" T7 R1 ^MUL{<cond>}{S} Rd,Rm,Rs
; ?/ v, O: s/ W7 r5 YMULA{<cond>}{S} Rd,Rm,Rs,Rn) A, D1 K6 f' A( C& L7 E
产生64位乘积的命令:
" {3 ^" h. L: y2 u7 \2 s5 N! l<mul>{<cond>}{S}RdHi,RdLo,Rm,Rs. Y# ^1 u) k5 j1 b- r F
在此<mul>是64位乘法类型(UMULL、UMLAL、SMULL、SMLAL)。
8 y5 o5 ?1 D9 R/ O/ {) L- k例子* c4 |) g! ~0 |
形成两个矢量的标量积:
$ d3 n; \) d: q) v$ {$ Y: k+ SMOV R11,#20 ;初始化循环计数
) ^" ?5 C1 t3 x' eMOV R10,#0 ;初始化总和$ `, N, q0 F5 `, p3 A( K8 A$ }
LOOP LDR R0,[R8],#4 ;读取第一分量
+ ]4 S+ \0 h8 l) S* i0 ]: W# ^ LDR R1,[R9],#4 ;读取第二分量
+ p. f! R- R1 H% n0 J+ U MLA R10,R0,R1,R0 ;乘积累加2 o; a. O- e: O0 p
SUBS R11,R11,#1 ;减循环计数, w9 F" W- B" N( D
BNE LOOP 3 O8 W( u7 m+ u/ }/ r+ i$ n7 v
乘以一个常数可由调一个常数到寄存器,然后使用这些指令中的一种来实现。但是使用移位和加法或减法构成一小段数据处理指令通常更加有效。例如,将R0乘以35:1 M( ~ `) O, x; E9 C4 J* i4 r) O
ADD R0,R0,R0,LSL#2 ;R0`<-5×R0
6 E/ D; @; k3 E |; H. HRSB R0,R0,R0,LSL#3 ;R0``<-7×R0`% u3 V7 P! y1 t3 t, o9 g
注意事项9 k. e" R$ _' D- Y3 }
它与其他数据处理指令的重要区别为:5 n' [* a B5 k: K
—不支持第2操作数为立即数
) @3 V: j. z# L* e8 N% f( P% |1 b$ O—结果寄存器不能同时为第一源寄存器,即Rd、RdHi、RdLo不能与Rm为同一寄存器,RdHi和RdLo不能为同一寄存器。
% t q7 F8 j( j8 h3 b% |5 s: V应避免R15为任意操作数或结果寄存器。
. O& {, }9 p4 U( E9 I早期的ARM处理器仅支持32位乘法指令。ARM7版本和后续的在名字中有M的处理器才支持64位乘法指令。 |
|