GCC后端及汇编发布
wuhui_gdnt
这个作者很懒,什么都没留下…
展开
-
GCC后端及汇编发布(47)
17. gencheck工具程序经由前端处理后,被转换为rtl形式。在这个中间形式的程序被构建为一棵树。可以想象在树中的节点是多种多样并且复杂的,为了使节点的构建更容易,也更好控制。在tree.def及C-common.def(专门对应c及c++)中,以类似rtl.def原创 2011-10-15 08:49:06 · 1184 阅读 · 0 评论 -
GCC后端及汇编发布(33)
9.6.2. 输出delay的数据对于i386架构,没有使用define_delay。不过,还是值得看一下这个模式如何工作。 main (continued) 6212 /* Write out delay eligibility information,if DEFINE_原创 2011-07-16 08:47:39 · 857 阅读 · 0 评论 -
GCC后端及汇编发布(32)
9.6.1.4. 输出属性虽然我们已经构建了属性相关的数据,为了流水线危险识别器的使用,它们需要被输出为接受指令rtx对象,并返回指令的属性值的函数。这些函数被输出到文件insn-attrtab.c中,并将作为gcc源代码的一部分,来产生执行映像。 main (contin原创 2011-07-16 08:29:49 · 1019 阅读 · 0 评论 -
GCC后端及汇编发布(31)
9.6.1.3. 属性的优化一些属性包含复杂的表达式作为其值。使用i386.md文件中的一个例子,“length_immediate”属性的定义如下" 。 189 (define_attr "length_immediate"""190 (cond [(eq_attr原创 2011-07-10 14:33:08 · 1427 阅读 · 0 评论 -
GCC后端及汇编发布(31)续
在下一步,同样的,对应NOT子树的EQ_ATTR_ATL的底部节点,在3322行把自身作为left返回。图86:优化属性,步骤2对于NOT内部右侧的孩子IOR,在3585行构建一个新的EQ_ATTR_ATL,并在3326行作为rigth返回。图87:优化属性,步骤3现在作为第四步原创 2011-07-10 15:04:27 · 741 阅读 · 0 评论 -
GCC后端及汇编发布(12)
<br />5.3.为define_split产生代码<br />对于我们的例子,分解后的模式,同样有一个如下的gen_split模式。<br /><br />图33:genouput - define_insn_and_split模式的例子– split部分<br /> <br />929 static void<br />930 gen_split (rtxsplit, int lineno)原创 2011-05-07 08:51:00 · 1156 阅读 · 0 评论 -
GCC后端及汇编发布(11)
<br />5. genoutput工具5.1.代码输出的准备<br />这个工具从md文件输出insn-output.c。Insn-output.c为指定的模式产生汇编指令。<br /> <br />967 int<br />968 main (int argc, char **argv) ingenoutput.c<br />969 {<br />原创 2011-05-07 08:41:00 · 1248 阅读 · 0 评论 -
GCC后端及汇编发布(9)
<br />4. genemit工具4.1.代码输出的准备<br />这个工具从机器描述文件生成文件insn-emit.c。Insn-emit.c定义了,从机器描述文件中的模式定义生成的,以给定操作数作为参数的模式匹配函数。<br /> <br />775 int<br />776 main (int argc, char **argv) in原创 2011-04-30 08:59:00 · 1177 阅读 · 0 评论 -
GCC后端及汇编发布(10)
<br />4.3.为define_split产生代码<br />现在回到main,在840行,这个define_insn_and_split的split部分将被通过gen_split写出。我们的例子显示如下:<br /><br /><br /><br />图30:genemit - define_insn_and_split模式的例子– split部分<br /> <br />550 static void<br />551 gen_split(rtx split)原创 2011-04-30 09:06:00 · 933 阅读 · 0 评论 -
GCC后端及汇编发布(30)
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class原创 2011-06-18 08:33:00 · 1037 阅读 · 0 评论 -
GCC后端及汇编发布(29)
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 /* Style Def原创 2011-06-18 08:30:00 · 1006 阅读 · 0 评论 -
GCC后端及汇编发布(34)
9.6.3. 输出功能单元数据在产生了为指令提取属性的函数之后,用于调度器的数据及辅助函数将被生成如下。 main (continued) 6224 if (num_units|| num_dfa_decls)6225 {6226 /*Write out inform原创 2011-07-16 08:52:10 · 776 阅读 · 0 评论 -
GCC后端及汇编发布(35)
9.6.4. 输出自动机数据在自动机的生成一节,我们已经看到在自动机的产生过程中,构建了许多数据。现在是时候为这些数据输出代码了。 9867 void9868 write_automata (void)原创 2011-07-31 08:01:01 · 1279 阅读 · 0 评论 -
GCC后端及汇编发布(36)
9.6.4.1.3. 输出状态替代表在自动机的生成一节中看到,不同等效类别的指令从某个状态触发相同的状态迁移是可能的。这些指令被定义为状态替代(state alternative)。为了最小化自动机,以及把NDFA转换为DFA,这些状态将被合并为一个复合状原创 2011-07-31 08:24:45 · 1067 阅读 · 0 评论 -
GCC后端及汇编发布(46)
16. gengenrtl工具16.1. 概览这个工具从rtl.def产生genrtl.h及genrtl.c。这些输出的文件给出了根据在rtl.def文件中的定义产生各种rtl对象的函数。 340 int341 main (int argc, cha原创 2011-10-15 08:44:04 · 1032 阅读 · 0 评论 -
GCC后端及汇编发布(43)
13. genconfig工具这个工具将产生诸如“已知最大操作数编号”,“在任一指令中match_dup的最大数目”,“在一个split中已知的最大指令数”等,连同定义来表示是否出现特殊指令的宏,例如HAVE_conditional_move,HAVE_peephol原创 2011-10-15 08:34:39 · 1056 阅读 · 0 评论 -
GCC后端及汇编发布(42)
12. genflags工具这个工具将输出insn-flags,由genemit生成的函数,以及一系列包含define_insn及define_expand模式的条件模板的HAVE_*宏将被声明在其中。 233 int234 main (int argc,原创 2011-10-15 08:31:33 · 1787 阅读 · 0 评论 -
GCC后端及汇编发布 当前目录
>> 关于前端部分的文章在此 1. 概览2. genconditions工具2.1. 代码输出的准备2.1.1. 读入rtx形式的定义2.1.2. DEFINE_INSN模式的概览2.2. 输出指令定义模式的条件部分3. genrecog工具3原创 2011-07-11 07:17:52 · 2087 阅读 · 8 评论 -
GCC后端及汇编发布(45)
15. genpeep工具模式define_peephole的细节参考概览 – 关于define_peephole一节,这个工具不处理define_peephole2模式,这个模式则由genemit,genoutput及genrecog工具处理了。 353 in原创 2011-10-15 08:40:31 · 1171 阅读 · 0 评论 -
GCC后端及汇编发布(44)
14. gencodes工具这个工具将产生为其它工具使用的指令编号。 51 int52 main (int argc, char **argv)原创 2011-10-15 08:37:15 · 882 阅读 · 0 评论 -
GCC后端及汇编发布(41)
11.4. 验证构建的模式回到main,在根据machmode.def及i386-modes.def构建了用于使用模式(mode)的数据之后,complete_all_modes被调用来完成这个构建过程。 389 static void390 complet原创 2011-08-28 09:11:29 · 872 阅读 · 0 评论 -
GCC后端及汇编发布(39)
10. genopinit工具10.1. 概览这个工具将从机器描述文件输出insn-opinit.c。这个文件提供函数init_all_optabs来把内建函数与枚举insn_code绑定一起。而通过这个值,能显示该指令是否被支持。10.2. 程序入口33原创 2011-08-28 09:04:42 · 1247 阅读 · 0 评论 -
GCC后端及汇编发布(38)
9.6.4.2.8. 输出函数internal_state_dead_lock_p与state_dead_lock_p这两个函数是对表dead_lock_x(参考输出锁定状态表)的封装。 8568 static void8569 output_原创 2011-08-07 07:15:18 · 1839 阅读 · 0 评论 -
GCC后端及汇编发布(37)
9.6.4.2. 输出接口函数现在所有的表已经就绪。事实上,我们可以看到状态与触发迁移的指令间的关系,以及指令间资源竞争关系(通过发布延迟)都被封装入这些表中。同时指令间潜在的依赖关系(通过阻塞代价及就绪代价),以及某个branch/jump指令输出的delay slo原创 2011-08-07 07:12:44 · 1766 阅读 · 0 评论 -
GCC后端及汇编发布(7)
<br />3.3.2.重组识别树<br />回到main,下来调用process_tree来识别这棵树。它将尝试简化这棵树,并把节点赋予用于输出的函数。<br /> <br />2582static void ingenreocg.c<br />2583process_tree (structdecision原创 2011-04-23 09:45:00 · 885 阅读 · 0 评论 -
GCC后端及汇编发布(4)
<br />3. genrecog工具3.1.代码输出的准备<br />工具genrecog用于产生识别及转换RTL到汇编的转换引擎。在这里我们看到该工具如何从机器描述文件构建出这个引擎——我们以i386系统为例子,这个机器描述文件是i386.md。<br /> <br />2612int<br />2613main (int argc,char **argv)原创 2011-04-23 09:02:00 · 1298 阅读 · 0 评论 -
GCC后端及汇编发布(6)
<br />3.3.构建识别树3.3.3.创建识别树<br />对于每个指令描述模式(正如我们看到有3个类型的模式在使用——define_insn,define_split及define_peephole2。但是它们被分别处理,因此有3种树对应这3个类型的模式),将构建形如图13的树。为了从这些树,以高效、方便的方式,产生insn-recog.c,我们需要把这些树合并成一棵大的树。这正是merge_trees.的目的。对于所有的描述,merge_trees应该构建一棵如下的树。<br /><br /><br原创 2011-04-23 09:30:00 · 1514 阅读 · 2 评论 -
GCC后端及汇编发布(1)
<br />1. 概览<br />为了使GCC以高效、方便的形式移植到其它机器(架构上),GCC需要芯片的机器描述文件(MD文件)。为了描述芯片,一系列称为模式(pattern)的定义被引入。通常,我们需要从两方面来描述芯片。<br />首先是在RTL形式定义的指令集——包括,指令看起来像什么(define_insn模式);哪个指令序列比其它等效的指令序列效率更高(define_peephole及define_peephole2模式);如何把一个复杂指令分解成多个简单些的指令,然后其中一个可原创 2011-04-09 09:09:00 · 5482 阅读 · 0 评论 -
GCC后端及汇编发布(16)
<br />9. genattrtab工具9.1.概览<br />上面我们看到了工具genattr产生文件insn-attr.h。这个文件包含了函数的声明。现在是时候看一下这些函数的定义从何而来。在这里它们由genattratab输出。再次的,在本节我们仍然使用上一级的例子。<br />通常,对于目标平台,有两种机器描述文件。第一种定义了,可以识别输入的RTL指令,并为目标平台提供了输出汇编信息的模式。这个文件为所有使用同一个指令集的机器所共享。在genrecog工具及genoutput工具原创 2011-05-28 08:08:00 · 1274 阅读 · 0 评论 -
GCC后端及汇编发布(22)
<br />9.4.2.处理DEFINE_FUNCTION_UNIT模式<br />我们已经知道define_function_unit从功能单元的角度来描述芯片。不过,这个模式仍然主要是人类可读的形式。我们必须构建可以容易被工具处理,来为流水线危险识别器输出函数的数据。这个旧式的芯片描述比新式的要简单得多,这里构建的数据仍然是属性。<br /> <br />main (continued)<br /> <br />6128 if (num_units|| num_dfa_decls)<br原创 2011-05-29 10:59:00 · 1555 阅读 · 0 评论 -
GCC后端及汇编发布(21)
<br />9.4.构建旧式的流水线危险识别器<br />现在所需要的数据已经从机器描述文件中读入,并且相应的rtx对象也已经被构建。不过,对于生成流水线危险识别器来说,rtx对象还是太粗糙了。更结构化的数据将被从上面节中构建的rtx对象中产生出来。<br /> <br />main (continued)<br /> <br />6111 if (have_error)<br />6112 returnFATAL_EXIT_CODE;<br />6113<br />6114 insn原创 2011-05-28 08:57:00 · 825 阅读 · 0 评论 -
GCC后端及汇编发布(19)
<br />9.3.7.读入DEFINE_BYPASS模式<br />DEFINE_INSN_RESERVATION模式的概览一节描述了define_bypass模式的细节。对于这个模式,我们使用以下的例子:<br /> <br />188 (define_bypass 0 "pent_push,pent_pop""pent_push,pent_pop,pent_call") in pentium.md<br /> <br /><br />图44:DEFINE_BYPASS模式的例原创 2011-05-28 08:41:00 · 1202 阅读 · 0 评论 -
GCC后端及汇编发布(18)
<br />9.3.4.读入DEFINE_DELAY模式<br />DEFINE_DELAY的细节请参考DEFINE_DELAY模式的概览。对于这种模式,我们使用以下例子:<br /> <br />278 (define_delay (and (eq_attr"type" "branch") in mips.md<br />279 (eq (symb原创 2011-05-28 08:32:00 · 995 阅读 · 0 评论 -
GCC后端及汇编发布(17)
<br />9.3.2.读入DEFINE_INSN模式<br />至于define_insn模式,我们使用在前一节中的如下例子:<br /> <br />467 (define_insn "cmpdi_ccno_1_rex64" ini386.md<br />468 [(set (reg17)<br />469 (compare (match_oper原创 2011-05-28 08:18:00 · 1527 阅读 · 0 评论 -
GCC后端及汇编发布(20)
<br />9.3.11. 读入DEFINE_RESERVATION模式<br />DEFINE_INSN_RESERVATION模式的概览一节描述了DEFINE_RESERVATION模式的细节。对于这个模式,我们使用以下的例子:<br /> <br />129 (define_reservation"pentium-firstuvboth" "(pentium-load + pentium-firstuv in pentium.md<br />130原创 2011-05-28 08:52:00 · 1435 阅读 · 0 评论 -
GCC后端及汇编发布(15)
<br />8.2.程序入口<br />为了显示的目的,在本节中我们使用以下的例子。<br /> <br />278 (define_delay (and (eq_attr"type" "branch") in mips.md<br />279 (eq (symbol_ref "TARGET_MIPS16")(const_int 0)))<br原创 2011-05-21 08:35:00 · 929 阅读 · 0 评论 -
GCC后端及汇编发布(14)
<br />8. genattr工具8.1.概览<br />Genattr将从机器描述文件输出insn-attr.h。在机器描述文件中,除了define_insn,define_expand,define_split,define_peephole及define_peephole2这些通过rtx指令合并来显示优化机会的模式外,关于硬件架构的模式也会出现。它们是define_delay,define_function_unit,define_insn_reservation,define_cpu_unit原创 2011-05-21 08:26:00 · 1194 阅读 · 0 评论 -
GCC后端及汇编发布(22 续)
<br /><br />simplify_with_current_value_aux遍历整个表达式,通过消除不可到达部分来约简这个表达式。<br /> <br />4082static rtx<br />4083simplify_with_current_value_aux (rtx exp) ingenattrtab.c<br />4084{<br />4085 int i;<br />408原创 2011-05-29 11:16:00 · 980 阅读 · 0 评论 -
GCC后端及汇编发布(23)
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Style原创 2011-06-04 09:07:00 · 1627 阅读 · 0 评论 -
GCC后端及汇编发布(5)
<br />3.2.3.向决策序列加入模式的RTL模板<br />对于上面我们的define_insn例子,在2467行,被传给add_to_sequence的类型是RECOG。而参数pattern是这个define_insn模式的RTL模板。对于我们的例子是:<br />[(set (reg 17)<br /> (compare(match_operand:DI 0 "nonimmediate_operand" "r,?mr")<br /> (match_原创 2011-04-23 09:16:00 · 1272 阅读 · 0 评论