00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #define sign_extend(N,SIZE) (((int)((N) << (sizeof(unsigned)*8-(SIZE)))) >> (sizeof(unsigned)*8-(SIZE)))
00012 #include <assert.h>
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "global.h"
00033 #include "decoder.h"
00034 #include "prog.h"
00035 #include "ss.h"
00036 #include "rtl.h"
00037 #include "proc.h"
00038 #include "csr.h"
00039 #include "mc68k.pat.h"
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 DecodeResult& NJMCDecoder::decodeInstruction (ADDRESS pc, int delta,
00066 UserProc* proc = NULL)
00067 {
00068 static DecodeResult result;
00069 ADDRESS hostPC = pc + delta;
00070
00071
00072 result.reset();
00073
00074
00075 list<RT*>* RTs = NULL;
00076
00077
00078 int addr, regs, locals, stackSize, d16, d32, reg;
00079 ADDRESS saveHostPC = hostPC;
00080 Logue* logue;
00081 if ((logue = InstructionPatterns::std_call(csr, hostPC, addr)) != NULL) {
00082
00083
00084
00085 HLCall* newCall = new HLCall(pc, 0, RTs);
00086 result.rtl = newCall;
00087 result.numBytes = hostPC - saveHostPC;
00088
00089
00090 newCall->setDest(addr - delta);
00091 newCall->setPrologue(logue);
00092
00093
00094
00095 SHOW_ASM("std_call "<<addr)
00096 }
00097
00098 else if ((logue = InstructionPatterns::near_call(csr, hostPC, addr))
00099 != NULL) {
00100
00101
00102
00103 HLCall* newCall = new HLCall(pc, 0, RTs);
00104 result.rtl = newCall;
00105 result.numBytes = hostPC - saveHostPC;
00106
00107
00108 newCall->setDest(addr - delta);
00109 newCall->setPrologue(logue);
00110
00111
00112
00113 SHOW_ASM("near_call " << addr)
00114 }
00115
00116 else if ((logue = InstructionPatterns::pea_pea_add_rts(csr, hostPC, d32))
00117 != NULL) {
00118
00119
00120
00121
00122 HLCall* newCall = new HLCall(pc, 0, RTs);
00123 result.rtl = newCall;
00124 result.numBytes = hostPC - saveHostPC;
00125
00126
00127
00128 newCall->setDest(pc + 10 + d32);
00129 newCall->setPrologue(logue);
00130
00131
00132
00133 SHOW_ASM("pea/pea/add/rts " << pc+10+d32)
00134 }
00135
00136 else if ((logue = InstructionPatterns::pea_add_rts(csr, hostPC, d32))
00137 != NULL) {
00138
00139
00140
00141
00142 HLCall* newCall = new HLCall(pc, 0, RTs);
00143 result.rtl = newCall;
00144 result.numBytes = hostPC - saveHostPC;
00145
00146
00147
00148 newCall->setDest(pc + 6 + d32);
00149 newCall->setPrologue(logue);
00150
00151
00152 newCall->setReturnAfterCall(true);
00153
00154
00155
00156 SHOW_ASM("pea/add/rts " << pc+6+d32)
00157 }
00158
00159 else if ((logue = InstructionPatterns::trap_syscall(csr, hostPC, d16))
00160 != NULL) {
00161
00162
00163
00164
00165 HLCall* newCall = new HLCall(pc, 0, RTs);
00166 result.rtl = newCall;
00167 result.numBytes = hostPC - saveHostPC;
00168
00169
00170 newCall->setDest(0xAAAAA000 + d16);
00171 newCall->setPrologue(logue);
00172
00173 SHOW_ASM("trap/syscall " << hex << 0xA000 + d16)
00174 }
00175
00176
00177
00178
00179 else if ((logue = InstructionPatterns::link_save(csr, hostPC,
00180 locals, d16)) != NULL)
00181 {
00182
00183
00184
00185 if (proc != NULL) {
00186
00187
00188 assert(logue->getType() == Logue::CALLEE_PROLOGUE);
00189 proc->setPrologue((CalleePrologue*)logue);
00190 }
00191 result.rtl = new RTlist(pc, RTs);
00192 result.numBytes = hostPC - saveHostPC;
00193 SHOW_ASM("link_save " << locals)
00194 }
00195
00196 else if ((logue = InstructionPatterns::link_save1(csr, hostPC,
00197 locals, reg)) != NULL)
00198 {
00199
00200
00201
00202 if (proc != NULL) {
00203
00204
00205 assert(logue->getType() == Logue::CALLEE_PROLOGUE);
00206 proc->setPrologue((CalleePrologue*)logue);
00207 }
00208 result.rtl = new RTlist(pc, RTs);
00209 result.numBytes = hostPC - saveHostPC;
00210 SHOW_ASM("link_save1 " << locals)
00211 }
00212
00213 else if ((logue = InstructionPatterns::push_lea(csr, hostPC,
00214 locals, reg)) != NULL)
00215 {
00216
00217
00218
00219
00220
00221 if (proc != NULL) {
00222
00223
00224 assert(logue->getType() == Logue::CALLEE_PROLOGUE);
00225 proc->setPrologue((CalleePrologue*)logue);
00226 }
00227 result.rtl = new RTlist(pc, RTs);
00228 result.numBytes = hostPC - saveHostPC;
00229 SHOW_ASM("push_lea " << locals)
00230 }
00231
00232 else if ((logue = InstructionPatterns::std_link(csr, hostPC,
00233 locals)) != NULL)
00234 {
00235
00236
00237
00238 if (proc != NULL) {
00239
00240
00241 assert(logue->getType() == Logue::CALLEE_PROLOGUE);
00242 proc->setPrologue((CalleePrologue*)logue);
00243 }
00244 result.rtl = new RTlist(pc, RTs);
00245 result.numBytes = hostPC - saveHostPC;
00246 SHOW_ASM("std_link "<< locals)
00247 }
00248
00249 else if ((logue = InstructionPatterns::bare_ret(csr, hostPC))
00250 != NULL)
00251 {
00252
00253
00254
00255 if (proc != NULL) {
00256
00257
00258 assert(logue->getType() == Logue::CALLEE_PROLOGUE);
00259 proc->setPrologue((CalleePrologue*)logue);
00260 proc->setEpilogue(new CalleeEpilogue("__dummy",list<string>()));
00261 }
00262 result.rtl = new HLReturn(pc, RTs);
00263 result.numBytes = hostPC - saveHostPC;
00264 SHOW_ASM("bare_ret")
00265 }
00266
00267 else if ((logue = InstructionPatterns::std_ret(csr, hostPC)) != NULL) {
00268
00269
00270
00271 if (proc!= NULL) {
00272
00273
00274 assert(logue->getType() == Logue::CALLEE_EPILOGUE);
00275 proc->setEpilogue((CalleeEpilogue*)logue);
00276 }
00277
00278 result.rtl = new HLReturn(pc, RTs);
00279 result.numBytes = hostPC - saveHostPC;
00280 SHOW_ASM("std_ret")
00281 }
00282
00283 else if ((logue = InstructionPatterns::rest_ret(csr, hostPC, d16)) != NULL)
00284 {
00285
00286
00287
00288 if (proc!= NULL) {
00289
00290
00291 assert(logue->getType() == Logue::CALLEE_EPILOGUE);
00292 proc->setEpilogue((CalleeEpilogue*)logue);
00293 }
00294
00295 result.rtl = new HLReturn(pc, RTs);
00296 result.numBytes = hostPC - saveHostPC;
00297 SHOW_ASM("rest_ret")
00298 }
00299
00300 else if ((logue = InstructionPatterns::rest1_ret(csr, hostPC, reg)) != NULL)
00301 {
00302
00303
00304
00305 if (proc!= NULL) {
00306
00307
00308 assert(logue->getType() == Logue::CALLEE_EPILOGUE);
00309 proc->setEpilogue((CalleeEpilogue*)logue);
00310 }
00311
00312 result.rtl = new HLReturn(pc, RTs);
00313 result.numBytes = hostPC - saveHostPC;
00314 SHOW_ASM("rest1_ret")
00315 }
00316
00317 else if ((logue = InstructionPatterns::pop_ret(csr, hostPC, reg)) != NULL)
00318 {
00319
00320
00321
00322 if (proc!= NULL) {
00323
00324
00325 assert(logue->getType() == Logue::CALLEE_EPILOGUE);
00326 proc->setEpilogue((CalleeEpilogue*)logue);
00327 }
00328
00329 result.rtl = new HLReturn(pc, RTs);
00330 result.numBytes = hostPC - saveHostPC;
00331 SHOW_ASM("pop_ret")
00332 }
00333
00334 else if ((logue = InstructionPatterns::clear_stack(csr, hostPC, stackSize))
00335 != NULL)
00336 {
00337
00338
00339
00340 RTs = instantiate(pc, "clear_stack", dis_Num(stackSize));
00341
00342 result.rtl = new RTlist(pc, RTs);
00343 result.numBytes = hostPC - saveHostPC;
00344 }
00345
00346 else {
00347
00348 ADDRESS nextPC;
00349 int bump = 0, bumpr;
00350 SemStr* ss;
00351
00352
00353
00354
00355 {
00356 dword MATCH_p =
00357
00358
00359 hostPC
00360 ;
00361 char *MATCH_name;
00362 static char *MATCH_name_cond_12[] = {
00363 "bra", (char *)0, "bhi", "bls", "bcc", "bcs", "bne", "beq", "bvc", "bvs",
00364 "bpl", "bmi", "bge", "blt", "bgt", "ble",
00365 };
00366 unsigned MATCH_w_16_0;
00367 {
00368 MATCH_w_16_0 = getWord(MATCH_p);
00369
00370 switch((MATCH_w_16_0 >> 12 & 0xf) ) {
00371 case 0: case 1: case 2: case 3: case 7: case 8: case 9: case 10:
00372 case 11: case 12: case 13: case 14: case 15:
00373 goto MATCH_label_de0; break;
00374 case 4:
00375 if ((MATCH_w_16_0 >> 3 & 0x7) == 2)
00376 if ((MATCH_w_16_0 >> 9 & 0x7) == 7)
00377 if ((MATCH_w_16_0 >> 8 & 0x1) == 1)
00378 goto MATCH_label_de0;
00379 else
00380
00381 switch((MATCH_w_16_0 >> 6 & 0x3) ) {
00382 case 0: case 1:
00383 goto MATCH_label_de0; break;
00384 case 2:
00385 {
00386 unsigned ea = addressToPC(MATCH_p);
00387 nextPC = 2 + MATCH_p;
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400 HLCall* newCall = new HLCall(pc, 0, RTs);
00401
00402
00403
00404 newCall->setIsComputed();
00405
00406
00407
00408 newCall->setDest(cEA(ea, pc, 32));
00409
00410 result.rtl = newCall;
00411
00412
00413
00414 result.numBytes = nextPC - hostPC;
00415
00416
00417
00418
00419
00420
00421 }
00422
00423 break;
00424 case 3:
00425 {
00426 unsigned ea = addressToPC(MATCH_p);
00427 nextPC = 2 + MATCH_p;
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438 HLNwayJump* newJump = new HLNwayJump(pc, RTs);
00439
00440
00441
00442 newJump->setIsComputed();
00443
00444
00445
00446 newJump->setDest(cEA(ea, pc, 32));
00447
00448 result.rtl = newJump;
00449
00450
00451
00452 result.numBytes = nextPC - hostPC;
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465 }
00466
00467 break;
00468 default: assert(0);
00469 }
00470 else
00471 goto MATCH_label_de0;
00472 else
00473 goto MATCH_label_de0;
00474 break;
00475 case 5:
00476
00477 switch((MATCH_w_16_0 >> 8 & 0xf) ) {
00478 case 0: case 1: case 8: case 9:
00479 goto MATCH_label_de0; break;
00480 case 2:
00481 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00482 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00483 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00484 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00485 MATCH_name = "shi";
00486 {
00487 char *name = MATCH_name;
00488 unsigned ea = addressToPC(MATCH_p);
00489 nextPC = 2 + MATCH_p;
00490
00491
00492
00493
00494 ss = daEA(ea, pc, bump, bumpr, 1);
00495
00496 RTs = instantiate(pc, name, ss);
00497
00498 SETS(name, ss, HLJCOND_JSG)
00499
00500
00501
00502
00503 }
00504
00505 }
00506 else
00507 goto MATCH_label_de0;
00508
00509 break;
00510 case 3:
00511 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00512 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00513 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00514 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00515 MATCH_name = "sls";
00516 {
00517 char *name = MATCH_name;
00518 unsigned ea = addressToPC(MATCH_p);
00519 nextPC = 2 + MATCH_p;
00520
00521
00522
00523
00524 ss = daEA(ea, pc, bump, bumpr, 1);
00525
00526 RTs = instantiate(pc, name, ss);
00527
00528 SETS(name, ss, HLJCOND_JULE)
00529
00530
00531
00532
00533 }
00534
00535 }
00536 else
00537 goto MATCH_label_de0;
00538
00539 break;
00540 case 4:
00541 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00542 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00543 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00544 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00545 MATCH_name = "scc";
00546 {
00547 char *name = MATCH_name;
00548 unsigned ea = addressToPC(MATCH_p);
00549 nextPC = 2 + MATCH_p;
00550
00551
00552
00553
00554 ss = daEA(ea, pc, bump, bumpr, 1);
00555
00556 RTs = instantiate(pc, name, ss);
00557
00558 SETS(name, ss, HLJCOND_JUGE)
00559
00560
00561
00562
00563 }
00564
00565 }
00566 else
00567 goto MATCH_label_de0;
00568
00569 break;
00570 case 5:
00571 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00572 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00573 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00574 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00575 MATCH_name = "scs";
00576 {
00577 char *name = MATCH_name;
00578 unsigned ea = addressToPC(MATCH_p);
00579 nextPC = 2 + MATCH_p;
00580
00581
00582
00583
00584 ss = daEA(ea, pc, bump, bumpr, 1);
00585
00586 RTs = instantiate(pc, name, ss);
00587
00588 SETS(name, ss, HLJCOND_JUL)
00589
00590
00591
00592
00593 }
00594
00595 }
00596 else
00597 goto MATCH_label_de0;
00598
00599 break;
00600 case 6:
00601 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00602 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00603 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00604 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00605 MATCH_name = "sne";
00606 {
00607 char *name = MATCH_name;
00608 unsigned ea = addressToPC(MATCH_p);
00609 nextPC = 2 + MATCH_p;
00610
00611
00612
00613
00614 ss = daEA(ea, pc, bump, bumpr, 1);
00615
00616 RTs = instantiate(pc, name, ss);
00617
00618 SETS(name, ss, HLJCOND_JNE)
00619
00620
00621
00622
00623 }
00624
00625 }
00626 else
00627 goto MATCH_label_de0;
00628
00629 break;
00630 case 7:
00631 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00632 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00633 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00634 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00635 MATCH_name = "seq";
00636 {
00637 char *name = MATCH_name;
00638 unsigned ea = addressToPC(MATCH_p);
00639 nextPC = 2 + MATCH_p;
00640
00641
00642
00643
00644 ss = daEA(ea, pc, bump, bumpr, 1);
00645
00646 RTs = instantiate(pc, name, ss);
00647
00648 SETS(name, ss, HLJCOND_JE)
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669 }
00670
00671 }
00672 else
00673 goto MATCH_label_de0;
00674
00675 break;
00676 case 10:
00677 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00678 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00679 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00680 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00681 MATCH_name = "spl";
00682 {
00683 char *name = MATCH_name;
00684 unsigned ea = addressToPC(MATCH_p);
00685 nextPC = 2 + MATCH_p;
00686
00687
00688
00689
00690 ss = daEA(ea, pc, bump, bumpr, 1);
00691
00692 RTs = instantiate(pc, name, ss);
00693
00694 SETS(name, ss, HLJCOND_JPOS)
00695
00696
00697
00698
00699 }
00700
00701 }
00702 else
00703 goto MATCH_label_de0;
00704
00705 break;
00706 case 11:
00707 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00708 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00709 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00710 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00711 MATCH_name = "smi";
00712 {
00713 char *name = MATCH_name;
00714 unsigned ea = addressToPC(MATCH_p);
00715 nextPC = 2 + MATCH_p;
00716
00717
00718
00719
00720 ss = daEA(ea, pc, bump, bumpr, 1);
00721
00722 RTs = instantiate(pc, name, ss);
00723
00724 SETS(name, ss, HLJCOND_JMI)
00725
00726
00727
00728
00729 }
00730
00731 }
00732 else
00733 goto MATCH_label_de0;
00734
00735 break;
00736 case 12:
00737 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00738 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00739 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00740 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00741 MATCH_name = "sge";
00742 {
00743 char *name = MATCH_name;
00744 unsigned ea = addressToPC(MATCH_p);
00745 nextPC = 2 + MATCH_p;
00746
00747
00748
00749
00750 ss = daEA(ea, pc, bump, bumpr, 1);
00751
00752 RTs = instantiate(pc, name, ss);
00753
00754 SETS(name, ss, HLJCOND_JSGE)
00755
00756
00757
00758
00759 }
00760
00761 }
00762 else
00763 goto MATCH_label_de0;
00764
00765 break;
00766 case 13:
00767 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00768 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00769 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00770 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00771 MATCH_name = "slt";
00772 {
00773 char *name = MATCH_name;
00774 unsigned ea = addressToPC(MATCH_p);
00775 nextPC = 2 + MATCH_p;
00776
00777
00778
00779
00780 ss = daEA(ea, pc, bump, bumpr, 1);
00781
00782 RTs = instantiate(pc, name, ss);
00783
00784 SETS(name, ss, HLJCOND_JSL)
00785
00786
00787
00788
00789 }
00790
00791 }
00792 else
00793 goto MATCH_label_de0;
00794
00795 break;
00796 case 14:
00797 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00798 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00799 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00800 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00801 MATCH_name = "sgt";
00802 {
00803 char *name = MATCH_name;
00804 unsigned ea = addressToPC(MATCH_p);
00805 nextPC = 2 + MATCH_p;
00806
00807
00808
00809
00810 ss = daEA(ea, pc, bump, bumpr, 1);
00811
00812 RTs = instantiate(pc, name, ss);
00813
00814 SETS(name, ss, HLJCOND_JSG)
00815
00816
00817
00818
00819 }
00820
00821 }
00822 else
00823 goto MATCH_label_de0;
00824
00825 break;
00826 case 15:
00827 if (((MATCH_w_16_0 >> 3 & 0x7) == 0 ||
00828 2 <= (MATCH_w_16_0 >> 3 & 0x7) &&
00829 (MATCH_w_16_0 >> 3 & 0x7) < 5) &&
00830 (MATCH_w_16_0 >> 6 & 0x3) == 3) {
00831 MATCH_name = "sle";
00832 {
00833 char *name = MATCH_name;
00834 unsigned ea = addressToPC(MATCH_p);
00835 nextPC = 2 + MATCH_p;
00836
00837
00838
00839
00840 ss = daEA(ea, pc, bump, bumpr, 1);
00841
00842 RTs = instantiate(pc, name, ss);
00843
00844 SETS(name, ss, HLJCOND_JSLE)
00845
00846
00847
00848
00849
00850
00851
00852
00853 }
00854
00855 }
00856 else
00857 goto MATCH_label_de0;
00858
00859 break;
00860 default: assert(0);
00861 }
00862 break;
00863 case 6:
00864
00865 switch((MATCH_w_16_0 >> 8 & 0xf) ) {
00866 case 0:
00867 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
00868 ];
00869 {
00870 char *name = MATCH_name;
00871 unsigned d = addressToPC(MATCH_p);
00872 nextPC = 2 + MATCH_p;
00873
00874
00875
00876
00877 ss = BTA(d, result, pc);
00878
00879 UNCOND_JUMP(name, nextPC - hostPC, ss);
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892 }
00893
00894 break;
00895 case 1:
00896 goto MATCH_label_de0; break;
00897 case 2:
00898 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
00899 ];
00900 {
00901 char *name = MATCH_name;
00902 unsigned d = addressToPC(MATCH_p);
00903 nextPC = 2 + MATCH_p;
00904
00905
00906
00907
00908 ss = BTA(d, result, pc);
00909
00910 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JUG)
00911
00912
00913
00914
00915 }
00916
00917 break;
00918 case 3:
00919 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
00920 ];
00921 {
00922 char *name = MATCH_name;
00923 unsigned d = addressToPC(MATCH_p);
00924 nextPC = 2 + MATCH_p;
00925
00926
00927
00928
00929 ss = BTA(d, result, pc);
00930
00931 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JULE)
00932
00933
00934
00935
00936 }
00937
00938 break;
00939 case 4:
00940 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
00941 ];
00942 {
00943 char *name = MATCH_name;
00944 unsigned d = addressToPC(MATCH_p);
00945 nextPC = 2 + MATCH_p;
00946
00947
00948
00949
00950 ss = BTA(d, result, pc);
00951
00952 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JUGE)
00953
00954
00955
00956
00957 }
00958
00959 break;
00960 case 5:
00961 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
00962 ];
00963 {
00964 char *name = MATCH_name;
00965 unsigned d = addressToPC(MATCH_p);
00966 nextPC = 2 + MATCH_p;
00967
00968
00969
00970
00971 ss = BTA(d, result, pc);
00972
00973 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JUL)
00974
00975
00976
00977
00978 }
00979
00980 break;
00981 case 6:
00982 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
00983 ];
00984 {
00985 char *name = MATCH_name;
00986 unsigned d = addressToPC(MATCH_p);
00987 nextPC = 2 + MATCH_p;
00988
00989
00990
00991
00992 ss = BTA(d, result, pc);
00993
00994 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JNE)
00995
00996
00997
00998
00999 }
01000
01001 break;
01002 case 7:
01003 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
01004 ];
01005 {
01006 char *name = MATCH_name;
01007 unsigned d = addressToPC(MATCH_p);
01008 nextPC = 2 + MATCH_p;
01009
01010
01011
01012
01013 ss = BTA(d, result, pc);
01014
01015 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JE)
01016
01017
01018
01019
01020 }
01021
01022 break;
01023 case 8:
01024 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
01025 ];
01026 {
01027 char *name = MATCH_name;
01028 unsigned d = addressToPC(MATCH_p);
01029 nextPC = 2 + MATCH_p;
01030
01031
01032
01033
01034 ss = BTA(d, result, pc);
01035
01036 COND_JUMP(name, nextPC - hostPC, ss, (JCOND_TYPE)0)
01037
01038
01039
01040
01041 }
01042
01043 break;
01044 case 9:
01045 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
01046 ];
01047 {
01048 char *name = MATCH_name;
01049 unsigned d = addressToPC(MATCH_p);
01050 nextPC = 2 + MATCH_p;
01051
01052
01053
01054
01055 ss = BTA(d, result, pc);
01056
01057 COND_JUMP(name, nextPC - hostPC, ss, (JCOND_TYPE)0)
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074 }
01075
01076 break;
01077 case 10:
01078 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
01079 ];
01080 {
01081 char *name = MATCH_name;
01082 unsigned d = addressToPC(MATCH_p);
01083 nextPC = 2 + MATCH_p;
01084
01085
01086
01087
01088 ss = BTA(d, result, pc);
01089
01090 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JPOS)
01091
01092
01093
01094
01095 }
01096
01097 break;
01098 case 11:
01099 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
01100 ];
01101 {
01102 char *name = MATCH_name;
01103 unsigned d = addressToPC(MATCH_p);
01104 nextPC = 2 + MATCH_p;
01105
01106
01107
01108
01109 ss = BTA(d, result, pc);
01110
01111 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JMI)
01112
01113
01114
01115
01116 }
01117
01118 break;
01119 case 12:
01120 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
01121 ];
01122 {
01123 char *name = MATCH_name;
01124 unsigned d = addressToPC(MATCH_p);
01125 nextPC = 2 + MATCH_p;
01126
01127
01128
01129
01130 ss = BTA(d, result, pc);
01131
01132 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JSGE)
01133
01134
01135
01136
01137 }
01138
01139 break;
01140 case 13:
01141 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
01142 ];
01143 {
01144 char *name = MATCH_name;
01145 unsigned d = addressToPC(MATCH_p);
01146 nextPC = 2 + MATCH_p;
01147
01148
01149
01150
01151 ss = BTA(d, result, pc);
01152
01153 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JSL)
01154
01155
01156
01157
01158 }
01159
01160 break;
01161 case 14:
01162 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
01163 ];
01164 {
01165 char *name = MATCH_name;
01166 unsigned d = addressToPC(MATCH_p);
01167 nextPC = 2 + MATCH_p;
01168
01169
01170
01171
01172 ss = BTA(d, result, pc);
01173
01174 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JSG)
01175
01176
01177
01178
01179 }
01180
01181 break;
01182 case 15:
01183 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf)
01184 ];
01185 {
01186 char *name = MATCH_name;
01187 unsigned d = addressToPC(MATCH_p);
01188 nextPC = 2 + MATCH_p;
01189
01190
01191
01192
01193 ss = BTA(d, result, pc);
01194
01195 COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JSLE)
01196
01197
01198
01199
01200 }
01201
01202 break;
01203 default: assert(0);
01204 }
01205 break;
01206 default: assert(0);
01207 }
01208
01209 }goto MATCH_finished_de;
01210
01211 MATCH_label_de0: (void)0;
01212 {
01213 nextPC = MATCH_p;
01214
01215
01216
01217 result.rtl = new RTlist(pc,
01218
01219 decodeLowLevelInstruction(hostPC, pc, result));
01220
01221
01222
01223
01224 }
01225 goto MATCH_finished_de;
01226
01227 MATCH_finished_de: (void)0;
01228
01229 }
01230
01231
01232 }
01233 return result;
01234 }
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265 SemStr* NJMCDecoder::BTA(ADDRESS d, DecodeResult& result, ADDRESS pc)
01266 {
01267
01268 SemStr* ret = new SemStr(32);
01269 ret->push(idIntConst);
01270
01271
01272
01273
01274 {
01275 dword MATCH_p =
01276
01277
01278 d
01279 ;
01280 unsigned MATCH_w_16_0;
01281 unsigned MATCH_w_16_16;
01282 {
01283 MATCH_w_16_0 = getWord(MATCH_p);
01284 if ((MATCH_w_16_0 & 0xff) == 0) {
01285 MATCH_w_16_16 = getWord(2 + MATCH_p);
01286 {
01287 int dsp16 =
01288 sign_extend((MATCH_w_16_16 & 0xffff) , 16);
01289
01290
01291 {
01292
01293 ret->push(pc+2 + dsp16);
01294
01295 result.numBytes += 2;
01296
01297 }
01298
01299
01300
01301
01302
01303
01304 }
01305
01306 }
01307 else {
01308 unsigned dsp8 = (MATCH_w_16_0 & 0xff) ;
01309
01310
01311 {
01312
01313
01314
01315 ret->push(pc+2 + (int)(char)dsp8);
01316
01317 }
01318
01319
01320
01321
01322 }
01323
01324 }goto MATCH_finished_ce;
01325
01326 MATCH_finished_ce: (void)0;
01327
01328 }
01329
01330
01331
01332 return ret;
01333 }
01334
01335
01336 void NJMCDecoder::pIllegalMode(ADDRESS pc)
01337 {
01338 ostrstream ost;
01339 ost << "Illegal addressing mode at " << hex << pc;
01340 error(str(ost));
01341 }
01342
01343 SemStr* NJMCDecoder::pDDirect(int r2, int size)
01344 {
01345 SemStr* ret = new SemStr(size);
01346 ret->push(idRegOf);
01347 ret->push(idIntConst);
01348 ret->push(r2);
01349 return ret;
01350 }
01351
01352 SemStr* NJMCDecoder::pADirect(int r2, int size)
01353 {
01354 SemStr* ret = new SemStr(size);
01355 ret->push(idRegOf);
01356 ret->push(idIntConst);
01357 ret->push(r2 + 8);
01358 return ret;
01359 }
01360
01361 SemStr* NJMCDecoder::pIndirect(int r2, int size)
01362 {
01363 SemStr* ret = new SemStr(size);
01364 ret->push(idMemOf);
01365 ret->push(idRegOf);
01366 ret->push(idIntConst);
01367 ret->push(r2 + 8);
01368 return ret;
01369 }
01370
01371 SemStr* NJMCDecoder::pPostInc(int r2, int& bump, int& bumpr, int size)
01372 {
01373
01374
01375
01376 if ((r2 == 7) && (size == 8)) size = 16;
01377 SemStr* ret = new SemStr(size/8);
01378 ret->push(idMemOf);
01379 ret->push(idRegOf);
01380 ret->push(idIntConst);
01381 ret->push(r2 + 8);
01382 bump = size/8;
01383 bumpr = r2 + 8;
01384 return ret;
01385 }
01386
01387 SemStr* NJMCDecoder::pPreDec(int r2, int& bump, int& bumpr, int size)
01388 {
01389
01390
01391
01392 if ((r2 == 7) && (size == 8)) size = 16;
01393 SemStr* ret = new SemStr(size);
01394 ret->push(idMemOf); ret->push(idPlus);
01395 ret->push(idRegOf);
01396 ret->push(idIntConst);
01397 ret->push(r2 + 8);
01398 ret->push(idIntConst); ret->push(-size/8);
01399 bump = -size/8;
01400 bumpr = r2 + 8;
01401 return ret;
01402 }
01403
01404 SemStr* NJMCDecoder::alEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01405 int size)
01406 {
01407 SemStr* ret = new SemStr(size);
01408
01409
01410
01411 {
01412 dword MATCH_p =
01413
01414
01415 ea
01416 ;
01417 unsigned MATCH_w_16_0;
01418 {
01419 MATCH_w_16_0 = getWord(MATCH_p);
01420
01421 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01422 case 0:
01423 {
01424 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01425
01426
01427 ret = pDDirect(reg2, size);
01428
01429
01430
01431
01432 }
01433
01434 break;
01435 case 1:
01436 {
01437 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01438
01439
01440 ret = pADirect(reg2, size);
01441
01442
01443
01444
01445 }
01446
01447 break;
01448 case 2:
01449 {
01450 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01451
01452
01453 ret = pIndirect(reg2, size);
01454
01455
01456
01457
01458 }
01459
01460 break;
01461 case 3:
01462 {
01463 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01464
01465
01466 ret = pPostInc(reg2, bump, bumpr, size);
01467
01468
01469
01470
01471 }
01472
01473 break;
01474 case 4:
01475 {
01476 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01477
01478
01479 ret = pPreDec(reg2, bump, bumpr, size);
01480
01481
01482
01483
01484 }
01485
01486 break;
01487 case 5: case 6: case 7:
01488
01489
01490 pIllegalMode(pc);
01491
01492
01493
01494
01495 break;
01496 default: assert(0);
01497 }
01498
01499 }goto MATCH_finished_be;
01500
01501 MATCH_finished_be: (void)0;
01502
01503 }
01504
01505
01506 return ret;
01507 }
01508
01509 SemStr* NJMCDecoder::amEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01510 int size)
01511 {
01512 SemStr* ret = new SemStr(size);
01513
01514
01515
01516 {
01517 dword MATCH_p =
01518
01519
01520 ea
01521 ;
01522 unsigned MATCH_w_16_0;
01523 {
01524 MATCH_w_16_0 = getWord(MATCH_p);
01525
01526 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01527 case 0:
01528 {
01529 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01530
01531
01532 ret = pDDirect(reg2, size);
01533
01534
01535
01536
01537 }
01538
01539 break;
01540 case 1:
01541 {
01542 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01543
01544
01545 ret = pADirect(reg2, size);
01546
01547
01548
01549
01550 }
01551
01552 break;
01553 case 2:
01554 {
01555 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01556
01557
01558 ret = pIndirect(reg2, size);
01559
01560
01561
01562
01563 }
01564
01565 break;
01566 case 3:
01567 {
01568 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01569
01570
01571 ret = pPostInc(reg2, bump, bumpr, size);
01572
01573
01574
01575
01576 }
01577
01578 break;
01579 case 4:
01580 {
01581 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01582
01583
01584 ret = pPreDec(reg2, bump, bumpr, size);
01585
01586
01587
01588
01589 }
01590
01591 break;
01592 case 5: case 6: case 7:
01593
01594
01595 pIllegalMode(pc);
01596
01597
01598
01599
01600 break;
01601 default: assert(0);
01602 }
01603
01604 }goto MATCH_finished_ae;
01605
01606 MATCH_finished_ae: (void)0;
01607
01608 }
01609
01610
01611 return ret;
01612 }
01613
01614 SemStr* NJMCDecoder::awlEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01615 int size)
01616 {
01617 SemStr* ret = new SemStr(size);
01618
01619
01620
01621 {
01622 dword MATCH_p =
01623
01624
01625 ea
01626 ;
01627 unsigned MATCH_w_16_0;
01628 {
01629 MATCH_w_16_0 = getWord(MATCH_p);
01630
01631 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01632 case 0:
01633 {
01634 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01635
01636
01637 ret = pDDirect(reg2, size);
01638
01639
01640
01641
01642 }
01643
01644 break;
01645 case 1:
01646 {
01647 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01648
01649
01650 ret = pADirect(reg2, size);
01651
01652
01653
01654
01655 }
01656
01657 break;
01658 case 2:
01659 {
01660 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01661
01662
01663 ret = pIndirect(reg2, size);
01664
01665
01666
01667
01668 }
01669
01670 break;
01671 case 3:
01672 {
01673 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01674
01675
01676 ret = pPostInc(reg2, bump, bumpr, size);
01677
01678
01679
01680
01681 }
01682
01683 break;
01684 case 4:
01685 {
01686 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01687
01688
01689 ret = pPreDec(reg2, bump, bumpr, size);
01690
01691
01692
01693
01694 }
01695
01696 break;
01697 case 5: case 6: case 7:
01698
01699
01700 pIllegalMode(pc);
01701
01702
01703
01704
01705 break;
01706 default: assert(0);
01707 }
01708
01709 }goto MATCH_finished_zd;
01710
01711 MATCH_finished_zd: (void)0;
01712
01713 }
01714
01715
01716 return ret;
01717 }
01718
01719 SemStr* NJMCDecoder::cEA(ADDRESS ea, ADDRESS pc, int size)
01720 {
01721 SemStr* ret = new SemStr(size);
01722
01723
01724
01725 {
01726 dword MATCH_p =
01727
01728
01729 ea
01730 ;
01731 unsigned MATCH_w_16_0;
01732 {
01733 MATCH_w_16_0 = getWord(MATCH_p);
01734 if ((MATCH_w_16_0 >> 3 & 0x7) == 2) {
01735 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01736
01737
01738 ret = pIndirect(reg2, size);
01739
01740
01741
01742
01743 }
01744 else
01745
01746
01747 pIllegalMode(pc);
01748
01749
01750
01751
01752 }goto MATCH_finished_yd;
01753
01754 MATCH_finished_yd: (void)0;
01755
01756 }
01757
01758
01759 return ret;
01760 }
01761
01762 SemStr* NJMCDecoder::dEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01763 int size)
01764 {
01765 SemStr* ret = new SemStr(size);
01766
01767
01768
01769 {
01770 dword MATCH_p =
01771
01772
01773 ea
01774 ;
01775 unsigned MATCH_w_16_0;
01776 {
01777 MATCH_w_16_0 = getWord(MATCH_p);
01778
01779 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01780 case 0:
01781 {
01782 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01783
01784
01785 ret = pDDirect(reg2, size);
01786
01787
01788
01789
01790 }
01791
01792 break;
01793 case 1: case 5: case 6: case 7:
01794
01795
01796 pIllegalMode(pc);
01797
01798
01799
01800
01801 break;
01802 case 2:
01803 {
01804 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01805
01806
01807 ret = pIndirect(reg2, size);
01808
01809
01810
01811
01812 }
01813
01814 break;
01815 case 3:
01816 {
01817 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01818
01819
01820 ret = pPostInc(reg2, bump, bumpr, size);
01821
01822
01823
01824
01825 }
01826
01827 break;
01828 case 4:
01829 {
01830 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01831
01832
01833 ret = pPreDec(reg2, bump, bumpr, size);
01834
01835
01836
01837
01838 }
01839
01840 break;
01841 default: assert(0);
01842 }
01843
01844 }goto MATCH_finished_xd;
01845
01846 MATCH_finished_xd: (void)0;
01847
01848 }
01849
01850
01851 return ret;
01852 }
01853
01854 SemStr* NJMCDecoder::daEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01855 int size)
01856 {
01857 SemStr* ret = new SemStr(size);
01858
01859
01860
01861 {
01862 dword MATCH_p =
01863
01864
01865 ea
01866 ;
01867 unsigned MATCH_w_16_0;
01868 {
01869 MATCH_w_16_0 = getWord(MATCH_p);
01870
01871 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01872 case 0:
01873 {
01874 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01875
01876
01877 ret = pDDirect(reg2, size);
01878
01879
01880
01881
01882 }
01883
01884 break;
01885 case 1: case 5: case 6: case 7:
01886
01887
01888 pIllegalMode(pc);
01889
01890
01891
01892
01893 break;
01894 case 2:
01895 {
01896 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01897
01898
01899 ret = pIndirect(reg2, size);
01900
01901
01902
01903
01904 }
01905
01906 break;
01907 case 3:
01908 {
01909 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01910
01911
01912 ret = pPostInc(reg2, bump, bumpr, size);
01913
01914
01915
01916
01917 }
01918
01919 break;
01920 case 4:
01921 {
01922 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01923
01924
01925 ret = pPreDec(reg2, bump, bumpr, size);
01926
01927
01928
01929
01930 }
01931
01932 break;
01933 default: assert(0);
01934 }
01935
01936 }goto MATCH_finished_wd;
01937
01938 MATCH_finished_wd: (void)0;
01939
01940 }
01941
01942
01943 return ret;
01944 }
01945
01946 SemStr* NJMCDecoder::dBEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01947 int size)
01948 {
01949 SemStr* ret = new SemStr(size);
01950
01951
01952
01953 {
01954 dword MATCH_p =
01955
01956
01957 ea
01958 ;
01959 unsigned MATCH_w_16_0;
01960 {
01961 MATCH_w_16_0 = getWord(MATCH_p);
01962
01963 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01964 case 0:
01965 {
01966 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01967
01968
01969 ret = pDDirect(reg2, size);
01970
01971
01972
01973
01974 }
01975
01976 break;
01977 case 1: case 5: case 6: case 7:
01978
01979
01980 pIllegalMode(pc);
01981
01982
01983
01984
01985 break;
01986 case 2:
01987 {
01988 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01989
01990
01991 ret = pIndirect(reg2, size);
01992
01993
01994
01995
01996 }
01997
01998 break;
01999 case 3:
02000 {
02001 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02002
02003
02004 ret = pPostInc(reg2, bump, bumpr, size);
02005
02006
02007
02008
02009 }
02010
02011 break;
02012 case 4:
02013 {
02014 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02015
02016
02017 ret = pPreDec(reg2, bump, bumpr, size);
02018
02019
02020
02021
02022 }
02023
02024 break;
02025 default: assert(0);
02026 }
02027
02028 }goto MATCH_finished_vd;
02029
02030 MATCH_finished_vd: (void)0;
02031
02032 }
02033
02034
02035 return ret;
02036 }
02037
02038 SemStr* NJMCDecoder::dWEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02039 int size)
02040 {
02041 SemStr* ret = new SemStr(size);
02042
02043
02044
02045 {
02046 dword MATCH_p =
02047
02048
02049 ea
02050 ;
02051 unsigned MATCH_w_16_0;
02052 {
02053 MATCH_w_16_0 = getWord(MATCH_p);
02054
02055 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
02056 case 0:
02057 {
02058 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02059
02060
02061 ret = pDDirect(reg2, size);
02062
02063
02064
02065
02066 }
02067
02068 break;
02069 case 1: case 5: case 6: case 7:
02070
02071
02072 pIllegalMode(pc);
02073
02074
02075
02076
02077 break;
02078 case 2:
02079 {
02080 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02081
02082
02083 ret = pIndirect(reg2, size);
02084
02085
02086
02087
02088 }
02089
02090 break;
02091 case 3:
02092 {
02093 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02094
02095
02096 ret = pPostInc(reg2, bump, bumpr, size);
02097
02098
02099
02100
02101 }
02102
02103 break;
02104 case 4:
02105 {
02106 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02107
02108
02109 ret = pPreDec(reg2, bump, bumpr, size);
02110
02111
02112
02113
02114 }
02115
02116 break;
02117 default: assert(0);
02118 }
02119
02120 }goto MATCH_finished_ud;
02121
02122 MATCH_finished_ud: (void)0;
02123
02124 }
02125
02126
02127 return ret;
02128 }
02129
02130 SemStr* NJMCDecoder::maEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02131 int size)
02132 {
02133 SemStr* ret = new SemStr(size);
02134
02135
02136
02137 {
02138 dword MATCH_p =
02139
02140
02141 ea
02142 ;
02143 unsigned MATCH_w_16_0;
02144 {
02145 MATCH_w_16_0 = getWord(MATCH_p);
02146
02147 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
02148 case 0: case 1: case 5: case 6: case 7:
02149
02150
02151 pIllegalMode(pc);
02152
02153
02154
02155
02156 break;
02157 case 2:
02158 {
02159 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02160
02161
02162 ret = pIndirect(reg2, size);
02163
02164
02165
02166
02167 }
02168
02169 break;
02170 case 3:
02171 {
02172 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02173
02174
02175 ret = pPostInc(reg2, bump, bumpr, size);
02176
02177
02178
02179
02180 }
02181
02182 break;
02183 case 4:
02184 {
02185 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02186
02187
02188 ret = pPreDec(reg2, bump, bumpr, size);
02189
02190
02191
02192
02193 }
02194
02195 break;
02196 default: assert(0);
02197 }
02198
02199 }goto MATCH_finished_td;
02200
02201 MATCH_finished_td: (void)0;
02202
02203 }
02204
02205
02206 return ret;
02207 }
02208
02209 SemStr* NJMCDecoder::msEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02210 int size)
02211 {
02212 SemStr* ret = new SemStr(size);
02213
02214
02215
02216 {
02217 dword MATCH_p =
02218
02219
02220 ea
02221 ;
02222 unsigned MATCH_w_16_0;
02223 {
02224 MATCH_w_16_0 = getWord(MATCH_p);
02225
02226 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
02227 case 0:
02228 {
02229 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02230
02231
02232 ret = pDDirect(reg2, size);
02233
02234
02235
02236
02237 }
02238
02239 break;
02240 case 1:
02241 {
02242 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02243
02244
02245 ret = pADirect(reg2, size);
02246
02247
02248
02249
02250 }
02251
02252 break;
02253 case 2:
02254 {
02255 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02256
02257
02258 ret = pIndirect(reg2, size);
02259
02260
02261
02262
02263 }
02264
02265 break;
02266 case 3:
02267 {
02268 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02269
02270
02271 ret = pPostInc(reg2, bump, bumpr, size);
02272
02273
02274
02275
02276 }
02277
02278 break;
02279 case 4:
02280 {
02281 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02282
02283
02284 ret = pPreDec(reg2, bump, bumpr, size);
02285
02286
02287
02288
02289 }
02290
02291 break;
02292 case 5: case 6: case 7:
02293
02294
02295 pIllegalMode(pc);
02296
02297
02298
02299
02300 break;
02301 default: assert(0);
02302 }
02303
02304 }goto MATCH_finished_sd;
02305
02306 MATCH_finished_sd: (void)0;
02307
02308 }
02309
02310
02311 return ret;
02312 }
02313
02314 SemStr* NJMCDecoder::mdEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02315 int size)
02316 {
02317 SemStr* ret = new SemStr(size);
02318
02319
02320
02321 {
02322 dword MATCH_p =
02323
02324
02325 ea
02326 ;
02327 unsigned MATCH_w_16_0;
02328 {
02329 MATCH_w_16_0 = getWord(MATCH_p);
02330
02331 switch((MATCH_w_16_0 >> 6 & 0x7) ) {
02332 case 0:
02333 {
02334 unsigned reg1 = (MATCH_w_16_0 >> 9 & 0x7) ;
02335
02336
02337 ret = pDDirect(reg1, size);
02338
02339
02340
02341
02342 }
02343
02344 break;
02345 case 1:
02346 {
02347 unsigned reg1 = (MATCH_w_16_0 >> 9 & 0x7) ;
02348
02349
02350 ret = pADirect(reg1, size);
02351
02352
02353
02354
02355 }
02356
02357 break;
02358 case 2:
02359 {
02360 unsigned reg1 = (MATCH_w_16_0 >> 9 & 0x7) ;
02361
02362
02363 ret = pIndirect(reg1, size);
02364
02365
02366
02367
02368 }
02369
02370 break;
02371 case 3:
02372 {
02373 unsigned reg1 = (MATCH_w_16_0 >> 9 & 0x7) ;
02374
02375
02376 ret = pPostInc(reg1, bump, bumpr, size);
02377
02378
02379
02380
02381 }
02382
02383 break;
02384 case 4:
02385 {
02386 unsigned reg1 = (MATCH_w_16_0 >> 9 & 0x7) ;
02387
02388
02389 ret = pPreDec(reg1, bump, bumpr, size);
02390
02391
02392
02393
02394 }
02395
02396 break;
02397 case 5: case 6: case 7:
02398
02399
02400 pIllegalMode(pc);
02401
02402
02403
02404
02405 break;
02406 default: assert(0);
02407 }
02408
02409 }goto MATCH_finished_rd;
02410
02411 MATCH_finished_rd: (void)0;
02412
02413 }
02414
02415
02416 return ret;
02417 }
02418
02419 SemStr* NJMCDecoder::mrEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02420 int size)
02421 {
02422 SemStr* ret = new SemStr(size);
02423
02424
02425
02426 {
02427 dword MATCH_p =
02428
02429
02430 ea
02431 ;
02432 unsigned MATCH_w_16_0;
02433 {
02434 MATCH_w_16_0 = getWord(MATCH_p);
02435
02436 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
02437 case 0: case 1: case 4: case 5: case 6: case 7:
02438
02439
02440 pIllegalMode(pc);
02441
02442
02443
02444
02445 break;
02446 case 2:
02447 {
02448 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02449
02450
02451 ret = pIndirect(reg2, size);
02452
02453
02454
02455
02456 }
02457
02458 break;
02459 case 3:
02460 {
02461 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02462
02463
02464 ret = pPostInc(reg2, bump, bumpr, size);
02465
02466
02467
02468
02469 }
02470
02471 break;
02472 default: assert(0);
02473 }
02474
02475 }goto MATCH_finished_qd;
02476
02477 MATCH_finished_qd: (void)0;
02478
02479 }
02480
02481
02482 return ret;
02483 }
02484
02485 SemStr* NJMCDecoder::rmEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02486 int size)
02487 {
02488 SemStr* ret = new SemStr(size);
02489
02490
02491
02492 {
02493 dword MATCH_p =
02494
02495
02496 ea
02497 ;
02498 unsigned MATCH_w_16_0;
02499 {
02500 MATCH_w_16_0 = getWord(MATCH_p);
02501
02502 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
02503 case 0: case 1: case 3: case 5: case 6: case 7:
02504
02505
02506 pIllegalMode(pc);
02507
02508
02509
02510
02511 break;
02512 case 2:
02513 {
02514 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02515
02516
02517 ret = pIndirect(reg2, size);
02518
02519
02520
02521
02522 }
02523
02524 break;
02525 case 4:
02526 {
02527 unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
02528
02529
02530 ret = pPreDec(reg2, bump, bumpr, size);
02531
02532
02533
02534
02535 }
02536
02537 break;
02538 default: assert(0);
02539 }
02540
02541 }goto MATCH_finished_pd;
02542
02543 MATCH_finished_pd: (void)0;
02544
02545 }
02546
02547
02548 return ret;
02549 }
02550
02551
02552 SemStr* NJMCDecoder::pADisp(int d16, int r, int size)
02553 {
02554 SemStr* ret = new SemStr(size);
02555
02556 ret->push(idMemOf); ret->push(idPlus); ret->push(idRegOf);
02557 ret->push(idIntConst); ret->push(r+8);
02558 ret->push(idIntConst); ret->push(d16);
02559 return ret;
02560 }
02561
02562 SemStr* NJMCDecoder::pAIndex(int d8, int r, int iT, int iR, int iS, int size)
02563 {
02564 SemStr* ret = new SemStr(size);
02565
02566
02567 ret->push(idMemOf); ret->push(idPlus); ret->push(idPlus);
02568 ret->push(idRegOf); ret->push(idIntConst); ret->push(r+8);
02569 ret->push(idSignExt);
02570 ret->push(idSize); ret->push(iS == 0 ? 16 : 32);
02571 ret->push(idRegOf); ret->push(idIntConst); ret->push((iT<<3) + iR);
02572 ret->push(idIntConst); ret->push(d8);
02573 return ret;
02574 }
02575
02576 SemStr* NJMCDecoder::pPcDisp(ADDRESS label, int delta, int size)
02577 {
02578
02579 SemStr* ret = new SemStr(size);
02580
02581
02582
02583
02584 ret->push(idMemOf); ret->push(idCodeAddr);
02585 ret->push(label - delta);
02586 return ret;
02587 }
02588
02589 SemStr* NJMCDecoder::pPcIndex(int d8, int iT, int iR, int iS, ADDRESS nextPc, int size)
02590 {
02591
02592 SemStr* ret = new SemStr(size);
02593
02594
02595 ret->push(idMemOf); ret->push(idPlus);
02596 ret->push(idIntConst); ret->push(nextPc+d8);
02597 ret->push(idSignExt);
02598 ret->push(idSize); ret->push(iS == 0 ? 16 : 32);
02599 ret->push(idRegOf); ret->push(idIntConst); ret->push((iT<<3) + iR);
02600 return ret;
02601 }
02602
02603 SemStr* NJMCDecoder::pAbsW(int d16, int size)
02604 {
02605
02606
02607 SemStr* ret = new SemStr(size);
02608 ret->push(idSize); ret->push(size);
02609 ret->push(idMemOf); ret->push(idIntConst); ret->push(d16);
02610 return ret;
02611 }
02612
02613 SemStr* NJMCDecoder::pAbsL(int d32, int size)
02614 {
02615
02616 SemStr* ret = new SemStr(size);
02617 ret->push(idSize); ret->push(size);
02618 ret->push(idMemOf); ret->push(idIntConst); ret->push(d32);
02619 return ret;
02620 }
02621
02622 SemStr* NJMCDecoder::pImmB(int d8)
02623 {
02624
02625
02626 SemStr* ret = new SemStr(8);
02627 ret->push(idIntConst); ret->push(d8);
02628 return ret;
02629 }
02630
02631 SemStr* NJMCDecoder::pImmW(int d16)
02632 {
02633
02634
02635 SemStr* ret = new SemStr(16);
02636 ret->push(idIntConst); ret->push(d16);
02637 return ret;
02638 }
02639
02640 SemStr* NJMCDecoder::pImmL(int d32)
02641 {
02642 SemStr* ret = new SemStr(32);
02643 ret->push(idIntConst); ret->push(d32);
02644 return ret;
02645 }
02646
02647 void NJMCDecoder::pNonzeroByte(ADDRESS pc)
02648 {
02649 ostrstream ost;
02650 ost << "Non zero upper byte at " << hex << pc;
02651 error(str(ost));
02652 }
02653
02654
02655 SemStr* NJMCDecoder::alEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
02656 ADDRESS pc, int size)
02657 {
02658 SemStr* ret;
02659 int reg2, mode;
02660
02661
02662
02663
02664 {
02665 dword MATCH_p =
02666
02667
02668 eax
02669 ;
02670 unsigned MATCH_w_16_0;
02671 {
02672 MATCH_w_16_0 = getWord(MATCH_p);
02673
02674 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
02675 case 0: case 1: case 2: case 3: case 4:
02676 goto MATCH_label_od0; break;
02677 case 5:
02678 {
02679 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
02680
02681
02682 { mode = 0; reg2 = r2; result.numBytes += 2;}
02683
02684
02685
02686
02687 }
02688
02689 break;
02690 case 6:
02691 {
02692 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
02693
02694
02695 { mode = 1; reg2 = r2; result.numBytes += 2;}
02696
02697
02698
02699
02700 }
02701
02702 break;
02703 case 7:
02704
02705 switch((MATCH_w_16_0 & 0x7) ) {
02706 case 0:
02707
02708
02709 { mode = 4; result.numBytes += 2;}
02710
02711
02712
02713
02714 break;
02715 case 1:
02716
02717
02718 { mode = 5; result.numBytes += 4;}
02719
02720
02721
02722
02723 break;
02724 case 2: case 3: case 4: case 5: case 6: case 7:
02725 goto MATCH_label_od0; break;
02726 default: assert(0);
02727 }
02728 break;
02729 default: assert(0);
02730 }
02731
02732 }goto MATCH_finished_od;
02733
02734 MATCH_label_od0: (void)0;
02735
02736
02737 pIllegalMode(pc);
02738
02739
02740
02741 goto MATCH_finished_od;
02742
02743 MATCH_finished_od: (void)0;
02744
02745 }
02746
02747
02748
02749 switch (mode) {
02750 case 0 : {
02751
02752
02753
02754 {
02755 dword MATCH_p =
02756
02757
02758 x
02759 ;
02760 unsigned MATCH_w_16_0;
02761 {
02762 MATCH_w_16_0 = getWord(MATCH_p);
02763 {
02764 int d16 =
02765 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
02766
02767
02768 ret = pADisp(d16, reg2, size);
02769
02770
02771
02772
02773 }
02774
02775 }goto MATCH_finished_nd;
02776
02777 MATCH_finished_nd: (void)0;
02778
02779 }
02780
02781
02782 break;
02783 }
02784 case 1 : {
02785
02786
02787
02788 {
02789 dword MATCH_p =
02790
02791
02792 x
02793 ;
02794 unsigned MATCH_w_16_0;
02795 {
02796 MATCH_w_16_0 = getWord(MATCH_p);
02797 {
02798 int d8 =
02799 sign_extend((MATCH_w_16_0 & 0xff) , 8);
02800 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
02801 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
02802 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
02803
02804
02805 ret = pAIndex(d8, reg2, iT, iR, iS, size);
02806
02807
02808
02809
02810 }
02811
02812 }goto MATCH_finished_md;
02813
02814 MATCH_finished_md: (void)0;
02815
02816 }
02817
02818
02819 break;
02820 }
02821 case 4 : {
02822
02823
02824
02825 {
02826 dword MATCH_p =
02827
02828
02829 x
02830 ;
02831 unsigned MATCH_w_16_0;
02832 {
02833 MATCH_w_16_0 = getWord(MATCH_p);
02834 {
02835 int d16 =
02836 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
02837
02838
02839 ret = pAbsW(d16, size);
02840
02841
02842
02843
02844 }
02845
02846 }goto MATCH_finished_ld;
02847
02848 MATCH_finished_ld: (void)0;
02849
02850 }
02851
02852
02853 break;
02854 }
02855 case 5 : {
02856
02857
02858
02859 {
02860 dword MATCH_p =
02861
02862
02863 x
02864 ;
02865 unsigned MATCH_w_16_0;
02866 unsigned MATCH_w_16_16;
02867 {
02868 MATCH_w_16_0 = getWord(MATCH_p);
02869 MATCH_w_16_16 = getWord(2 + MATCH_p);
02870 {
02871 unsigned d32 =
02872 ((MATCH_w_16_0 & 0xffff) << 16) +
02873 (MATCH_w_16_16 & 0xffff) ;
02874
02875
02876 ret = pAbsL(d32, size);
02877
02878
02879
02880
02881 }
02882
02883 }goto MATCH_finished_kd;
02884
02885 MATCH_finished_kd: (void)0;
02886
02887 }
02888
02889
02890 break;
02891 }
02892 default : pIllegalMode(pc); break;
02893 }
02894 return ret;
02895 }
02896
02897
02898 SemStr* NJMCDecoder::amEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
02899 ADDRESS pc, int delta, int size)
02900 {
02901 SemStr* ret;
02902 int reg2, mode;
02903
02904
02905
02906
02907 {
02908 dword MATCH_p =
02909
02910
02911 eax
02912 ;
02913 unsigned MATCH_w_16_0;
02914 {
02915 MATCH_w_16_0 = getWord(MATCH_p);
02916
02917 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
02918 case 0: case 1: case 2: case 3: case 4:
02919 goto MATCH_label_jd0; break;
02920 case 5:
02921 {
02922 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
02923
02924
02925 { mode = 0; reg2 = r2; result.numBytes += 2;}
02926
02927
02928
02929
02930 }
02931
02932 break;
02933 case 6:
02934 {
02935 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
02936
02937
02938 { mode = 1; reg2 = r2; result.numBytes += 2;}
02939
02940
02941
02942
02943 }
02944
02945 break;
02946 case 7:
02947
02948 switch((MATCH_w_16_0 & 0x7) ) {
02949 case 0:
02950
02951
02952 { mode = 4; result.numBytes += 2;}
02953
02954
02955
02956
02957 break;
02958 case 1:
02959
02960
02961 { mode = 5; result.numBytes += 4;}
02962
02963
02964
02965
02966 break;
02967 case 2:
02968
02969
02970 { mode = 2; result.numBytes += 2;}
02971
02972
02973
02974
02975 break;
02976 case 3:
02977
02978
02979 { mode = 3; result.numBytes += 2;}
02980
02981
02982
02983
02984 break;
02985 case 4:
02986
02987 switch((MATCH_w_16_0 >> 6 & 0x3) ) {
02988 case 0:
02989
02990
02991 { mode = 6; result.numBytes += 2;}
02992
02993
02994
02995
02996 break;
02997 case 1:
02998
02999
03000 { mode = 7; result.numBytes += 2;}
03001
03002
03003
03004
03005 break;
03006 case 2:
03007
03008
03009 { mode = 8; result.numBytes += 4;}
03010
03011
03012
03013
03014 break;
03015 case 3:
03016 goto MATCH_label_jd0; break;
03017 default: assert(0);
03018 }
03019 break;
03020 case 5: case 6: case 7:
03021 goto MATCH_label_jd0; break;
03022 default: assert(0);
03023 }
03024 break;
03025 default: assert(0);
03026 }
03027
03028 }goto MATCH_finished_jd;
03029
03030 MATCH_label_jd0: (void)0;
03031
03032
03033 pIllegalMode(pc);
03034
03035
03036
03037 goto MATCH_finished_jd;
03038
03039 MATCH_finished_jd: (void)0;
03040
03041 }
03042
03043
03044
03045 switch (mode) {
03046 case 0 : {
03047
03048
03049
03050 {
03051 dword MATCH_p =
03052
03053
03054 x
03055 ;
03056 unsigned MATCH_w_16_0;
03057 {
03058 MATCH_w_16_0 = getWord(MATCH_p);
03059 {
03060 int d16 =
03061 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
03062
03063
03064 ret = pADisp(d16, reg2, size);
03065
03066
03067
03068
03069 }
03070
03071 }goto MATCH_finished_id;
03072
03073 MATCH_finished_id: (void)0;
03074
03075 }
03076
03077
03078 break;
03079 }
03080 case 1 : {
03081
03082
03083
03084 {
03085 dword MATCH_p =
03086
03087
03088 x
03089 ;
03090 unsigned MATCH_w_16_0;
03091 {
03092 MATCH_w_16_0 = getWord(MATCH_p);
03093 {
03094 int d8 =
03095 sign_extend((MATCH_w_16_0 & 0xff) , 8);
03096 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
03097 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
03098 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
03099
03100
03101 ret = pAIndex(d8, reg2, iT, iR, iS, size);
03102
03103
03104
03105
03106 }
03107
03108 }goto MATCH_finished_hd;
03109
03110 MATCH_finished_hd: (void)0;
03111
03112 }
03113
03114
03115 break;
03116 }
03117 case 2 : {
03118
03119
03120
03121 {
03122 dword MATCH_p =
03123
03124
03125 x
03126 ;
03127 unsigned MATCH_w_16_0;
03128 {
03129 MATCH_w_16_0 = getWord(MATCH_p);
03130 {
03131 unsigned d16 =
03132 sign_extend((MATCH_w_16_0 & 0xffff) , 16) +
03133 addressToPC(MATCH_p);
03134
03135
03136 ret = pPcDisp(d16, delta, size);
03137
03138
03139
03140
03141 }
03142
03143 }goto MATCH_finished_gd;
03144
03145 MATCH_finished_gd: (void)0;
03146
03147 }
03148
03149
03150 break;
03151 }
03152 case 3 : {
03153
03154
03155
03156 {
03157 dword MATCH_p =
03158
03159
03160 x
03161 ;
03162 unsigned MATCH_w_16_0;
03163 {
03164 MATCH_w_16_0 = getWord(MATCH_p);
03165 {
03166 int d8 =
03167 sign_extend((MATCH_w_16_0 & 0xff) , 8);
03168 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
03169 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
03170 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
03171
03172
03173
03174
03175 ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
03176
03177
03178
03179
03180 }
03181
03182 }goto MATCH_finished_fd;
03183
03184 MATCH_finished_fd: (void)0;
03185
03186 }
03187
03188
03189 break;
03190 }
03191 case 4 : {
03192
03193
03194
03195 {
03196 dword MATCH_p =
03197
03198
03199 x
03200 ;
03201 unsigned MATCH_w_16_0;
03202 {
03203 MATCH_w_16_0 = getWord(MATCH_p);
03204 {
03205 int d16 =
03206 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
03207
03208
03209 ret = pAbsW(d16, size);
03210
03211
03212
03213
03214 }
03215
03216 }goto MATCH_finished_ed;
03217
03218 MATCH_finished_ed: (void)0;
03219
03220 }
03221
03222
03223 break;
03224 }
03225 case 5 : {
03226
03227
03228
03229 {
03230 dword MATCH_p =
03231
03232
03233 x
03234 ;
03235 unsigned MATCH_w_16_0;
03236 unsigned MATCH_w_16_16;
03237 {
03238 MATCH_w_16_0 = getWord(MATCH_p);
03239 MATCH_w_16_16 = getWord(2 + MATCH_p);
03240 {
03241 unsigned d32 =
03242 ((MATCH_w_16_0 & 0xffff) << 16) +
03243 (MATCH_w_16_16 & 0xffff) ;
03244
03245
03246 ret = pAbsL(d32, size);
03247
03248
03249
03250
03251 }
03252
03253 }goto MATCH_finished_dd;
03254
03255 MATCH_finished_dd: (void)0;
03256
03257 }
03258
03259
03260 break;
03261 }
03262 case 6 : {
03263
03264
03265
03266 {
03267 dword MATCH_p =
03268
03269
03270 x
03271 ;
03272 unsigned MATCH_w_16_0;
03273 {
03274 MATCH_w_16_0 = getWord(MATCH_p);
03275 if ((MATCH_w_16_0 >> 12 & 0x7) == 0 &&
03276 (MATCH_w_16_0 >> 11 & 0x1) == 0 &&
03277 (MATCH_w_16_0 >> 15 & 0x1) == 0 &&
03278 (1 <= (MATCH_w_16_0 >> 8 & 0x7) &&
03279 (MATCH_w_16_0 >> 8 & 0x7) < 8) ||
03280 (MATCH_w_16_0 >> 12 & 0x7) == 0 &&
03281 (MATCH_w_16_0 >> 11 & 0x1) == 0 &&
03282 (MATCH_w_16_0 >> 15 & 0x1) == 1 ||
03283 (MATCH_w_16_0 >> 12 & 0x7) == 0 &&
03284 (MATCH_w_16_0 >> 11 & 0x1) == 1 ||
03285 1 <= (MATCH_w_16_0 >> 12 & 0x7) &&
03286 (MATCH_w_16_0 >> 12 & 0x7) < 8)
03287 goto MATCH_label_cd0;
03288 else {
03289 unsigned d8 = (MATCH_w_16_0 & 0xff) ;
03290
03291
03292 ret = pImmB(d8);
03293
03294
03295
03296
03297 }
03298
03299 }goto MATCH_finished_cd;
03300
03301 MATCH_label_cd0: (void)0;
03302
03303
03304 pNonzeroByte(pc);
03305
03306
03307
03308 goto MATCH_finished_cd;
03309
03310 MATCH_finished_cd: (void)0;
03311
03312 }
03313
03314
03315 break;
03316 }
03317 case 7 : {
03318
03319
03320
03321 {
03322 dword MATCH_p =
03323
03324
03325 x
03326 ;
03327 unsigned MATCH_w_16_0;
03328 {
03329 MATCH_w_16_0 = getWord(MATCH_p);
03330 {
03331 unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
03332
03333
03334 ret = pImmW(d16);
03335
03336
03337
03338
03339 }
03340
03341 }goto MATCH_finished_bd;
03342
03343 MATCH_finished_bd: (void)0;
03344
03345 }
03346
03347
03348 break;
03349 }
03350 case 8 : {
03351
03352
03353
03354 {
03355 dword MATCH_p =
03356
03357
03358 x
03359 ;
03360 unsigned MATCH_w_16_0;
03361 unsigned MATCH_w_16_16;
03362 {
03363 MATCH_w_16_0 = getWord(MATCH_p);
03364 MATCH_w_16_16 = getWord(2 + MATCH_p);
03365 {
03366 unsigned d32 =
03367 ((MATCH_w_16_0 & 0xffff) << 16) +
03368 (MATCH_w_16_16 & 0xffff) ;
03369
03370
03371 ret = pImmL(d32);
03372
03373
03374
03375
03376 }
03377
03378 }goto MATCH_finished_ad;
03379
03380 MATCH_finished_ad: (void)0;
03381
03382 }
03383
03384
03385 break;
03386 }
03387 default : pIllegalMode(pc); break;
03388 }
03389 return ret;
03390 }
03391
03392
03393 SemStr* NJMCDecoder::awlEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
03394 ADDRESS pc, int delta, int size)
03395 {
03396 SemStr* ret;
03397 int reg2, mode;
03398
03399
03400
03401
03402 {
03403 dword MATCH_p =
03404
03405
03406 eax
03407 ;
03408 unsigned MATCH_w_16_0;
03409 {
03410 MATCH_w_16_0 = getWord(MATCH_p);
03411
03412 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
03413 case 0: case 1: case 2: case 3: case 4:
03414 goto MATCH_label_zc0; break;
03415 case 5:
03416 {
03417 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
03418
03419
03420 { mode = 0; reg2 = r2; result.numBytes += 2;}
03421
03422
03423
03424
03425 }
03426
03427 break;
03428 case 6:
03429 {
03430 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
03431
03432
03433 { mode = 1; reg2 = r2; result.numBytes += 2;}
03434
03435
03436
03437
03438 }
03439
03440 break;
03441 case 7:
03442
03443 switch((MATCH_w_16_0 & 0x7) ) {
03444 case 0:
03445
03446
03447 { mode = 4; result.numBytes += 2;}
03448
03449
03450
03451
03452 break;
03453 case 1:
03454
03455
03456 { mode = 5; result.numBytes += 4;}
03457
03458
03459
03460
03461 break;
03462 case 2:
03463
03464
03465 { mode = 2; result.numBytes += 2;}
03466
03467
03468
03469
03470 break;
03471 case 3:
03472
03473
03474 { mode = 3; result.numBytes += 2;}
03475
03476
03477
03478
03479 break;
03480 case 4:
03481 if ((MATCH_w_16_0 >> 8 & 0x1) == 1)
03482
03483
03484 { mode = 8; result.numBytes += 4;}
03485
03486
03487
03488 else
03489
03490
03491 { mode = 7; result.numBytes += 2;}
03492
03493
03494
03495
03496 break;
03497 case 5: case 6: case 7:
03498 goto MATCH_label_zc0; break;
03499 default: assert(0);
03500 }
03501 break;
03502 default: assert(0);
03503 }
03504
03505 }goto MATCH_finished_zc;
03506
03507 MATCH_label_zc0: (void)0;
03508
03509
03510 pIllegalMode(pc);
03511
03512
03513
03514 goto MATCH_finished_zc;
03515
03516 MATCH_finished_zc: (void)0;
03517
03518 }
03519
03520
03521
03522 switch (mode) {
03523 case 0 : {
03524
03525
03526
03527 {
03528 dword MATCH_p =
03529
03530
03531 x
03532 ;
03533 unsigned MATCH_w_16_0;
03534 {
03535 MATCH_w_16_0 = getWord(MATCH_p);
03536 {
03537 int d16 =
03538 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
03539
03540
03541 ret = pADisp(d16, reg2, size);
03542
03543
03544
03545
03546 }
03547
03548 }goto MATCH_finished_yc;
03549
03550 MATCH_finished_yc: (void)0;
03551
03552 }
03553
03554
03555 break;
03556 }
03557 case 1 : {
03558
03559
03560
03561 {
03562 dword MATCH_p =
03563
03564
03565 x
03566 ;
03567 unsigned MATCH_w_16_0;
03568 {
03569 MATCH_w_16_0 = getWord(MATCH_p);
03570 {
03571 int d8 =
03572 sign_extend((MATCH_w_16_0 & 0xff) , 8);
03573 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
03574 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
03575 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
03576
03577
03578 ret = pAIndex(d8, reg2, iT, iR, iS, size);
03579
03580
03581
03582
03583 }
03584
03585 }goto MATCH_finished_xc;
03586
03587 MATCH_finished_xc: (void)0;
03588
03589 }
03590
03591
03592 break;
03593 }
03594 case 2 : {
03595
03596
03597
03598 {
03599 dword MATCH_p =
03600
03601
03602 x
03603 ;
03604 unsigned MATCH_w_16_0;
03605 {
03606 MATCH_w_16_0 = getWord(MATCH_p);
03607 {
03608 unsigned d16 =
03609 sign_extend((MATCH_w_16_0 & 0xffff) , 16) +
03610 addressToPC(MATCH_p);
03611
03612
03613 ret = pPcDisp(d16, delta, size);
03614
03615
03616
03617
03618 }
03619
03620 }goto MATCH_finished_wc;
03621
03622 MATCH_finished_wc: (void)0;
03623
03624 }
03625
03626
03627 break;
03628 }
03629 case 3 : {
03630
03631
03632
03633 {
03634 dword MATCH_p =
03635
03636
03637 x
03638 ;
03639 unsigned MATCH_w_16_0;
03640 {
03641 MATCH_w_16_0 = getWord(MATCH_p);
03642 {
03643 int d8 =
03644 sign_extend((MATCH_w_16_0 & 0xff) , 8);
03645 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
03646 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
03647 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
03648
03649
03650
03651
03652 ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
03653
03654
03655
03656
03657 }
03658
03659 }goto MATCH_finished_vc;
03660
03661 MATCH_finished_vc: (void)0;
03662
03663 }
03664
03665
03666 break;
03667 }
03668 case 4 : {
03669
03670
03671
03672 {
03673 dword MATCH_p =
03674
03675
03676 x
03677 ;
03678 unsigned MATCH_w_16_0;
03679 {
03680 MATCH_w_16_0 = getWord(MATCH_p);
03681 {
03682 int d16 =
03683 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
03684
03685
03686 ret = pAbsW(d16, size);
03687
03688
03689
03690
03691 }
03692
03693 }goto MATCH_finished_uc;
03694
03695 MATCH_finished_uc: (void)0;
03696
03697 }
03698
03699
03700 break;
03701 }
03702 case 5 : {
03703
03704
03705
03706 {
03707 dword MATCH_p =
03708
03709
03710 x
03711 ;
03712 unsigned MATCH_w_16_0;
03713 unsigned MATCH_w_16_16;
03714 {
03715 MATCH_w_16_0 = getWord(MATCH_p);
03716 MATCH_w_16_16 = getWord(2 + MATCH_p);
03717 {
03718 unsigned d32 =
03719 ((MATCH_w_16_0 & 0xffff) << 16) +
03720 (MATCH_w_16_16 & 0xffff) ;
03721
03722
03723 ret = pAbsL(d32, size);
03724
03725
03726
03727
03728 }
03729
03730 }goto MATCH_finished_tc;
03731
03732 MATCH_finished_tc: (void)0;
03733
03734 }
03735
03736
03737 break;
03738 }
03739 case 7 : {
03740
03741
03742
03743 {
03744 dword MATCH_p =
03745
03746
03747 x
03748 ;
03749 unsigned MATCH_w_16_0;
03750 {
03751 MATCH_w_16_0 = getWord(MATCH_p);
03752 {
03753 unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
03754
03755
03756 ret = pImmW(d16);
03757
03758
03759
03760
03761 }
03762
03763 }goto MATCH_finished_sc;
03764
03765 MATCH_finished_sc: (void)0;
03766
03767 }
03768
03769
03770 break;
03771 }
03772 case 8 : {
03773
03774
03775
03776 {
03777 dword MATCH_p =
03778
03779
03780 x
03781 ;
03782 unsigned MATCH_w_16_0;
03783 unsigned MATCH_w_16_16;
03784 {
03785 MATCH_w_16_0 = getWord(MATCH_p);
03786 MATCH_w_16_16 = getWord(2 + MATCH_p);
03787 {
03788 unsigned d32 =
03789 ((MATCH_w_16_0 & 0xffff) << 16) +
03790 (MATCH_w_16_16 & 0xffff) ;
03791
03792
03793 ret = pImmL(d32);
03794
03795
03796
03797
03798 }
03799
03800 }goto MATCH_finished_rc;
03801
03802 MATCH_finished_rc: (void)0;
03803
03804 }
03805
03806
03807 break;
03808 }
03809 default : pIllegalMode(pc); break;
03810 }
03811 return ret;
03812 }
03813
03814
03815 SemStr* NJMCDecoder::cEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
03816 ADDRESS pc, int delta, int size)
03817 {
03818 SemStr* ret;
03819 int reg2, mode;
03820
03821
03822
03823
03824 {
03825 dword MATCH_p =
03826
03827
03828 eax
03829 ;
03830 unsigned MATCH_w_16_0;
03831 {
03832 MATCH_w_16_0 = getWord(MATCH_p);
03833
03834 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
03835 case 0: case 1: case 2: case 3: case 4:
03836 goto MATCH_label_qc0; break;
03837 case 5:
03838 {
03839 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
03840
03841
03842 { mode = 0; reg2 = r2; result.numBytes += 2;}
03843
03844
03845
03846
03847 }
03848
03849 break;
03850 case 6:
03851 {
03852 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
03853
03854
03855 { mode = 1; reg2 = r2; result.numBytes += 2;}
03856
03857
03858
03859
03860 }
03861
03862 break;
03863 case 7:
03864
03865 switch((MATCH_w_16_0 & 0x7) ) {
03866 case 0:
03867
03868
03869 { mode = 4; result.numBytes += 2;}
03870
03871
03872
03873
03874 break;
03875 case 1:
03876
03877
03878 { mode = 5; result.numBytes += 4;}
03879
03880
03881
03882
03883 break;
03884 case 2:
03885
03886
03887 { mode = 2; result.numBytes += 2;}
03888
03889
03890
03891
03892 break;
03893 case 3:
03894
03895
03896 { mode = 3; result.numBytes += 2;}
03897
03898
03899
03900
03901 break;
03902 case 4: case 5: case 6: case 7:
03903 goto MATCH_label_qc0; break;
03904 default: assert(0);
03905 }
03906 break;
03907 default: assert(0);
03908 }
03909
03910 }goto MATCH_finished_qc;
03911
03912 MATCH_label_qc0: (void)0;
03913
03914
03915 pIllegalMode(pc);
03916
03917
03918
03919 goto MATCH_finished_qc;
03920
03921 MATCH_finished_qc: (void)0;
03922
03923 }
03924
03925
03926
03927 switch (mode) {
03928 case 0 : {
03929
03930
03931
03932 {
03933 dword MATCH_p =
03934
03935
03936 x
03937 ;
03938 unsigned MATCH_w_16_0;
03939 {
03940 MATCH_w_16_0 = getWord(MATCH_p);
03941 {
03942 int d16 =
03943 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
03944
03945
03946 ret = pADisp(d16, reg2, size);
03947
03948
03949
03950
03951 }
03952
03953 }goto MATCH_finished_pc;
03954
03955 MATCH_finished_pc: (void)0;
03956
03957 }
03958
03959
03960 break;
03961 }
03962 case 1 : {
03963
03964
03965
03966 {
03967 dword MATCH_p =
03968
03969
03970 x
03971 ;
03972 unsigned MATCH_w_16_0;
03973 {
03974 MATCH_w_16_0 = getWord(MATCH_p);
03975 {
03976 int d8 =
03977 sign_extend((MATCH_w_16_0 & 0xff) , 8);
03978 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
03979 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
03980 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
03981
03982
03983 ret = pAIndex(d8, reg2, iT, iR, iS, size);
03984
03985
03986
03987
03988 }
03989
03990 }goto MATCH_finished_oc;
03991
03992 MATCH_finished_oc: (void)0;
03993
03994 }
03995
03996
03997 break;
03998 }
03999 case 2 : {
04000
04001
04002
04003 {
04004 dword MATCH_p =
04005
04006
04007 x
04008 ;
04009 unsigned MATCH_w_16_0;
04010 {
04011 MATCH_w_16_0 = getWord(MATCH_p);
04012 {
04013 unsigned label =
04014 sign_extend((MATCH_w_16_0 & 0xffff) , 16) +
04015 addressToPC(MATCH_p);
04016
04017
04018 ret = pPcDisp(label, delta, size);
04019
04020
04021
04022
04023 }
04024
04025 }goto MATCH_finished_nc;
04026
04027 MATCH_finished_nc: (void)0;
04028
04029 }
04030
04031
04032 break;
04033 }
04034 case 3 : {
04035
04036
04037
04038 {
04039 dword MATCH_p =
04040
04041
04042 x
04043 ;
04044 unsigned MATCH_w_16_0;
04045 {
04046 MATCH_w_16_0 = getWord(MATCH_p);
04047 {
04048 int d8 =
04049 sign_extend((MATCH_w_16_0 & 0xff) , 8);
04050 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
04051 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
04052 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
04053
04054
04055 ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
04056
04057
04058
04059
04060 }
04061
04062 }goto MATCH_finished_mc;
04063
04064 MATCH_finished_mc: (void)0;
04065
04066 }
04067
04068
04069 break;
04070 }
04071 case 4 : {
04072
04073
04074
04075 {
04076 dword MATCH_p =
04077
04078
04079 x
04080 ;
04081 unsigned MATCH_w_16_0;
04082 {
04083 MATCH_w_16_0 = getWord(MATCH_p);
04084 {
04085 int d16 =
04086 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
04087
04088
04089 ret = pAbsW(d16, size);
04090
04091
04092
04093
04094 }
04095
04096 }goto MATCH_finished_lc;
04097
04098 MATCH_finished_lc: (void)0;
04099
04100 }
04101
04102
04103 break;
04104 }
04105 case 5 : {
04106
04107
04108
04109 {
04110 dword MATCH_p =
04111
04112
04113 x
04114 ;
04115 unsigned MATCH_w_16_0;
04116 unsigned MATCH_w_16_16;
04117 {
04118 MATCH_w_16_0 = getWord(MATCH_p);
04119 MATCH_w_16_16 = getWord(2 + MATCH_p);
04120 {
04121 unsigned d32 =
04122 ((MATCH_w_16_0 & 0xffff) << 16) +
04123 (MATCH_w_16_16 & 0xffff) ;
04124
04125
04126 ret = pAbsL(d32, size);
04127
04128
04129
04130
04131 }
04132
04133 }goto MATCH_finished_kc;
04134
04135 MATCH_finished_kc: (void)0;
04136
04137 }
04138
04139
04140 break;
04141 }
04142 default : pIllegalMode(pc); break;
04143 }
04144 return ret;
04145 }
04146
04147
04148 SemStr* NJMCDecoder::dEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
04149 ADDRESS pc, int delta, int size)
04150 {
04151 SemStr* ret;
04152 int reg2, mode;
04153
04154
04155
04156
04157 {
04158 dword MATCH_p =
04159
04160
04161 eax
04162 ;
04163 unsigned MATCH_w_16_0;
04164 {
04165 MATCH_w_16_0 = getWord(MATCH_p);
04166
04167 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
04168 case 0: case 1: case 2: case 3: case 4:
04169 goto MATCH_label_jc0; break;
04170 case 5:
04171 {
04172 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
04173
04174
04175 { mode = 0; reg2 = r2; result.numBytes += 2;}
04176
04177
04178
04179
04180 }
04181
04182 break;
04183 case 6:
04184 {
04185 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
04186
04187
04188 { mode = 1; reg2 = r2; result.numBytes += 2;}
04189
04190
04191
04192
04193 }
04194
04195 break;
04196 case 7:
04197
04198 switch((MATCH_w_16_0 & 0x7) ) {
04199 case 0:
04200
04201
04202 { mode = 4; result.numBytes += 2;}
04203
04204
04205
04206
04207 break;
04208 case 1:
04209
04210
04211 { mode = 5; result.numBytes += 4;}
04212
04213
04214
04215
04216 break;
04217 case 2:
04218
04219
04220 { mode = 2; result.numBytes += 2;}
04221
04222
04223
04224
04225 break;
04226 case 3:
04227
04228
04229 { mode = 3; result.numBytes += 2;}
04230
04231
04232
04233
04234 break;
04235 case 4:
04236
04237 switch((MATCH_w_16_0 >> 6 & 0x3) ) {
04238 case 0:
04239
04240
04241 { mode = 6; result.numBytes += 2;}
04242
04243
04244
04245
04246 break;
04247 case 1:
04248
04249
04250 { mode = 7; result.numBytes += 2;}
04251
04252
04253
04254
04255 break;
04256 case 2:
04257
04258
04259 { mode = 8; result.numBytes += 4;}
04260
04261
04262
04263
04264 break;
04265 case 3:
04266 goto MATCH_label_jc0; break;
04267 default: assert(0);
04268 }
04269 break;
04270 case 5: case 6: case 7:
04271 goto MATCH_label_jc0; break;
04272 default: assert(0);
04273 }
04274 break;
04275 default: assert(0);
04276 }
04277
04278 }goto MATCH_finished_jc;
04279
04280 MATCH_label_jc0: (void)0;
04281
04282
04283 pIllegalMode(pc);
04284
04285
04286
04287 goto MATCH_finished_jc;
04288
04289 MATCH_finished_jc: (void)0;
04290
04291 }
04292
04293
04294
04295 switch (mode) {
04296 case 0 : {
04297
04298
04299
04300 {
04301 dword MATCH_p =
04302
04303
04304 x
04305 ;
04306 unsigned MATCH_w_16_0;
04307 {
04308 MATCH_w_16_0 = getWord(MATCH_p);
04309 {
04310 int d16 =
04311 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
04312
04313
04314 ret = pADisp(d16, reg2, size);
04315
04316
04317
04318
04319 }
04320
04321 }goto MATCH_finished_ic;
04322
04323 MATCH_finished_ic: (void)0;
04324
04325 }
04326
04327
04328 break;
04329 }
04330 case 1 : {
04331
04332
04333
04334 {
04335 dword MATCH_p =
04336
04337
04338 x
04339 ;
04340 unsigned MATCH_w_16_0;
04341 {
04342 MATCH_w_16_0 = getWord(MATCH_p);
04343 {
04344 int d8 =
04345 sign_extend((MATCH_w_16_0 & 0xff) , 8);
04346 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
04347 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
04348 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
04349
04350
04351 ret = pAIndex(d8, reg2, iT, iR, iS, size);
04352
04353
04354
04355
04356 }
04357
04358 }goto MATCH_finished_hc;
04359
04360 MATCH_finished_hc: (void)0;
04361
04362 }
04363
04364
04365 break;
04366 }
04367 case 2 : {
04368
04369
04370
04371 {
04372 dword MATCH_p =
04373
04374
04375 x
04376 ;
04377 unsigned MATCH_w_16_0;
04378 {
04379 MATCH_w_16_0 = getWord(MATCH_p);
04380 {
04381 unsigned label =
04382 sign_extend((MATCH_w_16_0 & 0xffff) , 16) +
04383 addressToPC(MATCH_p);
04384
04385
04386 ret = pPcDisp(label, delta, size);
04387
04388
04389
04390
04391 }
04392
04393 }goto MATCH_finished_gc;
04394
04395 MATCH_finished_gc: (void)0;
04396
04397 }
04398
04399
04400 break;
04401 }
04402 case 3 : {
04403
04404
04405
04406 {
04407 dword MATCH_p =
04408
04409
04410 x
04411 ;
04412 unsigned MATCH_w_16_0;
04413 {
04414 MATCH_w_16_0 = getWord(MATCH_p);
04415 {
04416 int d8 =
04417 sign_extend((MATCH_w_16_0 & 0xff) , 8);
04418 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
04419 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
04420 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
04421
04422
04423 ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
04424
04425
04426
04427
04428 }
04429
04430 }goto MATCH_finished_fc;
04431
04432 MATCH_finished_fc: (void)0;
04433
04434 }
04435
04436
04437 break;
04438 }
04439 case 4 : {
04440
04441
04442
04443 {
04444 dword MATCH_p =
04445
04446
04447 x
04448 ;
04449 unsigned MATCH_w_16_0;
04450 {
04451 MATCH_w_16_0 = getWord(MATCH_p);
04452 {
04453 int d16 =
04454 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
04455
04456
04457 ret = pAbsW(d16, size);
04458
04459
04460
04461
04462 }
04463
04464 }goto MATCH_finished_ec;
04465
04466 MATCH_finished_ec: (void)0;
04467
04468 }
04469
04470
04471 break;
04472 }
04473 case 5 : {
04474
04475
04476
04477 {
04478 dword MATCH_p =
04479
04480
04481 x
04482 ;
04483 unsigned MATCH_w_16_0;
04484 unsigned MATCH_w_16_16;
04485 {
04486 MATCH_w_16_0 = getWord(MATCH_p);
04487 MATCH_w_16_16 = getWord(2 + MATCH_p);
04488 {
04489 unsigned d32 =
04490 ((MATCH_w_16_0 & 0xffff) << 16) +
04491 (MATCH_w_16_16 & 0xffff) ;
04492
04493
04494 ret = pAbsL(d32, size);
04495
04496
04497
04498
04499 }
04500
04501 }goto MATCH_finished_dc;
04502
04503 MATCH_finished_dc: (void)0;
04504
04505 }
04506
04507
04508 break;
04509 }
04510 case 6 : {
04511
04512
04513
04514 {
04515 dword MATCH_p =
04516
04517
04518 x
04519 ;
04520 unsigned MATCH_w_16_0;
04521 {
04522 MATCH_w_16_0 = getWord(MATCH_p);
04523 if ((MATCH_w_16_0 >> 12 & 0x7) == 0 &&
04524 (MATCH_w_16_0 >> 11 & 0x1) == 0 &&
04525 (MATCH_w_16_0 >> 15 & 0x1) == 0 &&
04526 (1 <= (MATCH_w_16_0 >> 8 & 0x7) &&
04527 (MATCH_w_16_0 >> 8 & 0x7) < 8) ||
04528 (MATCH_w_16_0 >> 12 & 0x7) == 0 &&
04529 (MATCH_w_16_0 >> 11 & 0x1) == 0 &&
04530 (MATCH_w_16_0 >> 15 & 0x1) == 1 ||
04531 (MATCH_w_16_0 >> 12 & 0x7) == 0 &&
04532 (MATCH_w_16_0 >> 11 & 0x1) == 1 ||
04533 1 <= (MATCH_w_16_0 >> 12 & 0x7) &&
04534 (MATCH_w_16_0 >> 12 & 0x7) < 8)
04535 goto MATCH_label_cc0;
04536 else {
04537 unsigned d8 = (MATCH_w_16_0 & 0xff) ;
04538
04539
04540 ret = pImmB(d8);
04541
04542
04543
04544
04545 }
04546
04547 }goto MATCH_finished_cc;
04548
04549 MATCH_label_cc0: (void)0;
04550
04551
04552 pNonzeroByte(pc);
04553
04554
04555
04556 goto MATCH_finished_cc;
04557
04558 MATCH_finished_cc: (void)0;
04559
04560 }
04561
04562
04563 break;
04564 }
04565 case 7 : {
04566
04567
04568
04569 {
04570 dword MATCH_p =
04571
04572
04573 x
04574 ;
04575 unsigned MATCH_w_16_0;
04576 {
04577 MATCH_w_16_0 = getWord(MATCH_p);
04578 {
04579 unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
04580
04581
04582 ret = pImmW(d16);
04583
04584
04585
04586
04587 }
04588
04589 }goto MATCH_finished_bc;
04590
04591 MATCH_finished_bc: (void)0;
04592
04593 }
04594
04595
04596 break;
04597 }
04598 case 8 : {
04599
04600
04601
04602 {
04603 dword MATCH_p =
04604
04605
04606 x
04607 ;
04608 unsigned MATCH_w_16_0;
04609 unsigned MATCH_w_16_16;
04610 {
04611 MATCH_w_16_0 = getWord(MATCH_p);
04612 MATCH_w_16_16 = getWord(2 + MATCH_p);
04613 {
04614 unsigned d32 =
04615 ((MATCH_w_16_0 & 0xffff) << 16) +
04616 (MATCH_w_16_16 & 0xffff) ;
04617
04618
04619 ret = pImmL(d32);
04620
04621
04622
04623
04624 }
04625
04626 }goto MATCH_finished_ac;
04627
04628 MATCH_finished_ac: (void)0;
04629
04630 }
04631
04632
04633 break;
04634 }
04635 default : pIllegalMode(pc); break;
04636 }
04637 return ret;
04638 }
04639
04640
04641 SemStr* NJMCDecoder::daEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
04642 ADDRESS pc, int size)
04643 {
04644 SemStr* ret;
04645 int reg2, mode;
04646
04647
04648
04649
04650 {
04651 dword MATCH_p =
04652
04653
04654 eax
04655 ;
04656 unsigned MATCH_w_16_0;
04657 {
04658 MATCH_w_16_0 = getWord(MATCH_p);
04659
04660 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
04661 case 0: case 1: case 2: case 3: case 4:
04662 goto MATCH_label_zb0; break;
04663 case 5:
04664 {
04665 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
04666
04667
04668 { mode = 0; reg2 = r2; result.numBytes += 2;}
04669
04670
04671
04672
04673 }
04674
04675 break;
04676 case 6:
04677 {
04678 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
04679
04680
04681 { mode = 1; reg2 = r2; result.numBytes += 2;}
04682
04683
04684
04685
04686 }
04687
04688 break;
04689 case 7:
04690
04691 switch((MATCH_w_16_0 & 0x7) ) {
04692 case 0:
04693
04694
04695 { mode = 4; result.numBytes += 2;}
04696
04697
04698
04699
04700 break;
04701 case 1:
04702
04703
04704 { mode = 5; result.numBytes += 4;}
04705
04706
04707
04708
04709 break;
04710 case 2: case 3: case 4: case 5: case 6: case 7:
04711 goto MATCH_label_zb0; break;
04712 default: assert(0);
04713 }
04714 break;
04715 default: assert(0);
04716 }
04717
04718 }goto MATCH_finished_zb;
04719
04720 MATCH_label_zb0: (void)0;
04721
04722
04723 pIllegalMode(pc);
04724
04725
04726
04727 goto MATCH_finished_zb;
04728
04729 MATCH_finished_zb: (void)0;
04730
04731 }
04732
04733
04734
04735 switch (mode) {
04736 case 0 : {
04737
04738
04739
04740 {
04741 dword MATCH_p =
04742
04743
04744 x
04745 ;
04746 unsigned MATCH_w_16_0;
04747 {
04748 MATCH_w_16_0 = getWord(MATCH_p);
04749 {
04750 int d16 =
04751 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
04752
04753
04754 ret = pADisp(d16, reg2, size);
04755
04756
04757
04758
04759 }
04760
04761 }goto MATCH_finished_yb;
04762
04763 MATCH_finished_yb: (void)0;
04764
04765 }
04766
04767
04768 break;
04769 }
04770 case 1 : {
04771
04772
04773
04774 {
04775 dword MATCH_p =
04776
04777
04778 x
04779 ;
04780 unsigned MATCH_w_16_0;
04781 {
04782 MATCH_w_16_0 = getWord(MATCH_p);
04783 {
04784 int d8 =
04785 sign_extend((MATCH_w_16_0 & 0xff) , 8);
04786 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
04787 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
04788 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
04789
04790
04791 ret = pAIndex(d8, reg2, iT, iR, iS, size);
04792
04793
04794
04795
04796 }
04797
04798 }goto MATCH_finished_xb;
04799
04800 MATCH_finished_xb: (void)0;
04801
04802 }
04803
04804
04805 break;
04806 }
04807 case 4 : {
04808
04809
04810
04811 {
04812 dword MATCH_p =
04813
04814
04815 x
04816 ;
04817 unsigned MATCH_w_16_0;
04818 {
04819 MATCH_w_16_0 = getWord(MATCH_p);
04820 {
04821 int d16 =
04822 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
04823
04824
04825 ret = pAbsW(d16, size);
04826
04827
04828
04829
04830 }
04831
04832 }goto MATCH_finished_wb;
04833
04834 MATCH_finished_wb: (void)0;
04835
04836 }
04837
04838
04839 break;
04840 }
04841 case 5 : {
04842
04843
04844
04845 {
04846 dword MATCH_p =
04847
04848
04849 x
04850 ;
04851 unsigned MATCH_w_16_0;
04852 unsigned MATCH_w_16_16;
04853 {
04854 MATCH_w_16_0 = getWord(MATCH_p);
04855 MATCH_w_16_16 = getWord(2 + MATCH_p);
04856 {
04857 unsigned d32 =
04858 ((MATCH_w_16_0 & 0xffff) << 16) +
04859 (MATCH_w_16_16 & 0xffff) ;
04860
04861
04862 ret = pAbsL(d32, size);
04863
04864
04865
04866
04867 }
04868
04869 }goto MATCH_finished_vb;
04870
04871 MATCH_finished_vb: (void)0;
04872
04873 }
04874
04875
04876 break;
04877 }
04878 default : pIllegalMode(pc); break;
04879 }
04880 return ret;
04881 }
04882
04883
04884 SemStr* NJMCDecoder::dBEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
04885 ADDRESS pc, int delta, int size)
04886 {
04887 SemStr* ret;
04888 int reg2, mode;
04889
04890
04891
04892
04893 {
04894 dword MATCH_p =
04895
04896
04897 eax
04898 ;
04899 unsigned MATCH_w_16_0;
04900 {
04901 MATCH_w_16_0 = getWord(MATCH_p);
04902
04903 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
04904 case 0: case 1: case 2: case 3: case 4:
04905 goto MATCH_label_ub0; break;
04906 case 5:
04907 {
04908 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
04909
04910
04911 { mode = 0; reg2 = r2; result.numBytes += 2;}
04912
04913
04914
04915
04916 }
04917
04918 break;
04919 case 6:
04920 {
04921 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
04922
04923
04924 { mode = 1; reg2 = r2; result.numBytes += 2;}
04925
04926
04927
04928
04929 }
04930
04931 break;
04932 case 7:
04933
04934 switch((MATCH_w_16_0 & 0x7) ) {
04935 case 0:
04936
04937
04938 { mode = 4; result.numBytes += 2;}
04939
04940
04941
04942
04943 break;
04944 case 1:
04945
04946
04947 { mode = 5; result.numBytes += 4;}
04948
04949
04950
04951
04952 break;
04953 case 2:
04954
04955
04956 { mode = 2; result.numBytes += 2;}
04957
04958
04959
04960
04961 break;
04962 case 3:
04963
04964
04965 { mode = 3; result.numBytes += 2;}
04966
04967
04968
04969
04970 break;
04971 case 4:
04972
04973
04974 { mode = 6; result.numBytes += 2;}
04975
04976
04977
04978
04979 break;
04980 case 5: case 6: case 7:
04981 goto MATCH_label_ub0; break;
04982 default: assert(0);
04983 }
04984 break;
04985 default: assert(0);
04986 }
04987
04988 }goto MATCH_finished_ub;
04989
04990 MATCH_label_ub0: (void)0;
04991
04992
04993 pIllegalMode(pc);
04994
04995
04996
04997 goto MATCH_finished_ub;
04998
04999 MATCH_finished_ub: (void)0;
05000
05001 }
05002
05003
05004
05005 switch (mode) {
05006 case 0 : {
05007
05008
05009
05010 {
05011 dword MATCH_p =
05012
05013
05014 x
05015 ;
05016 unsigned MATCH_w_16_0;
05017 {
05018 MATCH_w_16_0 = getWord(MATCH_p);
05019 {
05020 int d16 =
05021 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
05022
05023
05024 ret = pADisp(d16, reg2, size);
05025
05026
05027
05028
05029 }
05030
05031 }goto MATCH_finished_tb;
05032
05033 MATCH_finished_tb: (void)0;
05034
05035 }
05036
05037
05038 break;
05039 }
05040 case 1 : {
05041
05042
05043
05044 {
05045 dword MATCH_p =
05046
05047
05048 x
05049 ;
05050 unsigned MATCH_w_16_0;
05051 {
05052 MATCH_w_16_0 = getWord(MATCH_p);
05053 {
05054 int d8 =
05055 sign_extend((MATCH_w_16_0 & 0xff) , 8);
05056 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
05057 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
05058 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
05059
05060
05061 ret = pAIndex(d8, reg2, iT, iR, iS, size);
05062
05063
05064
05065
05066 }
05067
05068 }goto MATCH_finished_sb;
05069
05070 MATCH_finished_sb: (void)0;
05071
05072 }
05073
05074
05075 break;
05076 }
05077 case 2 : {
05078
05079
05080
05081 {
05082 dword MATCH_p =
05083
05084
05085 x
05086 ;
05087 unsigned MATCH_w_16_0;
05088 {
05089 MATCH_w_16_0 = getWord(MATCH_p);
05090 {
05091 unsigned label =
05092 sign_extend((MATCH_w_16_0 & 0xffff) , 16) +
05093 addressToPC(MATCH_p);
05094
05095
05096 ret = pPcDisp(label, delta, size);
05097
05098
05099
05100
05101 }
05102
05103 }goto MATCH_finished_rb;
05104
05105 MATCH_finished_rb: (void)0;
05106
05107 }
05108
05109
05110 break;
05111 }
05112 case 3 : {
05113
05114
05115
05116 {
05117 dword MATCH_p =
05118
05119
05120 x
05121 ;
05122 unsigned MATCH_w_16_0;
05123 {
05124 MATCH_w_16_0 = getWord(MATCH_p);
05125 {
05126 int d8 =
05127 sign_extend((MATCH_w_16_0 & 0xff) , 8);
05128 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
05129 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
05130 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
05131
05132
05133
05134
05135 ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
05136
05137
05138
05139
05140 }
05141
05142 }goto MATCH_finished_qb;
05143
05144 MATCH_finished_qb: (void)0;
05145
05146 }
05147
05148
05149 break;
05150 }
05151 case 4 : {
05152
05153
05154
05155 {
05156 dword MATCH_p =
05157
05158
05159 x
05160 ;
05161 unsigned MATCH_w_16_0;
05162 {
05163 MATCH_w_16_0 = getWord(MATCH_p);
05164 {
05165 int d16 =
05166 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
05167
05168
05169 ret = pAbsW(d16, size);
05170
05171
05172
05173
05174 }
05175
05176 }goto MATCH_finished_pb;
05177
05178 MATCH_finished_pb: (void)0;
05179
05180 }
05181
05182
05183 break;
05184 }
05185 case 5 : {
05186
05187
05188
05189 {
05190 dword MATCH_p =
05191
05192
05193 x
05194 ;
05195 unsigned MATCH_w_16_0;
05196 unsigned MATCH_w_16_16;
05197 {
05198 MATCH_w_16_0 = getWord(MATCH_p);
05199 MATCH_w_16_16 = getWord(2 + MATCH_p);
05200 {
05201 unsigned d32 =
05202 ((MATCH_w_16_0 & 0xffff) << 16) +
05203 (MATCH_w_16_16 & 0xffff) ;
05204
05205
05206 ret = pAbsL(d32, size);
05207
05208
05209
05210
05211 }
05212
05213 }goto MATCH_finished_ob;
05214
05215 MATCH_finished_ob: (void)0;
05216
05217 }
05218
05219
05220 break;
05221 }
05222 case 6 : {
05223
05224
05225
05226 {
05227 dword MATCH_p =
05228
05229
05230 x
05231 ;
05232 unsigned MATCH_w_16_0;
05233 {
05234 MATCH_w_16_0 = getWord(MATCH_p);
05235 if ((MATCH_w_16_0 >> 12 & 0x7) == 0 &&
05236 (MATCH_w_16_0 >> 11 & 0x1) == 0 &&
05237 (MATCH_w_16_0 >> 15 & 0x1) == 0 &&
05238 (1 <= (MATCH_w_16_0 >> 8 & 0x7) &&
05239 (MATCH_w_16_0 >> 8 & 0x7) < 8) ||
05240 (MATCH_w_16_0 >> 12 & 0x7) == 0 &&
05241 (MATCH_w_16_0 >> 11 & 0x1) == 0 &&
05242 (MATCH_w_16_0 >> 15 & 0x1) == 1 ||
05243 (MATCH_w_16_0 >> 12 & 0x7) == 0 &&
05244 (MATCH_w_16_0 >> 11 & 0x1) == 1 ||
05245 1 <= (MATCH_w_16_0 >> 12 & 0x7) &&
05246 (MATCH_w_16_0 >> 12 & 0x7) < 8)
05247 goto MATCH_label_nb0;
05248 else {
05249 unsigned d8 = (MATCH_w_16_0 & 0xff) ;
05250
05251
05252 ret = pImmB(d8);
05253
05254
05255
05256
05257 }
05258
05259 }goto MATCH_finished_nb;
05260
05261 MATCH_label_nb0: (void)0;
05262
05263
05264 pNonzeroByte(pc);
05265
05266
05267
05268 goto MATCH_finished_nb;
05269
05270 MATCH_finished_nb: (void)0;
05271
05272 }
05273
05274
05275 break;
05276 }
05277 default : pIllegalMode(pc); break;
05278 }
05279 return ret;
05280 }
05281
05282
05283 SemStr* NJMCDecoder::dWEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
05284 ADDRESS pc, int delta, int size)
05285 {
05286 SemStr* ret;
05287 int reg2, mode;
05288
05289
05290
05291
05292 {
05293 dword MATCH_p =
05294
05295
05296 eax
05297 ;
05298 unsigned MATCH_w_16_0;
05299 {
05300 MATCH_w_16_0 = getWord(MATCH_p);
05301
05302 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
05303 case 0: case 1: case 2: case 3: case 4:
05304 goto MATCH_label_mb0; break;
05305 case 5:
05306 {
05307 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
05308
05309
05310 { mode = 0; reg2 = r2; result.numBytes += 2;}
05311
05312
05313
05314
05315 }
05316
05317 break;
05318 case 6:
05319 {
05320 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
05321
05322
05323 { mode = 1; reg2 = r2; result.numBytes += 2;}
05324
05325
05326
05327
05328 }
05329
05330 break;
05331 case 7:
05332
05333 switch((MATCH_w_16_0 & 0x7) ) {
05334 case 0:
05335
05336
05337 { mode = 4; result.numBytes += 2;}
05338
05339
05340
05341
05342 break;
05343 case 1:
05344
05345
05346 { mode = 5; result.numBytes += 4;}
05347
05348
05349
05350
05351 break;
05352 case 2:
05353
05354
05355 { mode = 2; result.numBytes += 2;}
05356
05357
05358
05359
05360 break;
05361 case 3:
05362
05363
05364 { mode = 3; result.numBytes += 2;}
05365
05366
05367
05368
05369 break;
05370 case 4:
05371
05372
05373 { mode = 7; result.numBytes += 2;}
05374
05375
05376
05377
05378 break;
05379 case 5: case 6: case 7:
05380 goto MATCH_label_mb0; break;
05381 default: assert(0);
05382 }
05383 break;
05384 default: assert(0);
05385 }
05386
05387 }goto MATCH_finished_mb;
05388
05389 MATCH_label_mb0: (void)0;
05390
05391
05392 pIllegalMode(pc);
05393
05394
05395
05396 goto MATCH_finished_mb;
05397
05398 MATCH_finished_mb: (void)0;
05399
05400 }
05401
05402
05403
05404 switch (mode) {
05405 case 0 : {
05406
05407
05408
05409 {
05410 dword MATCH_p =
05411
05412
05413 x
05414 ;
05415 unsigned MATCH_w_16_0;
05416 {
05417 MATCH_w_16_0 = getWord(MATCH_p);
05418 {
05419 int d16 =
05420 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
05421
05422
05423 ret = pADisp(d16, reg2, size);
05424
05425
05426
05427
05428 }
05429
05430 }goto MATCH_finished_lb;
05431
05432 MATCH_finished_lb: (void)0;
05433
05434 }
05435
05436
05437 break;
05438 }
05439 case 1 : {
05440
05441
05442
05443 {
05444 dword MATCH_p =
05445
05446
05447 x
05448 ;
05449 unsigned MATCH_w_16_0;
05450 {
05451 MATCH_w_16_0 = getWord(MATCH_p);
05452 {
05453 int d8 =
05454 sign_extend((MATCH_w_16_0 & 0xff) , 8);
05455 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
05456 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
05457 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
05458
05459
05460 ret = pAIndex(d8, reg2, iT, iR, iS, size);
05461
05462
05463
05464
05465 }
05466
05467 }goto MATCH_finished_kb;
05468
05469 MATCH_finished_kb: (void)0;
05470
05471 }
05472
05473
05474 break;
05475 }
05476 case 2 : {
05477
05478
05479
05480 {
05481 dword MATCH_p =
05482
05483
05484 x
05485 ;
05486 unsigned MATCH_w_16_0;
05487 {
05488 MATCH_w_16_0 = getWord(MATCH_p);
05489 {
05490 unsigned label =
05491 sign_extend((MATCH_w_16_0 & 0xffff) , 16) +
05492 addressToPC(MATCH_p);
05493
05494
05495 ret = pPcDisp(label, delta, size);
05496
05497
05498
05499
05500 }
05501
05502 }goto MATCH_finished_jb;
05503
05504 MATCH_finished_jb: (void)0;
05505
05506 }
05507
05508
05509 break;
05510 }
05511 case 3 : {
05512
05513
05514
05515 {
05516 dword MATCH_p =
05517
05518
05519 x
05520 ;
05521 unsigned MATCH_w_16_0;
05522 {
05523 MATCH_w_16_0 = getWord(MATCH_p);
05524 {
05525 int d8 =
05526 sign_extend((MATCH_w_16_0 & 0xff) , 8);
05527 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
05528 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
05529 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
05530
05531
05532
05533
05534 ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
05535
05536
05537
05538
05539 }
05540
05541 }goto MATCH_finished_ib;
05542
05543 MATCH_finished_ib: (void)0;
05544
05545 }
05546
05547
05548 break;
05549 }
05550 case 4 : {
05551
05552
05553
05554 {
05555 dword MATCH_p =
05556
05557
05558 x
05559 ;
05560 unsigned MATCH_w_16_0;
05561 {
05562 MATCH_w_16_0 = getWord(MATCH_p);
05563 {
05564 int d16 =
05565 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
05566
05567
05568 ret = pAbsW(d16, size);
05569
05570
05571
05572
05573 }
05574
05575 }goto MATCH_finished_hb;
05576
05577 MATCH_finished_hb: (void)0;
05578
05579 }
05580
05581
05582 break;
05583 }
05584 case 5 : {
05585
05586
05587
05588 {
05589 dword MATCH_p =
05590
05591
05592 x
05593 ;
05594 unsigned MATCH_w_16_0;
05595 unsigned MATCH_w_16_16;
05596 {
05597 MATCH_w_16_0 = getWord(MATCH_p);
05598 MATCH_w_16_16 = getWord(2 + MATCH_p);
05599 {
05600 unsigned d32 =
05601 ((MATCH_w_16_0 & 0xffff) << 16) +
05602 (MATCH_w_16_16 & 0xffff) ;
05603
05604
05605 ret = pAbsL(d32, size);
05606
05607
05608
05609
05610 }
05611
05612 }goto MATCH_finished_gb;
05613
05614 MATCH_finished_gb: (void)0;
05615
05616 }
05617
05618
05619 break;
05620 }
05621 case 7 : {
05622
05623
05624
05625 {
05626 dword MATCH_p =
05627
05628
05629 x
05630 ;
05631 unsigned MATCH_w_16_0;
05632 {
05633 MATCH_w_16_0 = getWord(MATCH_p);
05634 {
05635 unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
05636
05637
05638 ret = pImmW(d16);
05639
05640
05641
05642
05643 }
05644
05645 }goto MATCH_finished_fb;
05646
05647 MATCH_finished_fb: (void)0;
05648
05649 }
05650
05651
05652 break;
05653 }
05654 default : pIllegalMode(pc); break;
05655 }
05656 return ret;
05657 }
05658
05659
05660 SemStr* NJMCDecoder::maEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
05661 ADDRESS pc, int size)
05662 {
05663 SemStr* ret;
05664 int reg2, mode;
05665
05666
05667
05668
05669 {
05670 dword MATCH_p =
05671
05672
05673 eax
05674 ;
05675 unsigned MATCH_w_16_0;
05676 {
05677 MATCH_w_16_0 = getWord(MATCH_p);
05678
05679 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
05680 case 0: case 1: case 2: case 3: case 4:
05681 goto MATCH_label_eb0; break;
05682 case 5:
05683 {
05684 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
05685
05686
05687 { mode = 0; reg2 = r2; result.numBytes += 2;}
05688
05689
05690
05691
05692 }
05693
05694 break;
05695 case 6:
05696 {
05697 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
05698
05699
05700 { mode = 1; reg2 = r2; result.numBytes += 2;}
05701
05702
05703
05704
05705 }
05706
05707 break;
05708 case 7:
05709
05710 switch((MATCH_w_16_0 & 0x7) ) {
05711 case 0:
05712
05713
05714 { mode = 4; result.numBytes += 2;}
05715
05716
05717
05718
05719 break;
05720 case 1:
05721
05722
05723 { mode = 5; result.numBytes += 4;}
05724
05725
05726
05727
05728 break;
05729 case 2: case 3: case 4: case 5: case 6: case 7:
05730 goto MATCH_label_eb0; break;
05731 default: assert(0);
05732 }
05733 break;
05734 default: assert(0);
05735 }
05736
05737 }goto MATCH_finished_eb;
05738
05739 MATCH_label_eb0: (void)0;
05740
05741
05742 pIllegalMode(pc);
05743
05744
05745
05746 goto MATCH_finished_eb;
05747
05748 MATCH_finished_eb: (void)0;
05749
05750 }
05751
05752
05753
05754 switch (mode) {
05755 case 0 : {
05756
05757
05758
05759 {
05760 dword MATCH_p =
05761
05762
05763 x
05764 ;
05765 unsigned MATCH_w_16_0;
05766 {
05767 MATCH_w_16_0 = getWord(MATCH_p);
05768 {
05769 int d16 =
05770 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
05771
05772
05773 ret = pADisp(d16, reg2, size);
05774
05775
05776
05777
05778 }
05779
05780 }goto MATCH_finished_db;
05781
05782 MATCH_finished_db: (void)0;
05783
05784 }
05785
05786
05787 break;
05788 }
05789 case 1 : {
05790
05791
05792
05793 {
05794 dword MATCH_p =
05795
05796
05797 x
05798 ;
05799 unsigned MATCH_w_16_0;
05800 {
05801 MATCH_w_16_0 = getWord(MATCH_p);
05802 {
05803 int d8 =
05804 sign_extend((MATCH_w_16_0 & 0xff) , 8);
05805 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
05806 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
05807 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
05808
05809
05810 ret = pAIndex(d8, reg2, iT, iR, iS, size);
05811
05812
05813
05814
05815 }
05816
05817 }goto MATCH_finished_cb;
05818
05819 MATCH_finished_cb: (void)0;
05820
05821 }
05822
05823
05824 break;
05825 }
05826 case 4 : {
05827
05828
05829
05830 {
05831 dword MATCH_p =
05832
05833
05834 x
05835 ;
05836 unsigned MATCH_w_16_0;
05837 {
05838 MATCH_w_16_0 = getWord(MATCH_p);
05839 {
05840 int d16 =
05841 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
05842
05843
05844 ret = pAbsW(d16, size);
05845
05846
05847
05848
05849 }
05850
05851 }goto MATCH_finished_bb;
05852
05853 MATCH_finished_bb: (void)0;
05854
05855 }
05856
05857
05858 break;
05859 }
05860 case 5 : {
05861
05862
05863
05864 {
05865 dword MATCH_p =
05866
05867
05868 x
05869 ;
05870 unsigned MATCH_w_16_0;
05871 unsigned MATCH_w_16_16;
05872 {
05873 MATCH_w_16_0 = getWord(MATCH_p);
05874 MATCH_w_16_16 = getWord(2 + MATCH_p);
05875 {
05876 unsigned d32 =
05877 ((MATCH_w_16_0 & 0xffff) << 16) +
05878 (MATCH_w_16_16 & 0xffff) ;
05879
05880
05881 ret = pAbsL(d32, size);
05882
05883
05884
05885
05886 }
05887
05888 }goto MATCH_finished_ab;
05889
05890 MATCH_finished_ab: (void)0;
05891
05892 }
05893
05894
05895 break;
05896 }
05897 default : pIllegalMode(pc); break;
05898 }
05899 return ret;
05900 }
05901
05902
05903 SemStr* NJMCDecoder::msEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
05904 ADDRESS pc, int delta, int size)
05905 {
05906 SemStr* ret;
05907 int reg2, mode;
05908
05909
05910
05911
05912 {
05913 dword MATCH_p =
05914
05915
05916 eax
05917 ;
05918 unsigned MATCH_w_16_0;
05919 {
05920 MATCH_w_16_0 = getWord(MATCH_p);
05921
05922 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
05923 case 0: case 1: case 2: case 3: case 4:
05924 goto MATCH_label_z0; break;
05925 case 5:
05926 {
05927 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
05928
05929
05930 { mode = 0; reg2 = r2; result.numBytes += 2;}
05931
05932
05933
05934
05935 }
05936
05937 break;
05938 case 6:
05939 {
05940 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
05941
05942
05943 { mode = 1; reg2 = r2; result.numBytes += 2;}
05944
05945
05946
05947
05948 }
05949
05950 break;
05951 case 7:
05952
05953 switch((MATCH_w_16_0 & 0x7) ) {
05954 case 0:
05955
05956
05957 { mode = 4; result.numBytes += 2;}
05958
05959
05960
05961
05962 break;
05963 case 1: case 5: case 6: case 7:
05964 goto MATCH_label_z0; break;
05965 case 2:
05966
05967
05968 { mode = 2; result.numBytes += 2;}
05969
05970
05971
05972
05973 break;
05974 case 3:
05975
05976
05977 { mode = 3; result.numBytes += 2;}
05978
05979
05980
05981
05982 break;
05983 case 4:
05984
05985 switch((MATCH_w_16_0 >> 12 & 0xf) ) {
05986 case 0: case 2: case 4: case 5: case 6: case 7: case 8:
05987 case 9: case 10: case 11: case 12: case 13: case 14:
05988 case 15:
05989 goto MATCH_label_z0; break;
05990 case 1:
05991
05992
05993 { mode = 6; result.numBytes += 2;}
05994
05995
05996
05997
05998 break;
05999 case 3:
06000
06001
06002 { mode = 7; result.numBytes += 2;}
06003
06004
06005
06006
06007 break;
06008 default: assert(0);
06009 }
06010 break;
06011 default: assert(0);
06012 }
06013 break;
06014 default: assert(0);
06015 }
06016
06017 }goto MATCH_finished_z;
06018
06019 MATCH_label_z0: (void)0;
06020
06021
06022 pIllegalMode(pc);
06023
06024
06025
06026 goto MATCH_finished_z;
06027
06028 MATCH_finished_z: (void)0;
06029
06030 }
06031
06032
06033
06034 switch (mode) {
06035 case 0 : {
06036
06037
06038
06039 {
06040 dword MATCH_p =
06041
06042
06043 x
06044 ;
06045 unsigned MATCH_w_16_0;
06046 {
06047 MATCH_w_16_0 = getWord(MATCH_p);
06048 {
06049 int d16 =
06050 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
06051
06052
06053 ret = pADisp(d16, reg2, size);
06054
06055
06056
06057
06058 }
06059
06060 }goto MATCH_finished_y;
06061
06062 MATCH_finished_y: (void)0;
06063
06064 }
06065
06066
06067 break;
06068 }
06069 case 1 : {
06070
06071
06072
06073 {
06074 dword MATCH_p =
06075
06076
06077 x
06078 ;
06079 unsigned MATCH_w_16_0;
06080 {
06081 MATCH_w_16_0 = getWord(MATCH_p);
06082 {
06083 int d8 =
06084 sign_extend((MATCH_w_16_0 & 0xff) , 8);
06085 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
06086 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
06087 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
06088
06089
06090 ret = pAIndex(d8, reg2, iT, iR, iS, size);
06091
06092
06093
06094
06095 }
06096
06097 }goto MATCH_finished_x;
06098
06099 MATCH_finished_x: (void)0;
06100
06101 }
06102
06103
06104 break;
06105 }
06106 case 2 : {
06107
06108
06109
06110 {
06111 dword MATCH_p =
06112
06113
06114 x
06115 ;
06116 unsigned MATCH_w_16_0;
06117 {
06118 MATCH_w_16_0 = getWord(MATCH_p);
06119 {
06120 unsigned label =
06121 sign_extend((MATCH_w_16_0 & 0xffff) , 16) +
06122 addressToPC(MATCH_p);
06123
06124
06125 ret = pPcDisp(label, delta, size);
06126
06127
06128
06129
06130 }
06131
06132 }goto MATCH_finished_w;
06133
06134 MATCH_finished_w: (void)0;
06135
06136 }
06137
06138
06139 break;
06140 }
06141 case 3 : {
06142
06143
06144
06145 {
06146 dword MATCH_p =
06147
06148
06149 x
06150 ;
06151 unsigned MATCH_w_16_0;
06152 {
06153 MATCH_w_16_0 = getWord(MATCH_p);
06154 {
06155 int d8 =
06156 sign_extend((MATCH_w_16_0 & 0xff) , 8);
06157 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
06158 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
06159 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
06160
06161
06162
06163
06164 ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
06165
06166
06167
06168
06169 }
06170
06171 }goto MATCH_finished_v;
06172
06173 MATCH_finished_v: (void)0;
06174
06175 }
06176
06177
06178 break;
06179 }
06180 case 4 : {
06181
06182
06183
06184 {
06185 dword MATCH_p =
06186
06187
06188 x
06189 ;
06190 unsigned MATCH_w_16_0;
06191 {
06192 MATCH_w_16_0 = getWord(MATCH_p);
06193 {
06194 int d16 =
06195 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
06196
06197
06198 ret = pAbsW(d16, size);
06199
06200
06201
06202
06203 }
06204
06205 }goto MATCH_finished_u;
06206
06207 MATCH_finished_u: (void)0;
06208
06209 }
06210
06211
06212 break;
06213 }
06214 case 6 : {
06215
06216
06217
06218 {
06219 dword MATCH_p =
06220
06221
06222 x
06223 ;
06224 unsigned MATCH_w_16_0;
06225 {
06226 MATCH_w_16_0 = getWord(MATCH_p);
06227 if ((MATCH_w_16_0 >> 12 & 0x7) == 0 &&
06228 (MATCH_w_16_0 >> 11 & 0x1) == 0 &&
06229 (MATCH_w_16_0 >> 15 & 0x1) == 0 &&
06230 (1 <= (MATCH_w_16_0 >> 8 & 0x7) &&
06231 (MATCH_w_16_0 >> 8 & 0x7) < 8) ||
06232 (MATCH_w_16_0 >> 12 & 0x7) == 0 &&
06233 (MATCH_w_16_0 >> 11 & 0x1) == 0 &&
06234 (MATCH_w_16_0 >> 15 & 0x1) == 1 ||
06235 (MATCH_w_16_0 >> 12 & 0x7) == 0 &&
06236 (MATCH_w_16_0 >> 11 & 0x1) == 1 ||
06237 1 <= (MATCH_w_16_0 >> 12 & 0x7) &&
06238 (MATCH_w_16_0 >> 12 & 0x7) < 8)
06239 goto MATCH_label_t0;
06240 else {
06241 unsigned d8 = (MATCH_w_16_0 & 0xff) ;
06242
06243
06244 ret = pImmB(d8);
06245
06246
06247
06248
06249 }
06250
06251 }goto MATCH_finished_t;
06252
06253 MATCH_label_t0: (void)0;
06254
06255
06256 pNonzeroByte(pc);
06257
06258
06259
06260 goto MATCH_finished_t;
06261
06262 MATCH_finished_t: (void)0;
06263
06264 }
06265
06266
06267 break;
06268 }
06269 case 7 : {
06270
06271
06272
06273 {
06274 dword MATCH_p =
06275
06276
06277 x
06278 ;
06279 unsigned MATCH_w_16_0;
06280 {
06281 MATCH_w_16_0 = getWord(MATCH_p);
06282 {
06283 unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
06284
06285
06286 ret = pImmW(d16);
06287
06288
06289
06290
06291 }
06292
06293 }goto MATCH_finished_s;
06294
06295 MATCH_finished_s: (void)0;
06296
06297 }
06298
06299
06300 break;
06301 }
06302 default : pIllegalMode(pc); break;
06303 }
06304 return ret;
06305 }
06306
06307
06308 SemStr* NJMCDecoder::msEAXL(ADDRESS eaxl, int d32, DecodeResult& result,
06309 ADDRESS pc, int size)
06310 {
06311 SemStr* ret;
06312 int reg2, mode;
06313
06314
06315
06316
06317 {
06318 dword MATCH_p =
06319
06320
06321 eaxl
06322 ;
06323 unsigned MATCH_w_16_0;
06324 {
06325 MATCH_w_16_0 = getWord(MATCH_p);
06326
06327 switch((MATCH_w_16_0 & 0x7) ) {
06328 case 0: case 2: case 3: case 5: case 6: case 7:
06329 goto MATCH_label_r0; break;
06330 case 1:
06331 if ((MATCH_w_16_0 >> 3 & 0x7) == 7)
06332
06333
06334 { mode = 5; result.numBytes += 4;}
06335
06336
06337
06338 else
06339 goto MATCH_label_r0;
06340
06341 break;
06342 case 4:
06343 if ((MATCH_w_16_0 >> 12 & 0xf) == 2 &&
06344 (MATCH_w_16_0 >> 3 & 0x7) == 7)
06345
06346
06347 { mode = 8; result.numBytes += 4;}
06348
06349
06350
06351 else
06352 goto MATCH_label_r0;
06353
06354 break;
06355 default: assert(0);
06356 }
06357
06358 }goto MATCH_finished_r;
06359
06360 MATCH_label_r0: (void)0;
06361
06362
06363 pIllegalMode(pc);
06364
06365
06366
06367 goto MATCH_finished_r;
06368
06369 MATCH_finished_r: (void)0;
06370
06371 }
06372
06373
06374
06375 switch (mode) {
06376 case 5 : {
06377 ret = pAbsL(d32, size);
06378 break;
06379 }
06380 case 8 : {
06381 ret = pImmL(d32);
06382 break;
06383 }
06384 default : pIllegalMode(pc); break;
06385 }
06386 return ret;
06387 }
06388
06389
06390 SemStr* NJMCDecoder::mdEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
06391 ADDRESS pc, int size)
06392 {
06393 SemStr* ret;
06394 int reg1, mode;
06395
06396
06397
06398
06399 {
06400 dword MATCH_p =
06401
06402
06403 eax
06404 ;
06405 unsigned MATCH_w_16_0;
06406 {
06407 MATCH_w_16_0 = getWord(MATCH_p);
06408
06409 switch((MATCH_w_16_0 >> 6 & 0x7) ) {
06410 case 0: case 1: case 2: case 3: case 4: case 7:
06411 if ((MATCH_w_16_0 >> 8 & 0x1) == 1)
06412 if ((MATCH_w_16_0 >> 6 & 0x3) == 3)
06413
06414 switch((MATCH_w_16_0 >> 9 & 0x7) ) {
06415 case 0:
06416
06417
06418 { mode = 4; result.numBytes += 2;}
06419
06420
06421
06422
06423 break;
06424 case 1:
06425
06426
06427 { mode = 5; result.numBytes += 4;}
06428
06429
06430
06431
06432 break;
06433 case 2: case 3: case 4: case 5: case 6: case 7:
06434 goto MATCH_label_q0; break;
06435 default: assert(0);
06436 }
06437 else
06438 goto MATCH_label_q0;
06439 else
06440 goto MATCH_label_q0;
06441 break;
06442 case 5:
06443 {
06444 unsigned r1 = (MATCH_w_16_0 >> 9 & 0x7) ;
06445
06446
06447 { mode = 0; reg1 = r1; result.numBytes += 2;}
06448
06449
06450
06451
06452 }
06453
06454 break;
06455 case 6:
06456 {
06457 unsigned r1 = (MATCH_w_16_0 >> 9 & 0x7) ;
06458
06459
06460 { mode = 1; reg1 = r1; result.numBytes += 2;}
06461
06462
06463
06464
06465 }
06466
06467 break;
06468 default: assert(0);
06469 }
06470
06471 }goto MATCH_finished_q;
06472
06473 MATCH_label_q0: (void)0;
06474
06475
06476 pIllegalMode(pc);
06477
06478
06479
06480 goto MATCH_finished_q;
06481
06482 MATCH_finished_q: (void)0;
06483
06484 }
06485
06486
06487
06488 switch (mode) {
06489 case 0 : {
06490
06491
06492
06493 {
06494 dword MATCH_p =
06495
06496
06497 x
06498 ;
06499 unsigned MATCH_w_16_0;
06500 {
06501 MATCH_w_16_0 = getWord(MATCH_p);
06502 {
06503 int d16 =
06504 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
06505
06506
06507 ret = pADisp(d16, reg1, size);
06508
06509
06510
06511
06512 }
06513
06514 }goto MATCH_finished_p;
06515
06516 MATCH_finished_p: (void)0;
06517
06518 }
06519
06520
06521 break;
06522 }
06523 case 1 : {
06524
06525
06526
06527 {
06528 dword MATCH_p =
06529
06530
06531 x
06532 ;
06533 unsigned MATCH_w_16_0;
06534 {
06535 MATCH_w_16_0 = getWord(MATCH_p);
06536 {
06537 int d8 =
06538 sign_extend((MATCH_w_16_0 & 0xff) , 8);
06539 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
06540 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
06541 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
06542
06543
06544 ret = pAIndex(d8, reg1, iT, iR, iS, size);
06545
06546
06547
06548
06549 }
06550
06551 }goto MATCH_finished_o;
06552
06553 MATCH_finished_o: (void)0;
06554
06555 }
06556
06557
06558 break;
06559 }
06560 case 4 : {
06561
06562
06563
06564 {
06565 dword MATCH_p =
06566
06567
06568 x
06569 ;
06570 unsigned MATCH_w_16_0;
06571 {
06572 MATCH_w_16_0 = getWord(MATCH_p);
06573 {
06574 unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
06575
06576
06577 ret = pAbsW(d16, size);
06578
06579
06580
06581
06582 }
06583
06584 }goto MATCH_finished_n;
06585
06586 MATCH_finished_n: (void)0;
06587
06588 }
06589
06590
06591 break;
06592 }
06593 case 5 : {
06594
06595
06596
06597 {
06598 dword MATCH_p =
06599
06600
06601 x
06602 ;
06603 unsigned MATCH_w_16_0;
06604 unsigned MATCH_w_16_16;
06605 {
06606 MATCH_w_16_0 = getWord(MATCH_p);
06607 MATCH_w_16_16 = getWord(2 + MATCH_p);
06608 {
06609 unsigned d32 =
06610 ((MATCH_w_16_0 & 0xffff) << 16) +
06611 (MATCH_w_16_16 & 0xffff) ;
06612
06613
06614 ret = pAbsL(d32, size);
06615
06616
06617
06618
06619 }
06620
06621 }goto MATCH_finished_m;
06622
06623 MATCH_finished_m: (void)0;
06624
06625 }
06626
06627
06628 break;
06629 }
06630 default : pIllegalMode(pc); break;
06631 }
06632 return ret;
06633 }
06634
06635
06636 SemStr* NJMCDecoder::mrEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
06637 ADDRESS pc, int delta, int size)
06638 {
06639 SemStr* ret;
06640 int reg2, mode;
06641
06642
06643
06644
06645 {
06646 dword MATCH_p =
06647
06648
06649 eax
06650 ;
06651 unsigned MATCH_w_16_0;
06652 {
06653 MATCH_w_16_0 = getWord(MATCH_p);
06654
06655 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
06656 case 0: case 1: case 2: case 3: case 4:
06657 goto MATCH_label_l0; break;
06658 case 5:
06659 {
06660 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
06661
06662
06663 { mode = 0; reg2 = r2; result.numBytes += 2;}
06664
06665
06666
06667
06668 }
06669
06670 break;
06671 case 6:
06672 {
06673 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
06674
06675
06676 { mode = 1; reg2 = r2; result.numBytes += 2;}
06677
06678
06679
06680
06681 }
06682
06683 break;
06684 case 7:
06685
06686 switch((MATCH_w_16_0 & 0x7) ) {
06687 case 0:
06688
06689
06690 { mode = 4; result.numBytes += 2;}
06691
06692
06693
06694
06695 break;
06696 case 1:
06697
06698
06699 { mode = 5; result.numBytes += 4;}
06700
06701
06702
06703
06704 break;
06705 case 2:
06706
06707
06708 { mode = 2; result.numBytes += 2;}
06709
06710
06711
06712
06713 break;
06714 case 3:
06715
06716
06717 { mode = 3; result.numBytes += 2;}
06718
06719
06720
06721
06722 break;
06723 case 4: case 5: case 6: case 7:
06724 goto MATCH_label_l0; break;
06725 default: assert(0);
06726 }
06727 break;
06728 default: assert(0);
06729 }
06730
06731 }goto MATCH_finished_l;
06732
06733 MATCH_label_l0: (void)0;
06734
06735
06736 pIllegalMode(pc);
06737
06738
06739
06740 goto MATCH_finished_l;
06741
06742 MATCH_finished_l: (void)0;
06743
06744 }
06745
06746
06747
06748 switch (mode) {
06749 case 0 : {
06750
06751
06752
06753 {
06754 dword MATCH_p =
06755
06756
06757 x
06758 ;
06759 unsigned MATCH_w_16_0;
06760 {
06761 MATCH_w_16_0 = getWord(MATCH_p);
06762 {
06763 int d16 =
06764 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
06765
06766
06767 ret = pADisp(d16, reg2, size);
06768
06769
06770
06771
06772 }
06773
06774 }goto MATCH_finished_k;
06775
06776 MATCH_finished_k: (void)0;
06777
06778 }
06779
06780
06781 break;
06782 }
06783 case 1 : {
06784
06785
06786
06787 {
06788 dword MATCH_p =
06789
06790
06791 x
06792 ;
06793 unsigned MATCH_w_16_0;
06794 {
06795 MATCH_w_16_0 = getWord(MATCH_p);
06796 {
06797 int d8 =
06798 sign_extend((MATCH_w_16_0 & 0xff) , 8);
06799 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
06800 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
06801 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
06802
06803
06804 ret = pAIndex(d8, reg2, iT, iR, iS, size);
06805
06806
06807
06808
06809 }
06810
06811 }goto MATCH_finished_j;
06812
06813 MATCH_finished_j: (void)0;
06814
06815 }
06816
06817
06818 break;
06819 }
06820 case 2 : {
06821
06822
06823
06824 {
06825 dword MATCH_p =
06826
06827
06828 x
06829 ;
06830 unsigned MATCH_w_16_0;
06831 {
06832 MATCH_w_16_0 = getWord(MATCH_p);
06833 {
06834 unsigned label =
06835 sign_extend((MATCH_w_16_0 & 0xffff) , 16) +
06836 addressToPC(MATCH_p);
06837
06838
06839 ret = pPcDisp(label, delta, size);
06840
06841
06842
06843
06844 }
06845
06846 }goto MATCH_finished_i;
06847
06848 MATCH_finished_i: (void)0;
06849
06850 }
06851
06852
06853 break;
06854 }
06855 case 3 : {
06856
06857
06858
06859 {
06860 dword MATCH_p =
06861
06862
06863 x
06864 ;
06865 unsigned MATCH_w_16_0;
06866 {
06867 MATCH_w_16_0 = getWord(MATCH_p);
06868 {
06869 int d8 =
06870 sign_extend((MATCH_w_16_0 & 0xff) , 8);
06871 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
06872 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
06873 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
06874
06875
06876
06877
06878 ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
06879
06880
06881
06882
06883 }
06884
06885 }goto MATCH_finished_h;
06886
06887 MATCH_finished_h: (void)0;
06888
06889 }
06890
06891
06892 break;
06893 }
06894 case 4 : {
06895
06896
06897
06898 {
06899 dword MATCH_p =
06900
06901
06902 x
06903 ;
06904 unsigned MATCH_w_16_0;
06905 {
06906 MATCH_w_16_0 = getWord(MATCH_p);
06907 {
06908 int d16 =
06909 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
06910
06911
06912 ret = pAbsW(d16, size);
06913
06914
06915
06916
06917 }
06918
06919 }goto MATCH_finished_g;
06920
06921 MATCH_finished_g: (void)0;
06922
06923 }
06924
06925
06926 break;
06927 }
06928 case 5 : {
06929
06930
06931
06932 {
06933 dword MATCH_p =
06934
06935
06936 x
06937 ;
06938 unsigned MATCH_w_16_0;
06939 unsigned MATCH_w_16_16;
06940 {
06941 MATCH_w_16_0 = getWord(MATCH_p);
06942 MATCH_w_16_16 = getWord(2 + MATCH_p);
06943 {
06944 unsigned d32 =
06945 ((MATCH_w_16_0 & 0xffff) << 16) +
06946 (MATCH_w_16_16 & 0xffff) ;
06947
06948
06949 ret = pAbsL(d32, size);
06950
06951
06952
06953
06954 }
06955
06956 }goto MATCH_finished_f;
06957
06958 MATCH_finished_f: (void)0;
06959
06960 }
06961
06962
06963 break;
06964 }
06965 default : pIllegalMode(pc); break;
06966 }
06967 return ret;
06968 }
06969
06970
06971 SemStr* NJMCDecoder::rmEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
06972 ADDRESS pc, int size)
06973 {
06974 SemStr* ret;
06975 int reg2, mode;
06976
06977
06978
06979
06980 {
06981 dword MATCH_p =
06982
06983
06984 eax
06985 ;
06986 unsigned MATCH_w_16_0;
06987 {
06988 MATCH_w_16_0 = getWord(MATCH_p);
06989
06990 switch((MATCH_w_16_0 >> 3 & 0x7) ) {
06991 case 0: case 1: case 2: case 3: case 4:
06992 goto MATCH_label_e0; break;
06993 case 5:
06994 {
06995 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
06996
06997
06998 { mode = 0; reg2 = r2; result.numBytes += 2;}
06999
07000
07001
07002
07003 }
07004
07005 break;
07006 case 6:
07007 {
07008 unsigned r2 = (MATCH_w_16_0 & 0x7) ;
07009
07010
07011 { mode = 1; reg2 = r2; result.numBytes += 2;}
07012
07013
07014
07015
07016 }
07017
07018 break;
07019 case 7:
07020
07021 switch((MATCH_w_16_0 & 0x7) ) {
07022 case 0:
07023
07024
07025 { mode = 4; result.numBytes += 2;}
07026
07027
07028
07029
07030 break;
07031 case 1:
07032
07033
07034 { mode = 5; result.numBytes += 4;}
07035
07036
07037
07038
07039 break;
07040 case 2: case 3: case 4: case 5: case 6: case 7:
07041 goto MATCH_label_e0; break;
07042 default: assert(0);
07043 }
07044 break;
07045 default: assert(0);
07046 }
07047
07048 }goto MATCH_finished_e;
07049
07050 MATCH_label_e0: (void)0;
07051
07052
07053 pIllegalMode(pc);
07054
07055
07056
07057 goto MATCH_finished_e;
07058
07059 MATCH_finished_e: (void)0;
07060
07061 }
07062
07063
07064
07065 switch (mode) {
07066 case 0 : {
07067
07068
07069
07070 {
07071 dword MATCH_p =
07072
07073
07074 x
07075 ;
07076 unsigned MATCH_w_16_0;
07077 {
07078 MATCH_w_16_0 = getWord(MATCH_p);
07079 {
07080 int d16 =
07081 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
07082
07083
07084 ret = pADisp(d16, reg2, size);
07085
07086
07087
07088
07089 }
07090
07091 }goto MATCH_finished_d;
07092
07093 MATCH_finished_d: (void)0;
07094
07095 }
07096
07097
07098 break;
07099 }
07100 case 1 : {
07101
07102
07103
07104 {
07105 dword MATCH_p =
07106
07107
07108 x
07109 ;
07110 unsigned MATCH_w_16_0;
07111 {
07112 MATCH_w_16_0 = getWord(MATCH_p);
07113 {
07114 int d8 =
07115 sign_extend((MATCH_w_16_0 & 0xff) , 8);
07116 unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
07117 unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
07118 unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
07119
07120
07121 ret = pAIndex(d8, reg2, iT, iR, iS, size);
07122
07123
07124
07125
07126 }
07127
07128 }goto MATCH_finished_c;
07129
07130 MATCH_finished_c: (void)0;
07131
07132 }
07133
07134
07135 break;
07136 }
07137 case 4 : {
07138
07139
07140
07141 {
07142 dword MATCH_p =
07143
07144
07145 x
07146 ;
07147 unsigned MATCH_w_16_0;
07148 {
07149 MATCH_w_16_0 = getWord(MATCH_p);
07150 {
07151 int d16 =
07152 sign_extend((MATCH_w_16_0 & 0xffff) , 16);
07153
07154
07155 ret = pAbsW(d16, size);
07156
07157
07158
07159
07160 }
07161
07162 }goto MATCH_finished_b;
07163
07164 MATCH_finished_b: (void)0;
07165
07166 }
07167
07168
07169 break;
07170 }
07171 case 5 : {
07172
07173
07174
07175 {
07176 dword MATCH_p =
07177
07178
07179 x
07180 ;
07181 unsigned MATCH_w_16_0;
07182 unsigned MATCH_w_16_16;
07183 {
07184 MATCH_w_16_0 = getWord(MATCH_p);
07185 MATCH_w_16_16 = getWord(2 + MATCH_p);
07186 {
07187 unsigned d32 =
07188 ((MATCH_w_16_0 & 0xffff) << 16) +
07189 (MATCH_w_16_16 & 0xffff) ;
07190
07191
07192 ret = pAbsL(d32, size);
07193
07194
07195
07196
07197 }
07198
07199 }goto MATCH_finished_a;
07200
07201 MATCH_finished_a: (void)0;
07202
07203 }
07204
07205
07206 break;
07207 }
07208 default : pIllegalMode(pc); break;
07209 }
07210 return ret;
07211 }
07212
07213
07214
07215
07216
07217
07218
07219
07220
07221 bool isFuncPrologue(ADDRESS hostPC)
07222 {
07223 int locals, reg, d16;
07224
07225 if ((InstructionPatterns::link_save(prog.csrSrc, hostPC, locals, d16))
07226 != NULL)
07227 return true;
07228 if ((InstructionPatterns::link_save1(prog.csrSrc, hostPC, locals, reg))
07229 != NULL)
07230 return true;
07231 if ((InstructionPatterns::push_lea(prog.csrSrc, hostPC, locals, reg))
07232 != NULL)
07233 return true;
07234 if ((InstructionPatterns::std_link(prog.csrSrc, hostPC, locals)) != NULL)
07235 return true;
07236
07237 return false;
07238 }
07239
07240
07241