GCC MD文件分析笔记(1)

本文介绍了MD文件在GCC编译器中的作用,特别是机器相关优化阶段,详细解释了前端分析、中间代码优化(包括机器无关和相关优化)以及后端代码生成的过程,强调了define_insn模板在将GIMPLE转换为RTL和生成汇编代码中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        MD文件即机器描述文件,其重点是为了让编译器能够生成运行平台相适应的代码,因此,它是一种与处理平台相关的描述文件,在新的芯片需要适配时,主要修改的也是该文件。

        整个GCC编译器包括前端分析、中间代码优化、后端代码生成三个阶段。具体分为以下几个过程:

a) 前端分析会将源代码转化为语法树,进而转为GENERIC中间表示,此部分主要是针对编程语言的,与具体的处理平台无关,不需要用到MD文件。

b) 中间代码优化分为机器无关优化和机器相关优化两大类。首先GCC将GENERIC转为GIMPLE,在GIMPLE上进行的是机器无关优化(如:内联、常量传播、尾部调用消除、冗余消除等),此部分同样与具体的处理平台无关,不需要用到MD文件。接着,便是机器相关优化,此时有两个地方需要用到MD文件。

  1. 机器相关优化是在RTL中间表示基础上进行的,需要先将GIMPLE转为RTL,此时,就需要用到MD文件中命名的define_insndefine_expand,此时通过名字的匹配,找到对应的模式,然后将对应的GIMPLE转为define_insn或define_expand模板中给定的RTL指令序列。
  2. 在具体的机器相关优化过程中,将用到define_splitdefine_peephole等模板,实现窥孔优化等机器相关优化。

c) 后端代码生成将使用define_insn中的RTL模板匹配当前的RTL,当匹配上时,则根据该模板的汇编输出部分生成对应的汇编代码。

1. define_insn

define_insn包括5个部分,如下图所示:

对于以上的模板,展开后会变成如下三个模板:

注意:

  1. 里面用了模式的迭代批量生成模板,此时在具体匹配的时候需要根据模式的迭代进行展开;
    1. 展开时我们先找模式的迭代,这里即为IMSA_DWH,只有它是define_mode_iterator,其他三个都是define_mode_attr
    2. 另外属性一般是用"<>"包裹起来的,比如这里的<VHMODE>,<>,<>等,对于属性的扩展,其实就是根据模式扩展后具体的名字,然后找后面对应的字符串。如IMSA_DWH中第一个模式是V2DI,那么对于<VHMODE>这个属性,它就是找到(V2DI "V4SI")这一项,然后用后面的V4SI替换即可;
    3. <MODE>和<mode>是特殊的属性,即模式名本身,只是在具体转换时,<MODE>用模式名的大写替换表示,<mode>用模式名的小写替换,即对于V2DI这个模式,<MODE>替换后即为V2DI,<mode>替换后为v2di;
  2. 模板的name是GCC一开始定义好的,在将GIMPLE转为RTL时,就是根据name找到对应的RTL转换模板;
  3. RTL template其实是RTL表达式,具体操作(如set、vec_concat、truncate)可以查看GCC internal手册专门的RTL Expression章节,而对于match_operand等操作数,可以查看GCC internal手册中机器描述部分;
  4. 模板中的condition其实是C语言表达时的字符串形式,只有返回为真,这个模板才起作用;
  5. output template可以是一条汇编语句,也可以是多条,也可以是c语言代码;
  6. insn attributes主要包含有关目标机器的特定信息,例如指令集、寄存器、指令格式等。用于指示该指令所对应的属性,以便GCC能够根据这些属性进行相关的优化。比如选择最佳的指令序列、减少不必要的寄存器访问或内存操作、流水优化等;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值