3.11.2 过程中的浮点代码

3.11.2 过程中的浮点代码

在 x86-64 中,XMM 寄存器用来向函数传递浮点参数,以及从函数返回浮点值。如图 3-45 所示,可以看到如下规则:

  • XMM 寄存器 %xmm0%xmm7 最多可以传递 8 个浮点参数。按照参数列出的顺序使用这些寄存器。可以通过栈传递额外的浮点参数。
  • 函数使用寄存器 %xmm0 来返回浮点值。
  • 所有的 XMM 寄存器都是调用者保存的。被调用者可以不用保存就覆盖这些寄存器中任意一个。

当函数包含指针、整数和浮点数混合的参数时,指针和整数通过通用寄存器传递,而浮点值通过 XMM 寄存器传递。也就是说,参数到寄存器的映射取决于它们的类型和排列的顺序。下面是一些例子:

double f1(int x, double y, long z);

这个函数会把 x 存放在 %edi 中,y 放在 %xmm0 中,而 z 放在 %rsi 中。

double f2(double y, int x, long z);

这个函数的寄存器分配与函数 f1 相同。

double f1(float x, double *y, long *z);

这个函数会将 x 放在 %xmm0 中,y 放在 %rdi 中,而 z 放在 %rsi 中。

练习题 3.52 对于下面每个函数声明,确定参数的寄存器分配:

A. double g1(double a, long b, float c, int d);

B. double g2(int a, double *b, float *c, long d);

C. double g3(double *a, double b, int c, float d);

D. double g4(float a, int *b, float c, double d);