用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[i];
- return(local_sum);
- }
- ...
- double_rtn=sum_double(...);
- ...
复制代码
编译器可替换成的代码:
- ;finit 在适当的地方运行
- push esi
- fldz ;FPU st[0] 置零
- mov ecx,[esp+8] ;double_count
- mov esi,[esp+12] ;double_list
- sum_loop:
- jecxz exit ;if(ecx==0) 则退出
- fadd QWORD PTR[esi] ;求和,结果放在FPU st[0]
- dec ecx ;double_count--
- add esi,8 ;i++
- jmp sum_loop ;continue
- exit
- pop esi
- ret ;用FPU st[0]存结果,传递返回值
- ...
- fstp double_rtn ;返回值double_rtn=st[0]
- ...
复制代码
[ 本帖最后由 system888net 于 2008-5-18 16:19 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
用FPU的单元做返回值,通用性和移植性差一些!
可移植性?编译器用这种方法挺好 又不用程序员思考这个可移植性的问题
编译后如果在没有FPU的机器上则没法运行了,但每个机器都有CPU,因此用CPU更通用.
从奔腾开始 intel 和 amd 的那个CPU里没含有FPU?
FPU已经是CPU的一部分了。
支持,是否用FPU是由编译器决定的.