break;
case 0x04: /* CND (prefix) */
- if (src[1] >= 0x40) w.err = JITC_ERR_REGNUM;
+ if (src[1] >= 0x40) w.err = JITC_ERR_REGNUM; // R00-R3F 以外のレジスタは比較対象にできない
+
+ // 比較対象のレジスタがメモリ上にあれば-1, それ以外なら適切なレジスタ番号を返す
reg0 = jitCompA000_selectRegCache(src[1], -1 /* mem */);
- if (reg0 < 0) {
+
+ /* TEST命令を発行 */
+ if (reg0 < 0) { //比較対象のレジスタはメモリ上にある
jitCompPutByte1(w.dst, 0xf7); /* TEST([EBP+?],1); */
jitCompA0001_85DispN(&w, src[1] * 4, 0);
}
jitCompPutByte2(w.dst, 0xf7, 0xc0 | reg0); /* TEST(reg0,1); */
}
jitCompPutImm32(&w, 1);
+
+ /* JZ命令を発行 */
jitCompPutByte2(w.dst, 0x74, 0x00); /* JZ($+2) */
cmp0reg = -1;
if (w.err != 0) goto err_w;
src += 2;
- w.prefix = 1;
- w.dst0 = w.dst;
+ w.prefix = 1; // プリフィックスをセット
+ w.dst0 = w.dst;
goto prefix_continue;
case 0x08: /* LMEM */ /* 完成 */