x86 是否具有 Arm FCVTNS(标量)的等效项?

Does x86 have equivalent of Arm FCVTNS (scalar)?

提问人:pmor 提问时间:8/8/2023 最后编辑:pmor 更新时间:8/9/2023 访问量:58

问:

手臂有指令,这是(强调后加):FCVTNS (scalar)

浮点转换为有符号整数,四舍五入到最接近,并系到偶数(标量)。

一个简单的问题:x86 有相当于 Arm 的吗?FCVTNS (scalar)

我已经快速浏览了 x86 指令列表,但找不到我要找的东西。有一个通常的CVTTSS2SI,四舍五入为零(当转换不准确时),这不是我要找的。

x86 浮点 类型转换 舍入

评论

2赞 alias 8/8/2023
felixcloutier.com/x86/cvtss2si
2赞 Nate Eldredge 8/9/2023
值得注意的是,AVX-512 之前的 x86 缺少将浮点转换为无符号整数的等效项。AVX-512 添加了VCVTSD2USI和朋友。FCVT*U

答:

4赞 Peter Cordes 8/9/2023 #1

非截断 cvtss2si 使用当前舍入模式,该模式通常是最接近的偶数,但可以更改(在 MXCSR 中,这会影响 x86-64)。对于打包的转换,如 .fenv.hcvtps2dq xmm,xmm

之所以存在截断版本,是因为 C 指定使用截断。使用旧版 x87(SSE3 之前),编译器必须将 x87 舍入模式更改为截断,并在每次转换时返回,这很糟糕。(int)my_floatfisttp


如果需要在 MXCSR 中以不同舍入模式运行的代码中舍入到最接近偶数,则可以使用 AVX-512(NASM 语法)覆盖该指令的舍入模式。vcvtss2si eax, xmm0, {rn-sae}

如果没有 AVX-512,如果您需要在同一循环中设置不同的舍入,则可以在 MXCSR 和 x87 控制字中设置不同的舍入模式。( 使用当前的 x87 舍入模式存储/重新加载/转换为整数可能比每次迭代两次更有效,而无需大量展开。(来自两个保存的值,使用 。movssfld dwordfistpldmxcsrstmxcsr

(ldmxcsrSkylake / Alder Lake 上有 4 个 uops,但在 Zen 上只有 1 个。不过,它的吞吐量比您对 uop 计数和执行端口的预期要低一些。查看 https://uops.info/)