X86 英特尔为什么要从《优化参考手册》中删除16字节分支目标对齐编码规则?

X86 英特尔为什么要从《优化参考手册》中删除16字节分支目标对齐编码规则?,x86,x86-64,intel,micro-optimization,micro-architecture,X86,X86 64,Intel,Micro Optimization,Micro Architecture,以前版本的《英特尔64和IA-32体系结构优化参考手册》包含以下编码规则: 汇编/编译器编码规则12。(M冲击,H一般性) 所有分支目标应为16字节对齐 2020年5月版本没有此规则。为什么会被移除 按照Linux内核邮件列表中的讨论,对齐到16字节会带来成本。但这是一条长期存在的规则,ARM的微体系结构也有同样的规则 考虑将子程序入口点和分支目标与四字(16字节)边界对齐 AMD针对AMD系列17h处理器的软件优化指南指出: 使用16字节对齐的分支目标可以获得最大的选择器吞吐量,并避免缓存线末

以前版本的《英特尔64和IA-32体系结构优化参考手册》包含以下编码规则:

汇编/编译器编码规则12。(M冲击,H一般性)
所有分支目标应为16字节对齐

2020年5月版本没有此规则。为什么会被移除

按照Linux内核邮件列表中的讨论,对齐到16字节会带来成本。但这是一条长期存在的规则,ARM的微体系结构也有同样的规则

考虑将子程序入口点和分支目标与四字(16字节)边界对齐

AMD针对AMD系列17h处理器的软件优化指南指出:

使用16字节对齐的分支目标可以获得最大的选择器吞吐量,并避免缓存线末端短操作缓存(OC)条目


我猜uop缓存使得前端问题通常不是什么大问题,代码密度更重要。32字节的边界对于uop缓存来说很重要(最多有3个6-uop“行”),这会在函数内部造成太多的填充,特别是对于非循环分支目标。我认为,与分支预测一样(始终不执行、向后执行/向前不执行、BTB…)英特尔基本上已经不再讨论分支目标对齐问题了。程序员不应该试图猜测英特尔晶体管。不幸的是,预回迁LLVM没有接受提示,仍然生成分支提示,没有关闭开关。分支对齐不再必要是新的,所以LLVM还没有为此添加交换机是可以理解的。