]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - include/opcode/mmix.h
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / include / opcode / mmix.h
CommitLineData
3c3bdf30 1/* mmix.h -- Header file for MMIX opcode table
250d07de 2 Copyright (C) 2001-2021 Free Software Foundation, Inc.
3c3bdf30
NC
3 Written by Hans-Peter Nilsson (hp@bitrange.com)
4
e4e42b45 5 This file is part of GDB, GAS, and the GNU binutils.
3c3bdf30 6
e4e42b45
NC
7 GDB, GAS, and the GNU binutils are free software; you can redistribute
8 them and/or modify them under the terms of the GNU General Public
9 License as published by the Free Software Foundation; either version 3,
10 or (at your option) any later version.
3c3bdf30 11
e4e42b45
NC
12 GDB, GAS, and the GNU binutils are distributed in the hope that they
13 will be useful, but WITHOUT ANY WARRANTY; without even the implied
14 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 the GNU General Public License for more details.
3c3bdf30 16
e4e42b45
NC
17 You should have received a copy of the GNU General Public License
18 along with this file; see the file COPYING3. If not, write to the Free
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
3c3bdf30
NC
21
22/* We could have just a char*[] table indexed by the register number, but
23 that would not allow for synonyms. The table is terminated with an
24 entry with a NULL name. */
25struct mmix_spec_reg
26{
27 const char *name;
28 unsigned int number;
29};
30
31/* General indication of the type of instruction. */
32enum mmix_insn_type
33 {
34 mmix_type_pseudo,
35 mmix_type_normal,
36 mmix_type_branch,
37 mmix_type_condbranch,
38 mmix_type_memaccess_octa,
39 mmix_type_memaccess_tetra,
40 mmix_type_memaccess_wyde,
41 mmix_type_memaccess_byte,
42 mmix_type_memaccess_block,
43 mmix_type_jsr
44 };
45
46/* Type of operands an instruction takes. Use when parsing assembly code
47 and disassembling. */
48enum mmix_operands_type
49 {
50 mmix_operands_none = 0,
51
52 /* All operands are registers: "$X,$Y,$Z". */
53 mmix_operands_regs,
54
55 /* "$X,YZ", like SETH. */
56 mmix_operands_reg_yz,
57
58 /* The regular "$X,$Y,$Z|Z".
59 The Z is optional; if only "$X,$Y" is given, then "$X,$Y,0" is
60 assumed. */
61 mmix_operands_regs_z_opt,
62
63 /* The regular "$X,$Y,$Z|Z". */
64 mmix_operands_regs_z,
65
66 /* "Address"; only JMP. Zero operands allowed unless GNU syntax. */
67 mmix_operands_jmp,
68
69 /* "$X|X,$Y,$Z|Z": PUSHGO; like "3", but X can be expressed as an
70 integer. */
71 mmix_operands_pushgo,
72
73 /* Two registers or a register and a byte, like FLOT, possibly with
74 rounding: "$X,$Z|Z" or "$X,ROUND_MODE,$Z|Z". */
75 mmix_operands_roundregs_z,
76
77 /* "X,YZ", POP. Unless GNU syntax, zero or one operand is allowed. */
78 mmix_operands_pop,
79
80 /* Two registers, possibly with rounding: "$X,$Z" or
81 "$X,ROUND_MODE,$Z". */
82 mmix_operands_roundregs,
83
84 /* "XYZ", like SYNC. */
85 mmix_operands_sync,
86
87 /* "X,$Y,$Z|Z", like SYNCD. */
88 mmix_operands_x_regs_z,
89
90 /* "$X,Y,$Z|Z", like NEG and NEGU. The Y field is optional, default 0. */
91 mmix_operands_neg,
92
93 /* "$X,Address, like GETA or branches. */
94 mmix_operands_regaddr,
95
96 /* "$X|X,Address, like PUSHJ. */
97 mmix_operands_pushj,
98
99 /* "$X,spec_reg"; GET. */
100 mmix_operands_get,
101
102 /* "spec_reg,$Z|Z"; PUT. */
103 mmix_operands_put,
104
105 /* Two registers, "$X,$Y". */
106 mmix_operands_set,
107
108 /* "$X,0"; SAVE. */
109 mmix_operands_save,
110
111 /* "0,$Z"; UNSAVE. */
112 mmix_operands_unsave,
113
114 /* "X,Y,Z"; like SWYM or TRAP. Zero (or 1 if GNU syntax) to three
115 operands, interpreted as 0; XYZ; X, YZ and X, Y, Z. */
116 mmix_operands_xyz_opt,
117
118 /* Just "Z", like RESUME. Unless GNU syntax, the operand can be omitted
119 and will then be assumed zero. */
120 mmix_operands_resume,
121
122 /* These are specials to handle that pseudo-directives are specified
123 like ordinary insns when being mmixal-compatible. They signify the
124 specific pseudo-directive rather than the operands type. */
125
126 /* LOC. */
127 mmix_operands_loc,
128
129 /* PREFIX. */
130 mmix_operands_prefix,
131
132 /* BYTE. */
133 mmix_operands_byte,
134
135 /* WYDE. */
136 mmix_operands_wyde,
137
138 /* TETRA. */
139 mmix_operands_tetra,
140
141 /* OCTA. */
142 mmix_operands_octa,
143
144 /* LOCAL. */
145 mmix_operands_local,
146
147 /* BSPEC. */
148 mmix_operands_bspec,
149
150 /* ESPEC. */
151 mmix_operands_espec,
152 };
153
154struct mmix_opcode
155 {
156 const char *name;
157 unsigned long match;
158 unsigned long lose;
159 enum mmix_operands_type operands;
160
161 /* This is used by the disassembly function. */
162 enum mmix_insn_type type;
163 };
164
165/* Declare the actual tables. */
166extern const struct mmix_opcode mmix_opcodes[];
167
168/* This one is terminated with an entry with a NULL name. */
169extern const struct mmix_spec_reg mmix_spec_regs[];
170
171/* Some insn values we use when padding and synthesizing address loads. */
172#define IMM_OFFSET_BIT 1
173#define COND_INV_BIT 0x8
174#define PRED_INV_BIT 0x10
175
13c9c485
AM
176#define PUSHGO_INSN_BYTE 0xbeu
177#define GO_INSN_BYTE 0x9eu
178#define SETL_INSN_BYTE 0xe3u
179#define INCML_INSN_BYTE 0xe6u
180#define INCMH_INSN_BYTE 0xe5u
181#define INCH_INSN_BYTE 0xe4u
182#define SWYM_INSN_BYTE 0xfdu
183#define JMP_INSN_BYTE 0xf0u
3c3bdf30
NC
184
185/* We can have 256 - 32 (local registers) - 1 ($255 is not allocatable)
186 global registers. */
187#define MAX_GREGS 223