用FPU的单元保存返回值的一个小例子
在一些计算的函数里,作为常规,编译器形成的代码可以用eax 等cpu寄存器作为返回值对于INTEL CPU 的操作系统,在进行进程切换的时,对FPU的状态也进行了保存和恢复(挂起时用FSAVE指令保存,再运行时用FRSTOR恢复)
因此,一些编译器也用FPU的单元保存返回值:
求double和c function
double sum_double(int double_count,double* double_list)
{
int i;
double local_sum = 0.0;
for(i=0;i<count;i++)
local_sum+=double_list;
return(local_sum);
}
...
double_rtn=sum_double(...);
...
编译器可替换成的代码:
;finit 在适当的地方运行
push esi
fldz ;FPU st 置零
mov ecx, ;double_count
mov esi, ;double_list
sum_loop:
jecxz exit ;if(ecx==0) 则退出
fadd QWORD PTR;求和,结果放在FPU st
dec ecx ;double_count--
add esi,8 ;i++
jmp sum_loop ;continue
exit
pop esi
ret ;用FPU st存结果,传递返回值
...
fstp double_rtn ;返回值double_rtn=st
...
[ 本帖最后由 system888net 于 2008-5-18 16:19 编辑 ] 用FPU的单元做返回值,通用性和移植性差一些! 可移植性?编译器用这种方法挺好:mrgreen: 又不用程序员思考这个可移植性的问题 原帖由 newIT666 于 2008-5-18 19:32 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
用FPU的单元做返回值,通用性和移植性差一些!
编译后如果在没有FPU的机器上则没法运行了,但每个机器都有CPU,因此用CPU更通用. 原帖由 hzcgz 于 2008-5-19 14:02 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
编译后如果在没有FPU的机器上则没法运行了,但每个机器都有CPU,因此用CPU更通用.
从奔腾开始 intel 和 amd 的那个CPU里没含有FPU?
FPU已经是CPU的一部分了。 原帖由 prolj 于 2008-5-18 19:48 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
可移植性?编译器用这种方法挺好:mrgreen: 又不用程序员思考这个可移植性的问题
支持,是否用FPU是由编译器决定的.
页:
[1]