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);