cdecl_thunk on x64
__cdecl呼び出し規約用メソッドサンクcdecl_thunkをx64に対応させました。
<hamigaki/detail/x64/cdecl_thunk.hpp>
x64呼び出し規約に関してはMSDNに記載されています。
http://msdn.microsoft.com/ja-jp/library/7kcdt6fy(VS.80).aspx
概要だけ書くと、
- 引数は可能な限りレジスタ渡し、乗らない場合はポインタ渡し、足りない場合はスタック渡し
- 第一引数はRCXかxmm0、第二引数はRDXかxmm1、第三引数はR8かxmm2、第四引数はR9かxmm3
- 戻り値はRAXかxmm0
- レジスタ渡しの場合も引数が4つ未満でもスタックは四引数分空けておく
- スタックは16バイトアラインメント
といった感じです。
一方、cdecl_thunkは、
// Argcは引数のバイト数÷4 (≠引数の数) template<std::size_t Argc> class cdecl_thunk;
とx86依存なインタフェースになっていたため、
x64版は整数引数1,2,3,4個用、double引数1個用を専用に用意するインチキ実装になっています。
まじめにやるならインタフェースを変えないといけませんね。