关于GCC RTL中Standard Pattern Name
本帖最后由 adam_w 于 2013-11-17 19:49 编辑经过阅读一些参考资料和一些实验,对于GCC中从GIMPLE到RTL的转换,我有如下的初步结论:
在从GIMPLE到RTL的转换过程中,GCC会将特定语义的GIMPLE语句转换成其对应的某个特定Standard Pattern Name(SPN)所描述的指令模板(在机器描述中定义),也就是说GIMPLE语句与SPN的对应是机器无关的。
请教各位:
1.不知道这个结论是否正确?
2. 请问GCC中的SPN在什么地方定义?
多谢了!
lazy_linux@126.com 请各位不吝赐教! 本帖最后由 EricFisher 于 2013-11-18 18:04 编辑
> 1.不知道这个结论是否正确?
应该是这样的,标准名字可以用来将tree转换为rtl,所以在expand过程中,不管target如何实现标准名字的rtl pattern,只是直接调用这些gen_SPN处理函数。不过,如果有些标准名字的pattern没有实现,gcc会尝试用别的pattern来生成rtl。
> 2. 请问GCC中的SPN在什么地方定义?
具体的gen_SPN函数,是在build gcc是,自动生成的,源文件位于build目录下,比如:insn-emit.c 中的 gen_addsi3函数。 回复 3# EricFisher
首先感谢版主!
>> 1.不知道这个结论是否正确?
>
> 应该是这样的,标准名字可以用来将tree转换为rtl,所以在expand过程中,不管target如何实现标准名字的rtl pattern,只是直接调用这些gen_SPN处理函数。不过,
>如果有些标准名字的pattern没有实现,gcc会尝试用别的pattern来生成rtl。
请问:
1. 这写标准的模式名称都包括哪些?我想具体指导每个SPN的名字,从而深入了解其转换过程。
2. 您说的“如果机器描述文件中缺少了某些SPN,gcc会尝试别的pattern来生成rtl”,这句话的如何理解?
我看到有些文档上说:“在MD文件中,只有命名的define_insn或者define_expand的指令模板才会被处理,并且编译器只能处理系统中硬编码(Hard-coded)的insn名称,即具有标准模板名称的指令模板,并且忽略所有的无命名、或者编译器本身所不能识别其名称的指令模板。同时,如果机器描述中没有提供编译器所需要的特定名称的指令模板时,系统将会出错并终止。”
这种说法和您的说法是矛盾的,不知道应该从什么地方入手去真正地验证这个问题?
>> 2. 请问GCC中的SPN在什么地方定义?
>
>具体的gen_SPN函数,是在build gcc是,自动生成的,源文件位于build目录下,比如:insn-emit.c 中的 gen_addsi3函数。
这句话是否可以这样理解,系统里面定义了gen_{name}函数,那么这个{name}就是一个SPN呢?
以上问题请版主赐教!再次感谢!
> 1. 这写标准的模式名称都包括哪些?我想具体指导每个SPN的名字,从而深入了解其转换过程。
http://gcc.gnu.org/onlinedocs/gccint/Standard-Names.html#Standard-Names
> 2. 您说的“如果机器描述文件中缺少了某些SPN,gcc会尝试别的pattern来生成rtl”,这句话的如何理解?
你可以看到上面那个文档中有许多的标准名字,但是,你并不是都要实现了。也就是说,有些标准名字,如果实现了,那么就会生成它的RTL,如果没有实现,那么会根据你实现的那些标准名字,来生成别的等效的RTL。
> 这种说法和您的说法是矛盾的,不知道应该从什么地方入手去真正地验证这个问题?
但是,有些标准名字模式是必须要实现的,最常见的就是movm。文档里并没有说明那些是必须的,这个只能是在实现的时候,看gcc是否会报错。
> 这句话是否可以这样理解,系统里面定义了gen_{name}函数,那么这个{name}就是一个SPN呢?
是的。 多谢EricFisher版主,我再好好消化消化。
等搞明白了,一定向您汇报!
页:
[1]