Revisión | 386b9b5a4ad42304daca2075e0fce745f974f892 (tree) |
---|---|
Tiempo | 2014-03-10 16:59:08 |
Autor | ttwilb <ttwilb@user...> |
Commiter | ttwilb |
comment added
@@ -558,9 +558,13 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
558 | 558 | break; |
559 | 559 | |
560 | 560 | case 0x04: /* CND (prefix) */ |
561 | - if (src[1] >= 0x40) w.err = JITC_ERR_REGNUM; | |
561 | + if (src[1] >= 0x40) w.err = JITC_ERR_REGNUM; // R00-R3F 以外のレジスタは比較対象にできない | |
562 | + | |
563 | + // 比較対象のレジスタがメモリ上にあれば-1, それ以外なら適切なレジスタ番号を返す | |
562 | 564 | reg0 = jitCompA000_selectRegCache(src[1], -1 /* mem */); |
563 | - if (reg0 < 0) { | |
565 | + | |
566 | + /* TEST命令を発行 */ | |
567 | + if (reg0 < 0) { //比較対象のレジスタはメモリ上にある | |
564 | 568 | jitCompPutByte1(w.dst, 0xf7); /* TEST([EBP+?],1); */ |
565 | 569 | jitCompA0001_85DispN(&w, src[1] * 4, 0); |
566 | 570 | } |
@@ -568,12 +572,14 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
568 | 572 | jitCompPutByte2(w.dst, 0xf7, 0xc0 | reg0); /* TEST(reg0,1); */ |
569 | 573 | } |
570 | 574 | jitCompPutImm32(&w, 1); |
575 | + | |
576 | + /* JZ命令を発行 */ | |
571 | 577 | jitCompPutByte2(w.dst, 0x74, 0x00); /* JZ($+2) */ |
572 | 578 | cmp0reg = -1; |
573 | 579 | if (w.err != 0) goto err_w; |
574 | 580 | src += 2; |
575 | - w.prefix = 1; | |
576 | - w.dst0 = w.dst; | |
581 | + w.prefix = 1; // プリフィックスをセット | |
582 | + w.dst0 = w.dst; | |
577 | 583 | goto prefix_continue; |
578 | 584 | |
579 | 585 | case 0x08: /* LMEM */ /* 完成 */ |