即时生成矢量常量的最佳指令序列是什么?
“最佳”是指最少的指令(或最少的微指令,如果有任何指令解码到一个以上的微指令)。机器码大小(以字节为单位)是相等的insn计数的平局。
从本质上讲,恒定生成是新的依赖链的开始,因此延迟很重要。在循环内生成常量也很不常见,因此吞吐量和执行端口需求也几乎无关紧要。
生成常量而不是加载常量需要更多指令(全零或全一除外),因此确实会占用宝贵的uop缓存空间。与数据缓存相比,这可能是更为有限的资源。
Agner Fog出色的《优化装配》指南在中对此进行了介绍Section 13.4
。表13.10具有用于产生向量序列,每一个元素是0
,1
,2
,3
,4
,-1
,或-2
,与从8位到64位单元大小。表13.11具有用于产生一些浮点值序列(0.0
,0.5
,1.0
,1.5
,2.0
,-2.0
,和位掩码为符号位。)
Agner Fog的序列仅出于设计目的或因为已有一段时间没有更新而仅使用SSE2。
简短的非显而易见的指令序列还可以生成其他哪些常量? (具有不同移位计数的进一步扩展是显而易见的,并且没有“兴趣”。)是否有更好的序列来生成Agner Fog列出的常数?
如何将128位立即数移动到XMM寄存器说明了一些将任意128b常量放入指令流中的方法,但这通常不明智(它不节省任何空间,并占用大量的uop缓存空间。)