|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM乘法指令完成2个寄存器中数据的乘法。按产生结果的位宽一般分为2类:一类是2个32位二进制相乘的结果是64位;另一类是2个32位二进制相乘,仅保留最低有效32位。) G. x' F# W) D1 [( ]3 z9 \1 k: v
这2种类型都有“乘一累加”的变形,即将乘积连续相加成为总和,而且有符号和无符号操作数都能使用。
5 y) u5 E: j5 V# p对于有符号和无符号操作数,结果的最低有效32位是一样的,所以对于只保留32位的结果的乘法指令,无须区分有符号数和无符号数2种指令格式。) i6 r& c M/ u$ l( [
二进制编码
% x* C) f; s. L7 M4 E乘法的二进制编码
: D- Q7 V8 g2 Y" a" y4 O: a说明
. D4 {, {9 c; b! L1 t M! o0 e表列出了各种形式乘法功能,对指令编码及表中使用的寄存器表示符号解释如下:. U5 A' m2 O- \) c! q. g
对于32位乘积结果指令,Rd为结果寄存器,Rm、Rs、Rn为操作数寄存器。R15不能用作Rd、Rm、Rs或Rn。且Rd不能与Rm相同。
0 G- E7 J: S# ]! F. c M对于64位乘积结果指令,RdLo、RdHi为结果寄存器,“RdLo:RdHi”是由RdHi(最高有效32位)和RdLo(最低有效32位)连接形成64位乘积结果,Rm、Rs为操作数寄存器。R15不能用作RdLo、RdHi、Rm或Rs,且RdLo、RdHi不能与Rm相同。
. F1 I# v/ o* g选择[31:0]意指只选取乘积结果的最低有效32位。
v+ g: B) {) \0 h$ U/ [* E简单的赋值由“<-”表示。5 ~* y% e6 _/ t# B
累加(将右边加到左边)是由“+=”表示。$ e+ d4 k! J1 J
与其他数据处理指令一样,S位控制条件码的设置。当在指令中设置了S位时:( |* X7 R. l9 d
根据结果更新标志位N和Z。对于产生32结果的指令形式,N标志位设置为Rd的第3位的值;对于产生64位结果的指令形式,N标志位设置的是RdHi的第31位的值;如果Rd或RdHi和RdLo为0,则Z标志设置位。4 N: K. z0 k1 T) }2 s5 T# `
在ARMV4及以前版本中,标志C和V不可靠;1 _. u8 n$ ^9 e1 H; {/ P, c
在ARMV5及以后版本中,不影响标志C和V。
$ v9 Y' j+ m! W汇编格式 ]: p2 t; y" e8 N j- _
产生最低有效32位乘积的指令:
# i8 `7 `7 V% u; ~) m2 |* l; hMUL{<cond>}{S} Rd,Rm,Rs# f# h! m* H- t |9 g; ~
MULA{<cond>}{S} Rd,Rm,Rs,Rn* `. \3 n. Z' q+ ]
产生64位乘积的命令:3 f! }: }; N1 C3 p- M9 d# j
<mul>{<cond>}{S}RdHi,RdLo,Rm,Rs8 R. N5 D' E" a \( l* E" ]* A0 p
在此<mul>是64位乘法类型(UMULL、UMLAL、SMULL、SMLAL)。8 y2 g k1 v& U- d2 @; E
例子
/ {/ u; X; ]% p( m) u4 K6 B形成两个矢量的标量积:8 m% p$ i/ Z) f+ [2 C
MOV R11,#20 ;初始化循环计数
+ c- s+ R5 C) @1 ?MOV R10,#0 ;初始化总和
* S& x$ ^! c" i' q' G' mLOOP LDR R0,[R8],#4 ;读取第一分量$ F+ [ Y( @ o2 z; ^, h
LDR R1,[R9],#4 ;读取第二分量) `$ \0 Z; y- d, I4 j; y1 M# U" r
MLA R10,R0,R1,R0 ;乘积累加
1 M6 R" u" x& k1 c4 r9 \ SUBS R11,R11,#1 ;减循环计数. X/ u1 N |- K2 P$ M/ I h3 E1 }
BNE LOOP 0 R9 I, O& |4 @" J) T
乘以一个常数可由调一个常数到寄存器,然后使用这些指令中的一种来实现。但是使用移位和加法或减法构成一小段数据处理指令通常更加有效。例如,将R0乘以35:
/ I {1 Z0 d# }5 U k- EADD R0,R0,R0,LSL#2 ;R0`<-5×R0
+ `$ ~# j/ }+ |7 C1 Q8 L3 u" S9 JRSB R0,R0,R0,LSL#3 ;R0``<-7×R0`" u4 }( I) j) Q6 h# t* x+ w$ [
注意事项1 F2 M3 p7 L+ t* \
它与其他数据处理指令的重要区别为:
1 c: E* P& r4 R* f T$ I—不支持第2操作数为立即数0 z5 n1 q0 f7 O2 n% B
—结果寄存器不能同时为第一源寄存器,即Rd、RdHi、RdLo不能与Rm为同一寄存器,RdHi和RdLo不能为同一寄存器。
9 _/ y. O! P3 u# R应避免R15为任意操作数或结果寄存器。+ F" \2 g) s! q( m+ R5 M
早期的ARM处理器仅支持32位乘法指令。ARM7版本和后续的在名字中有M的处理器才支持64位乘法指令。 |
|