Arm 有
FCVTNS (scalar)
指令,即(强调):
一个简单的问题:x86 是否有相当于 Arm浮点转换为有符号整数,四舍五入到最接近的值,并与偶数(标量)。
FCVTNS (scalar)
?我已经快速浏览了
x86 指令列表,但找不到我要找的东西。有一个通常的 CVTTSS2SI
fenv.h
对 x86-64 的影响)。对于像
cvtps2dq xmm,xmm
这样的打包转换也是如此。截断版本的存在是因为 C 指定
(int)my_float
使用截断。对于旧版 x87(在 SSE3
fisttp
之前),编译器必须将 x87 舍入模式更改为截断并在每次转换时返回,这很糟糕。
vcvtss2si eax, xmm0, {rn-sae}
(NASM 语法)覆盖该指令的舍入模式。如果没有 AVX-512,如果您需要在同一循环中进行不同的舍入,您可以在 MXCSR 和 x87 控制字中设置不同的舍入模式。 (
movss
存储/
fld dword
重新加载/
fistp
使用当前x87舍入模式转换为整数可能比每次迭代两次
ldmxcsr
更有效,而无需大量展开。(来自使用
stmxcsr
生成的两个保存的值) .)(
ldmxcsr
在 Skylake / Alder Lake 上为 4 uops,但在 Zen 上仅为 1。不过,它的吞吐量比您对 uop 计数和执行端口的预期要低一些。请参阅https://uops.info /)