论文部分内容阅读
为了提高特定应用环境下的运行速度,DSP增加了许多特殊的指令和功能单元,体系结构越来越不规则。传统的代码生成算法是一种分治算法,没有考虑指令和寄存器之间的约束关系,难以应用在DSP编译器中。必须为DSP编译器发展出新的代码生成算法,以适应新的需求和挑战。本文主要研究了DSP编译器的若干关键技术,DSP编译器的目标机器平台是浙江大学自主研发的媒体DSP——SPOCK。编译器前端包括词法分析器、语法分析器和中间代码生成器等。针对DSP的体系结构特点,重新改造了LCC编译器中记号、符号表、数据类型支持等数据结构,并使LCC前端能够正确的处理计算溢出和数据类型转换等。DSP的体系结构复杂多变,拥有高级语言难以表述的诸多特性,代码生成技术是编译器最难、最复杂的技术之一,它从根本上决定了一个编译器的效率和性能。代码生成技术共分三个子问题:指令选择、寄存器分配以及指令调度,传统的分步优化算法生成的目标代码往往是次优代码。本文研究了包括时间约束、资源约束和DSP体系约束等特性,指出必须发展出同时考虑指令选择、寄存器分配和指令调度的新算法,才有可能为DSP生成优化的目标代码。根据最优化原理,提出调度DAG的概念,给出了同时考虑指令选择和寄存器分配的代码综合生成算法。该代码生成算法在指令生成过程中,充分考虑的指令和寄存器之间的约束,将代码优化生成的问题转化为在调度DAG中寻找一条优化路径的问题。在传统的图染色算法中,仅仅用物理寄存器个数——n表示寄存器堆的模型,这种简单的方式不足以描述DSP寄存器的约束关系。提出了一个能够描述这些约束关系的DSP寄存器模型,该模型将DSP的寄存器分成若干类,并定义了它们之间的相互约束量和优先级别。传统图染色算法只能有效地为通用处理器分配寄存器,改进了图染色算法,将算法的应用范围延伸到DSP领域。提出了有向冲突图的概念,有向边的权值代表寄存器类之间的约束值,寄存器分配的过程就是对有向图进行简化、归约的过程。给出判断有向冲突图节点染色性的精确判据,当冲突图中所有节点都不可染色,算法就选择一个优化的节点溢出到存储器中。中间语言反映源语言的结构,又和目标体系相关,具有目标语言的特性。中间语言对编译器的结构和功能影响很大,其形式是多方面考虑的折中。本文基于XML语言,扩展了IBURG的树文法。这种中间语言的好处就是简单明确,描述能力强,能方便地描述DSP体系结构的特征。为DSP编译器的重定位提供了一个良好的机制,简化了DSP编译器充定位的难度。LCC是一个重定位的通用处理器编译器系统。采用LCC的前端,应用综合代码生成算法和改进图染色寄存器分配算法,重写了编译器后端,构成了一个DSP编译器。试验证明,该DSP编译器能较好的利用DSP特性,提高了代码生成质量,降低了寄存器溢出的概率。