|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM乘法指令完成2个寄存器中数据的乘法。按产生结果的位宽一般分为2类:一类是2个32位二进制相乘的结果是64位;另一类是2个32位二进制相乘,仅保留最低有效32位。- U3 ~* n3 A& S5 M3 n8 H. O' N3 r! Q
这2种类型都有“乘一累加”的变形,即将乘积连续相加成为总和,而且有符号和无符号操作数都能使用。
! V" o0 u+ F# m% C0 h8 R( I8 S+ W对于有符号和无符号操作数,结果的最低有效32位是一样的,所以对于只保留32位的结果的乘法指令,无须区分有符号数和无符号数2种指令格式。$ H& t: Y7 ]$ g& F ~
二进制编码8 i3 Y* O5 L; j9 |2 D
乘法的二进制编码5 G: j5 p- n+ v. d+ E
说明9 ]5 A0 o b, I0 K3 B
表列出了各种形式乘法功能,对指令编码及表中使用的寄存器表示符号解释如下:* ?7 N1 H% g4 p1 n' w8 h4 v# ?
对于32位乘积结果指令,Rd为结果寄存器,Rm、Rs、Rn为操作数寄存器。R15不能用作Rd、Rm、Rs或Rn。且Rd不能与Rm相同。
M$ l# h, q3 W3 y4 V对于64位乘积结果指令,RdLo、RdHi为结果寄存器,“RdLo:RdHi”是由RdHi(最高有效32位)和RdLo(最低有效32位)连接形成64位乘积结果,Rm、Rs为操作数寄存器。R15不能用作RdLo、RdHi、Rm或Rs,且RdLo、RdHi不能与Rm相同。7 }/ B3 W) f. M( q
选择[31:0]意指只选取乘积结果的最低有效32位。; T, H5 S( g7 C
简单的赋值由“<-”表示。. @& K: x/ [. y& y% o8 p
累加(将右边加到左边)是由“+=”表示。
2 _2 |7 _3 I' Q2 U" ^与其他数据处理指令一样,S位控制条件码的设置。当在指令中设置了S位时:
1 x' H9 v& u& m, n, y* [- W根据结果更新标志位N和Z。对于产生32结果的指令形式,N标志位设置为Rd的第3位的值;对于产生64位结果的指令形式,N标志位设置的是RdHi的第31位的值;如果Rd或RdHi和RdLo为0,则Z标志设置位。4 t! ~+ b2 q. u: H6 O2 E7 x
在ARMV4及以前版本中,标志C和V不可靠;
4 K: d4 i9 m! P% g在ARMV5及以后版本中,不影响标志C和V。
2 v4 |, G* `5 i0 k汇编格式
, u. \8 t# C5 U$ \) L& |产生最低有效32位乘积的指令:, o6 Z. ^' t z, \7 f0 W
MUL{<cond>}{S} Rd,Rm,Rs
2 S" U2 L" V& c! `% q) k/ rMULA{<cond>}{S} Rd,Rm,Rs,Rn" |" \" Z7 F% e% r8 y T1 _
产生64位乘积的命令:5 v( u9 R1 Z* w% ]! U5 \( Y9 r
<mul>{<cond>}{S}RdHi,RdLo,Rm,Rs
6 H6 ^6 @# Z" }& y# x) Z在此<mul>是64位乘法类型(UMULL、UMLAL、SMULL、SMLAL)。$ c, d. Q3 @3 ^& O+ V2 ]2 o9 q3 L
例子
2 {: a9 _ T9 S7 O9 A3 H h形成两个矢量的标量积:1 v, G) z. Z3 n% {0 J
MOV R11,#20 ;初始化循环计数" k4 t! r; u5 K g/ v) [6 o, z
MOV R10,#0 ;初始化总和
$ k7 H2 {$ W5 e% DLOOP LDR R0,[R8],#4 ;读取第一分量# p3 t- o$ P; b5 K$ S
LDR R1,[R9],#4 ;读取第二分量1 t8 w: |* e8 J0 x& f
MLA R10,R0,R1,R0 ;乘积累加
; [3 ?) n! |4 D$ O" x SUBS R11,R11,#1 ;减循环计数5 p% V& ?: p9 p; M& g! ?5 q
BNE LOOP
2 a5 l5 ~3 `/ b& r4 U乘以一个常数可由调一个常数到寄存器,然后使用这些指令中的一种来实现。但是使用移位和加法或减法构成一小段数据处理指令通常更加有效。例如,将R0乘以35:
) a: U6 P0 p" ]5 AADD R0,R0,R0,LSL#2 ;R0`<-5×R0
! N# O7 H- y( U9 H, t2 wRSB R0,R0,R0,LSL#3 ;R0``<-7×R0`
% @) C7 U2 S. n注意事项0 K7 Z$ @) y( K7 q( W3 L
它与其他数据处理指令的重要区别为:
! [+ L+ ~/ d0 |6 |% i6 v—不支持第2操作数为立即数! v+ @7 }( b; R3 T' _5 i, C
—结果寄存器不能同时为第一源寄存器,即Rd、RdHi、RdLo不能与Rm为同一寄存器,RdHi和RdLo不能为同一寄存器。8 o1 m% a- `6 S) n
应避免R15为任意操作数或结果寄存器。
Q, P0 H% x$ T; K3 H5 h早期的ARM处理器仅支持32位乘法指令。ARM7版本和后续的在名字中有M的处理器才支持64位乘法指令。 |
|