llvm中的XXXInstrInfo.td
全文基于作者主观理解,仅供参考:
XXXInstrInfo.td文件中定义的是目标机的指令格式。这种td文件会被TableGen自动生成c++类型文件。下面主要是要讨论该文件中的代码含义。
1、def CPU0Ret : SDNode<"CPU0ISD::Ret", SDTNone, [SDNPHasChain,SDNoptInGlue,SDNPVariadic]>;
参考了这篇文档。每个SelectionDAG节点类型都有一个对应的SDNode定义。该函数的原型在llvm/include/llvm/Target/TargetSelectionDAG.td中。第一个参数"CPU0ISD::Ret"指的是这个Node结点的名称。第二个参数是SDTypeProfile类型,它描述了该结点的一些类型要求,详细介绍见下一小节。上面的SDTNone指没有什么要求。第三个参数指的是该结点所应该具有的属性。上面代码中SDNPHasChai的意思是R/W chain operand and result(具体含义自行理解); SDNPVariadic的含义则是说该结点有可变参数。其余的属性都可以在TargetSelectioDAG.td中找到。上面这段代码应该是定义了一个返回类型的SDNode结点。
2、def SDT_Cp0Ret : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
SDTypeProfile的原型也在TargetSelectionDAG.td中。前两个参数是指有几个结果和几个操作数,因为一个SDNode结点里包括有这些内容。如果第二个参数为-1则说明该操作数个数不定。第三个参数是对操作数类型的约束。如这里的SDTCisInt就说明操作数应该是整型的,0则是代表约束的是第一个操作数。
3、def simm8 : Operand<i32>{ let DecoderMethod = "DecodeSimm8"; }
Operand的原型在llvm/include/llvm/Target/Target.td中。个人理解是把simm8这个标识当作一个32位的操作数。例如有个8位的数,但是该系统只支持32位的,所以就要进行扩展,这在LLVM中就是SelectionDAG的legalize。
4、def men : Operand<iPTR>{
let PrintMethod = "printMemOperand";
let MIOperandInfo = (ops Cpu0Regs, simm8);
let EncoderMethod = "getMemEncoding"; }
这是定义了对内存的操作。(???)我推测MIOperandInfo定义的是一种寻址方式,如这里就是一个寄存器(CPURegs)加一个立即数(simm8)的方式。
5、def immSExt8 : PatLeaf<(imm),[ return isInt<8>(N->getSExtValue()); }]>
原型在TargetSelectionDAG.td。(imm)是dag类型;N是一个操作数结点,后面就判断该N结点是否为8位的整型,是的话才返回。(但这个的含义也不懂)。给一个8位的立即操作数,之后返回一个常量结点。这样这个常量结点便可以代表这个8位立即数了。至于它是不是8位的立即数就得进行一下判断了。
6、def addr : ComplexPattern<iPTR, 2, "SelectAddr", [frameindex],[SDNPWantParent]>
原型在TargetSelectionDAG.td。这应该是为了处理地址模式比较复杂的情况。2是指SelectAddr方法所返回的操作数个数。SelectAddr似乎定义在了XXXDAGToDAGISel。
7、class ArithLogicI<bits<8> op, string instr_asm, SDNode OpNode,
FL<op, (outs GPROut:$ra), (ins RC:$rb, Od:$imm16), !strconcat(instr_asm, "\t$ra, $rb, $imm16"),
[(set GPROut:$ra, (OpNode RC:$rb, imm_type: $imm16))], IIAlu> {
let isReMaterializable = 1; }
llvm中的XXXInstrInfo.td相关推荐
- LLVM中指令的一生
原作:http://eli.thegreenplace.net/2012/11/24/life-of-an-instruction-in-llvm/ 作者:Eli Bendersky LLVM是一个复 ...
- LLVM中的String相关
LLVM中的String相关 1. 传递字符串(`StringRef` 类和 `Twine` 类) 1.1 `StringRef`类 1.1.1 StringRef.getAsInteger()成员函 ...
- HTML中th和td区别
很多人想问在HTML中<th>和<td>标签都是用于单元格内容显示的,那么有什么区别呢? 下面我们将用实例和代码来演示. 由此可见,<th>和<td>标 ...
- jQuery遍历table中的tr td并获取td中的值
jQuery遍历table中的tr td并获取td中的值 $(function(){$("#tableId tr").find("td").each(funct ...
- LLVM中几个重要的Passes子类
LLVM中几个重要的Passes子类 ModulePass 它是最通用的超类.通过继承此类,可以分析整个模块.函数在模块内是无特定顺序的.要使用它时,需要编写一个继承自ModulePass并重载run ...
- CSS中设置表格TD宽度的问题
CSS布局,表格宽度不听使唤的实例.想把表格第一例宽度设为20,其他自适应.但CSS中宽度是等宽的.只设这一行也不起作用.但是在实际应用中总是等宽处理,并不按照样式来走. XML/HTML代码 < ...
- html 中 table tr td br 什么意思 是什么的缩写
HTML(HyperText Mark-up Language)即超文本标记语言或超文本链接标示语言,是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言.设计HTML语言的目的是为了能把存放在 ...
- table标签中tr和td的英文单词
table标签 tr标签 td标签 th标签 首标签<table>和尾标签</table>分别表示一个表格的开始与结束.这是不难理解的. tr是"table row( ...
- LLVM中的PHI节点
PHI 节点,它会选择来自不同分支的 i,因为我们的 IR 是 SSA(single static assignment,静态单赋值)形式的.在控制流图中,一个给定的变量可以来自两个不同的基本块(两条 ...
最新文章
- ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收
- Chrome Restful Api 测试工具 Postman-REST-Client离线安装包下载,Axure RP Extension for Chrome离线版下载...
- Mysql学习积累之一[网摘收藏 个人学习参考]
- 【AI-1000问】Face detection、alignment、verification、identification(recognization) 你能分的清楚吗?
- 编写yara规则,检测恶意软件(自定义yara规则)
- 解读年度数据库性能:PostgreSQL的日志文件和数据加载
- python数组的使用方法_使用Python记录数组的正确方法是什么
- python的sdk是什么意思_python sdk
- jq ajax input file,基于jq的input file文件上传
- python计算单词长度_附加一个计算单词长度的列表
- matlab求函数偏导
- 明知故犯还是执迷不悟?
- php输出白天时间,php 判断白天黑夜
- JAVA-日期类(Date、SimpleDateFormat)
- PTMs-ALBERT
- 伏神月破、伏神跟飞神、动爻、日月关系的思考
- 三种方法获取公众号文章素材的永久链接
- html5游戏占内存和cpu,IIS解决CPU和内存占用率太高的问题
- 记 随手科技2020届实习生笔试题(Java开发工程师)笔试题
- linux系统下html中文乱码
热门文章
- 简单动画制作方法,教程在这里! | 万彩动画大师
- C#Lua 过滤筛选脏字
- PHP中PSR-[0-4]规范
- Activiti基础
- 故障:fork failed:Resource Temporarily Unavailable解决方案
- 一文带你了解 Google I/O 2022 精彩汇总与个人感想
- hibernate mysql 中文乱码_使用Hibernate和mysql中文乱码问题
- 转:2014年最酷的30个JavaScript库
- 正则表达式提取html 中的网址,C#正则表达式模式从给定的字符串中提取网址 - 不是完整的html网址,也包括裸链接...
- 大写的服!84 岁的程序员