Minor cleanup in readcpu

This commit is contained in:
Dimitris Panokostas 2020-08-31 20:39:18 +02:00
parent 1e35f035a5
commit 46b20f449a

View file

@ -197,48 +197,47 @@ STATIC_INLINE amodes mode_from_mr (int mode, int reg)
return (amodes)0;
}
static void build_insn (int insn)
static void build_insn(int insn)
{
int find = -1;
int variants;
struct instr_def id;
const TCHAR *opcstr;
const TCHAR* opcstr;
int i, n;
int flaglive = 0, flagdead = 0;
int cflow = 0;
int cflow = 0;
// Mask of flags set/used
unsigned char flags_set = 0;
unsigned char flags_used = 0;
// Mask of flags set/used
unsigned char flags_set = 0, flags_used = 0;
id = defs68k[insn];
// Control flow information
cflow = id.cflow;
// Control flow information
cflow = id.cflow;
for (i = 0, n = 4; i < 5; i++, n--) {
switch (id.flaginfo[i].flagset) {
case fa_unset:
case fa_isjmp:
break;
default:
flags_set |= (1 << n);
}
for (i = 0, n = 4; i < 5; i++, n--) {
switch (id.flaginfo[i].flagset) {
case fa_unset:
case fa_isjmp:
break;
default:
flags_set |= (1 << n);
}
switch (id.flaginfo[i].flaguse) {
case fu_unused:
case fu_isjmp:
break;
default:
flags_used |= (1 << n);
}
}
switch (id.flaginfo[i].flaguse) {
case fu_unused:
case fu_isjmp:
break;
default:
flags_used |= (1 << n);
}
}
for (i = 0; i < 5; i++) {
switch (id.flaginfo[i].flagset){
switch (id.flaginfo[i].flagset) {
case fa_unset: break;
case fa_isjmp: break;
case fa_isjmp: break;
case fa_zero: flagdead |= 1 << i; break;
case fa_one: flagdead |= 1 << i; break;
case fa_dontcare: flagdead |= 1 << i; break;
@ -286,7 +285,7 @@ out2:
for (i = 0; i < lastbit; i++) {
bitcnt[i] = bitval[i] = 0;
}
}
vmsk = 1 << id.n_variable;
@ -344,7 +343,8 @@ out2:
break;
default: abort();
}
} else {
}
else {
mnemonic[mnp] = opcstr[pos];
if (mnemonic[mnp] == 'f') {
find = -1;
@ -382,7 +382,7 @@ out2:
case 'A':
srcmode = Areg;
switch (opcstr[pos++]) {
case 'l': srcmode = absl; break;
case 'l': srcmode = absl; break;
case 'r': srcreg = bitval[bitr]; srcgather = 1; srcpos = bitpos[bitr]; break;
case 'R': srcreg = bitval[bitR]; srcgather = 1; srcpos = bitpos[bitR]; break;
default: abort();
@ -441,15 +441,15 @@ out2:
srcpos = bitpos[bitK];
}
break;
case 'E': srcmode = immi; srcreg = bitval[bitE];
if (CPU_EMU_SIZE < 5) {
/* 1..255 */
srcgather = 1;
srctype = 6;
srcpos = bitpos[bitE];
}
break;
case 'p': srcmode = immi; srcreg = bitval[bitp];
case 'E': srcmode = immi; srcreg = bitval[bitE];
if (CPU_EMU_SIZE < 5) {
/* 1..255 */
srcgather = 1;
srctype = 6;
srcpos = bitpos[bitE];
}
break;
case 'p': srcmode = immi; srcreg = bitval[bitp];
if (CPU_EMU_SIZE < 5) {
/* 0..3 */
srcgather = 1;
@ -462,13 +462,13 @@ out2:
break;
case 'd':
srcreg = bitval[bitD];
srcmode = mode_from_mr(bitval[bitd],bitval[bitD]);
srcmode = mode_from_mr(bitval[bitd], bitval[bitD]);
if (srcmode == am_illg)
continue;
if (CPU_EMU_SIZE < 2 &&
(srcmode == Areg || srcmode == Dreg || srcmode == Aind
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
{
srcgather = 1; srcpos = bitpos[bitD];
}
@ -478,28 +478,30 @@ out2:
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == srcmode)
if (mode_from_str(opcstr + pos) == srcmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
}
else {
if (opcstr[pos + 4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == srcmode)
srcmode = mode_from_str(opcstr+pos+5);
if (mode_from_str(opcstr + pos) == srcmode)
srcmode = mode_from_str(opcstr + pos + 5);
else
goto nomatch;
pos += 10;
} else {
}
else {
/* normal */
while(mode_from_str(opcstr+pos) != srcmode) {
while (mode_from_str(opcstr + pos) != srcmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while(opcstr[pos] != ']') pos++;
while (opcstr[pos] != ']') pos++;
pos++;
break;
}
@ -511,14 +513,14 @@ out2:
break;
case 's':
srcreg = bitval[bitS];
srcmode = mode_from_mr(bitval[bits],bitval[bitS]);
srcmode = mode_from_mr(bitval[bits], bitval[bitS]);
if (srcmode == am_illg)
continue;
if (CPU_EMU_SIZE < 2 &&
(srcmode == Areg || srcmode == Dreg || srcmode == Aind
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
|| srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi
|| srcmode == Apdi))
{
srcgather = 1; srcpos = bitpos[bitS];
}
@ -528,28 +530,30 @@ out2:
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == srcmode)
if (mode_from_str(opcstr + pos) == srcmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
}
else {
if (opcstr[pos + 4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == srcmode)
srcmode = mode_from_str(opcstr+pos+5);
if (mode_from_str(opcstr + pos) == srcmode)
srcmode = mode_from_str(opcstr + pos + 5);
else
goto nomatch;
pos += 10;
} else {
}
else {
/* normal */
while(mode_from_str(opcstr+pos) != srcmode) {
while (mode_from_str(opcstr + pos) != srcmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while(opcstr[pos] != ']') pos++;
while (opcstr[pos] != ']') pos++;
pos++;
}
}
@ -582,19 +586,19 @@ out2:
default: abort();
}
if (dstpos < 0 || dstpos >= 32)
abort ();
abort();
break;
case 'A':
destmode = Areg;
switch (opcstr[pos++]) {
case 'l': destmode = absl; break;
case 'l': destmode = absl; break;
case 'r': destreg = bitval[bitr]; dstgather = 1; dstpos = bitpos[bitr]; break;
case 'R': destreg = bitval[bitR]; dstgather = 1; dstpos = bitpos[bitR]; break;
case 'x': destreg = 0; dstgather = 0; dstpos = 0; break;
default: abort();
}
if (destmode != absl && (dstpos < 0 || dstpos >= 32))
abort ();
if (destmode != absl && (dstpos < 0 || dstpos >= 32))
abort();
switch (opcstr[pos]) {
case 'p': destmode = Apdi; pos++; break;
case 'P': destmode = Aipi; pos++; break;
@ -619,13 +623,13 @@ out2:
break;
case 'd':
destreg = bitval[bitD];
destmode = mode_from_mr(bitval[bitd],bitval[bitD]);
destmode = mode_from_mr(bitval[bitd], bitval[bitD]);
if (destmode == am_illg)
continue;
if (CPU_EMU_SIZE < 1 &&
(destmode == Areg || destmode == Dreg || destmode == Aind
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
{
dstgather = 1; dstpos = bitpos[bitD];
}
@ -636,28 +640,30 @@ out2:
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == destmode)
if (mode_from_str(opcstr + pos) == destmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
}
else {
if (opcstr[pos + 4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == destmode)
destmode = mode_from_str(opcstr+pos+5);
if (mode_from_str(opcstr + pos) == destmode)
destmode = mode_from_str(opcstr + pos + 5);
else
goto nomatch;
pos += 10;
} else {
}
else {
/* normal */
while(mode_from_str(opcstr+pos) != destmode) {
while (mode_from_str(opcstr + pos) != destmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while(opcstr[pos] != ']') pos++;
while (opcstr[pos] != ']') pos++;
pos++;
break;
}
@ -669,14 +675,14 @@ out2:
break;
case 's':
destreg = bitval[bitS];
destmode = mode_from_mr(bitval[bits],bitval[bitS]);
destmode = mode_from_mr(bitval[bits], bitval[bitS]);
if (destmode == am_illg)
continue;
if (CPU_EMU_SIZE < 1 &&
(destmode == Areg || destmode == Dreg || destmode == Aind
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
|| destmode == Ad16 || destmode == Ad8r || destmode == Aipi
|| destmode == Apdi))
{
dstgather = 1; dstpos = bitpos[bitS];
}
@ -687,28 +693,30 @@ out2:
/* exclusion */
do {
pos++;
if (mode_from_str(opcstr+pos) == destmode)
if (mode_from_str(opcstr + pos) == destmode)
goto nomatch;
pos += 4;
} while (opcstr[pos] == ',');
pos++;
} else {
if (opcstr[pos+4] == '-') {
}
else {
if (opcstr[pos + 4] == '-') {
/* replacement */
if (mode_from_str(opcstr+pos) == destmode)
destmode = mode_from_str(opcstr+pos+5);
if (mode_from_str(opcstr + pos) == destmode)
destmode = mode_from_str(opcstr + pos + 5);
else
goto nomatch;
pos += 10;
} else {
}
else {
/* normal */
while(mode_from_str(opcstr+pos) != destmode) {
while (mode_from_str(opcstr + pos) != destmode) {
pos += 4;
if (opcstr[pos] == ']')
goto nomatch;
pos++;
}
while(opcstr[pos] != ']') pos++;
while (opcstr[pos] != ']') pos++;
pos++;
}
}
@ -726,17 +734,17 @@ out2:
if (destmode == Areg && sz == sz_byte)
goto nomatch;
endofline:
endofline:
/* now, we have a match */
if (table68k[opc].mnemo != i_ILLG)
;//write_log (_T("Double match: %x: %s\n"), opc, opcstr);
if (find == -1) {
for (find = 0;; find++) {
if (_tcscmp (mnemonic, lookuptab[find].name) == 0) {
if (_tcscmp(mnemonic, lookuptab[find].name) == 0) {
table68k[opc].mnemo = lookuptab[find].mnemo;
break;
}
if (_tcslen (lookuptab[find].name) == 0)
if (_tcslen(lookuptab[find].name) == 0)
abort();
}
}
@ -779,44 +787,44 @@ endofline:
table68k[opc].clocks = id.clocks;
table68k[opc].fetchmode = id.fetchmode;
// Fix flags used information for Scc, Bcc, TRAPcc, DBcc instructions
if ( table68k[opc].mnemo == i_Scc
|| table68k[opc].mnemo == i_Bcc
|| table68k[opc].mnemo == i_DBcc
|| table68k[opc].mnemo == i_TRAPcc
) {
switch (table68k[opc].cc) {
// CC mask: XNZVC
// 8421
case 0: flags_used = 0x00; break; /* T */
case 1: flags_used = 0x00; break; /* F */
case 2: flags_used = 0x05; break; /* HI */
case 3: flags_used = 0x05; break; /* LS */
case 4: flags_used = 0x01; break; /* CC */
case 5: flags_used = 0x01; break; /* CS */
case 6: flags_used = 0x04; break; /* NE */
case 7: flags_used = 0x04; break; /* EQ */
case 8: flags_used = 0x02; break; /* VC */
case 9: flags_used = 0x02; break; /* VS */
case 10:flags_used = 0x08; break; /* PL */
case 11:flags_used = 0x08; break; /* MI */
case 12:flags_used = 0x0A; break; /* GE */
case 13:flags_used = 0x0A; break; /* LT */
case 14:flags_used = 0x0E; break; /* GT */
case 15:flags_used = 0x0E; break; /* LE */
// Fix flags used information for Scc, Bcc, TRAPcc, DBcc instructions
if (table68k[opc].mnemo == i_Scc
|| table68k[opc].mnemo == i_Bcc
|| table68k[opc].mnemo == i_DBcc
|| table68k[opc].mnemo == i_TRAPcc
) {
switch (table68k[opc].cc) {
// CC mask: XNZVC
// 8421
case 0: flags_used = 0x00; break; /* T */
case 1: flags_used = 0x00; break; /* F */
case 2: flags_used = 0x05; break; /* HI */
case 3: flags_used = 0x05; break; /* LS */
case 4: flags_used = 0x01; break; /* CC */
case 5: flags_used = 0x01; break; /* CS */
case 6: flags_used = 0x04; break; /* NE */
case 7: flags_used = 0x04; break; /* EQ */
case 8: flags_used = 0x02; break; /* VC */
case 9: flags_used = 0x02; break; /* VS */
case 10:flags_used = 0x08; break; /* PL */
case 11:flags_used = 0x08; break; /* MI */
case 12:flags_used = 0x0A; break; /* GE */
case 13:flags_used = 0x0A; break; /* LT */
case 14:flags_used = 0x0E; break; /* GT */
case 15:flags_used = 0x0E; break; /* LE */
}
}
}
#if 1
/* gb-- flagdead and flaglive would not have correct information */
table68k[opc].flagdead = flags_set;
table68k[opc].flaglive = flags_used;
/* gb-- flagdead and flaglive would not have correct information */
table68k[opc].flagdead = flags_set;
table68k[opc].flaglive = flags_used;
#else
table68k[opc].flagdead = flagdead;
table68k[opc].flaglive = flaglive;
#endif
table68k[opc].cflow = cflow;
nomatch:
table68k[opc].cflow = cflow;
nomatch:
/* FOO! */;
}
}