c++ - 内置汇编程序直接双到长转换

  显示原文与译文双语对照的内容
0 0

由于优化原因,我想直接将( 使用内联汇编程序) 调用到函数"fldl"和"fist"。 可惜的是,我不知道如何运行它,因为我不是在汇编器中。

我没有得到更多的信息:


double* input; 
long long output;

__asm fldl input; 
__asm fist output;

时间: 原作者:

0 0

__asm fld input 实际上会尝试读取你的指针值,就像它是一个浮点值一样。 如果要读取指向指针的浮点值 ,必须执行两步过程: 将地址读入 register,然后使用 register 中的地址读取数据。 在 32位 平台上,它是沿着


__asm {
 mov eax, input
 fld qword ptr [eax]
 fistp output
}

我刚在VS2005上试用过,它。 ( 注意,随着注释中它的他人的说明,fist 不支持存储到 64位 long long,而 fistp 则是。 但你可以能需要 fistp,换句话说,一个弹出店。

原作者:
0 0

最简单的可能是:


double input;
long long output;

__asm fld input
__asm fisttp output

这就是一个'正常'双向长转换,截向零,就像C 转换一样。 非常旧的( pre Pentium4 ) CPU 不支持 fistpp,但是在这种机器上,你需要使用 fistp,它使用当前的舍入模式( 通常到最近) 。 因这里,如果要向-infinity转动,则需要保存当前的舍入模式,将它的设置为所需的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

原作者:
...