Subversion Repositories Kolibri OS

Rev

Rev 5191 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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