问题标签 [x87]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 是否有 x87 FILD 和 SSE CVTSI2SD 指令的无符号等效项?
我想在 GHC Haskell 编译器中实现相当于 C 的uint
-to -cast。double
我们已经实现了int
-to- double
using FILD
or CVTSI2SD
。这些操作是否有无符号版本,或者我应该uint
在转换之前将最高位归零(从而失去范围)?
visual-c++ - 检测 EXCEPTION_FLT_STACK_CHECK 的原因
我有一个复杂的 C 和 C++ 代码,其中包含大量的数学计算。我使用英特尔 C++ - 编译的最新更新。我使用优化,应用程序没有给出预期的答案。很长一段时间后,我设法将问题减少到 EXCEPTION_FLT_STACK_CHECK 0xc0000092。如果我在没有优化的情况下编译 - 程序按预期工作。
它是 Winxp64 上的单线程代码(应用程序是 32 位)。
MSVC 2010 提供与调试或发布版本相同的结果。(我的意思是好=预期结果)
有人可以帮我在哪里看吗?目前我怀疑一个编译器错误 - 因为我没有自己的汇编代码,只有编译器生成的代码。我查看了汇编器,它是 SSE/x87 混合代码。
我正在寻找寻找的方向。由于我在试用版(英特尔编译器),我没有太多时间进行调查。
我将尝试使用 /Qfp-stack-check tommorow 来查看是否可以发现我的代码有问题。
* 更新 * 我刚刚在 intel 编译器中发现了一个错误。函数在 st(0) 上返回一个值,但调用函数不会删除它。这样我得到堆栈异常。解决方法是使用返回的值,即使我并不总是需要它。我将尝试使用我可以共享的代码来重现它。
在此解决方法之后,英特尔在相同代码上的速度比 msvc2010 快 35%。- 这是主要结果。
莫迪
assembly - 在 x86 中向 xmm 寄存器添加一个常量值
我将如何添加1
或添加2
到寄存器xmm0
(双)?
我可以这样做,但肯定有一个更简单的方法:
也可以用浮点x87指令来做到这一点吗?
这对我不起作用:
assembly - 协处理器命令有问题(我想在图形模式下绘制 f(x)=x*sin(1/x) 曲线)
我是编程汇编的初学者。我想在图形模式下绘制 f(x)=x*sin(1/x) 曲线。我可以画出 f(x)=sin(x) 曲线,但我无法画出 f(x)=x*sin(1/x)。我怎么能这样做?
下面你可以看到我的工作 f(x)=sin(x) 代码。它正在工作并完美地绘制正弦曲线:
我想更改此代码以绘制 f(x)=x*sin(1/x) 曲线。
我已经尝试了几件事来更改上面代码中的以下部分:
然而到目前为止还没有任何结果。
请问你能帮帮我吗?
=========== 已编辑:====================
我试过你的代码。现在我的代码如下所示:
但是,此代码仅绘制一条线,而不是预期的 x*sin(1/x) 曲线。你能帮我弄清楚可能是什么问题吗?
x86 - x86:超越函数的延迟和吞吐量
英特尔® 64 和 IA-32 架构优化参考手册列出了各种 CPU 指令的延迟和吞吐量数据。
对于超越函数(FSIN
等),一些数字被列为范围(第 C-29 页)。脚注 4 解释:
先验指令的延迟和吞吐量在动态执行环境中可能会有很大差异。这些说明仅给出了一个近似值或一个值范围。
我的问题是:哪些因素会影响此类指令的吞吐量和延迟?我想这个论点的价值是一个因素。还有其他的吗?
assembly - 在汇编 x86-64 中划分 longfloat 和 int
我有一个程序,只要用户输入 Y(是),我就会循环。然后用户输入 long float 类型的数据。我还有一个计数器,r14,每次输入长浮点数时都会计数。循环结束后,我希望计算平均值。如果我这样做:
并显示它,我会得到一个分段错误。我也尝试了很多其他的东西,但它总是给我一个段。尝试分割显示后出现故障。我认为问题在于 r14 是一个 int,我不能像那样将它放入 FPU 堆栈并进行划分。但我想不出另一种方法。
有人可以帮忙吗?提前致谢。
.net - SSE 浮点算术是否可重现?
x87 FPU 以使用内部 80 位精度模式而著称,这通常会导致跨编译器和机器产生意外且不可重现的结果。在我在 .NET 上搜索可重现的浮点数学时,我发现 .NET 的两个主要实现(Microsoft 和 Mono)都发出 SSE 指令,而不是 64 位模式下的 x87。
SSE(2) 对 32 位浮点数使用严格的 32 位寄存器,对 64 位浮点数使用严格的 64 位寄存器。通过设置适当的控制字,可以选择将非正规数刷新为零。
因此,SSE 似乎不受 x87 精度相关问题的影响,唯一的变量是可以控制的非规范行为。
撇开先验函数(与 x87 不同,SSE 本身不提供)的问题,使用 SSE 是否能保证跨机器和编译器的可重现结果?例如,编译器优化能否转化为不同的结果?我发现了一些相互矛盾的意见:
如果您拥有 SSE2,请使用它并从此过上幸福的生活。SSE2 支持 32b 和 64b 操作,中间结果是操作数的大小。- Yossi Kreinin,http://www.yosefk.com/blog/consistency-how-to-defeat-the- purpose-of-ieee-floating-point.html
...
SSE2 指令 (...) 完全符合 IEEE754-1985,它们允许更好的再现性(由于静态舍入精度)和与其他平台的可移植性。Muller 等人, 浮点算术手册- p.107
然而:
此外,您不能将 SSE 或 SSE2 用于浮点,因为它的指定太低而无法确定。-约翰·瓦特 http://www.gamedev.net/topic/499435-floating-point-determinism/#entry4259411
assembly - FMUL 不会清除 STATUS 寄存器中的溢出
我有这个 Win32 代码:
似乎fmul
没有清除 FPU 状态寄存器位,即如果溢出已经设置(ax
& 8),那么它将在之后保持设置fmul
。这是正确的行为吗?是否需要在 FPU 操作之后或之前清除状态?
即我想fmul
会设置这个位,但它应该重置它吗?我在网上找不到答案。
assembly - ASM 浮点单元给出错误的数字
我正在使用浮点单元 ASM 制作一个更大的程序,但我得到了错误的数字。我做了一个简单的代码,它也给出了错误的数字。有人知道为什么吗?这里有什么问题?我正在使用 ubuntu 32b。
我正在使用gdb,在“打印a”之后它显示了巨大的数字而不是1,并且与其他2个变量(b,test1)相同。
这里有什么问题?
assembly - FCOM 浮点比较失败
我刚刚开始使用 32 位汇编,我很困惑。我有以下代码:
现在据我了解,我将 pi 推入堆栈然后将 1 推入堆栈,它应该比较 pi 和 1 并看到 1 较小并执行跳转。但是,这种比较似乎不起作用。有人可以帮忙吗?