内联汇编器直接双倍到长长转换
inline assembler direct double to long long conversion
由于优化原因,我想直接调用(使用内联汇编程序)到函数"FLDL"和"拳头"。可悲的是,我不知道如何运行它,因为我不是汇编程序中的那个神。
我没有比这更进一步:
double* input;
long long output;
__asm fldl input;
__asm fist output;
__asm fld input
实际上会尝试读取指针值,就好像它是浮点值一样。如果要读取指针指向的浮点值,则必须经历两个步骤:将地址读入寄存器,然后使用寄存器中的地址读取数据。在 32 位平台上,它将是类似于
__asm {
mov eax, input
fld qword ptr [eax]
fistp output
}
我刚刚在VS2005中尝试过,它可以工作。(请注意,正如其他人在评论中所说,fist
不支持存储到 64 位long long
,而fistp
支持。但无论如何,你可能都需要fistp
,即一个弹出式商店。
最简单的可能是:
double input;
long long output;
__asm fld input
__asm fisttp output
这将执行"正常"的双倍到长整型转换,截断为零,就像 C 转换一样。 非常旧的(奔腾4之前)CPU不支持fistpp
,但是,因此在此类机器上,您需要改用fistp
,它使用当前的舍入模式(通常舍入到最接近)。 因此,如果您想例如向 -无穷大四舍五入,则需要保存当前的舍入模式,将其设置为您想要的,执行fistp
并恢复舍入模式:
double input;
long long output;
unsigned short oldcw, cw;
__asm fld input
__asm fstcw oldcw
cw = (oldcw & ~0xc00) | 0x400; // round towards -infinity
__asm fldcw cw
__asm fistp output
__asm fldcw oldcw
相关文章:
- 为什么我们不编写可以处理C++标识符的汇编器和链接器?
- 如何使用 gcc 内联汇编器代码访问成员变量
- std::带有指向成员函数和back_inserter的指针的转换包装器
- 如何使用C 给出的地址覆盖汇编器堆栈的返回地址
- 与 2015 相比,内联汇编器给出了 C2400
- 在 c++ 中实现内联汇编器以对变量进行异或操作的正确方法
- 简单 g++ 内联汇编器中的错误
- C 汇编器转换问题
- 使用SSE将float值从汇编器DLL返回到C
- 内联汇编器直接双倍到长长转换
- “__cpp”和 gcc 内联 ARM 汇编器
- 需要用C或C++编写MIPS汇编器,寻找一些设计建议
- 将 GCC/ATT 风格的汇编器转换为可视化工作室汇编器
- 如何使用内联汇编器保存寄存器值
- 调用传递给 gcc 内联汇编器 (avr-gcc) 的 const 函数地址
- 用汇编器消息编译错误
- 在Eclipse中,当使用汇编器时,汇编看起来是无限的
- 汇编器消息:错误:拇指条件指令应该在 IT 块中 - "strexeq r1,r2,[r4]"
- 使用内联汇编器时编译器的详细输出
- 普通c++代码比内联汇编器快10倍.为什么