- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于我正在编写的函数,如果输入没有意义,我想返回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
为单精度
float
。
mulpd
/
mulps
也将是合适的。
mulsd
或
addsd
(或
divsd
)的结果还具有以下优点:如果调用方在循环中重复使用该寄存器,则不会有跨域旁路等待时间。 (在Sandybridge系列上,这种情况将永远持续下去。例如,即使xmm0来自
addsd xmm1, xmm0
,每个
pcmpeqd
从xmm1输入到xmm1输出都有一个额外的延迟周期,即使那是很久以前的,并且整数SIMD uop已经退休。)
cmpsd
或
cmppd
,您甚至可以无分支地执行此操作:您可以将0/-1掩码的
orps
转换为结果,使其变为NaN或不变。如果其他一些计算将(或已经)设置了FP-invalid标志,或者如果您对此不关心,则全部设置完毕。
movmskpd
/
test eax,eax
/
jnz
来查看是否设置了任何一位=> SIMD元素之一未通过某些检查。
关于assembly - 如何将NaN插入xmm寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59838261/
Intel x86 汇编中执行以下操作最有效的方法是什么(a、b 是 32 位 float ): 从 xmm1: [-, -, a, b] 到 xmm1: [a, a, b, b] 我找不到任何有用的
Intel x86 汇编中执行以下操作最有效的方法是什么(a、b 是 32 位 float ): 从 xmm1: [-, -, a, b] 到 xmm1: [a, a, b, b] 我找不到任何有用的
从 SIMD 寄存器加载和存储生成用途寄存器的最佳方式是什么?到目前为止,我一直使用堆栈作为临时的。例如, mov [rsp + 0x00], r8 mov [rsp + 0x08], r9 mov
我正在尝试实现一些内联汇编器(在 C/C++ 代码中)以利用 SSE。我想将值(从 XMM 寄存器或内存)复制并复制到另一个 XMM 寄存器。例如,假设我在内存中有一些值 {1, 2, 3, 4}。我
在多核 CPU 中,每个核是否都可以访问自己的 XMM 寄存器组?例如,如果一个芯片被列为具有 16 个 XMM 寄存器 (XMM0-XMM15),那么每个内核 16 个寄存器还是 16 个共享? 我
我发现很难在 Visual Studio 的寄存器窗口中解释 xmm 寄存器的值。窗口显示以下内容: XMM0 = 00000000000000004018000000000000 XMM1 = 00
pushf //couldnt store this in other registers movd xmm0,eax//storing in xmm registers
我正在使用 AES-NI在内核代码中。 AES 新指令使用 XMM 寄存器,我想确保从用户模式到内核模式的转换以及返回到用户模式的转换将保留 XMM 寄存器的状态。 MSDN link读到: In 6
有没有办法将压缩双字整数从 XMM 寄存器推送到堆栈?然后在需要时将其弹出? 理想情况下,我正在为通用寄存器寻找 PUSH 或 POP 之类的东西,我已经检查过英特尔手册,但我要么错过了命令,要么没有
是将值移动到 xmm 寄存器的唯一方法,首先将值移动到整数寄存器中,不知道它们叫什么,然后进入 xmm 寄存器,例如 mov [eax], (float)1000 ; store to mem
如何仅访问 128 位 xmm 寄存器的特定部分(字节)?我必须在整个空间上循环(按字节),逐字节比较并在明确定义的条件下复制它*。 因此,我必须将这个 16 字节寄存器的每个字节与 \0 进行比较,
我在xmm1寄存器加载了一些内容,假设它可以被视为 xmm1 = | bgra | bgra | bgra | bgra | (each one a dw) 现在,我想将每个双字逻辑右移 1 个字节,
我正在尝试使用 XMM 寄存器使用 SSE2 指令将 4 个数字添加到其他 4 个汇编语言中的数字。我确实成功了,但是我遇到了一些我不明白的事情。如果我以这种方式添加: movdqu xmm0, ow
我想知道,有没有办法增加 xmm 寄存器中的值,或者只能将一个值移到一个寄存器中? 我的意思是,你可以这样做: inc eax 或者像这样: inc [ebp+7F00F000] 有没有办法对 xmm
我需要能够采用 4 个压缩整数,并使用“或”运算将它们(一个在另一个之上)折叠成一个组合整数。 最有效的方法是什么?请注意,打包整数中的 1 永远不会有公共(public)位置,因此我认为无符号“ad
我正在尝试使用 XMM 寄存器使用 SSE2 指令将 4 个数字添加到其他 4 个汇编语言中的数字。我确实成功了,但是我遇到了一些我不明白的事情。如果我以这种方式添加: movdqu xmm0, ow
使用 nasm 在 x86 汇编中编程... 使用 MOVQ 指令,我将 m64 设置为 xmm MOVQ xmm1, qword [mymem64] 现在我想将它与零进行比较,以便我可以使用 Jcc
给定一个 128 位 xmm包含两个四字(即两个 64 位整数)的寄存器: ╭──────────────────┬──────────────────╮ xmm0 │ ffeeddccbb
我正在开发一个涉及 SSE 内在函数和 XMM 寄存器的项目,并且我想使用提供的所有 16 个寄存器。我试图明确告诉编译器执行此操作,但它似乎不起作用。例如,我可能会写这样一行: register _
我正在尝试使用 GCC 风格的内联汇编将 xmm 寄存器推送到 x86_64 C 代码中的堆栈上。我查看了this的答案问题并正在使用此代码 int main(void) { asm vola
我是一名优秀的程序员,十分优秀!