我希望以编译器在指令重新调度后生成的相同顺序查看反汇编代码。顺便说一句,我正在使用 GDB,当我给出一个命令时,disas /m FunctionName
它会按照源代码的顺序给我反汇编代码。我正在尝试查看我的编译器(GCC 4.1)重新调度指令的有效性,并希望了解如何重新调度指令。谢谢!///////////////编辑////////////////////////// /////////查看反汇编代码后的一行代码:
double w_n = (A_n[2] * x[0] + A_n[5] * y + A_n[8] * z + A_n[11]) ;
我可以看到它的 83 字节指令。但是在通过 2 次迭代展开后:
double w_n[2] = { (A_n[2] * x[0] + A_n[5] * y + A_n[8] * z + A_n[11]), (A_n_2[2] * x[0] + A_n_2[5] * y + A_n_2[8] * z + A_n_2[11]) };
代码块为 226 字节。并且指令数量大幅增加。谁能告诉我为什么会这样?我还可以从 VTune 中看到,展开后退出的指令增加了。我能想到的可能原因:编译器通过增加块大小获得了足够的机会来生成简单的指令,从而最大限度地提高指令预取和解码器单元的吞吐量。
任何帮助是极大的赞赏。谢谢!!