簡単な変換方法: (kharcはスタックマシンではなくレジスタマシンなので、JITコンパイルの際には変換する必要があるのです。)
func temp() { return str("t%d", tempNo++); }
func val(zero)
{
i = get(); switch (i) {
case 0: return str("%d", zero);
case 1~3: return repeat[i - 1];
case 4: t = temp(); put(str("%s = %s + %s;", t, val(1), val(1))); return t;
case 5: t = temp(); put(str("%s = %s - %s;", t, val(1), val(1))); return t;
case 6: t = temp(); put(str("%s = %s * %s;", t, val(2), val(2))); return t;
case 0x80~0x98: return str("%d", i - 0x80);
case 0x99~0x9e: return str("%d", 32 << (i - 0x99));
case 0x9f: t = temp(); put(str("%s = %s << 16;", val(1))); return t;
case 0xa0~0xaf: return str("i%d", i - 0xa0);
case 0xb0: t = temp(); put(str("%s = %s / %s;", t, val(1), val(3))); return t;
case 0xb3: t = temp(); put(str("%s = %s >> %s;", t, val(0), val(1))); return t;
case 0xc00~0xcff: return str("%d", i - 0xc00);
case 0xdb1: t = temp(); put(str("%s = ff16Sqrt(%s);", t, val(0))); return t;
case 0xdb2: t = temp(); put(str("%s = ff16Sin(%s);", t, val(0))); return t;
}
}
func let() { tempNo = 0; v = val(0); i = get(); put(str("i%d = %s;", i, v)); updateRepeat(i); }