Tag: x87

fstcw程序集操作数类型不匹配

我试图在C中的内联汇编中使用指定的舍入模式对输入double进行舍入。为此,我需要使用“fstcw”获取FPU控制字,然后更改字中的位。 不幸的是我在第一行遇到错误: double roundD(double n, RoundingMode roundingMode) { asm(“fstcw %%ax \n” ::: “ax”); //clobbers return n; } 我收到的汇编程序错误是: “错误:’fstcw’的操作数类型不匹配。” 我的印象是这个代码片段应该在AX寄存器中存储FPU控制字,长度为16位,长度也是16位。 为了确保,我还使用EAX寄存器而不是AX测试了上述代码,并收到了同样的错误。 我可能会在这里失踪什么? 如果需要任何进一步的信息,请告诉我。

SSE FPU并行

我想知道是否可以将SSE与x87并行使用。 所以考虑以下伪代码, 1:sse_insn 2:x87_insn 管道是否会并行执行1和2,假设它们可以并行执行?

在汇编中添加浮点/双精度数

我正在尝试内联汇编,我试图在内联汇编中添加十进制数字(不,不是整数)。 问题是,当我调用以下函数时: inline double ADD(double num1, double num2) { double res; _asm{ push eax; push the former state of eax onto stack mov eax, num1; add eax, num2; mov res, eax; pop eax; restore the former state of eax now that we are done } return res;} 编译器抱怨内联汇编中的操作数大小不合适(除了push和pop指令行之外的所有汇编行)。 所以我必须更改为整数类型,例如unsigned long,然后它可以工作,但当然只支持整数类型; 十进制结果四舍五入。 有没有办法添加允许像8.4这样的十进制结果的程序集?

如何使用扩展的gcc程序集指定x87 FPU堆栈的破坏底部?

在我们的代码库中,我发现了这个代码片段,用于在x87上快速,朝向负无穷大1舍入: inline int my_int(double x) { int r; #ifdef _GCC_ asm (“fldl %1\n” “fistpl %0\n” :”=m”(r) :”m”(x)); #else // … #endif return r; } 我不是非常熟悉GCC扩展汇编语法,但是从我从文档中收集到的内容: r必须是一个记忆位置,我写回来的东西; x必须也是一个内存位置,数据来自哪里。 没有clobber规范,所以编译器可以放心,在代码片段的末尾,寄存器就像他离开时一样。 现在,提出我的问题:最终FPU堆栈是平衡的,但如果所有8个位置都已经在使用并且我已经溢出呢? 编译器如何知道它不能信任ST(7)离开它的位置? 应该添加一些clobber吗? 编辑我试图在clobber列表中指定st(7) ,它似乎影响codegen,现在我将等待对此事实的一些确认。 作为旁注:在glibc和MinGW中查看准系统lrint的实现我看到类似的东西 __asm__ __volatile__ (“fistpl %0” : “=m” (retval) : “t” (x) : “st”); 我们要求输入直接放在ST(0) (这避免了可能无用的fldl ); 什么是”st” clobber? 文档似乎只提到t (即堆栈的顶部)。 是的,它取决于当前的舍入模式,在我们的应用程序中应该总是“朝向负无穷大”。