doc/gdbinv-s.m4.in: remove text on special procedures to continue after
[external/binutils.git] / include / h8300-opcode.h
1 /* Opcode table for the H8-300
2    Copyright (C) 1989, 1991 Free Software Foundation.
3    Written by Steve Chamberlain, steve@cygnus.com.
4
5 This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
20
21 typedef enum op_type
22   {
23 Hex0=0,
24 Hex1,Hex2,Hex3,Hex4,Hex5,Hex6,Hex7,Hex8,Hex9,HexA,HexB,HexC,HexD,HexE,HexF,
25     START = 0x20,
26     KBIT,                               /* K is #1, or #2, yielding 0x0 or 0x8 */
27     IMM3,                               /* bit number */
28     RD8,                                /* 8 bit reg as 2nd op  */
29     RD16,                               /* 16 bit reg as 2nd op */
30     RS8,                                /* 8 bit reg as 1st op */
31     RS16,                               /* 16 bit reg 1st op */
32     IMM8,                               /* constant which fits into 8 bits */
33     IMM16,                      /* constant which fits into 16 bits */
34     CCR,                                /* CCR reg */
35     ABS8SRC,                    /* abs 8 address mode */
36     ABS8DST,                    /* abs 8 address mode */
37     DISP8,                      /* pc rel displacement */
38     ABS16SRC,                   /* abs 16 address mode */
39     ABS16DST,                   /* abs 16 address mode */
40     DISPSRC,                    /* @(r:16) address mode src */
41     DISPDST,                    /* @(r:16) address mode dst*/
42     DISPREG,                    /* register from DISP address mode */
43     RDDEC,                      /* @-rn mode */
44     RSINC,                      /* @rn+ mode */
45     RDIND,                      /* @R mode dst */
46     RSIND,                      /* @R mode src */
47     MEMIND,                     /* @@r8 mode */
48     IGNORE,
49     B30 = 0x40,                 /* bit 3 must be low */
50     B31 = 0x80,                 /* bit 3 must be high */
51
52   E                             /* End of list */
53   } op_type;
54
55
56 struct code {
57
58   op_type nib[9];
59 } ;
60
61 struct h8_opcode {
62   int length;
63   int noperands;        /* Number of operands this opcode takes */
64   int nopcodes;         /* Number of opcodes with same mnemonic */
65   char *name;
66   struct code args;
67   struct code data;
68 int value;
69 };
70
71
72
73 struct h8_opcode h8_opcodes[] 
74 #ifdef DEFINE_TABLE
75
76 #define BITOP(n,imm, name, op00, op01,op10,op11, op20,op21)\
77 {  2,  2,n, name,       {imm,RD8,E},    {op00, op01, imm, RD8,E}},\
78 { 4,   2,n, name,       {imm,RDIND,E},  {op10, op11, RDIND, 0, op00,op01, imm, 0,E}},\
79 { 4,   2,n, name,       {imm,ABS8DST,E},        {op20, op21, ABS8DST, IGNORE, op00,op01, imm, 0,E}}
80
81 #define EBITOP(n,imm, name, op00, op01,op10,op11, op20,op21)\
82    BITOP(n,imm, name, op00+1, op01, op10,op11, op20,op21),\
83    BITOP(n, RS8,  name, op00, op01, op10,op11, op20,op21)
84
85 #define BRANCH(name, op) \
86 {   2,  1, 1,name,{DISP8,E}, { Hex4, op, DISP8,IGNORE,E }}
87
88 #define TWOOP(name, op1, op2,op3) \
89 { 2,  2, 2, name, {IMM8, RD8,E},        { op1, RD8, IMM8,IGNORE,E}},\
90 { 2,  2, 2, name, {RS8, RD8, E},        { op2, op3, RS8, RD8 ,E}} 
91
92 #define UNOP(name, op1, op2) \
93 { 2, 1, 1, name, {RS8, E}, { op1, op2, 0, RS8, E}}
94
95 #define UNOP3(name, op1, op2, op3) \
96 {2, 1, 1, name , {RS8, E}, {op1, op2, op3, RS8, E}}
97
98 #define WTWOP(name, op1, op2) \
99 {2, 2, 1, name, {RS16, RD16, E}, { op1, op2, RS16, RD16, E}}
100
101
102 {
103   TWOOP("add.b", Hex8,  Hex0,Hex8),
104   WTWOP("add.w", Hex0, Hex9),
105     { 2,  2, 1, "adds", {KBIT,RD16|B30, E},{Hex0, HexB, KBIT, RD16|B30, E}},
106   TWOOP("addx", Hex9,Hex0,HexE),
107   TWOOP("and", HexE,Hex1,Hex6),
108     {  2,  2, 1, "andc",        {IMM8, CCR, E}, { Hex0, Hex6, IMM8,IGNORE, E}},
109   BITOP(3,IMM3|B30, "band", Hex7, Hex6, Hex7, HexC,  Hex7, HexE),
110   BRANCH("bra", Hex0),
111   BRANCH("bt",  Hex0),
112   BRANCH("brn", Hex1),
113   BRANCH("bf",  Hex1),
114   BRANCH("bhi", Hex2),
115   BRANCH("bls", Hex3),
116   BRANCH("bcc", Hex4),
117   BRANCH("bhs", Hex4),
118   BRANCH("bcs", Hex5),
119   BRANCH("blo", Hex5),
120   BRANCH("bne", Hex6),
121   BRANCH("beq", Hex7),
122   BRANCH("bvc", Hex8),
123   BRANCH("bvs", Hex9),
124   BRANCH("bpl", HexA),
125   BRANCH("bmi", HexB),
126   BRANCH("bge", HexC),
127   BRANCH("blt", HexD),
128   BRANCH("bgt", HexE),
129   BRANCH("ble", HexF),
130   EBITOP(6,IMM3|B30,"bclr", Hex6, Hex2, Hex7, HexD, Hex7, HexF),
131   BITOP(3,IMM3|B31,"biand", Hex7, Hex6, Hex7, HexC, Hex7, HexE),
132   BITOP(3,IMM3|B31, "bild",     Hex7, Hex7,Hex7, HexC, Hex7, HexE),
133   BITOP(3,IMM3|B31, "bior",     Hex7, Hex4,Hex7, HexC, Hex7, HexE),
134   BITOP(3,IMM3|B31, "bist",     Hex6, Hex7,Hex7, HexD, Hex7, HexE),
135   BITOP(3,IMM3|B31, "bixor",    Hex7, Hex5,Hex7, HexC, Hex7, HexE),
136   BITOP(3,IMM3|B30, "bld",      Hex7, Hex7,Hex7, HexC, Hex7, HexE),
137   EBITOP(6,IMM3|B30,"bnot", Hex6, Hex1, Hex7, HexD, Hex7, HexF),
138   BITOP(3,IMM3|B30,"bor",       Hex7, Hex4,Hex7, HexC, Hex7, HexE),
139   EBITOP(6,IMM3|B30,"bset",     Hex6, Hex0,Hex7, HexD, Hex7, HexF),
140     {  2,  1, 1, "bsr",{DISP8, E},{ Hex5, Hex5, DISP8,IGNORE, E}},
141   BITOP(3,IMM3|B30, "bst",      Hex6, Hex7,Hex7, HexD, Hex7, HexF),
142   EBITOP(6,IMM3|B30, "btst",    Hex6, Hex3,Hex7, HexC, Hex7, HexE),
143   BITOP(3,IMM3|B30, "bxor",     Hex7,Hex5,Hex7, HexC, Hex7, HexE),
144   TWOOP( "cmp.b",HexA, Hex1, HexC),
145   WTWOP( "cmp.w",Hex1,HexD),
146   UNOP(   "daa",Hex0, HexF),
147   UNOP(   "das",Hex1, HexF),
148   UNOP(   "dec",Hex1, HexA),
149     {  2,  2, 1, "divxu",{RS8, RD16|B30, E}, { Hex5, Hex1, RS8, RD16|B30, E}},
150     {  4,  0, 1, "eepmov",{ E}, {Hex7, HexB, Hex5, HexC, Hex5, Hex9, Hex8, HexF,E}},
151   UNOP(   "inc",        Hex0, HexA),
152     {  2,  1, 3, "jmp",{RSIND|B30, E}, {Hex5, Hex9, RSIND|B30, Hex0, E}},
153     {  4,  1, 3, "jmp",{ABS16SRC, E}, {Hex5, HexA, Hex0, Hex0, ABS16SRC, IGNORE,IGNORE,IGNORE,E}},
154     {  2,  1, 3, "jmp",{MEMIND, E}, {Hex5, HexB, MEMIND,IGNORE, E}},
155     {  2,  1, 3, "jsr",{RSIND|B30, E}, {Hex5, HexD, RSIND|B30, Hex0, E}},
156     {  4,  1, 3, "jsr",{ABS16SRC, E}, {Hex5, HexE, Hex0, Hex0, ABS16SRC,IGNORE,IGNORE,IGNORE, E}},
157     {  2,  1, 3, "jsr",{MEMIND, E}, {Hex5, HexF, MEMIND, IGNORE,E}},
158     {  2,  2, 2, "ldc", {IMM8, CCR, E}, { Hex0, Hex7, IMM8,IGNORE, E}},
159     {  2,  2, 2, "ldc", {RS8, CCR, E},  { Hex0, Hex3, Hex0, RS8, E}},
160
161     {  2,  2,13,  "mov.b",      {RS8, RD8, E},  { Hex0, HexC, RS8, RD8, E}},
162     {  2,  2,13,  "mov.b",      {IMM8, RD8, E}, { HexF, RD8, IMM8,IGNORE, E}},
163     {  2,  2,13,  "mov.b",      {RSIND|B30,RD8, E},     { Hex6, Hex8, RSIND|B30, RD8, E}},
164     {  4,  2,13,  "mov.b",      {DISPSRC,RD8, E},       { Hex6, HexE, DISPREG|B30, RD8, DISPSRC, IGNORE, IGNORE, IGNORE, E}} ,
165     {  2,  2,13,  "mov.b",      {RSINC|B30, RD8, E},    { Hex6, HexC, RSINC|B30, RD8, E}},
166
167     {  4,  2,13,  "mov.b",      {ABS16SRC, RD8, E},     { Hex6, HexA, Hex0, RD8,ABS16SRC, IGNORE,IGNORE,IGNORE,E}},
168     {  2,  2,13,  "mov.b",      {ABS8SRC, RD8, E},      { Hex2, RD8, ABS8SRC,IGNORE, E}},
169     {  2,  2,13,  "mov.b",      {RS8, RDIND|B30, E},    { Hex6, Hex8, RDIND|B31, RS8, E}},
170     {  4,  2,13,  "mov.b",      {RS8, DISPDST, E},      { Hex6, HexE, DISPREG|B31, RS8,DISPDST, IGNORE, IGNORE, IGNORE, E}},
171     {  2,  2,13,  "mov.b",      {RS8, RDDEC|B31, E},    { Hex6, HexC, RDDEC|B31, RS8, E}},
172 /* Put the 16 bit one in first so it matches first */
173     {  4,  2,13,  "mov.b",      {RS8, ABS16DST, E},     { Hex6, HexA, Hex8, RS8, ABS16DST,IGNORE,IGNORE,IGNORE, E}},
174     {  2,  2,13,  "mov.b",      {RS8, ABS8DST, E},      { Hex3, RS8, ABS8DST,IGNORE, E}},
175     {  2,  2,11,  "mov.w",      {RS16|B30, RD16|B30, E},{ Hex0, HexD, RS16|B30, RD16|B30, E}},
176     {  4,  2,11,  "mov.w",      {IMM16, RD16|B30, E},   { Hex7, Hex9, Hex0, RD16|B30, IMM16,IGNORE,IGNORE,IGNORE, E}},
177     {  2,  2,11,  "mov.w",      {RSIND|B30,RD16|B30, E},{ Hex6, Hex9, RSIND|B30, RD16|B30, E}},
178     {  4,  2,11,  "mov.w",      {DISPSRC,RD16|B30, E},  { Hex6, HexF, DISPREG|B30, RD16|B30, DISPSRC, IGNORE, IGNORE, IGNORE,E}} ,
179     {  2,  2,11,  "mov.w",      {RSINC|B30, RD16|B30, E},       { Hex6, HexD, RSINC|B30, RD16|B30, E}},
180     {  4,  2,11,  "mov.w",      {ABS16SRC, RD16|B30, E},        { Hex6, HexB, Hex0, RD16|B30,ABS16SRC,IGNORE,IGNORE,IGNORE, E}},
181     {  2,  2,11,  "mov.w",      {RS16|B30, RDIND|B30, E},{ Hex6, Hex9, RDIND|B31, RS16|B30, E}},
182     {  4,  2,11,  "mov.w",      {RS16|B30, DISPDST, E}, { Hex6, HexF, DISPREG|B31, RS16|B30,DISPDST, IGNORE,IGNORE,IGNORE,E}},
183     {  2,  2,11,  "mov.w",      {RS16|B30, RDDEC|B30, E},{ Hex6, HexD, RDDEC|B31, RS16|B30, E}},
184     {  4,  2,11,  "mov.w",      {RS16|B30, ABS16DST, E},        { Hex6, HexB, Hex8, RS16|B30, ABS16DST, IGNORE, IGNORE, IGNORE, E}},
185
186
187     {  4,  2,1,  "movfpe",      {ABS16SRC, RD8, E},     { Hex6, HexA, Hex4, RD8, ABS16SRC,IGNORE,IGNORE,IGNORE, E}},
188     {  4,  2,1,  "movtpe",      {RS8, ABS16DST, E},     { Hex6, HexA, HexC, RS8, ABS16DST,IGNORE,IGNORE,IGNORE, E}},
189     {  2,  2,1,  "mulxu",       {RS8, RD16|B30, E},     { Hex5, Hex0, RS8, RD16|B30, E}},
190     {  2,  1,1,  "neg", {RS8, E},               { Hex1, Hex7, Hex8, RS8, E}},
191     {  2,  0,1,  "nop", {E},            { Hex0, Hex0, Hex0, Hex0,E}},
192     {  2,  1,1,  "not", {RS8,E},                { Hex1, Hex7, Hex0, RS8,E}},
193   TWOOP("or", HexC, Hex1, Hex4),
194     {  2,  2,1,    "orc",       {IMM8, CCR,E},  { Hex0, Hex4, IMM8,IGNORE,E}},
195     {  2,  1,1,  "pop", {RS16|B30,E},           { Hex6, HexD, Hex7, RS16|B30,E}},
196     {  2,  1,1,  "push",        {RS16|B30,E},           { Hex6, HexD, HexF, RS16|B30,E}},
197   UNOP3(  "rotl",Hex1, Hex2,Hex8),
198   UNOP3(  "rotr",Hex1, Hex3, Hex8),
199   UNOP3(  "rotxl",Hex1, Hex2, Hex0),
200   UNOP3(  "rotxr",Hex1, Hex3, Hex0),
201     {  2,  0, 1, "rte", {E},            { Hex5, Hex6, Hex7, Hex0,E}},
202     {  2,  0, 1, "rts", {E},            { Hex5, Hex4, Hex7, Hex0,E}},
203   UNOP3(   "shal",      Hex1, Hex0, Hex8),
204   UNOP3(    "shar",     Hex1, Hex1, Hex8),
205   UNOP3(    "shll",     Hex1, Hex0, Hex0),
206   UNOP3(    "shlr",     Hex1, Hex1, Hex0),
207     {  2,  0, 1, "sleep",       {E},            { Hex0, Hex1, Hex8, Hex0,E}},
208     {  2,  2, 1, "stc", {CCR, RD8,E},   { Hex0, Hex2, Hex0, RD8,E}},
209     {  2,  2, 1, "sub.b",       {RS8,RD8,E},    { Hex1, Hex8, RS8, RD8,E}},
210     {  2,  2, 1, "sub.w",       {RS16|B30, RD16|B30,E},         {Hex1, Hex9, RS16|B30, RD16|B30,E}},
211     {  2,  2, 1, "subs",        {KBIT,RD16|B30,E},      { Hex1, HexB, KBIT, RD16|B30,E}},
212   TWOOP("subx",HexB, Hex1, HexE),
213   TWOOP("xor", HexD, Hex1, Hex5), 
214     {  2,  2,  1,"xorc",        {IMM8, CCR,E}, { Hex0, Hex5, IMM8,IGNORE,E}},
215     {  2,  0,1,  "bad 52",      {E, IMM8},              { Hex5, Hex2, IMM8, IGNORE,E}},
216     {  2,  0,1,  "bad 53",      {E, IMM8},              { Hex5, Hex3, IMM8, IGNORE,E}},
217     {  2,  0,1,  "bad 57",      {E, IMM8},              { Hex5, Hex7, IMM8, IGNORE,E}},
218     {  2,  0,1,  "bad 58",      {E, IMM8},              { Hex5, Hex8, IMM8, IGNORE,E}},
219     {  2,  0,1,  "bad 64",      {E, IMM8},              { Hex6, Hex4, IMM8, IGNORE,E}},
220     {  2,  0,1,  "bad 65",      {E, IMM8},              { Hex6, Hex5, IMM8, IGNORE,E}},
221     {  2,  0,1,  "bad 66",      {E, IMM8},              { Hex6, Hex6, IMM8, IGNORE,E}},
222     {  2,  0,1,  "bad 78",      {E, IMM8},              { Hex7, Hex8, IMM8, IGNORE,E}},
223     {  2,  0,1,  "bad 7a",      {E, IMM8},              { Hex7, HexA, IMM8, IGNORE,E}},
224     {  2,  0,1,  "bad 5c",      {E, IMM8},              { Hex5, HexC, IMM8, IGNORE,E}},
225
226   0
227   }
228
229
230
231 #endif
232
233 ;