VS2019 16.2: 新版本对游戏性能的优化( 五 )

以下是函数的反汇编代码 , 左边为16.0 , 右边为16.2 。 编译为x64模式 , 开启AVX2选项 。

从上图我们可以看到 , 16.0对所有的intrinsics逐一生成了代码 , 而16.2可以更加智能的识别intrinsics并将乘法和加法操作合并到FMA指令中去 。 在将来的16.3/16.4版本中 , 我们还将看到更多类似的优化点 。

即使是现在 , 对于一个给定的常量 , 代码生成也会呈现出上述的特征:

从上面的反汇编中 , 我们可以看到:在16.0中 , 编译器逐一地生成代码 , 而在16.2中 , 编译器可以在编译期就计算出值(这里使用了/fp:fast编译选项) 。

更多的FMA模式

对于FMA生成 , 编译器按照如下规则进行代码生成:

也做了如下的FMA简化:

推荐阅读