提问人:pmor 提问时间:8/8/2023 最后编辑:pmor 更新时间:8/9/2023 访问量:58
x86 是否具有 Arm FCVTNS(标量)的等效项?
Does x86 have equivalent of Arm FCVTNS (scalar)?
问:
手臂有指令,这是(强调后加):FCVTNS (scalar)
浮点转换为有符号整数,四舍五入到最接近,并系到偶数(标量)。
一个简单的问题:x86 有相当于 Arm 的吗?FCVTNS (scalar)
我已经快速浏览了 x86 指令列表,但找不到我要找的东西。有一个通常的CVTTSS2SI
,四舍五入为零(当转换不准确时),这不是我要找的。
答:
非截断 cvtss2si
使用当前舍入模式,该模式通常是最接近的偶数,但可以更改(在 MXCSR 中,这会影响 x86-64)。对于打包的转换,如 .fenv.h
cvtps2dq xmm,xmm
之所以存在截断版本,是因为 C 指定使用截断。使用旧版 x87(SSE3 之前),编译器必须将 x87 舍入模式更改为截断,并在每次转换时返回,这很糟糕。(int)my_float
fisttp
如果需要在 MXCSR 中以不同舍入模式运行的代码中舍入到最接近偶数,则可以使用 AVX-512(NASM 语法)覆盖该指令的舍入模式。vcvtss2si eax, xmm0, {rn-sae}
如果没有 AVX-512,如果您需要在同一循环中设置不同的舍入,则可以在 MXCSR 和 x87 控制字中设置不同的舍入模式。( 使用当前的 x87 舍入模式存储/重新加载/转换为整数可能比每次迭代两次更有效,而无需大量展开。(来自两个保存的值,使用 。movss
fld dword
fistp
ldmxcsr
stmxcsr
(ldmxcsr
Skylake / Alder Lake 上有 4 个 uops,但在 Zen 上只有 1 个。不过,它的吞吐量比您对 uop 计数和执行端口的预期要低一些。查看 https://uops.info/)
评论
VCVTSD2USI
和朋友。FCVT*U