GNU超优化器

GNU超级优化器(superpt)查找最短的指令给定函数的序列。它写于1991年至1995年。

下载

superpt包可从主GNU服务器获得(通过HTTPS通过HTTP通过FTP)和来自它的后视镜; 拜托使用镜子如果可能的话。

文档

以下是superopt附带的自述文件的精确副本:

GNU超级优化器超优化器是一个函数序列生成器,它使用了寻找最短指令序列的生成和测试方法给定的函数。你必须告诉超级优化程序哪个函数和要为哪个CPU生成代码,以及可以生成多少指令接受。超级优化程序不能生成很长的序列,除非您有一个非常快的电脑或非常多的空闲时间。使用的时间复杂性算法近似2个O(百万)其中m是体系结构上可用指令的数量,n是目标函数的最短序列。实际序列长度限制取决于目标体系结构和目标功能arity;最多在这种情况下,它大约是5,但对于HPPA这样的丰富指令集来说,它只是4.生成的最长序列是MC68020和7长指令。生成它花了几个星期。。。超级优化器不能保证它能找到最好的所有可能的目标函数的指令序列。例如,它甚至不尝试包含立即数(除-1、0、+1和序列中最小的负数和最大的正数)。其他可能无法找到最佳序列的原因是指令包括在内,甚至不以寄存器形式包含的指令可能无法正确模拟。如果你遇到如有任何问题,请向以下地址报告。警告!生成的序列可能不正确概率。在使用之前一定要确保序列是正确的。所以到目前为止,我从未遇到过任何错误的序列。如果你找到一个,请让我知道这件事!话虽如此,请注意,超级优化程序实际上总是会发现仅依赖寄存器的函数的最佳正确序列。使用说明超级优化程序支持以下CPU:SPARC v7、Motorola 68000、68020和88000、IBM POWER和PowerPC、AMD 29000、Intel x86和960 1.0和1.1、,金字塔、DEC Alpha、HP PA-RISC和Hitachi SH。不支持SGI Mips,因为它没有使用不明显的指令。一些新的指令,如Intel P6和Sparc v9有条件移动支持。您需要一个ANSI C编译器(例如GCC)来编译超级优化器。类型使CPU=-D<cpuname>超级选择其中,<cpuname>是SPARC、MC68000、MC68020、M88000、POWER、POWERPC、,AM29K、I386、I960(用于I960 1.0)、I960B(用于I960B 1.1)、PYR、ALPHA、HPPA、,或SH。编译可能需要很长时间,并占用大量内存,尤其是HPPA。您还可以通过键入以下内容来构建所有超级优化器:制造所有这将创建superpt-sparc、superpt-power等。还有安装目标,使用“make install”安装单个超级优化程序和“makeinstall-all”来安装它们。要运行超级优化器,请键入superpt-f<目标函数>|-all[-assembly][-max-cost n][-shifts][-sextract][-no-carry-insn][-extract-cost n]并等待打印找到的指令序列。例如,超文本-flts0-as将打印计算语句的所有序列{r=(签名字)v0<0;}。有关可能的目标函数的一些示例,请参见下文。默认情况下,超级优化程序不会尝试所有立即移位计数。收件人启用所有班次计数,将-shifts作为命令行选项传递。启用所有位字段提取,使用-提取。选项必须定义“-f”选项来告诉超级优化程序它应该尝试查找指令序列的函数。请参见下文获取可能的函数名。选项名称可以缩写。-装配适用于向汇编程序而不是伪汇编程序提供的输出汇编程序-适合人类的代码。-最大成本n将指令序列的“成本”限制为n。可用于如果没有该长度的指令序列或发现较短的。默认值为4。-额外成本n搜索比找到的最便宜的更昂贵的序列n顺序。默认值为0,表示只有最便宜的序列打印。-无阵列insns不要使用使用进位标志的指令。这可能是希望在RISC上简化指令调度。-班次包括目标体系结构支持的所有班次计数搜索。这大大降低了搜索速度。-提取物包括目标体系结构支持的所有位字段提取在搜索中。这大大降低了搜索速度。-f<目标函数名称>其中,<goal-function-name>是eq、ne、les、ges、lts、gts之一,leu、geu、ltu、gtu、eq0、ne0、les0、ges0、lts0、gts0、neq、nne,nles、nges、nlts、ngts、nleu、ngeu、nltu、ngtu、neq0、nne0、nles0、,nges0、nlts0、ngts0、maxs、mins、maxu、minu、sgn、abs、nabs、gray、,或灰色2等。eq、ne、les等计算C表达式“a==b”、“a!=b”和“a<=b”等,其中以“s”结尾的操作代码表示符号比较`u`表示无符号比较。等式0,。。。计算“a==0”。。。名称前的“n”表示相应的函数值取反,例如nlt是C表达式“-(a<b)”。maxs、mins、maxu、minu是二进制的(即两个参数)符号分别为无符号max和min。sgn是一元符号函数-1表示负数,0表示零,+1积极的论点。abs和nabs是绝对值和负绝对值,分别是。有关目标函数及其定义的完整列表,请参阅文件goal.def。您可以轻松地将自己的目标函数添加到那个文件。添加新函数后,必须重新编译超优化器。读取超级优化器输出默认情况下,超级优化程序以高级语言(如语法。例如,这是M88000/abs的输出:1:r1:=算术移位右(r0,0x1f)r2:=添加_co(r1,r0)r3:=异或(r2,r1)2:r1:=算术移位右(r0,0x1f)r2:=相加(r1,r0)r3:=异或(r2,r1)3:r1:=算术移位右(r0,0x1f)r2:=异或(r1,r0)r3:=adc_co(r2,r1)r1:=arith_shift_right(r0,0x1f)表示“将r0右移31步算术并将结果放入r1“。add_co是“加法并设置进位”。adc_co是大多数RISC上的减法指令,即“用加法补码和进位进位方式的差异是在加法后设置的-无补全和减法。后缀“_ci”和“_cio”分别表示是输入的但不受影响,并且进位既是输入的又是生成的。有趣的值始终是最后一条指令计算的值。*********************************请将评论、改进和新端口发送至tege@gnu.ai.mit.edu。GNU超级优化程序由Torbjorn Granlund编写(目前天鹅座支持)。Tom Wood(当时在Data General工作,现在在摩托罗拉工作)做出了重大改进,如清晰地描述目标函数和内部指令。最初的超优化器想法是由亨利提出的马萨林。GNU超优化器及其在GCC调优中的应用如所述ACM SIGPLAN编程语言会议记录设计与实施(PLDI),1992年。

维护人员

GNU超优化器的当前维护者是Thien-Thi Nguyen。

许可

GNU超优化器是自由软件;您可以在的条款GNU通用公共许可证版本2由发布自由软件基金会。