- 追加された行はこの色です。
- 削除された行はこの色です。
* Essen Rev2 JIT00
-(by [[K]], 2017.07.31)
** JIT00で提供する機能
-ラベルを使えるようにする
-CPUに依存するレイヤをここに集約する(JIT01以降はCPUに依存しない)
-実際のCPUのレジスタ数がいくつであるかなどの制約を受けずに済むようにする
** 基本仕様
-i# : 即値
-c# : 即値
-l# : ローカル変数(#=0~)
-g# : グローバル変数
-p# : ポインタレジスタ(p0~p7しかない)
-L# : 分岐先指定などに使うラベル
-p# : ポインタレジスタ(p0~p31しかない)
-i# : s32以上レジスタ(i0~i31しかない)
-f# : f64以上レジスタ(f0~f31しかない)
-ローカル変数、グローバル変数には、どんな型の値でも代入できる。なぜならEssenは値が型を持つ言語だから。
-ポインタレジスタはポインタしか代入できない。
-s32以上レジスタは整数しか代入できない。
-f64以上レジスタは浮動小数点しか代入できない。
-p#, i#, f#はグローバル変数で、これをうまく使いこなせるかどうかはJIT01レイヤ次第(使えばきっと高速化には寄与する)。
-基本構文
命令 パラメータ1 パラメータ2 ...
-人間にとって書きやすい構文にしようとしていない。どうせこれはJIT01から渡されてくる中間言語でしかない。
--だからコメントやマクロなどはない。
-パラメータはスペース区切り(コンマはいらない)
-命令の命名規則
--最初の一文字はnかs。nはノーマル。sはスピード優先。
--二文字目はパラメータの数。
--末尾には型を表す接尾子が入る場合がある。
-例1:
n0sysEnt // JITコードの先頭に入れるべきコード、レジスタを初期化する
s2cp_s32 g0 i0 // g0に定数0を代入
s2cp_s32 g0 c0 // g0に定数0を代入
n1label L0 // ここをL0とする
s2add_s32 g0 i1 // g0 += 1
s4cjmp_s32 g0 i1000000000 1 L0 // 条件ジャンプ命令 if (g0 != 1000000000) goto L0
s2add_s32 g0 c1 // g0 += 1
s4cjmp_s32 g0 c1000000000 1 L0 // 条件ジャンプ命令 if (g0 != 1000000000) goto L0
n0sysRet // JITコードから帰る場合に入れるべきコード
-[Q]人間が書くわけじゃない中間言語なのに、どうしてバイナリにしなかったの?テキストなんて生成するのも解釈するのも手間じゃないか。
--[A]その意見には全面的に賛成します。まあひとまずはデバッグを楽にするためにテキストでやっています、くらいの感じで。・・・将来的にはバイナリ化するかもしれません。
** x86(32bit)版の仕様
-こうでなければいけないということではないが、とりあえず最初のバージョンではこうやって構成した、という例として:
-変数は16バイト
--型(32bit)、補助属性(32bit)、値(最大64bit)
--値が64bitに収まらない場合や可変長の場合は、ポインタを入れておく。
-EAX: テンポラリデータレジスタ
-EDI: グローバル変数のベース
-EBP: ローカル変数のベース
-ESI: ワークエリアのベース
-EBX: p0
-ECX: テンポラリポインタ
-ECX: テンポラリポインタ(p1)
-EDX: テンポラリ
--p1~p7はワークエリア内にある
--p2~p31はワークエリア内にある
--i0~i31はワークエリア内にある
--f0~f5はFPUの中にあり、f6~f31はワークエリア内にある
-例1は以下のような機械語になる(2017.07.28時点)
60 PUSHAD n0sysEnt
BF E8 24 48 00 EDI=....
B8 00 00 00 00 EAX=0 s2cp_s32 g0 i0
89 87 08 00 00 00 [EDI+8]=EAX
n1label L0
8B 87 08 00 00 00 EAX=[EDI+8] s2add_s32 g0 i1
40 EAX++
89 87 08 00 00 00 [EDI+8]=EAX
3D 00 CA 9A 3B CMP(EAX,0x3b9aca00) s4cjmp_s32 g0 i1000000000 1 L0 // EAX=[EDI+8]を自動で省略している.
0F 85 E8 FF FF FF JNE L0
61 POPAD n0sysRet
C3 RET
-[Q]もっと短い機械語を生成しなくていいのか?
--[A]もちろんやりたいが、今は他を先に作るべきだと思っているので、今はまだそこには着手しない。
-[Q]・・・で、肝心の性能は?
--[A]Core-i7で実験した範囲では、gccで-O3したのと同じくらいの性能が出る。これは使える!!