LLVM汇编语言指导手册之指令手册

2023-10-26

下面是我对llvm汇编中一些不常用的指令的总结: 
‘shl’指令
语法:
<result> = shl <ty> <op1>, <op2>   ; yields {ty}:result
概述:
shl指令把第一个操作数(op1)向左移动(op2)个指定位,并把该值返回给result。
参数:
shl指令的两个参数都必须是同样的类型,为整型或者是整型的容器(vector),‘op2’被认为是无符号值。
语义:
生成的值是op1 * 2op2 mod 2n,这里n是result的宽度。如果op2是负数,或者op2的值与op1的比特位数相等或者更大,那么这个结果(result)就是不明确的。如果参数是容器(vector)的话,那么每个容器元素op1都要相应的移动op2个位数。
例子:
<result> = shl i32 4, %var   ; yields {i32}: 4 << %var
<result> = shl i32 4, 2      ; yields {i32}: 16
<result> = shl i32 1, 10     ; yields {i32}: 1024
<result> = shl i32 1, 32     ; undefined
<result> = shl <2 x i32> < i32 1, i32 1>, < i32 1, i32 2>   ; yields: result=<2 x i32> < i32 2, i32 4>
’zext.. to‘指令
语法:
<result> = zext <ty> <value> to <ty2>             ; yields ty2
概述:
zext指令把操作数使用0扩展为ty2类型。
参数:
zext指令要转换的数值,必须是整型,目标类型也必须是整型。value的位的大小必须比目标类型ty2的位的大小小。
语义:
zext指令用0填充value的高阶位,直到达到目标类型ty2的大小。
When zero extending from i1, the result will always be either 0 or 1.(具体解释见例子)。
例子:
 %X = zext i32 257 to i64              ; yields i64:257
 %Y = zext i1 true to i32              ; yields i32:1
’lshr‘指令
语法:
 <result> = lshr <ty> <op1>, <op2>   ; yields {ty}:result
概述:
lshr指令(逻辑右移)把第一个操作数op1向右移动指定数量(op2)的位数,用0填充左边的高位,最后返回第一个操作数给result。
参数:
lshr指令的两个参数必须都是相同的整型或者整型类容器(vector)。op2被认为是一个无符号值。
语义:
该指令总是执行一个逻辑右移的操作。移位之后,结果result中的最高位将被0填充。如果op2的值与op1的位数相等,或者更大,那么结果result不明确。如果参数是容器的话,那么每个容器元素op1都要相应的移动op2个位数。
例子:
  <result> = lshr i32 4, 1   ; yields {i32}:result = 2
  <result> = lshr i32 4, 2   ; yields {i32}:result = 1
  <result> = lshr i8  4, 3   ; yields {i8}:result = 0
  <result> = lshr i8 -2, 1   ; yields {i8}:result = 0x7FFFFFFF 
  <result> = lshr i32 1, 32  ; undefined
  <result> = lshr <2 x i32> < i32 -2, i32 4>, < i32 1, i32 2>   ; yields: result=<2 x i32> < i32 0x7FFFFFFF, i32 1>
’’trunc.. to‘指令
语法:
<result> = trunc <ty> <value> to <ty2>             ; yields ty2
概述:
trunc指令把它的操作数缩短为ty2类型。
参数:
trunc指令要缩短的数值必须是整型,指定result的尺寸和类型的ty2也必须是整型的。value位的大小必须比ty2的位的大小大。同等大小的类型也是不允许的。
语义:
trunc指令把value的高阶位缩短(即去掉),把剩余的位(bits)转化为ty2。因为源操作数的位大小必须比目标类型的位大小大,所以trunc不能是个空操作转换。它总是会缩短位的。
例子:
  %X = trunc i32 257 to i8              ; yields i8:1        说明:257---100 000 001
  %Y = trunc i32 123 to i1              ; yields i1:true    说明:123---111 101 1
  %Y = trunc i32 122 to i1              ; yields i1:false   说明:122---111 101 0

phi指令中,一个数据对中的第一个值是来自上一个bb中的,要注意。
xor指令:
语法:
<result> = xor <ty> <op1>, <op2>   ; yields {ty}:result
概述
xor指令返回两个操作数异或运算后的值。该指令也可以用来执行对一个操作数的取反操作(当然这需要op2操作数是-1,-1对应的16进制补码是0xFFFF),这有点像C语言中的“~”运算符。
参数:
xor指令的两个参数必须是整型或者整形类容器(vecotr),两个参数的类型必须一致。
语义:
xor指令异或规则如下表所示:
In0 In1 OUt
0 0 0
0 1 1
1 0 1
1 1 0
例子(前三个例子是异或,最后一个例子实际上是对%v变量取反,这个取反是不论%v正负属性的):
  <result> = xor i32 4, %var         ; yields {i32}:result = 4 ^ %var
  <result> = xor i32 15, 40          ; yields {i32}:result = 39
  <result> = xor i32 4, 8            ; yields {i32}:result = 12
  <result> = xor i32 %V, -1          ; yields {i32}:result = ~%V
select指令:
语法:
<result> = select selty <cond>, <ty> <val1>, <ty> <val2>     ; yields ty
selty is either i1 or {<N x i1>}
概述:
select指令被用来在基于某个条件的情况下选取一个值,没有分支情况。
参数:
select指令需要一个i1值或者是i1值的一个容器(vecotr)来说明条件。两个val值必须是同一个类型。如果val1和val2是容器类型,而条件cond是标量类型,那么整个容器(vector)都会被选中,而不是单个元素。
语义:
如果条件是i1并且i1的值是1,这个指令会返回第一个值参数。否则,它会返回第二个值参数。如果条件是i1容器,那么这个值参数必须是同样大小的容器,选择会一个元素一个元素的进行。
例子:
 
     
 %X = select i1 true, i8 17, i8 42          ; yields i8:17
llvm-2.6版本需要注意代码生成器还不支持条件是容器类型。
 
    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLVM汇编语言指导手册之指令手册 的相关文章

随机推荐

  • 深度卷积神经网络中的patch

    转载 https blog csdn net wills798 article details 97974617 在阅读基于深度卷积神经网络的图像识别 分类或检测的文献时经常看到 patch 不是很能理解 后来就总结了一下 通过阅读 pat
  • 【深度学习——点云】PointNet++

    这篇文章发表于NIPS 2017 是在PointNet基础上的工作 论文地址 PointNet Deep Hierarchical Feature Learning on Point Sets in a Metric Space 1 Mot
  • vue实现简单轮播图

    实现思路 将vue的框架封装在function中 在界面刷新时调用 将要轮播的图片存放在data中 还有下面的列表也分别保存在data中的一个数组中 然后每隔一段时间进行自动切换的函数写在methods中 注意函数要调用的话 就要在生命周期
  • 如何fork GitHub上的官方仓库

    在GitHub中 fork表示复制一个仓库到你自己的GitHub账号下 创建一个独立的副本 通过fork操作 你可以在自己的副本中进行修改 改进和实验 而不会影响到原始仓库或其他人的工作 当你fork一个仓库时 GitHub将会为你创建一个
  • Spring Boot(二)SpringBoot是如何启动Spring容器源码

    SpringApplication run 调用SpringApplication run启动springboot应用 1 SpringApplication run Application class args 2 使用自定义Spring
  • 使用R语言绘制散点图

    文章目录 学习目标 学习内容 内容小结 学习目标 我们所采用的学习内容来自B站的Lizongzhang老师的R语言的学习分享 今天学习的主要内容是关于 绘制散点图 学习内容 下面是学习的主要内容 直接上代码 大家可以查看视频 我也的注释也比
  • 求阶乘的三种方法

    方法一 递归算法 include
  • 【手把手带你用pid算法控制电机】——(4)串级PID控制电机

    前言 1 该系列教程是基于stm32f103c8t6最小系统板的hal库开发 用最通俗易懂的方式手把手带你学会使用Pid算法的速度环 位置环以及速度位置串级pid 2 出这一期Pid系列教程的想法是前段时间我参加了一个比赛 要用到串级Pid
  • 第1课:三位一体定位法,让写作事半功倍

    做最懂技术的传播者 最懂传播的工程师 课程内容分析 本课程的目标是 通过对一系列问题的梳理 找到适合自己的输出状态 确定与理想输出状态之间存在的差距 以及采取什么办法 减少差距 知识要点 1 受众需要什么 省时间的内容 收敛 看过就走 教你
  • Netty源码剖析之HashedWheelTimer时间轮

    版本信息 JDK1 8 Netty all 4 1 38 Final 时间轮的介绍 我们知道钟表分为很多块 每时钟滴答一次就往前走一个块 而时间轮就是使用这个思想 如下图 上图总共分为8块 每过100ms就往前走一块 然后周而复始 此时 我
  • HC32L130单片机入坑记

    解决问题的思路 经验就可提高工作效率 1 调试中遇到的问题及解决思路 1 程序debug过程中 进入hardware default中断中无限循环 解决办法 运用断点定位到程序debug出错的具体位置 程序最终执行的位置即为程序出错的位置
  • alook浏览器哪个好 夸克浏览器_夸克(Quark)浏览器的安装和使用

    前面的文章 我们大概介绍了一下夸克浏览器的 本片将着重将一下夸克浏览器的使用 下载安装 去夸克的官方网站下载安装包 上传到手机进行安装 去各大应用商店去下载安装 比如小米手机的小米应用商店 华为的华为应用商店 或者第三方的豌豆荚等应用商店去
  • flex & bison 基础概述

    1 前言 限于作者能力水平 本文可能存在谬误 因此而给读者带来的损失 作者不做任何承诺 2 本文目标 简单介绍 flex 和 bison 的基础使用方法 简要分析 flex bison 生成代码的工作流程 3 flex bison 3 1
  • 超详细讲解 H5 移动端适配方案

    目录 REM适配方案 1 前言 2 原理 3 适配代码 4 总结 vw适配方案 1 原理 2 适配代码 3 适配方案对比 1px问题 1 简述 2 代码测试 总结 REM适配方案 1 前言 设计师交付给前端开发一张宽度为750px的视觉稿
  • 重新安装ROG Armoury Crate

    文章目录 使用官方卸载工具卸载奥创 安装奥创 更新奥创之后 Aura Sync 坏了 无法调整灯光 打开 Aura Creator 提示服务运行异常 在任务管理器中随便禁用了几个奥创 Asus的服务后 再次打开 Aura Creator 提
  • 【人工智能】SVM 分类器的设计与应用(QDU)

    人工智能 Astar算法求解8数码问题 QDU 人工智能 利用 搜索的博弈树算法编写一字棋游戏 QDU 人工智能 Fisher 线性分类器的设计与实现 QDU 人工智能 感知器算法的设计实现 QDU 人工智能 SVM 分类器的设计与应用 Q
  • Linux中查看socket状态

    Linux中查看socket状态 cat proc net sockstat 这个是ipv4的 sockets used 137 TCP inuse 49 orphan 0 tw 3272 alloc 52 mem 46UDP inuse
  • 响应式布局(媒体查询+%)

    总结 核心思想 每一个最外层盒子给一个max width 盒子中的内容width全部使用 表示 使用 元素全部写在盒子里 当媒体查询满足情况是display block 注意 精确的是需要一样的 媒体查询相当于if 过渡的动画写在默认样式里
  • 读书笔记-看见未来:改变互联网世界的人们

    作者 余晨 推荐序二 未来从来不会自动地发生 世界正在重新 造物 它既是虚拟意义上的 又同时是实物意义上的 宙斯在假眠 而诸神则各逞其能 时代 曾经刊登过的一篇文章认为 今天的个人计算机革命和互联网之所以成为这样 乃是继承了20世纪60年代
  • LLVM汇编语言指导手册之指令手册

    下面是我对llvm汇编中一些不常用的指令的总结 shl 指令 语法