* Fix a few wrong fallthroughs in switch cases:
- add a missing return; at the end of a case, leading to wrong disassembly of the next few instructions after fmovem. - while we're here, correct the same bug in PBcc. XXX there are a few other dubious fallthroughs in this file (which are not explicitly marked with /* FALLTHROUGH */), which I didn't yet analyze. * Fix other FMOVEM interpretation bugs: - correct printing of FP data register lists if all are used (only FP0 would be mentioned) - correct printing of FP data register lists in the case the list is reversed (would have printed nothing) - correct mapping of fp0-fp7 to register list bits (was reversed) - correct printing of FP control register lists (this list is never reversed) - correct printing of FMOVEM with FP control registers (the data direction was interpreted the wrong way) * While we're here, enhance the comments in MOVC's list of cpu control registers
This commit is contained in:
parent
d5f094e14f
commit
072b7020c4
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: db_disasm.c,v 1.16 1996/10/24 18:30:17 is Exp $ */
|
/* $NetBSD: db_disasm.c,v 1.17 1996/10/28 08:43:18 is Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994 Christian E. Hopps
|
* Copyright (c) 1994 Christian E. Hopps
|
||||||
|
@ -152,7 +152,7 @@ const char *const mmcc_table[16] = {
|
||||||
const char *const aregs[8] = {"a0","a1","a2","a3","a4","a5","a6","sp"};
|
const char *const aregs[8] = {"a0","a1","a2","a3","a4","a5","a6","sp"};
|
||||||
const char *const dregs[8] = {"d0","d1","d2","d3","d4","d5","d6","d7"};
|
const char *const dregs[8] = {"d0","d1","d2","d3","d4","d5","d6","d7"};
|
||||||
const char *const fpregs[8] = {
|
const char *const fpregs[8] = {
|
||||||
"fp0","fp1","fp2","fp3","fp4","fp5","fp6","fp7" };
|
"fp7","fp6","fp5","fp4","fp3","fp2","fp1","fp0" };
|
||||||
const char *const fpcregs[3] = { "fpiar", "fpsr", "fpcr" };
|
const char *const fpcregs[3] = { "fpiar", "fpsr", "fpcr" };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1383,6 +1383,7 @@ opcode_fpu(dbuf, opc)
|
||||||
}
|
}
|
||||||
if (ISBITSET(ext,15) || ISBITSET(ext,13)) {
|
if (ISBITSET(ext,15) || ISBITSET(ext,13)) {
|
||||||
opcode_fmove_ext(dbuf, opc, ext);
|
opcode_fmove_ext(dbuf, opc, ext);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(opmode) {
|
switch(opmode) {
|
||||||
|
@ -1637,12 +1638,12 @@ opcode_fmove_ext(dbuf, opc, ext)
|
||||||
addchar('l');
|
addchar('l');
|
||||||
addchar('\t');
|
addchar('\t');
|
||||||
|
|
||||||
if (!ISBITSET(ext,13)) {
|
if (ISBITSET(ext,13)) {
|
||||||
print_freglist(dbuf, AR_DEC, BITFIELD(ext,12,10), 1);
|
print_freglist(dbuf, AR_DEC, BITFIELD(ext,12,10), 1);
|
||||||
addchar(',');
|
addchar(',');
|
||||||
}
|
}
|
||||||
get_modregstr(dbuf, 5, GETMOD_BEFORE, SIZE_LONG, 1);
|
get_modregstr(dbuf, 5, GETMOD_BEFORE, SIZE_LONG, 1);
|
||||||
if (ISBITSET(ext,13)) {
|
if (!ISBITSET(ext,13)) {
|
||||||
addchar(',');
|
addchar(',');
|
||||||
print_freglist(dbuf, AR_DEC, BITFIELD(ext,12,10), 1);
|
print_freglist(dbuf, AR_DEC, BITFIELD(ext,12,10), 1);
|
||||||
}
|
}
|
||||||
|
@ -1736,6 +1737,7 @@ opcode_mmu(dbuf, opc)
|
||||||
-1);
|
-1);
|
||||||
dbuf->used += 2;
|
dbuf->used += 2;
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
case 1:
|
case 1:
|
||||||
ext = *(dbuf->val + 1);
|
ext = *(dbuf->val + 1);
|
||||||
dbuf->used++;
|
dbuf->used++;
|
||||||
|
@ -2105,19 +2107,22 @@ print_freglist(dbuf, mod, rl, cntl)
|
||||||
regs = cntl ? fpcregs : fpregs;
|
regs = cntl ? fpcregs : fpregs;
|
||||||
upper = cntl ? 3 : 8;
|
upper = cntl ? 3 : 8;
|
||||||
|
|
||||||
if (mod == AR_DEC) {
|
if (!cntl && mod == AR_DEC) {
|
||||||
list = rl;
|
list = rl;
|
||||||
rl = 0;
|
rl = 0;
|
||||||
/* I am sure there is some trick... */
|
/* I am sure there is some trick... */
|
||||||
for (bit = 0; bit < upper; bit++)
|
for (bit = 0; bit < upper; bit++)
|
||||||
if (list & (1 << bit))
|
if (list & (1 << bit))
|
||||||
rl |= (0x8000 >> bit);
|
rl |= 1 << (upper-bit-1);
|
||||||
}
|
}
|
||||||
for (bit = 0, list = 0; bit < upper; bit++) {
|
for (bit = upper-1, list = 0; bit >= 0; bit--) {
|
||||||
if (ISBITSET(rl,bit)) {
|
if (ISBITSET(rl,bit)) {
|
||||||
if (list == 0) {
|
if (list == 0) {
|
||||||
list = 1;
|
|
||||||
addstr(dbuf, regs[bit]);
|
addstr(dbuf, regs[bit]);
|
||||||
|
if (cntl)
|
||||||
|
addchar('/');
|
||||||
|
else
|
||||||
|
list = 1;
|
||||||
} else if (list == 1) {
|
} else if (list == 1) {
|
||||||
list++;
|
list++;
|
||||||
addchar('-');
|
addchar('-');
|
||||||
|
@ -2125,12 +2130,15 @@ print_freglist(dbuf, mod, rl, cntl)
|
||||||
} else {
|
} else {
|
||||||
if (list) {
|
if (list) {
|
||||||
if (list > 1)
|
if (list > 1)
|
||||||
addstr(dbuf, regs[bit-1]);
|
addstr(dbuf, regs[bit+1]);
|
||||||
addchar('/');
|
addchar('/');
|
||||||
list = 0;
|
list = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (list > 1)
|
||||||
|
addstr(dbuf, regs[0]);
|
||||||
|
|
||||||
if (dbuf->casm[-1] == '/' || dbuf->casm[-1] == '-')
|
if (dbuf->casm[-1] == '/' || dbuf->casm[-1] == '-')
|
||||||
dbuf->casm--;
|
dbuf->casm--;
|
||||||
*dbuf->casm = 0;
|
*dbuf->casm = 0;
|
||||||
|
@ -2189,7 +2197,7 @@ opcode_movec(dbuf, opc)
|
||||||
addchar(',');
|
addchar(',');
|
||||||
}
|
}
|
||||||
switch (BITFIELD(ext,11,0)) {
|
switch (BITFIELD(ext,11,0)) {
|
||||||
/* 010/020/030/040/CPU32 */
|
/* 010/020/030/040/CPU32/060 */
|
||||||
case 0x000:
|
case 0x000:
|
||||||
tmp = "sfc";
|
tmp = "sfc";
|
||||||
break;
|
break;
|
||||||
|
@ -2206,17 +2214,18 @@ opcode_movec(dbuf, opc)
|
||||||
case 0x802:
|
case 0x802:
|
||||||
tmp = "caar";
|
tmp = "caar";
|
||||||
break;
|
break;
|
||||||
/* 020/030/040 */
|
/* 020/030/040/060 */
|
||||||
case 0x002:
|
case 0x002:
|
||||||
tmp = "cacr";
|
tmp = "cacr";
|
||||||
break;
|
break;
|
||||||
|
/* 020/030/040 */
|
||||||
case 0x803:
|
case 0x803:
|
||||||
tmp = "msp";
|
tmp = "msp";
|
||||||
break;
|
break;
|
||||||
case 0x804:
|
case 0x804:
|
||||||
tmp = "isp";
|
tmp = "isp";
|
||||||
break;
|
break;
|
||||||
/* 040 */
|
/* 040/060 */
|
||||||
case 0x003:
|
case 0x003:
|
||||||
tmp = "tc";
|
tmp = "tc";
|
||||||
break;
|
break;
|
||||||
|
@ -2232,16 +2241,18 @@ opcode_movec(dbuf, opc)
|
||||||
case 0x007:
|
case 0x007:
|
||||||
tmp = "dtt1";
|
tmp = "dtt1";
|
||||||
break;
|
break;
|
||||||
|
/* 040 */
|
||||||
case 0x805:
|
case 0x805:
|
||||||
tmp = "mmusr";
|
tmp = "mmusr";
|
||||||
break;
|
break;
|
||||||
|
/* 040/060 */
|
||||||
case 0x806:
|
case 0x806:
|
||||||
tmp = "urp";
|
tmp = "urp";
|
||||||
break;
|
break;
|
||||||
case 0x807:
|
case 0x807:
|
||||||
tmp = "srp";
|
tmp = "srp";
|
||||||
break;
|
break;
|
||||||
/* 060: */
|
/* 060 */
|
||||||
case 0x808:
|
case 0x808:
|
||||||
tmp = "pcr";
|
tmp = "pcr";
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue