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 DLX microprocess.
6324 serge 2
   Copyright (C) 2002-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
   Initially created by Kuang Hwa Lin, 2002.   */
22
 
23
/* Following are the function codes for the Special OP (ALU).  */
24
#define  ALUOP       0x00000000
25
#define  SPECIALOP   0x00000000
26
 
27
#define  NOPF        0x00000000
28
#define  SLLF        0x00000004
29
#define  SRLF        0x00000006
30
#define  SRAF        0x00000007
31
 
32
#define  SEQUF       0x00000010
33
#define  SNEUF       0x00000011
34
#define  SLTUF       0x00000012
35
#define  SGTUF       0x00000013
36
#define  SLEUF       0x00000014
37
#define  SGEUF       0x00000015
38
 
39
#define  ADDF        0x00000020
40
#define  ADDUF       0x00000021
41
#define  SUBF        0x00000022
42
#define  SUBUF       0x00000023
43
#define  ANDF        0x00000024
44
#define  ORF         0x00000025
45
#define  XORF        0x00000026
46
 
47
#define  SEQF        0x00000028
48
#define  SNEF        0x00000029
49
#define  SLTF        0x0000002A
50
#define  SGTF        0x0000002B
51
#define  SLEF        0x0000002C
52
#define  SGEF        0x0000002D
53
  /* Following special functions was not mentioned in the
54
     Hennessy's book but was implemented in the RTL.  */
55
#define  MVTSF 	     0x00000030
56
#define  MVFSF       0x00000031
57
#define  BSWAPF      0x00000032
58
#define  LUTF        0x00000033
59
/* Following special functions was mentioned in the
60
   Hennessy's book but was not implemented in the RTL.  */
61
#define  MULTF       0x00000005
62
#define  MULTUF      0x00000006
63
#define  DIVF        0x00000007
64
#define  DIVUF       0x00000008
65
 
66
 
67
/* Following are the rest of the OPcodes:
68
   JOP    = (0x002 << 26), JALOP  = (0x003 << 26), BEQOP = (0x004 << 26),   BNEOP  = (0x005 << 26)
69
   ADDIOP = (0x008 << 26), ADDUIOP= (0x009 << 26), SUBIOP	= (0x00A << 26), SUBUIOP= (0x00B << 26)
70
   ANDIOP = (0x00C << 26), ORIOP  = (0x00D << 26), XORIOP = (0x00E << 26),  LHIOP  = (0x00F << 26)
71
   RFEOP  = (0x010 << 26), TRAPOP = (0x011 << 26), JROP	= (0x012 << 26), JALROP = (0x013 << 26)
72
   BREAKOP= (0x014 << 26)
73
   SEQIOP = (0x018 << 26), SNEIOP = (0x019 << 26), SLTIOP = (0x01A << 26),  SGTIOP = (0x01B << 26)
74
   SLEIOP = (0x01C << 26), SGEIOP = (0x01D << 26)
75
   LBOP   = (0x020 << 26), LHOP   = (0x021 << 26), LWOP   = (0x023 << 26),  LBUOP  = (0x024 << 26)
76
   LHUOP  = (0x025 << 26), SBOP   = (0x028 << 26), SHOP   = (0x029 << 26),  SWOP   = (0x02B << 26)
77
   LSBUOP = (0x026 << 26), LSHU   = (0x027 << 26), LSW    = (0x02C << 26),
78
   SEQUIOP= (0x030 << 26), SNEUIOP= (0x031 << 26), SLTUIOP= (0x032 << 26),  SGTUIOP= (0x033 << 26)
79
   SLEUIOP= (0x034 << 26), SGEUIOP= (0x035 << 26)
80
   SLLIOP = (0x036 << 26), SRLIOP = (0x037 << 26), SRAIOP = (0x038 << 26).  */
81
#define  JOP	     0x08000000
82
#define  JALOP	     0x0c000000
83
#define  BEQOP	     0x10000000
84
#define  BNEOP	     0x14000000
85
 
86
#define  ADDIOP	     0x20000000
87
#define  ADDUIOP     0x24000000
88
#define  SUBIOP	     0x28000000
89
#define  SUBUIOP     0x2c000000
90
#define  ANDIOP      0x30000000
91
#define  ORIOP       0x34000000
92
#define  XORIOP      0x38000000
93
#define  LHIOP       0x3c000000
94
#define  RFEOP	     0x40000000
95
#define  TRAPOP      0x44000000
96
#define  JROP	     0x48000000
97
#define  JALROP      0x4c000000
98
#define  BREAKOP     0x50000000
99
 
100
#define  SEQIOP      0x60000000
101
#define  SNEIOP      0x64000000
102
#define  SLTIOP      0x68000000
103
#define  SGTIOP      0x6c000000
104
#define  SLEIOP      0x70000000
105
#define  SGEIOP      0x74000000
106
 
107
#define  LBOP        0x80000000
108
#define  LHOP        0x84000000
109
#define  LWOP        0x8c000000
110
#define  LBUOP       0x90000000
111
#define  LHUOP	     0x94000000
112
#define  LDSTBU
113
#define  LDSTHU
114
#define  SBOP	     0xa0000000
115
#define  SHOP        0xa4000000
116
#define  SWOP        0xac000000
117
#define  LDST
118
 
119
#define  SEQUIOP     0xc0000000
120
#define  SNEUIOP     0xc4000000
121
#define  SLTUIOP     0xc8000000
122
#define  SGTUIOP     0xcc000000
123
#define  SLEUIOP     0xd0000000
124
#define  SGEUIOP     0xd4000000
125
 
126
#define  SLLIOP      0xd8000000
127
#define  SRLIOP      0xdc000000
128
#define  SRAIOP      0xe0000000
129
 
130
/* Following 3 ops was added to provide the MP atonmic operation.  */
131
#define  LSBUOP      0x98000000
132
#define  LSHUOP      0x9c000000
133
#define  LSWOP       0xb0000000
134
 
135
/* Following opcode was defined in the Hennessy's book as
136
   "normal" opcode but was implemented in the RTL as special
137
   functions.  */
138
#if 0
139
#define  MVTSOP	     0x50000000
140
#define  MVFSOP      0x54000000
141
#endif
142
 
143
struct dlx_opcode
144
{
145
  /* Name of the instruction.  */
146
  char *name;
147
 
148
  /* Opcode word.  */
149
  unsigned long opcode;
150
 
151
  /* A string of characters which describe the operands.
152
     Valid characters are:
153
     ,        Itself.  The character appears in the assembly code.
154
     a        rs1      The register number is in bits 21-25 of the instruction.
155
     b        rs2/rd   The register number is in bits 16-20 of the instruction.
156
     c        rd.      The register number is in bits 11-15 of the instruction.
157
     f        FUNC bits 0-10 of the instruction.
158
     i        An immediate operand is in bits 0-16 of the instruction. 0 extended
159
     I        An immediate operand is in bits 0-16 of the instruction. sign extended
160
     d	      An 16 bit PC relative displacement.
161
     D	      An immediate operand is in bits 0-25 of the instruction.
162
     N	      No opperands needed, for nops.
163
     P	      it can be a register or a 16 bit operand.  */
164
  char *args;
165
};
166
 
167
static const struct dlx_opcode dlx_opcodes[] =
168
  {
169
  /* Arithmetic and Logic R-TYPE instructions.  */
170
    { "nop",      (ALUOP|NOPF),   "N"     },  /* NOP                          */
171
    { "add",      (ALUOP|ADDF),   "c,a,b" },  /* Add                          */
172
    { "addu",     (ALUOP|ADDUF),  "c,a,b" },  /* Add Unsigned                 */
173
    { "sub",      (ALUOP|SUBF),   "c,a,b" },  /* SUB                          */
174
    { "subu",     (ALUOP|SUBUF),  "c,a,b" },  /* Sub Unsigned                 */
175
    { "mult",     (ALUOP|MULTF),  "c,a,b" },  /* MULTIPLY                     */
176
    { "multu",    (ALUOP|MULTUF), "c,a,b" },  /* MULTIPLY Unsigned            */
177
    { "div",      (ALUOP|DIVF),   "c,a,b" },  /* DIVIDE                       */
178
    { "divu",     (ALUOP|DIVUF),  "c,a,b" },  /* DIVIDE Unsigned              */
179
    { "and",      (ALUOP|ANDF),   "c,a,b" },  /* AND                          */
180
    { "or",       (ALUOP|ORF),    "c,a,b" },  /* OR                           */
181
    { "xor",      (ALUOP|XORF),   "c,a,b" },  /* Exclusive OR                 */
182
    { "sll",      (ALUOP|SLLF),   "c,a,b" },  /* SHIFT LEFT LOGICAL           */
183
    { "sra",      (ALUOP|SRAF),   "c,a,b" },  /* SHIFT RIGHT ARITHMETIC       */
184
    { "srl",      (ALUOP|SRLF),   "c,a,b" },  /* SHIFT RIGHT LOGICAL          */
185
    { "seq",      (ALUOP|SEQF),   "c,a,b" },  /* Set if equal                 */
186
    { "sne",      (ALUOP|SNEF),   "c,a,b" },  /* Set if not equal             */
187
    { "slt",      (ALUOP|SLTF),   "c,a,b" },  /* Set if less                  */
188
    { "sgt",      (ALUOP|SGTF),   "c,a,b" },  /* Set if greater               */
189
    { "sle",      (ALUOP|SLEF),   "c,a,b" },  /* Set if less or equal         */
190
    { "sge",      (ALUOP|SGEF),   "c,a,b" },  /* Set if greater or equal      */
191
    { "sequ",     (ALUOP|SEQUF),  "c,a,b" },  /* Set if equal unsigned        */
192
    { "sneu",     (ALUOP|SNEUF),  "c,a,b" },  /* Set if not equal unsigned    */
193
    { "sltu",     (ALUOP|SLTUF),  "c,a,b" },  /* Set if less unsigned         */
194
    { "sgtu",     (ALUOP|SGTUF),  "c,a,b" },  /* Set if greater unsigned      */
195
    { "sleu",     (ALUOP|SLEUF),  "c,a,b" },  /* Set if less or equal unsigned*/
196
    { "sgeu",     (ALUOP|SGEUF),  "c,a,b" },  /* Set if greater or equal      */
197
    { "mvts",     (ALUOP|MVTSF),  "c,a"   },  /* Move to special register     */
198
    { "mvfs",     (ALUOP|MVFSF),  "c,a"   },  /* Move from special register   */
199
    { "bswap",    (ALUOP|BSWAPF), "c,a,b" },  /* ??? Was not documented       */
200
    { "lut",      (ALUOP|LUTF),   "c,a,b" },  /* ????? same as above          */
201
 
202
    /* Arithmetic and Logical Immediate I-TYPE instructions.  */
203
    { "addi",     ADDIOP,         "b,a,I" },  /* Add Immediate                */
204
    { "addui",    ADDUIOP,        "b,a,i" },  /* Add Usigned Immediate        */
205
    { "subi",     SUBIOP,         "b,a,I" },  /* Sub Immediate                */
206
    { "subui",    SUBUIOP,        "b,a,i" },  /* Sub Unsigned Immedated       */
207
    { "andi",     ANDIOP,         "b,a,i" },  /* AND Immediate                */
208
    { "ori",      ORIOP,          "b,a,i" },  /* OR  Immediate                */
209
    { "xori",     XORIOP,         "b,a,i" },  /* Exclusive OR  Immediate      */
210
    { "slli",     SLLIOP,         "b,a,i" },  /* SHIFT LEFT LOCICAL Immediate */
211
    { "srai",     SRAIOP,         "b,a,i" },  /* SHIFT RIGHT ARITH. Immediate */
212
    { "srli",     SRLIOP,         "b,a,i" },  /* SHIFT RIGHT LOGICAL Immediate*/
213
    { "seqi",     SEQIOP,         "b,a,i" },  /* Set if equal                 */
214
    { "snei",     SNEIOP,         "b,a,i" },  /* Set if not equal             */
215
    { "slti",     SLTIOP,         "b,a,i" },  /* Set if less                  */
216
    { "sgti",     SGTIOP,         "b,a,i" },  /* Set if greater               */
217
    { "slei",     SLEIOP,         "b,a,i" },  /* Set if less or equal         */
218
    { "sgei",     SGEIOP,         "b,a,i" },  /* Set if greater or equal      */
219
    { "sequi",    SEQUIOP,        "b,a,i" },  /* Set if equal                 */
220
    { "sneui",    SNEUIOP,        "b,a,i" },  /* Set if not equal             */
221
    { "sltui",    SLTUIOP,        "b,a,i" },  /* Set if less                  */
222
    { "sgtui",    SGTUIOP,        "b,a,i" },  /* Set if greater               */
223
    { "sleui",    SLEUIOP,        "b,a,i" },  /* Set if less or equal         */
224
    { "sgeui",    SGEUIOP,        "b,a,i" },  /* Set if greater or equal      */
225
    /* Macros for I type instructions.  */
226
    { "mov",      ADDIOP,         "b,P"   },  /* a move macro                 */
227
    { "movu",     ADDUIOP,        "b,P"   },  /* a move macro, unsigned       */
228
 
229
#if 0
230
    /* Move special.  */
231
    { "mvts",     MVTSOP,         "b,a"   },  /* Move From Integer to Special */
232
    { "mvfs",     MVFSOP,         "b,a"   },  /* Move From Special to Integer */
233
#endif
234
 
235
    /* Load high Immediate I-TYPE instruction.  */
236
    { "lhi",      LHIOP,          "b,i"   },  /* Load High Immediate          */
237
    { "lui",      LHIOP,          "b,i"   },  /* Load High Immediate          */
238
    { "sethi",    LHIOP,          "b,i"   },  /* Load High Immediate          */
239
 
240
  /* LOAD/STORE BYTE 8 bits I-TYPE.  */
241
    { "lb",       LBOP,           "b,a,I" },  /* Load Byte                    */
242
    { "lbu",      LBUOP,          "b,a,I" },  /* Load Byte Unsigned           */
243
    { "ldstbu",   LSBUOP,         "b,a,I" },  /* Load store Byte Unsigned     */
244
    { "sb",       SBOP,           "b,a,I" },  /* Store Byte                   */
245
 
246
    /* LOAD/STORE HALFWORD 16 bits.  */
247
    { "lh",       LHOP,           "b,a,I" },  /* Load Halfword                */
248
    { "lhu",      LHUOP,          "b,a,I" },  /* Load Halfword Unsigned       */
249
    { "ldsthu",   LSHUOP,         "b,a,I" },  /* Load Store Halfword Unsigned */
250
    { "sh",       SHOP,           "b,a,I" },  /* Store Halfword               */
251
 
252
  /* LOAD/STORE WORD 32 bits.  */
253
    { "lw",       LWOP,           "b,a,I" },  /* Load Word                    */
254
    { "sw",       SWOP,           "b,a,I" },  /* Store Word                   */
255
    { "ldstw",    LSWOP,          "b,a,I" },  /* Load Store Word              */
256
 
257
  /* Branch PC-relative, 16 bits offset.  */
258
    { "beqz",     BEQOP,          "a,d" },    /* Branch if a == 0             */
259
    { "bnez",     BNEOP,          "a,d" },    /* Branch if a != 0             */
260
    { "beq",      BEQOP,          "a,d" },    /* Branch if a == 0             */
261
    { "bne",      BNEOP,          "a,d" },    /* Branch if a != 0             */
262
 
263
    /* Jumps Trap and RFE J-TYPE.  */
264
    { "j",        JOP,            "D" },      /* Jump, PC-relative 26 bits    */
265
    { "jal",      JALOP,          "D" },      /* JAL, PC-relative 26 bits     */
266
    { "break",    BREAKOP,        "D" },      /* break to OS                  */
267
    { "trap" ,    TRAPOP,         "D" },      /* TRAP to OS                   */
268
    { "rfe",      RFEOP,          "N" },      /* Return From Exception        */
269
    /* Macros.  */
270
    { "call",     JOP,            "D" },      /* Jump, PC-relative 26 bits    */
271
 
272
    /* Jumps Trap and RFE I-TYPE.  */
273
    { "jr",       JROP,           "a" },      /* Jump Register, Abs (32 bits) */
274
    { "jalr",     JALROP,         "a" },      /* JALR, Abs (32 bits)          */
275
    /* Macros.  */
276
    { "retr",     JROP,           "a" },      /* Jump Register, Abs (32 bits) */
277
 
278
    { "", 0x0, "" }		/* Dummy entry, not included in NUM_OPCODES.
279
				   This lets code examine entry i + 1 without
280
				   checking if we've run off the end of the table.  */
281
  };
282
 
283
const unsigned int num_dlx_opcodes = (((sizeof dlx_opcodes) / (sizeof dlx_opcodes[0])) - 1);