system888net 发表于 2008-04-28 18:16

用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 编辑 ]

newIT666 发表于 2008-05-18 19:32

用FPU的单元做返回值,通用性和移植性差一些!

prolj 发表于 2008-05-18 19:48

可移植性?编译器用这种方法挺好:mrgreen: 又不用程序员思考这个可移植性的问题

hzcgz 发表于 2008-05-19 14:02

原帖由 newIT666 于 2008-5-18 19:32 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
用FPU的单元做返回值,通用性和移植性差一些!

编译后如果在没有FPU的机器上则没法运行了,但每个机器都有CPU,因此用CPU更通用.

chzCPU 发表于 2008-05-22 14:29

原帖由 hzcgz 于 2008-5-19 14:02 发表 http://linux.chinaunix.net/bbs/images/common/back.gif


编译后如果在没有FPU的机器上则没法运行了,但每个机器都有CPU,因此用CPU更通用.

从奔腾开始 intel 和 amd 的那个CPU里没含有FPU?
FPU已经是CPU的一部分了。

chzCPU 发表于 2008-05-22 14:31

原帖由 prolj 于 2008-5-18 19:48 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
可移植性?编译器用这种方法挺好:mrgreen: 又不用程序员思考这个可移植性的问题

支持,是否用FPU是由编译器决定的.
页: [1]
查看完整版本: 用FPU的单元保存返回值的一个小例子