ARM指令集——乘法指令

2024-08-28 12:18
文章标签 指令 arm 乘法 指令集

本文主要是介绍ARM指令集——乘法指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ARM有两类乘法指令:一类为32位的乘法指令,即乘法操作的结果为32位;另一类位64位的乘法指令,即乘法操作的结果为64位。两类指令共有以下6条:

  • MUL 32位乘法指令
  • MLA 32位带加数的乘法指令
  • SMULL 64位有符号数乘法指令
  • SMLAL 64位带加数的有符号乘法指令
  • UMULL 64位无符号数乘法指令
  • UMLAL 64位带加数的无符号数乘法指令
下面一一介绍之:

1、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

指令的使用:
由于两个32位的数相乘结果为64位,而MUL指令仅仅保存了64位结果的低32位,所以对带符号的和无符号的操作数来说MUL指令执行的结果相同。

2、MLA
MLA指令实现两个32位数(有无符号都可以)的乘积,再将乘积加上第3个操作数,并将结果存放到一个32位的寄存器中。考虑执行命令的效率,指令中所有的操作数都放在寄存器中。

指令的语法格式:
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

3、SMULL
指令的语法格式:
SMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>

指令操作的伪代码:
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

指令的使用:
SMULL R1, R2, R3, R4 ; R1 = (R3 * R4)的低32位
; R2 = (R3 * R4)的高32位

4、SMLAL
指令的语法格式:
SMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>

指令操作的伪代码:
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

5、UMULL
指令的语法格式:
UMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>

指令操作的伪代码:
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 Rd == 0 then 1 else 0
C Flag = unaffected
V Flag =  unaffected

指令的使用:
UMULL R1, R2, R3, R4 ; R2 R1 = R3 * R4

6、UMLAL
指令的语法格式:
UMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs>

指令操作的伪代码:
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

这篇关于ARM指令集——乘法指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114738

相关文章

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行

mysql中导入txt文件数据的操作指令

1 表tt的格式:    CREATE TABLE `tt` (   `ind` int NOT NULL auto_increment,   `name` char(100) default NULL,   PRIMARY KEY  (`ind`)  )   2 文件d.txt的内容示例:  1,a  2,b  3,c

可选择的反思指令微调

论文:https://arxiv.org/pdf/2402.10110代码:GitHub - tianyi-lab/Reflection_Tuning: [ACL'24] Selective Reflection-Tuning: Student-Selected Data Recycling for LLM Instruction-Tuning机构:马里兰大学, Adobe Research领

bash: arm-linux-gcc: No such file or directory

ubuntu出故障重装了系统,一直用着的gcc使用不了,提示bash: arm-linux-gcc: No such file or directorywhich找到的命令所在的目录 在google上翻了一阵发现此类问题的帖子不多,后来在Freescale的的LTIB环境配置文档中发现有这么一段:     # Packages required for 64-bit Ubuntu

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键