x64コードジェネレータの部分を開発した。


x64コードジェネレータとは、64bit版 x86命令を生成するプログラムのことである。

pcsx2のソースディレクトリ(\x86\ix86ディレクトリ配下)に相当する部分といえば分かりやすいかもしれない。


x64コードジェネレータのプログラムソースが見たいという人は、以下のURLからダウンロードできる。

http://www.ssspsx.com/x64asm.h


このコードジェネレータには、以下の特徴がある。


1)すべてマクロで作られている

 関数呼び出しより、マクロのほうが、静的コンパイル時に最適化されやすい。


2)マクロ名の銘銘規則

 マクロ名の銘銘規則は、BNF(Backus Naur Form)で定義している。


3)生成される命令長が短い

  x86命令の中には、同じ意味の命令が異なるバイト数の命令になることがある。

  たとえば、"adc eax,1"命令の場合だと次の3種類になる。
  ・3バイト
   83 d0 01
  ・5バイト
   15 01 00 00 00
  ・6バイト
   81 d0 01 00 00 00

  このコードジェネレータは、常にもっとも短い命令をジェネレートする。


  IntelのCore2 DuoやAMDのAthlon64X2では、1サイクルの間に16バイトをデコードすることができる。
  命令長が3バイトの場合は、1サイクルの間に5.3命令がデコードできる。
  一方、
  命令長が6バイトの場合は、1サイクルの間に3.2命令しかデコードできない。

  デコードにかかる時間だけに着目すると、1.6倍の差がある。


おそらく、x64asm.hは、まだ誤りがあるともうけれど、次はiR5900.cに相当する部分のコーディングに取り掛かろうと思う。