我正在制作一个简单的工具来分析不同网络编译器的“智能性”,以将某些函数/程序识别为内置指令。对我来说,绊脚石是如何将编译器生成的汇编文件与作为预期代码模板的另一个汇编文件进行比较?诸如简单地逐行比较两个文件之类的幼稚方法是行不通的,因为诸如寄存器名称或额外空格之类的微小更改会产生未通过的测试。
我正在用 Python 编写该工具。
diff,编辑距离
要分解寄存器分配选择,也许可以生成指令之间的数据依赖关系图,就像 https://uica.uops.info/ 那样,如果您选中“依赖关系”复选框,然后单击“打开依赖关系”运行后生成结果的链接。
比较图表的相似性可能很好,因为指令之间的数据依赖关系是乱序执行器真正关心的。例如,
inc eax
/ inc edx
与 inc edx
/ inc eax
没有显着差异,除非在有序 CPU 上(例如,如果前一条指令写入 EDX,则它无法与 P5 上的 inc edx
配对) ,或与 ARM Cortex A53 或 A510 上的 R0 等效。)。不同的编译器版本/选项/调整设置通常会产生几乎相同的指令,具有相同的数据依赖性,但具有不同的静态调度。
(uiCA 仅适用于非分支循环体,因此当您具有控制依赖性和数据依赖性时,一般情况可能会变得更加棘手。)