Initial revision
[deliverable/binutils-gdb.git] / include / opcode / h8300.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 ;
This page took 0.066442 seconds and 5 git commands to generate.