x86-64の構造体の値渡しのABIについて
Linux(Ubuntu)x86-64の構造体の値渡しのABI
趣味でx86-64のコンパイラ作っているのですが、Linux(Ubuntu)での構造体のABIがわかりません。それが記述されている資料もどこにあるのか、ググっても探せませんでした。
ご存じの方いましたら、資料の場所でもいいので教えていただけないでしょうか。
知りたいことは、構造体の値渡し(引数)および戻り値ついてですが、いろいろわからないことだらけです。
- メンバー渡しなのか? 配列がメンバーの場合は?
- 構造体のサイズによりレジスタ渡しだったり、スタック渡しだったりするのか?
- 浮動小数点はどうなる?
- スタック渡しの場合、呼び出し側でメモリ確保するのか?どこに?
Cで書いてアセンブリ見ろという話もあるかもしれませんが、正式な方法が定義されていれば知りたいです。
例
float を3つもつ構造体、例えば下記のコードの構造体を関数の戻り値で返した場合、アセンブリを見るとxmm0に最初の2つのx, yが格納。xmm1にzが格納されているように思いましたが、合っているでしょうか。下記のようなイメージです。
struct Vec3f {
float x, y, z;
};
Vec3f createVec() {
struct Vec3f t;
t.x = t.y = t.z = 0.0f;
return t;
}
このような構造体の受け渡しに詳しい方がいらっしゃいましたら教えてください。
資料の在りかでもよいです。
よろしくお願いします。