有一次 x86 模拟器团队发现代码非常糟糕,他们在模拟过程中修复了它

2026-06-16 1 阅读 paulmooreparks
在一次战争故事交流中,我的一位同事讲述了当时 Windows 在本机运行其他处理器的系统上包含 x86-32 处理器模拟器的日子。 (这种情况已经发生过很多次了。不,我不知道这个特定的故事适用于哪个处理器。)这个特定的模拟器采用二进制翻译,生成本机代码来执行原始 x86-32 代码的等效操作。与通过解释器进行仿真相比,这提供了显着的性能改进。你可以想象x86-32只是一个字节码,模拟器是一个JIT编译器。不管怎样,我的同事发现有一个程序需要在堆栈上分配大约 64KB 的内存并对其进行初始化。执行此操作的标准方法是执行堆栈探测以确保 64KB 内存可用,然后从堆栈指针中减去 65536,然后在一个小而紧密的循环中初始化内存。但是对于使用任何编译器来编译此代码来说,使用循环来初始化内存都太普通了。编译器没有生成循环来初始化缓冲区的每个字节,而是通过将循环展开为 65,536 个单独的“将字节写入内存”指令(每个指令长 4 个字节)来“优化”代码。总而言之,该程序花费了 256 KB 的代码来初始化 64 KB 的数据。这极大地冒犯了团队,以至于他们向翻译器添加了特殊代码来检测这个可怕的函数,并将其替换为等效的紧密循环。