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個用を専用に用意するインチキ実装になっています。
まじめにやるならインタフェースを変えないといけませんね。