X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fm68k-opc.c;h=f635c6c230edea35d39db0b57d916260090942fb;hb=0c519399349fea4e3a718e5a2b94282e29cfe499;hp=bc01f7a727524e77d08c62acb58fc796a7deeb0e;hpb=1852237cf4611d55d2eeb0c8fb970425675668ff;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/m68k-opc.c b/opcodes/m68k-opc.c index bc01f7a727..f635c6c230 100644 --- a/opcodes/m68k-opc.c +++ b/opcodes/m68k-opc.c @@ -1,5 +1,5 @@ -/* Opcode table for m680[01234]0/m6888[12]/m68851. - Copyright 1989, 91, 92, 93, 94, 95, 1996 Free Software Foundation. +/* Opcode table for m680[012346]0/m6888[12]/m68851/mcf5200. + Copyright 1989, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation. This file is part of GDB, GAS, and the GNU binutils. @@ -38,7 +38,8 @@ const struct m68k_opcode m68k_opcodes[] = {"addib", one(0003000), one(0177700), "#b$s", m68000up }, {"addiw", one(0003100), one(0177700), "#w$s", m68000up }, -{"addil", one(0003200), one(0177700), "#l$s", m68000up | mcf5200 }, +{"addil", one(0003200), one(0177700), "#l$s", m68000up }, +{"addil", one(0003200), one(0177700), "#lDs", mcf5200 }, {"addqb", one(0050000), one(0170700), "Qd$b", m68000up }, {"addqw", one(0050100), one(0170700), "Qd%w", m68000up }, @@ -55,7 +56,8 @@ const struct m68k_opcode m68k_opcodes[] = {"addw", one(0150100), one(0170700), "*wDd", m68000up }, {"addw", one(0150500), one(0170700), "Dd~w", m68000up }, {"addl", one(0050200), one(0170700), "Qd%l", m68000up | mcf5200 }, -{"addl", one(0003200), one(0177700), "#l$s", m68000up | mcf5200 }, +{"addl", one(0003200), one(0177700), "#l$s", m68000up }, +{"addl", one(0003200), one(0177700), "#lDs", mcf5200 }, {"addl", one(0150700), one(0170700), "*lAd", m68000up | mcf5200 }, {"addl", one(0150200), one(0170700), "*lDd", m68000up | mcf5200 }, {"addl", one(0150600), one(0170700), "Dd~l", m68000up | mcf5200 }, @@ -71,7 +73,8 @@ const struct m68k_opcode m68k_opcodes[] = {"andib", one(0001074), one(0177777), "#bCs", m68000up }, {"andiw", one(0001100), one(0177700), "#w$s", m68000up }, {"andiw", one(0001174), one(0177777), "#wSs", m68000up }, -{"andil", one(0001200), one(0177700), "#l$s", m68000up | mcf5200 }, +{"andil", one(0001200), one(0177700), "#l$s", m68000up }, +{"andil", one(0001200), one(0177700), "#lDs", mcf5200 }, {"andi", one(0001100), one(0177700), "#w$s", m68000up }, {"andi", one(0001074), one(0177777), "#bCs", m68000up }, {"andi", one(0001174), one(0177777), "#wSs", m68000up }, @@ -85,7 +88,8 @@ const struct m68k_opcode m68k_opcodes[] = {"andw", one(0001174), one(0177777), "#wSs", m68000up }, {"andw", one(0140100), one(0170700), ";wDd", m68000up }, {"andw", one(0140500), one(0170700), "Dd~w", m68000up }, -{"andl", one(0001200), one(0177700), "#l$s", m68000up | mcf5200 }, +{"andl", one(0001200), one(0177700), "#l$s", m68000up }, +{"andl", one(0001200), one(0177700), "#lDs", mcf5200 }, {"andl", one(0140200), one(0170700), ";lDd", m68000up | mcf5200 }, {"andl", one(0140600), one(0170700), "Dd~l", m68000up | mcf5200 }, {"and", one(0001100), one(0177700), "#w$w", m68000up }, @@ -251,11 +255,12 @@ const struct m68k_opcode m68k_opcodes[] = {"cmpib", one(0006000), one(0177700), "#b;s", m68000up }, {"cmpiw", one(0006100), one(0177700), "#w;s", m68000up }, -{"cmpil", one(0006200), one(0177700), "#l;s", m68000up | mcf5200 }, +{"cmpil", one(0006200), one(0177700), "#l;s", m68000up }, +{"cmpil", one(0006200), one(0177700), "#lDs", mcf5200 }, {"cmpmb", one(0130410), one(0170770), "+s+d", m68000up }, {"cmpmw", one(0130510), one(0170770), "+s+d", m68000up }, -{"cmpml", one(0130610), one(0170770), "+s+d", m68000up | mcf5200 }, +{"cmpml", one(0130610), one(0170770), "+s+d", m68000up }, /* The cmp opcode can generate the cmpa, cmpm, and cmpi instructions. */ {"cmpb", one(0006000), one(0177700), "#b;s", m68000up }, @@ -266,8 +271,9 @@ const struct m68k_opcode m68k_opcodes[] = {"cmpw", one(0130510), one(0170770), "+s+d", m68000up }, {"cmpw", one(0130100), one(0170700), "*wDd", m68000up }, {"cmpl", one(0130700), one(0170700), "*lAd", m68000up | mcf5200 }, -{"cmpl", one(0006200), one(0177700), "#l;s", m68000up | mcf5200 }, -{"cmpl", one(0130610), one(0170770), "+s+d", m68000up | mcf5200 }, +{"cmpl", one(0006200), one(0177700), "#l;s", m68000up }, +{"cmpl", one(0006200), one(0177700), "#lDs", mcf5200 }, +{"cmpl", one(0130610), one(0170770), "+s+d", m68000up }, {"cmpl", one(0130200), one(0170700), "*lDd", m68000up | mcf5200 }, {"dbcc", one(0052310), one(0177770), "DsBw", m68000up }, @@ -307,7 +313,8 @@ const struct m68k_opcode m68k_opcodes[] = {"eorib", one(0005074), one(0177777), "#bCs", m68000up }, {"eoriw", one(0005100), one(0177700), "#w$s", m68000up }, {"eoriw", one(0005174), one(0177777), "#wSs", m68000up }, -{"eoril", one(0005200), one(0177700), "#l$s", m68000up | mcf5200 }, +{"eoril", one(0005200), one(0177700), "#l$s", m68000up }, +{"eoril", one(0005200), one(0177700), "#lDs", mcf5200 }, {"eori", one(0005074), one(0177777), "#bCs", m68000up }, {"eori", one(0005174), one(0177777), "#wSs", m68000up }, {"eori", one(0005100), one(0177700), "#w$s", m68000up }, @@ -319,7 +326,8 @@ const struct m68k_opcode m68k_opcodes[] = {"eorw", one(0005100), one(0177700), "#w$s", m68000up }, {"eorw", one(0005174), one(0177777), "#wSs", m68000up }, {"eorw", one(0130500), one(0170700), "Dd$s", m68000up }, -{"eorl", one(0005200), one(0177700), "#l$s", m68000up | mcf5200 }, +{"eorl", one(0005200), one(0177700), "#l$s", m68000up }, +{"eorl", one(0005200), one(0177700), "#lDs", mcf5200 }, {"eorl", one(0130600), one(0170700), "Dd$s", m68000up | mcf5200 }, {"eor", one(0005074), one(0177777), "#bCs", m68000up }, {"eor", one(0005174), one(0177777), "#wSs", m68000up }, @@ -877,11 +885,9 @@ const struct m68k_opcode m68k_opcodes[] = {"fremx", two(0xF000, 0x0025), two(0xF1C0, 0xE07F), "IiF8F7", mfloat }, {"fremx", two(0xF000, 0x4825), two(0xF1C0, 0xFC7F), "Ii;xF7", mfloat }, -{"frestore", one(0xF140), one(0xF1C0), "Id&s", mfloat }, -{"frestore", one(0xF158), one(0xF1F8), "Id+s", mfloat }, +{"frestore", one(0xF140), one(0xF1C0), "Ids", mfloat }, {"fscaleb", two(0xF000, 0x5826), two(0xF1C0, 0xFC7F), "Ii;bF7", mfloat }, {"fscaled", two(0xF000, 0x5426), two(0xF1C0, 0xFC7F), "Ii;FF7", mfloat }, @@ -1224,6 +1230,23 @@ const struct m68k_opcode m68k_opcodes[] = {"lsrl", one(0160210), one(0170770), "QdDs", m68000up | mcf5200 }, {"lsrl", one(0160250), one(0170770), "DdDs", m68000up | mcf5200 }, +/* NOTE: The mcf5200 family programmer's reference manual does not + indicate the byte form of the movea instruction is invalid (as it + is on 68000 family cpus). However, experiments on the 5202 yeild + unexpected results. The value is copied, but it is not sign extended + (as is done with movea.w) and the top three bytes in the address + register are not disturbed. I don't know if this is the intended + behavior --- it could be a hole in instruction decoding (Motorola + decided not to trap all invalid instructions for performance reasons) + --- but I suspect that it is not. + + I reported this to Motorola ISD Technical Communications Support, + which replied that other coldfire assemblers reject movea.b. For + this reason I've decided to not allow moveab. + + jtc@cygnus.com - 97/01/24 + */ + {"moveal", one(0020100), one(0170700), "*lAd", m68000up | mcf5200 }, {"moveaw", one(0030100), one(0170700), "*wAd", m68000up | mcf5200 }, @@ -1234,20 +1257,23 @@ const struct m68k_opcode m68k_opcodes[] = {"movemw", one(0044200), one(0177700), "Lw&s", m68000up }, {"movemw", one(0044240), one(0177770), "lw-s", m68000up }, -{"movemw", one(0046200), one(0177700), "!sLw", m68000up }, -{"movemw", one(0046230), one(0177770), "+sLw", m68000up }, -{"movemw", one(0044200), one(0177700), "#w&s", m68000up }, -{"movemw", one(0044240), one(0177770), "#w-s", m68000up }, -{"movemw", one(0046200), one(0177700), "!s#w", m68000up }, -{"movemw", one(0046230), one(0177770), "+s#w", m68000up }, -{"moveml", one(0044300), one(0177700), "Lw&s", m68000up | mcf5200 }, -{"moveml", one(0044340), one(0177770), "lw-s", m68000up | mcf5200 }, -{"moveml", one(0046300), one(0177700), "!sLw", m68000up | mcf5200 }, -{"moveml", one(0046330), one(0177770), "+sLw", m68000up | mcf5200 }, -{"moveml", one(0044300), one(0177700), "#w&s", m68000up | mcf5200 }, -{"moveml", one(0044340), one(0177770), "#w-s", m68000up | mcf5200 }, -{"moveml", one(0046300), one(0177700), "!s#w", m68000up | mcf5200 }, -{"moveml", one(0046330), one(0177770), "+s#w", m68000up | mcf5200 }, +{"movemw", one(0044200), one(0177700), "#w>s", m68000up }, +{"movemw", one(0046200), one(0177700), "s", m68000up }, +{"moveml", one(0046300), one(0177700), "s", m68851 }, {"psac", two(0xf040, 0x0007), two(0xffc0, 0xffff), "$s", m68851 }, {"psas", two(0xf040, 0x0006), two(0xffc0, 0xffff), "$s", m68851 }, @@ -1596,9 +1653,9 @@ const struct m68k_opcode m68k_opcodes[] = {"roxrb", one(0160020), one(0170770), "QdDs", m68000up }, {"roxrb", one(0160060), one(0170770), "DdDs", m68000up }, -{"roxrw", one(0160120), one(0170770),"QdDs", m68000up }, +{"roxrw", one(0160120), one(0170770), "QdDs", m68000up }, {"roxrw", one(0160160), one(0170770), "DdDs", m68000up }, -{"roxrw", one(0162300), one(0177700),"~s", m68000up }, +{"roxrw", one(0162300), one(0177700), "~s", m68000up }, {"roxrl", one(0160220), one(0170770), "QdDs", m68000up }, {"roxrl", one(0160260), one(0170770), "DdDs", m68000up }, @@ -1615,22 +1672,39 @@ const struct m68k_opcode m68k_opcodes[] = {"sbcd", one(0100400), one(0170770), "DsDd", m68000up }, {"sbcd", one(0100410), one(0170770), "-s-d", m68000up }, -{"scc", one(0052300), one(0177700), "$s", m68000up | mcf5200 }, -{"scs", one(0052700), one(0177700), "$s", m68000up | mcf5200 }, -{"seq", one(0053700), one(0177700), "$s", m68000up | mcf5200 }, -{"sf", one(0050700), one(0177700), "$s", m68000up | mcf5200 }, -{"sge", one(0056300), one(0177700), "$s", m68000up | mcf5200 }, -{"sgt", one(0057300), one(0177700), "$s", m68000up | mcf5200 }, -{"shi", one(0051300), one(0177700), "$s", m68000up | mcf5200 }, -{"sle", one(0057700), one(0177700), "$s", m68000up | mcf5200 }, -{"sls", one(0051700), one(0177700), "$s", m68000up | mcf5200 }, -{"slt", one(0056700), one(0177700), "$s", m68000up | mcf5200 }, -{"smi", one(0055700), one(0177700), "$s", m68000up | mcf5200 }, -{"sne", one(0053300), one(0177700), "$s", m68000up | mcf5200 }, -{"spl", one(0055300), one(0177700), "$s", m68000up | mcf5200 }, -{"st", one(0050300), one(0177700), "$s", m68000up | mcf5200 }, -{"svc", one(0054300), one(0177700), "$s", m68000up | mcf5200 }, -{"svs", one(0054700), one(0177700), "$s", m68000up | mcf5200 }, + +{"scc", one(0052300), one(0177700), "$s", m68000up }, +{"scc", one(0052300), one(0177700), "Ds", mcf5200 }, +{"scs", one(0052700), one(0177700), "$s", m68000up }, +{"scs", one(0052700), one(0177700), "Ds", mcf5200 }, +{"seq", one(0053700), one(0177700), "$s", m68000up }, +{"seq", one(0053700), one(0177700), "Ds", mcf5200 }, +{"sf", one(0050700), one(0177700), "$s", m68000up }, +{"sf", one(0050700), one(0177700), "Ds", mcf5200 }, +{"sge", one(0056300), one(0177700), "$s", m68000up }, +{"sge", one(0056300), one(0177700), "Ds", mcf5200 }, +{"sgt", one(0057300), one(0177700), "$s", m68000up }, +{"sgt", one(0057300), one(0177700), "Ds", mcf5200 }, +{"shi", one(0051300), one(0177700), "$s", m68000up }, +{"shi", one(0051300), one(0177700), "Ds", mcf5200 }, +{"sle", one(0057700), one(0177700), "$s", m68000up }, +{"sle", one(0057700), one(0177700), "Ds", mcf5200 }, +{"sls", one(0051700), one(0177700), "$s", m68000up }, +{"sls", one(0051700), one(0177700), "Ds", mcf5200 }, +{"slt", one(0056700), one(0177700), "$s", m68000up }, +{"slt", one(0056700), one(0177700), "Ds", mcf5200 }, +{"smi", one(0055700), one(0177700), "$s", m68000up }, +{"smi", one(0055700), one(0177700), "Ds", mcf5200 }, +{"sne", one(0053300), one(0177700), "$s", m68000up }, +{"sne", one(0053300), one(0177700), "Ds", mcf5200 }, +{"spl", one(0055300), one(0177700), "$s", m68000up }, +{"spl", one(0055300), one(0177700), "Ds", mcf5200 }, +{"st", one(0050300), one(0177700), "$s", m68000up }, +{"st", one(0050300), one(0177700), "Ds", mcf5200 }, +{"svc", one(0054300), one(0177700), "$s", m68000up }, +{"svc", one(0054300), one(0177700), "Ds", mcf5200 }, +{"svs", one(0054700), one(0177700), "$s", m68000up }, +{"svs", one(0054700), one(0177700), "Ds", mcf5200 }, {"stop", one(0047162), one(0177777), "#w", m68000up | mcf5200 }, @@ -1639,7 +1713,8 @@ const struct m68k_opcode m68k_opcodes[] = {"subib", one(0002000), one(0177700), "#b$s", m68000up }, {"subiw", one(0002100), one(0177700), "#w$s", m68000up }, -{"subil", one(0002200), one(0177700), "#l$s", m68000up | mcf5200 }, +{"subil", one(0002200), one(0177700), "#l$s", m68000up }, +{"subil", one(0002200), one(0177700), "#lDs", mcf5200 }, {"subqb", one(0050400), one(0170700), "Qd%s", m68000up }, {"subqw", one(0050500), one(0170700), "Qd%s", m68000up }, @@ -1656,7 +1731,8 @@ const struct m68k_opcode m68k_opcodes[] = {"subw", one(0110100), one(0170700), "*wDd", m68000up }, {"subw", one(0110500), one(0170700), "Dd~s", m68000up }, {"subl", one(0050600), one(0170700), "Qd%s", m68000up | mcf5200 }, -{"subl", one(0002200), one(0177700), "#l$s", m68000up | mcf5200 }, +{"subl", one(0002200), one(0177700), "#l$s", m68000up }, +{"subl", one(0002200), one(0177700), "#lDs", mcf5200 }, {"subl", one(0110700), one(0170700), "*lAd", m68000up | mcf5200 }, {"subl", one(0110200), one(0170700), "*lDd", m68000up | mcf5200 }, {"subl", one(0110600), one(0170700), "Dd~s", m68000up | mcf5200 }, @@ -1670,6 +1746,15 @@ const struct m68k_opcode m68k_opcodes[] = {"swap", one(0044100), one(0177770), "Ds", m68000up | mcf5200 }, +/* swbeg and swbegl are magic constants used on sysV68. The compiler + generates them before a switch table. They tell the debugger and + disassembler that a switch table follows. The parameter is the + number of elements in the table. swbeg means that the entries in + the table are word (2 byte) sized, and swbegl means that the + entries in the table are longword (4 byte) sized. */ +{"swbeg", one(0045374), one(0177777), "#w", m68000up | mcf5200 }, +{"swbegl", one(0045375), one(0177777), "#l", m68000up | mcf5200 }, + {"tas", one(0045300), one(0177700), "$s", m68000up }, #define TBL1(name,signed,round,size) \ @@ -1739,9 +1824,12 @@ TBL("tblunb", "tblunw", "tblunl", 0, 0), {"trapv", one(0047166), one(0177777), "", m68000up }, -{"tstb", one(0045000), one(0177700), ";b", m68000up | mcf5200 }, -{"tstw", one(0045100), one(0177700), "*w", m68000up | mcf5200 }, -{"tstl", one(0045200), one(0177700), "*l", m68000up | mcf5200 }, +{"tstb", one(0045000), one(0177700), ";b", m68020up | mcf5200 }, +{"tstb", one(0045000), one(0177700), "@b", m68000up }, +{"tstw", one(0045100), one(0177700), "*w", m68020up | mcf5200 }, +{"tstw", one(0045100), one(0177700), "@w", m68000up }, +{"tstl", one(0045200), one(0177700), "*l", m68020up | mcf5200 }, +{"tstl", one(0045200), one(0177700), "@l", m68000up }, {"unlk", one(0047130), one(0177770), "As", m68000up | mcf5200 },