问题标签 [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.
visual-c++ - Visual C++ x86 ABI:VC++ 如何返回值?
我知道在 中返回 1/2/4 字节整数,在 中返回eax
8 字节整数eax:edx
。
顺便说一句,在 cdecl/stdcall 中如何返回 4/8/16字节浮点值(也许我记得long double
可能是 16 字节..) ?
感谢@MatteoItalia,我知道 VC++long double
是 8 字节的;那么,如何使用 16 字节的浮点数呢?
(不要说我“只使用 8 个字节!”。我真的需要它。)
嗯,我想我应该对 10 字节浮点数感到满意......
math - x86上三角指令的错误是什么?
我在哪里可以找到有关 x86 处理器上三角函数指令的错误范围的信息,例如fsincos
?
macos - 在 Mac OSX 上 flds 指令失败
该flds
指令应将值存储在寄存器中st0
。我正在调试一个我没有代码的共享库。有时该flds
指令对st0
. 下面是gdb
它工作时的情况和失败时的情况的输出。在损坏的情况下,fstat
寄存器是 0x2261 而不是 0x2061。0x200 标志表示什么?
工作版本:
破解版:
assembly - 访问 x87 堆栈上的数组索引
我在汇编语法方面遇到了一些困难。在我的作业中,我们需要将一系列参数传递给 x87 浮点寄存器。其中一个参数是双精度数,我们应该将此双精度数用作数组。
我已经使用fldl 4(%esp)将它加载到堆栈中,但现在我的任务是访问它的数组元素。我知道并理解在 x86 中操作整数数组的语法,但我不明白如何在 x87 堆栈上访问数组的索引。
因为它是我的浮点堆栈上唯一的东西,所以我知道它可以在%st(0)找到
linux - 从 x86 函数(x87 的 flds/fstps)返回时,信号 NaN 已损坏
我对 x86(32 位)linux gcc 有奇怪的行为。我使用 gcc 的内置生成信号 NaN __builtin_nansf("")
,生成 0x7fa00000。从函数返回这个值作为浮点数后,它被修改为 0x7fe00000。有一个简短的例子:
用 编译的程序gcc-4.6.2 program.c
,其输出:
数据库:
为什么我的信号 NaN 被修改了?如何防止这种修改?
c - Change the FPU hardware context in a signal handler
Context
I'm trying to change the FPU rounding mode behaviour in a running process, using a signal handler. Although I would prefer a portable solution, the platform I'm targetting in priority is Linux/x86.
Using fesetround()
seemed like a good solution, except it doesn't have any effect after the signal handler returns. As far as I understand, at each context change, the Linux kernel saves the hardware context of the currently running process, and restores the context of the process scheduled to run.
Although this context handling normally happens in kernel space, I understand from various resources that in the case of signals handling, this context is stored in user space and can be accessed. I tried to use this to modify the FPU registers and set the desired rounding mode.
Attempted solution & problems
Below is the code I use to do this. init()
is called at the beginning of the program to setup the signal handler, and a USR1
signal is sent to trigger the rounding mode switch.
All this kind of works insofar as calling fegetround()
after the signal handler execution correctly returns FE_TOWARDZERO
. However, computation results don't seem to be affected.
Calling fesetround( fegetround() )
after the signal handler execution however seems to alter the FPU configuration and causes computation results to actually change. All this seems to hint at another layer indirection, as though I correctly altered the hardware context, but it isn't coherent with the actual FPU state.
Question
Can anybody explain why this isn't working and possibly what could be attempted to correct the problem?
assembly - x87 精度如何影响平方根?
我写了一些代码来测试 fsqrt 函数,结果对我来说并不完全有意义。这是代码(在delphi中):
很简单,我正在寻找一个 int 的平方根。在 int_sqrt 中,一条精度线让 x87 使用 24 位精度作为 sqrt 精度,另一个使用 64 位精度。正如预期的那样,24 位版本的速度要快很多(10-20% 取决于输入)。
这就是问题所在。我还没有找到使用 24 位精度时返回错误结果的单个 32 位(实际上是 31 位,最后一位是未使用的符号)int!
到目前为止,我唯一的理论是只有最终结果取决于精度,而不是源或任何中间缓冲区。这是有道理的,因为 31 位整数的平方根的最大结果大小是 16 位。
这是怎么回事?
visual-c++ - 使用不同的 cl.exe 编译器选项时的不同结果
我在 Windows 7 64bit 上,使用 VS2013 Express for Desktop。
编译为默认值(使用 SSE)
仅使用 x87 编译。
测试代码如下
请注意,如果我删除它,我会手动初始化 FPU。结果会改变!
删除后finit
,默认编译
仅使用 x87 编译
所以我的问题是:
对于
@@1
,为什么会有不同?它是一个错误吗?对于
@@3
,为什么值改变了?
c++ - 为什么 Webkit 运行时 pow() 计算错误?
我有一个 Qt C++ 应用程序,其中有一个 GUI 线程,其中会发生一些浮点计算。QWebView
它还会在带有一些视频的 Flash 播放器的位置 打开。
很明显,关闭 QWebView 会干扰新的下一个浮点操作。所以pow(double, double)
返回确定但不正确的值。
在一种情况下,它返回的值1000
是正确值的两倍。另一次它返回 1.#inf
当与 arguments 一起使用时pow(10.0, 2.0)
。
我不得不提到它是在不同的计算机上测试的,并不特定于特定的 CPU。
您对如何在 Webkit 中找到协处理器出错的地方以及如何防止它有什么建议吗?
示例(仅限 x64)
环境:Qt 4.7.4、C++、HTML 和 flowplayer
cpp
html
这是一个完整的程序源代码: 下载 15MB
c++ - GNU C++ 编译器中的内联汇编
以下内联汇编代码在我的系统上不起作用。该代码有什么问题?
如果我使用asm
而不是__asm__
那么它可以正常工作。