gpt4 book ai didi

assembly - 如何将NaN插入xmm寄存器?

转载 作者:行者123 更新时间:2023-12-03 16:07:42 25 4
gpt4 key购买 nike

对于我正在编写的函数,如果输入没有意义,我想返回Nan。

如何以最简单的方式将NaN插入xmm寄存器

最佳答案

All-ones是一个安静的(非信令,又称正常)NaN,这就是您想要的。最简单的产生方法是使用SSE2 pcmpeqd xmm0,xmm0 将寄存器中的每一位都设置为1(即2的补码整数-1)。 (Set all bits in CPU register to 1 efficiently/What are the best instruction sequences to generate vector constants on the fly?)

它实际上是一个-NaN-符号位已设置。如果不希望使用整数右移(psrld xmm0,1)或除以零/零(xorps xmm0,xmm0/divpd xmm0,xmm0)。

想要返回NaN的数学函数通常还希望确保在MXCSR中将FP无效的粘性异常位设置为(或者,如果调用者取消屏蔽该异常,则实际上引发异常)。为此,您可以将NaN与自身相乘或相加。例如

    ...
.error_return_path:
pcmpeqd xmm0, xmm0
mulsd xmm0, xmm0 ; Cause an FP-invalid operation.
ret

mulss为单精度 floatmulpd/ mulps也将是合适的。

将NaN与NaN相乘或相加的位模式肯定仍然是NaN,并且仍然应该是相同的有效负载,因此仍然是全1。

使返回值是 mulsdaddsd(或 divsd)的结果还具有以下优点:如果调用方在循环中重复使用该寄存器,则不会有跨域旁路等待时间。 (在Sandybridge系列上,这种情况将永远持续下去。例如,即使xmm0来自 addsd xmm1, xmm0,每个 pcmpeqd从xmm1输入到xmm1输出都有一个额外的延迟周期,即使那是很久以前的,并且整数SIMD uop已经退休。)

如果使用 cmpsdcmppd,您甚至可以无分支地执行此操作:您可以将0/-1掩码的 orps转换为结果,使其变为NaN或不变。如果其他一些计算将(或已经)设置了FP-invalid标志,或者如果您对此不关心,则全部设置完毕。

提防使用额外的cmp延长关键路径/或;如果您认为它非常稀有,您可能宁愿比较并分支,例如在cmppd结果上使用 movmskpd/ test eax,eax/ jnz来查看是否设置了任何一位=> SIMD元素之一未通过某些检查。

关于assembly - 如何将NaN插入xmm寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59838261/

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