命令 パラメータ1 パラメータ2 ...
n0sysEnt // JITコードの先頭に入れるべきコード、レジスタを初期化する s2cp_s32 g0 c0 // g0に定数0を代入 n1label L0 // ここをL0とする s2add_s32 g0 g0 c1 // g0 += 1 s4cjmp_s32 g0 c1000000000 1 L0 // 条件ジャンプ命令 if (g0 != 1000000000) goto L0 n0sysRet // JITコードから帰る場合に入れるべきコード
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 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
s2cp_s32 a b → MOV(EAX, b); MOV(a, EAX); s2add_s32 a b c → MOV(EAX, b); ADD(EAX, c); MOV(a, EAX); // subやandなどもほぼ同様. s4cjmp_s32 a b c d → MOV(EAX, a); CMP(EAX, b); jcc(d);
1: MOV(EAX, [EDI+8]); 2: INC(EAX); 3: MOV([EDI+8], EAX); 4: MOV(EAX, [EDI+8]); 5: CMP(EAX, 0x3b9aca00); 6: JNE(L0);
1: s3mul_f64 f2 f0 f0 xx = zx * zx 2: s3mul_f64 f3 f1 f1 yy = zy * zy 3: s3add_f64 f4 f3 f2 tmp = yy + xx 4: s4cjmp_f64 f4 c4.0 5 L5 if (tmp > 4) goto L5 5: s3sub_f64 f4 f2 f3 tx = xx - yy 6: s3mul_f64 f5 f0 f1 ty = zx * zy * 2.0 7: s3add_f64 f5 f5 f5 8: s3add_f64 f0 f4 g8 zx = tx + cx 9: s3add_f64 f1 f5 g9 zy = ty + cy
01: FLD ST(0) // f0 02: FMUL ST(1) // f0 03: FSTP ST(3) // f2 04: FLD ST(1) // f1 05: FMUL ST(2) // f1 06: FSTP ST(4) // f3 07: FLD ST(3) // f3 08: FADD ST(3) // f2 09: FSTP ST(5) // f4 10: FLD ST(4) // f4 11: FCOMP [...] // 4.0 12: FNSTSW AX 13: SAHF 14: JA L5 (以下略)