使用复合日期类型调用约定

Calling conventions with composite date types

本文关键字:调用 约定 类型 日期 复合      更新时间:2023-10-16

我理解在microsoft和System V AMD64 ABI的64位代码中传递32位和64位整数(和指针)、浮点数和双精度的调用约定。但是我不清楚复合数据类型的调用约定是什么。

更清楚的是,在具有外部链接的函数(即非static inline函数)中,按值传递结构、类和联合的调用约定是什么?我对像

这样的简单结构特别感兴趣。
typedef struct doublefloat { float hi; float lo; } doublefloat;
typedef struct doubledouble { double hi; double lo; } doubledouble;
typedef struct int128 { int64_t hi; int64_t lo; } int128; 
doublefloat foof(float a, float b);    
doubledouble food(double a, double b);
float foo3(doubledouble a, doubledouble b);    
int128 fooi(int64_t a, int64_t b);

下面是我在GCC中观察到的(使用-O3)

  • foof返回hilo打包成XMM0的前64位。
  • food返回hiloXMM0XMM1
  • foo3XMM0XMM1XMM2XMM3中的ab中通过hilo
  • fooi返回hilo为rda和rdx

Agner Fog描述了每个编译器的细节(与观察一致)http://www.agner.org/optimize/calling_conventions.pdf

表6。方法用于传递结构、类和联合对象表7所示。返回结构、类和联合对象的方法

对于64位代码,他的表分为Windows和Linux/BSD/Mac,而不是每个编译器,所以这对我来说意味着有一些复合数据类型的标准。这是正确的吗?或者复合数据类型的传递和返回是否可能由每个编译器或每个版本的编译器定义(即可能在下一个版本中更改)?

请注意,我理解在实践中,在许多这些情况下,static inline可能是最好的。还要注意,即使C没有类,我仍然对结构和联合如何在C中按值传递感兴趣,而不仅仅是c++,这就是为什么我包含了C标签。

确实存在一些标准。例如,SystemV AMD64 ABI文档详细描述了聚合的参数传递(从第17页开始)。这篇文章有好几页,我就不抄了。

并不是所有的平台都有这么好的文档。