OSDN Git Service

Use datarootdir for locales.
[pf3gnuchains/pf3gnuchains4x.git] / include / opcode / m88k.h
1 /* Table of opcodes for the Motorola M88k family.
2    Copyright 1989, 1990, 1991, 1993, 2001, 2002, 2010
3    Free Software Foundation, Inc.
4
5    This file is part of GDB and GAS.
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 3 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., 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21
22 /*
23  *                      Disassembler Instruction Table
24  *
25  *      The first field of the table is the opcode field. If an opcode
26  *      is specified which has any non-opcode bits on, a system error
27  *      will occur when the system attempts the install it into the
28  *      instruction table.  The second parameter is a pointer to the
29  *      instruction mnemonic. Each operand is specified by offset, width,
30  *      and type. The offset is the bit number of the least significant
31  *      bit of the operand with bit 0 being the least significant bit of
32  *      the instruction. The width is the number of bits used to specify
33  *      the operand. The type specifies the output format to be used for
34  *      the operand. The valid formats are: register, register indirect,
35  *      hex constant, and bit field specification.  The last field is a
36  *      pointer to the next instruction in the linked list.  These pointers
37  *      are initialized by init_disasm().
38  *
39  *                              Revision History
40  *
41  *      Revision 1.0    11/08/85        Creation date
42  *               1.1    02/05/86        Updated instruction mnemonic table MD
43  *               1.2    06/16/86        Updated SIM_FLAGS for floating point
44  *               1.3    09/20/86        Updated for new encoding
45  *                      05/11/89        R. Trawick adapted from Motorola disassembler
46  */
47
48 #include <stdio.h>
49
50 /* Define the number of bits in the primary opcode field of the instruction,
51    the destination field, the source 1 and source 2 fields.  */
52
53 /* Size of opcode field.  */
54 #define OP 8
55
56 /* Size of destination.  */
57 #define DEST 6
58
59 /* Size of source1.  */
60 #define SOURCE1 6
61
62 /* Size of source2.  */
63 #define SOURCE2 6
64
65 /* Number of registers.  */
66 #define REGs 32
67
68 /* Type definitions.  */
69
70 typedef unsigned int UINT;
71 #define    WORD    long
72 #define    FLAG    unsigned
73 #define    STATE   short
74
75 /* The next four equates define the priorities that the various classes
76  * of instructions have regarding writing results back into registers and
77  * signalling exceptions.  */
78
79 /* PMEM is also defined in <sys/param.h> on Delta 88's.  Sigh!  */
80 #undef PMEM
81
82 /* Integer priority.  */
83 #define    PINT  0
84
85 /* Floating point priority.  */
86 #define    PFLT  1
87
88 /* Memory priority.  */
89 #define    PMEM  2
90
91 /* Not applicable, instruction doesn't write to regs.  */
92 #define    NA    3
93
94 /* Highest of these priorities.  */
95 #define    HIPRI 3
96
97 /* The instruction registers are an artificial mechanism to speed up
98  * simulator execution.  In the real processor, an instruction register
99  * is 32 bits wide.  In the simulator, the 32 bit instruction is kept in
100  * a structure field called rawop, and the instruction is partially decoded,
101  * and split into various fields and flags which make up the other fields
102  * of the structure.
103  * The partial decode is done when the instructions are initially loaded
104  * into simulator memory.  The simulator code memory is not an array of
105  * 32 bit words, but is an array of instruction register structures.
106  * Yes this wastes memory, but it executes much quicker.
107  */
108
109 struct IR_FIELDS
110 {
111   unsigned op:OP,
112     dest: DEST,
113     src1: SOURCE1,
114     src2: SOURCE2;
115   int ltncy,
116     extime,
117     /* Writeback priority.  */
118     wb_pri;
119   /* Immediate size.  */
120   unsigned        imm_flags:2,
121     /* Register source 1 used.  */
122     rs1_used:1,
123     /* Register source 2 used. */
124     rs2_used:1,
125     /* Register source/dest. used.  */
126     rsd_used:1,
127     /* Complement.  */
128     c_flag:1,
129     /* Upper half word.  */
130     u_flag:1,
131     /* Execute next.  */
132     n_flag:1,
133     /* Uses writeback slot.  */
134     wb_flag:1,
135     /* Dest size.  */
136     dest_64:1,
137     /* Source 1 size.  */
138     s1_64:1,
139     /* Source 2 size.  */
140     s2_64:1,
141     scale_flag:1,
142     /* Scaled register.  */
143     brk_flg:1;
144 };
145
146 struct  mem_segs
147 {
148   /* Pointer (returned by calloc) to segment.  */
149   struct mem_wrd *seg;                  
150
151   /* Base load address from file headers.  */
152   unsigned long baseaddr;                       
153
154   /* Ending address of segment.  */
155   unsigned long endaddr;                
156
157   /* Segment control flags (none defined).  */  
158   int         flags;                    
159 };
160
161 #define MAXSEGS         (10)                    /* max number of segment allowed */
162 #define MEMSEGSIZE      (sizeof(struct mem_segs))/* size of mem_segs structure */
163
164 #if 0
165 #define BRK_RD          (0x01)                  /* break on memory read */
166 #define BRK_WR          (0x02)                  /* break on memory write */
167 #define BRK_EXEC        (0x04)                  /* break on execution */
168 #define BRK_CNT         (0x08)                  /* break on terminal count */
169 #endif
170
171 struct mem_wrd
172 {
173   /* Simulator instruction break down.  */
174   struct IR_FIELDS opcode;
175   union {
176     /* Memory element break down.  */
177     unsigned long  l;
178     unsigned short s[2];
179     unsigned char  c[4];
180   } mem;
181 };
182
183 /* Size of each 32 bit memory model.  */
184 #define MEMWRDSIZE      (sizeof (struct mem_wrd))
185
186 extern struct mem_segs memory[];
187 extern struct PROCESSOR m78000;
188
189 struct PROCESSOR
190 {
191   unsigned WORD
192   /* Execute instruction pointer.  */
193   ip, 
194     /* Vector base register.  */
195     vbr,
196     /* Processor status register.  */
197     psr;
198   
199   /* Source 1.  */
200   WORD    S1bus,
201     /* Source 2.  */
202     S2bus,
203     /* Destination.  */
204     Dbus,
205     /* Data address bus.  */
206     DAbus,
207     ALU,
208     /* Data registers.  */
209     Regs[REGs],
210     /* Max clocks before reg is available.  */
211     time_left[REGs],
212     /* Writeback priority of reg.  */
213     wb_pri[REGs], 
214     /* Integer unit control regs.  */
215     SFU0_regs[REGs],
216     /* Floating point control regs.  */
217     SFU1_regs[REGs], 
218     Scoreboard[REGs],
219     Vbr;
220   unsigned WORD   scoreboard,
221     Psw,
222     Tpsw;
223   /* Waiting for a jump instruction.  */
224   FLAG   jump_pending:1;
225 };
226
227 /* Size of immediate field.  */
228
229 #define    i26bit      1
230 #define    i16bit      2
231 #define    i10bit      3
232
233 /* Definitions for fields in psr.  */
234
235 #define psr_mode  31
236 #define psr_rbo   30
237 #define psr_ser   29
238 #define psr_carry 28
239 #define psr_sf7m  11
240 #define psr_sf6m  10
241 #define psr_sf5m   9
242 #define psr_sf4m   8
243 #define psr_sf3m   7
244 #define psr_sf2m   6
245 #define psr_sf1m   5
246 #define psr_mam    4
247 #define psr_inm    3
248 #define psr_exm    2
249 #define psr_trm    1
250 #define psr_ovfm   0
251
252 /* The 1 clock operations.  */
253
254 #define    ADDU        1
255 #define    ADDC        2
256 #define    ADDUC       3
257 #define    ADD         4
258
259 #define    SUBU    ADD+1
260 #define    SUBB    ADD+2
261 #define    SUBUB   ADD+3
262 #define    SUB     ADD+4
263
264 #define    AND_    ADD+5
265 #define    OR      ADD+6
266 #define    XOR     ADD+7
267 #define    CMP     ADD+8
268
269 /* Loads.  */
270
271 #define    LDAB    CMP+1
272 #define    LDAH    CMP+2
273 #define    LDA     CMP+3
274 #define    LDAD    CMP+4
275
276 #define    LDB   LDAD+1
277 #define    LDH   LDAD+2
278 #define    LD    LDAD+3
279 #define    LDD   LDAD+4
280 #define    LDBU  LDAD+5
281 #define    LDHU  LDAD+6
282
283 /* Stores.  */
284
285 #define    STB    LDHU+1
286 #define    STH    LDHU+2
287 #define    ST     LDHU+3
288 #define    STD    LDHU+4
289
290 /* Exchange.  */
291
292 #define    XMEMBU LDHU+5
293 #define    XMEM   LDHU+6
294
295 /* Branches.  */
296
297 #define    JSR    STD+1
298 #define    BSR    STD+2
299 #define    BR     STD+3
300 #define    JMP    STD+4
301 #define    BB1    STD+5
302 #define    BB0    STD+6
303 #define    RTN    STD+7
304 #define    BCND   STD+8
305
306 /* Traps.  */
307
308 #define    TB1    BCND+1
309 #define    TB0    BCND+2
310 #define    TCND   BCND+3
311 #define    RTE    BCND+4
312 #define    TBND   BCND+5
313
314 /* Misc.  */
315
316 #define    MUL     TBND + 1
317 #define    DIV     MUL  +2
318 #define    DIVU    MUL  +3
319 #define    MASK    MUL  +4
320 #define    FF0     MUL  +5
321 #define    FF1     MUL  +6
322 #define    CLR     MUL  +7
323 #define    SET     MUL  +8
324 #define    EXT     MUL  +9
325 #define    EXTU    MUL  +10
326 #define    MAK     MUL  +11
327 #define    ROT     MUL  +12
328
329 /* Control register manipulations.  */
330
331 #define    LDCR    ROT  +1
332 #define    STCR    ROT  +2
333 #define    XCR     ROT  +3
334
335 #define    FLDCR    ROT  +4
336 #define    FSTCR    ROT  +5
337 #define    FXCR     ROT  +6
338
339 #define    NOP     XCR +1
340
341 /* Floating point instructions.  */
342
343 #define    FADD    NOP +1
344 #define    FSUB    NOP +2
345 #define    FMUL    NOP +3
346 #define    FDIV    NOP +4
347 #define    FSQRT   NOP +5
348 #define    FCMP    NOP +6
349 #define    FIP     NOP +7
350 #define    FLT     NOP +8
351 #define    INT     NOP +9
352 #define    NINT    NOP +10
353 #define    TRNC    NOP +11
354 #define    FLDC   NOP +12
355 #define    FSTC   NOP +13
356 #define    FXC    NOP +14
357
358 #define UEXT(src,off,wid) \
359   ((((unsigned int)(src)) >> (off)) & ((1 << (wid)) - 1))
360
361 #define SEXT(src,off,wid) \
362   (((((int)(src))<<(32 - ((off) + (wid)))) >>(32 - (wid))) )
363
364 #define MAKE(src,off,wid) \
365   ((((unsigned int)(src)) & ((1 << (wid)) - 1)) << (off))
366
367 #define opword(n) (unsigned long) (memaddr->mem.l)
368
369 /* Constants and masks.  */
370
371 #define SFU0       0x80000000
372 #define SFU1       0x84000000
373 #define SFU7       0x9c000000
374 #define RRI10      0xf0000000
375 #define RRR        0xf4000000
376 #define SFUMASK    0xfc00ffe0
377 #define RRRMASK    0xfc00ffe0
378 #define RRI10MASK  0xfc00fc00
379 #define DEFMASK    0xfc000000
380 #define CTRL       0x0000f000
381 #define CTRLMASK   0xfc00f800
382
383 /* Operands types.  */
384
385 enum operand_type
386 {
387   HEX = 1,
388   REG = 2,
389   CONT = 3,
390   IND = 3,
391   BF = 4,
392   /* Scaled register.  */
393   REGSC = 5,
394   /* Control register.  */
395   CRREG = 6,
396   /* Floating point control register.  */
397   FCRREG = 7,
398   PCREL = 8,
399   CONDMASK = 9,
400   /* Extended register.  */
401   XREG = 10,
402   /* Decimal.  */
403   DEC = 11
404 };
405
406 /* Hashing specification.  */
407
408 #define HASHVAL     79
409
410 /* Structure templates.  */
411
412 typedef struct
413 {
414   unsigned int offset;
415   unsigned int width;
416   enum operand_type type;
417 } OPSPEC;
418
419 struct SIM_FLAGS
420 {
421   int  ltncy,   /* latency (max number of clocks needed to execute).  */
422     extime,   /* execution time (min number of clocks needed to execute).  */
423     wb_pri;   /* writeback slot priority.  */
424   unsigned         op:OP,   /* simulator version of opcode.  */
425     imm_flags:2,   /* 10,16 or 26 bit immediate flags.  */
426     rs1_used:1,   /* register source 1 used.  */
427     rs2_used:1,   /* register source 2 used.  */
428     rsd_used:1,   /* register source/dest used.  */
429     c_flag:1,   /* complement.  */
430     u_flag:1,   /* upper half word.  */
431     n_flag:1,   /* execute next.  */
432     wb_flag:1,   /* uses writeback slot.  */
433     dest_64:1,   /* double precision dest.  */
434     s1_64:1,   /* double precision source 1.  */
435     s2_64:1,   /* double precision source 2.  */
436     scale_flag:1;   /* register is scaled.  */
437 };
438
439 typedef struct INSTRUCTAB {
440   unsigned int  opcode;
441   char          *mnemonic;
442   OPSPEC        op1,op2,op3;
443   struct SIM_FLAGS flgs;
444 } INSTAB;
445 \f
446
447 #define NO_OPERAND {0,0,0}
448
449 extern const INSTAB  instructions[];
450
451 /*
452  * Local Variables:
453  * fill-column: 131
454  * End:
455  */