x86 是否具有与 Arm FCVTNS(标量)等效的功能?

问题描述 投票:0回答:1

Arm 有

FCVTNS (scalar)
指令,即(强调):

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

一个简单的问题:x86 是否有相当于 Arm

FCVTNS (scalar)

我已经快速浏览了

x86 指令列表,但找不到我要找的东西。有一个通常的 CVTTSS2SI

,它向零舍入(当转换不精确时),这不是我想要的。
    

x86 floating-point type-conversion rounding
1个回答
0
投票
非截断

cvtss2si

 使用当前舍入模式,该模式通常是最近偶数,但可以更改(在 MXCSR 中,这就是 fenv.h
 对 x86-64 的影响)。对于像 
cvtps2dq xmm,xmm
 这样的打包转换也是如此。

截断版本的存在是因为 C 指定

(int)my_float

 使用截断。对于旧版 x87(在 SSE3 
fisttp
 之前),编译器必须将 x87 舍入模式更改为截断并在每次转换时返回,这很糟糕。


如果您需要在 MXCSR 中以不同舍入模式运行的代码中进行舍入到最近偶数,则可以使用 AVX-512

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 /

© www.soinside.com 2019 - 2024. All rights reserved.