ARM指令集之乘法指令

ARM有两类乘法指令:一类指令的操作结果为32位,所以叫32位乘法指令;另一类的操作结果位64位,所以叫64位乘法指令。

为了运算高效,乘法指令要求所有操作数都位于寄存器中,所以ARM乘法指令无需指定寻址方式。

ARM共有如下乘法指令:

助记符说明实现逻辑
MUL32位乘法指令Rd = Rm * Rs
MLA32位带加数的乘法指令Rd = Rm * Rs + Rn
SMULL64位有符号数乘法指令RdHi = (Rm * Rs)[63:32];
RdLo = (Rm * Rs)[31:0];
SMLAL64位带加数的有符号数乘法指令RdLo = (Rm * Rs)[31:0] + RdLo;
RdHi = (Rm * Rs)[63:32] + RdHi + CarryFrom((Rm * Rs)[31:0] + RdLo);
UMULL64位无符号数乘法指令RdHi = (Rm * Rs)[63:32];
RdLo = (Rm * Rs)[31:0];
UMLAL64位带加数的无符号数乘法指令RdLo = (Rm * Rs)[31:0] + RdLo;
RdHi = (Rm * Rs)[63:32] + RdHi + CarryFrom((Rm * Rs)[31:0] + RdLo);

MUL

MUL{<cond>}{S} <Rd>, <Rm>, <Rs>

if ConditionPassed(cond) then
	Rd = (Rm * Rs)[31:0]
	if S == 1 then
		N Flag = Rd[31]
		Z Flag = if Rd == 0 then 1 else 0
		C Flag = unaffected
		V Flag = unaffected

MLA

MLA{<cond>}{S} <Rd>, <Rm>, <Rs>, <Rn>

if ConditionPassed(cond) then
	Rd = (Rm * Rs + Rn)[31:0]
	if S == 1 then
		N Flag = Rd[31]
		Z Flag = if Rd == 0 then 1 else 0
		C Flag = unaffected
		V Flag = unaffected

SMULL

SMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>, <Rn>

if ConditionPassed(cond) then
	RdHi = (Rm * Rs)[63:32] // 计算结果的高32位
	RdLo = (Rm * Rs)[31:0] // 计算结果的低32位
	if S == 1 then
		N Flag = RdHi[31]
		Z Flag = if RdHi == 0 and RdLo == 0 then 1 else 0
		C Flag = unaffected
		V Flag = unaffected

SMLAL

SMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>, <Rn>

if ConditionPassed(cond) then
	RdLo = (Rm * Rs)[31:0] + RdLo
	RdHi = (Rm * Rs)[63:32] + RdHi + CarryFrom((Rm * Rs)[31:0] + RdLo)
	if S == 1 then
		N Flag = RdHi[31]
		Z Flag = if RdHi == 0 and RdLo == 0 then 1 else 0
		C Flag = unaffected
		V Flag = unaffected

UMULL

UMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>, <Rn>

if ConditionPassed(cond) then
	RdHi = (Rm * Rs)[63:32]
	RdLo = (Rm * Rs)[31:0]
	if S == 1 then
		N Flag = RdHi[31]
		Z Flag = if RdHi == 0 and RdLo == 0 then 1 else 0
		C Flag = unaffected
		V Flag = unaffected

UMLAL

UMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>, <Rn>

if ConditionPassed(cond) then
	RdLo = (Rm * Rs)[31:0] + RdLo
	RdHi = (Rm * Rs)[63:32] + RdHi + CarryFrom((Rm * Rs)[31:0] + RdLo)
	if S == 1 then
		N Flag = RdHi[31]
		Z Flag = if RdHi == 0 and RdLo == 0 then 1 else 0
		C Flag = unaffected
		V Flag = unaffected
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值