gpt4 book ai didi

assembly - 在 x86-SSE 中将四个压缩单精度 float 转换为无符号双字

转载 作者:行者123 更新时间:2023-12-05 06:58:27 25 4
gpt4 key购买 nike

有没有办法在带有 SSE 扩展的 x86 中将四个压缩单精度浮点值转换为四个双字?最接近的指令是 CVTPS2PI,但它不能在两个 xmm 寄存器上执行,而应给出为 CVTPS2PI MM, XMM/M64 .如果我想要类似 <conversion_mnemonic> XMM, XMM/M128 的东西怎么办? ?

谢谢。伊曼。

最佳答案

x86 在 AVX512 之前没有对 FP<->unsigned 的原生支持,使用 vcvtps2udq ( https://www.felixcloutier.com/x86/vcvtps2udq )。对于标量,您通常只需转换为 64 位有符号 (cvtss2si rax, xmm0) 并取其低 32 位(在 EAX 中),但这不是 SIMD 的选项。

如果没有 AVX-512,理想情况下您可以使用带符号的转换 (cvtps2dq) 并获得相同的结果。即如果您的 float 是非负数且 <= INT_MAX (2147483647.0)。

参见 How to efficiently perform double/int64 conversions with SSE/AVX?用于相关的 double->uint64_t 转换。如果需要,全范围的应该可以从 double->uint64_t 适应到 float->uint32_t。

另一种可能性(对于 32 位 float ->uint32_t)只是将范围移动到带符号的 FP,然后返回整数。 INT32_MIN ^ 转换(x + INT32_MIN)。但这引入了小整数的 FP 舍入,因为 INT32_MIN 超出了 -224 .. 224 范围,其中 float 可以表示每个整数。例如5 将在转换期间四舍五入为最接近的 28 的倍数。所以那是不可用的;您需要尝试直接转换和范围偏移转换,并且只有在直接转换给您 0x80000000 时才使用范围偏移转换。 (也许使用直接转换结果作为 SSE4 blendvps 的混合控件?)


对于 float->int32_t 的打包转换,有 SSE2 cvtps2dq xmm, xmm/m128 docs . (cvttps2dq 向 0 截断,而不是当前默认的舍入模式(最接近,如果您没有更改的话)。)

任何小于-0.5 的负 float 都将转换为-1 或更低的整数;作为 uint32_t 位模式代表一个巨大的数字。 -231..231-1 范围外的 float 将转换为 0x80000000,Intel 的“不定整数”值。


如果你没有找到那个,只有 cvtps2pi 签名转换成 MMX 寄存器,你需要更好的地方来搜索:

关于assembly - 在 x86-SSE 中将四个压缩单精度 float 转换为无符号双字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64592329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com