| 1 |
330 |
jeremybenn |
/* TI C6X opcode information.
|
| 2 |
|
|
Copyright 2010
|
| 3 |
|
|
Free Software Foundation, Inc.
|
| 4 |
|
|
|
| 5 |
|
|
This program is free software; you can redistribute it and/or modify
|
| 6 |
|
|
it under the terms of the GNU General Public License as published by
|
| 7 |
|
|
the Free Software Foundation; either version 3 of the License, or
|
| 8 |
|
|
(at your option) any later version.
|
| 9 |
|
|
|
| 10 |
|
|
This program is distributed in the hope that it will be useful,
|
| 11 |
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| 12 |
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
| 13 |
|
|
GNU General Public License for more details.
|
| 14 |
|
|
|
| 15 |
|
|
You should have received a copy of the GNU General Public License
|
| 16 |
|
|
along with this program; if not, write to the Free Software
|
| 17 |
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
| 18 |
|
|
MA 02110-1301, USA. */
|
| 19 |
|
|
|
| 20 |
|
|
#ifndef OPCODE_TIC6X_H
|
| 21 |
|
|
#define OPCODE_TIC6X_H
|
| 22 |
|
|
|
| 23 |
|
|
#include "bfd.h"
|
| 24 |
|
|
#include "symcat.h"
|
| 25 |
|
|
|
| 26 |
|
|
/* A field in an instruction format. The names are based on those
|
| 27 |
|
|
used in the architecture manuals. */
|
| 28 |
|
|
typedef enum
|
| 29 |
|
|
{
|
| 30 |
|
|
tic6x_field_baseR,
|
| 31 |
|
|
tic6x_field_creg,
|
| 32 |
|
|
tic6x_field_cst,
|
| 33 |
|
|
tic6x_field_csta,
|
| 34 |
|
|
tic6x_field_cstb,
|
| 35 |
|
|
tic6x_field_dst,
|
| 36 |
|
|
tic6x_field_fstgfcyc,
|
| 37 |
|
|
tic6x_field_h,
|
| 38 |
|
|
tic6x_field_mask,
|
| 39 |
|
|
tic6x_field_mode,
|
| 40 |
|
|
tic6x_field_offsetR,
|
| 41 |
|
|
tic6x_field_op,
|
| 42 |
|
|
tic6x_field_p,
|
| 43 |
|
|
tic6x_field_r,
|
| 44 |
|
|
tic6x_field_s,
|
| 45 |
|
|
tic6x_field_sc,
|
| 46 |
|
|
tic6x_field_src,
|
| 47 |
|
|
tic6x_field_src1,
|
| 48 |
|
|
tic6x_field_src2,
|
| 49 |
|
|
tic6x_field_srcdst,
|
| 50 |
|
|
tic6x_field_x,
|
| 51 |
|
|
tic6x_field_y,
|
| 52 |
|
|
tic6x_field_z
|
| 53 |
|
|
} tic6x_insn_field_id;
|
| 54 |
|
|
|
| 55 |
|
|
typedef struct
|
| 56 |
|
|
{
|
| 57 |
|
|
/* The name used to reference the field. */
|
| 58 |
|
|
tic6x_insn_field_id field_id;
|
| 59 |
|
|
|
| 60 |
|
|
/* The least-significant bit position in the field. */
|
| 61 |
|
|
unsigned short low_pos;
|
| 62 |
|
|
|
| 63 |
|
|
/* The number of bits in the field. */
|
| 64 |
|
|
unsigned short width;
|
| 65 |
|
|
} tic6x_insn_field;
|
| 66 |
|
|
|
| 67 |
|
|
/* Maximum number of variable fields in an instruction format. */
|
| 68 |
|
|
#define TIC6X_MAX_INSN_FIELDS 11
|
| 69 |
|
|
|
| 70 |
|
|
/* A particular instruction format. */
|
| 71 |
|
|
typedef struct
|
| 72 |
|
|
{
|
| 73 |
|
|
/* How many bits in the instruction. */
|
| 74 |
|
|
unsigned int num_bits;
|
| 75 |
|
|
|
| 76 |
|
|
/* Constant bits in the instruction. */
|
| 77 |
|
|
unsigned int cst_bits;
|
| 78 |
|
|
|
| 79 |
|
|
/* Mask matching those bits. */
|
| 80 |
|
|
unsigned int mask;
|
| 81 |
|
|
|
| 82 |
|
|
/* The number of instruction fields. */
|
| 83 |
|
|
unsigned int num_fields;
|
| 84 |
|
|
|
| 85 |
|
|
/* Descriptions of instruction fields. */
|
| 86 |
|
|
tic6x_insn_field fields[TIC6X_MAX_INSN_FIELDS];
|
| 87 |
|
|
} tic6x_insn_format;
|
| 88 |
|
|
|
| 89 |
|
|
/* An index into the table of instruction formats. */
|
| 90 |
|
|
typedef enum
|
| 91 |
|
|
{
|
| 92 |
|
|
#define FMT(name, num_bits, cst_bits, mask, fields) \
|
| 93 |
|
|
CONCAT2(tic6x_insn_format_, name),
|
| 94 |
|
|
#include "tic6x-insn-formats.h"
|
| 95 |
|
|
#undef FMT
|
| 96 |
|
|
tic6x_insn_format_max
|
| 97 |
|
|
} tic6x_insn_format_id;
|
| 98 |
|
|
|
| 99 |
|
|
/* The table itself. */
|
| 100 |
|
|
extern const tic6x_insn_format tic6x_insn_format_table[tic6x_insn_format_max];
|
| 101 |
|
|
|
| 102 |
|
|
/* If instruction format FMT has a field FIELD, return a pointer to
|
| 103 |
|
|
the description of that field; otherwise return NULL. */
|
| 104 |
|
|
|
| 105 |
|
|
const tic6x_insn_field *tic6x_field_from_fmt (const tic6x_insn_format *fmt,
|
| 106 |
|
|
tic6x_insn_field_id field);
|
| 107 |
|
|
|
| 108 |
|
|
/* Description of a field (in an instruction format) whose value is
|
| 109 |
|
|
fixed, or constrained to be in a particular range, in a particular
|
| 110 |
|
|
opcode. */
|
| 111 |
|
|
typedef struct
|
| 112 |
|
|
{
|
| 113 |
|
|
/* The name of the field. */
|
| 114 |
|
|
tic6x_insn_field_id field_id;
|
| 115 |
|
|
|
| 116 |
|
|
/* The least value of the field in this instruction. */
|
| 117 |
|
|
unsigned int min_val;
|
| 118 |
|
|
|
| 119 |
|
|
/* The greatest value of the field in this instruction. */
|
| 120 |
|
|
unsigned int max_val;
|
| 121 |
|
|
} tic6x_fixed_field;
|
| 122 |
|
|
|
| 123 |
|
|
/* Bit-masks for defining instructions present on some subset of
|
| 124 |
|
|
processors; each indicates an instruction present on that processor
|
| 125 |
|
|
and those that are supersets of it. The options passed to the
|
| 126 |
|
|
assembler determine a bit-mask ANDed with the bit-mask indicating
|
| 127 |
|
|
when the instruction was added to determine whether the instruction
|
| 128 |
|
|
is enabled. */
|
| 129 |
|
|
#define TIC6X_INSN_C62X 0x0001
|
| 130 |
|
|
#define TIC6X_INSN_C64X 0x0002
|
| 131 |
|
|
#define TIC6X_INSN_C64XP 0x0004
|
| 132 |
|
|
#define TIC6X_INSN_C67X 0x0008
|
| 133 |
|
|
#define TIC6X_INSN_C67XP 0x0010
|
| 134 |
|
|
#define TIC6X_INSN_C674X 0x0020
|
| 135 |
|
|
#define TIC6X_INSN_ATOMIC 0x0040
|
| 136 |
|
|
|
| 137 |
|
|
/* Flags with further information about an opcode table entry. */
|
| 138 |
|
|
|
| 139 |
|
|
/* Only used by the assembler, not the disassembler. */
|
| 140 |
|
|
#define TIC6X_FLAG_MACRO 0x0001
|
| 141 |
|
|
|
| 142 |
|
|
/* Must be first in its execute packet. */
|
| 143 |
|
|
#define TIC6X_FLAG_FIRST 0x0002
|
| 144 |
|
|
|
| 145 |
|
|
/* Multi-cycle NOP (not used for the NOP n instruction itself, which
|
| 146 |
|
|
is only a multicycle NOP if n > 1). */
|
| 147 |
|
|
#define TIC6X_FLAG_MCNOP 0x0004
|
| 148 |
|
|
|
| 149 |
|
|
/* Cannot be in parallel with a multi-cycle NOP. */
|
| 150 |
|
|
#define TIC6X_FLAG_NO_MCNOP 0x0008
|
| 151 |
|
|
|
| 152 |
|
|
/* Load instruction. */
|
| 153 |
|
|
#define TIC6X_FLAG_LOAD 0x0010
|
| 154 |
|
|
|
| 155 |
|
|
/* Store instruction. */
|
| 156 |
|
|
#define TIC6X_FLAG_STORE 0x0020
|
| 157 |
|
|
|
| 158 |
|
|
/* Unaligned memory operation. */
|
| 159 |
|
|
#define TIC6X_FLAG_UNALIGNED 0x0040
|
| 160 |
|
|
|
| 161 |
|
|
/* Only on side B. */
|
| 162 |
|
|
#define TIC6X_FLAG_SIDE_B_ONLY 0x0080
|
| 163 |
|
|
|
| 164 |
|
|
/* Only on data path T2. */
|
| 165 |
|
|
#define TIC6X_FLAG_SIDE_T2_ONLY 0x0100
|
| 166 |
|
|
|
| 167 |
|
|
/* Does not support cross paths. */
|
| 168 |
|
|
#define TIC6X_FLAG_NO_CROSS 0x0200
|
| 169 |
|
|
|
| 170 |
|
|
/* Annotate this branch instruction as a call. */
|
| 171 |
|
|
#define TIC6X_FLAG_CALL 0x0400
|
| 172 |
|
|
|
| 173 |
|
|
/* Annotate this branch instruction as a return. */
|
| 174 |
|
|
#define TIC6X_FLAG_RETURN 0x0800
|
| 175 |
|
|
|
| 176 |
|
|
/* This instruction starts a software pipelined loop. */
|
| 177 |
|
|
#define TIC6X_FLAG_SPLOOP 0x1000
|
| 178 |
|
|
|
| 179 |
|
|
/* This instruction ends a software pipelined loop. */
|
| 180 |
|
|
#define TIC6X_FLAG_SPKERNEL 0x2000
|
| 181 |
|
|
|
| 182 |
|
|
/* This instruction takes a list of functional units as parameters;
|
| 183 |
|
|
although described as having one parameter, the number may be 0 to
|
| 184 |
|
|
8. */
|
| 185 |
|
|
#define TIC6X_FLAG_SPMASK 0x4000
|
| 186 |
|
|
|
| 187 |
|
|
/* When more than one opcode matches the assembly source, prefer the
|
| 188 |
|
|
one with the highest value for this bit-field. If two opcode table
|
| 189 |
|
|
entries can match the same syntactic form, they must have different
|
| 190 |
|
|
values here. */
|
| 191 |
|
|
#define TIC6X_PREFER_VAL(n) (((n) & 0x8000) >> 15)
|
| 192 |
|
|
#define TIC6X_FLAG_PREFER(n) ((n) << 15)
|
| 193 |
|
|
#define TIC6X_NUM_PREFER 2
|
| 194 |
|
|
|
| 195 |
|
|
/* Maximum number of fixed fields for a particular opcode. */
|
| 196 |
|
|
#define TIC6X_MAX_FIXED_FIELDS 4
|
| 197 |
|
|
|
| 198 |
|
|
/* Maximum number of operands in the opcode table for a particular
|
| 199 |
|
|
opcode. */
|
| 200 |
|
|
#define TIC6X_MAX_OPERANDS 4
|
| 201 |
|
|
|
| 202 |
|
|
/* Maximum number of operands in the source code for a particular
|
| 203 |
|
|
opcode (different from the number in the opcode table for SPMASK
|
| 204 |
|
|
and SPMASKR). */
|
| 205 |
|
|
#define TIC6X_MAX_SOURCE_OPERANDS 8
|
| 206 |
|
|
|
| 207 |
|
|
/* Maximum number of variable fields for a particular opcode. */
|
| 208 |
|
|
#define TIC6X_MAX_VAR_FIELDS 7
|
| 209 |
|
|
|
| 210 |
|
|
/* Which functional units an opcode uses. This only describes the
|
| 211 |
|
|
basic choice of D, L, M, S or no functional unit; other fields are
|
| 212 |
|
|
used to describe further restrictions (instructions only operating
|
| 213 |
|
|
on one side), use of cross paths and load/store instructions using
|
| 214 |
|
|
one side for the address and the other side for the source or
|
| 215 |
|
|
destination register. */
|
| 216 |
|
|
typedef enum
|
| 217 |
|
|
{
|
| 218 |
|
|
tic6x_func_unit_d,
|
| 219 |
|
|
tic6x_func_unit_l,
|
| 220 |
|
|
tic6x_func_unit_m,
|
| 221 |
|
|
tic6x_func_unit_s,
|
| 222 |
|
|
tic6x_func_unit_nfu
|
| 223 |
|
|
} tic6x_func_unit_base;
|
| 224 |
|
|
|
| 225 |
|
|
/* Possible forms of source operand. */
|
| 226 |
|
|
typedef enum
|
| 227 |
|
|
{
|
| 228 |
|
|
/* An assembly-time constant. */
|
| 229 |
|
|
tic6x_operand_asm_const,
|
| 230 |
|
|
/* A link-time constant. */
|
| 231 |
|
|
tic6x_operand_link_const,
|
| 232 |
|
|
/* A register, from the same side as the functional unit
|
| 233 |
|
|
selected. */
|
| 234 |
|
|
tic6x_operand_reg,
|
| 235 |
|
|
/* A register, that is from the other side if a cross path is
|
| 236 |
|
|
used. */
|
| 237 |
|
|
tic6x_operand_xreg,
|
| 238 |
|
|
/* A register, that is from the side of the data path
|
| 239 |
|
|
selected. */
|
| 240 |
|
|
tic6x_operand_dreg,
|
| 241 |
|
|
/* An address register usable with 15-bit offsets (B14 or B15).
|
| 242 |
|
|
This is from the same side as the functional unit if a cross
|
| 243 |
|
|
path is not used, and the other side if a cross path is
|
| 244 |
|
|
used. */
|
| 245 |
|
|
tic6x_operand_areg,
|
| 246 |
|
|
/* A return address register (A3 or B3), from the same side as the
|
| 247 |
|
|
functional unit selected. */
|
| 248 |
|
|
tic6x_operand_retreg,
|
| 249 |
|
|
/* A register pair, from the same side as the functional unit
|
| 250 |
|
|
selected. */
|
| 251 |
|
|
tic6x_operand_regpair,
|
| 252 |
|
|
/* A register pair, that is from the other side if a cross path is
|
| 253 |
|
|
used. */
|
| 254 |
|
|
tic6x_operand_xregpair,
|
| 255 |
|
|
/* A register pair, from the side of the data path selected. */
|
| 256 |
|
|
tic6x_operand_dregpair,
|
| 257 |
|
|
/* The literal string "irp" (case-insensitive). */
|
| 258 |
|
|
tic6x_operand_irp,
|
| 259 |
|
|
/* The literal string "nrp" (case-insensitive). */
|
| 260 |
|
|
tic6x_operand_nrp,
|
| 261 |
|
|
/* A control register. */
|
| 262 |
|
|
tic6x_operand_ctrl,
|
| 263 |
|
|
/* A memory reference (base and offset registers from the side of
|
| 264 |
|
|
the functional unit selected), using either unsigned 5-bit
|
| 265 |
|
|
constant or register offset, if any offset; register offsets
|
| 266 |
|
|
cannot use unscaled () syntax. */
|
| 267 |
|
|
tic6x_operand_mem_short,
|
| 268 |
|
|
/* A memory reference (base and offset registers from the side of
|
| 269 |
|
|
the functional unit selected), using either unsigned 5-bit
|
| 270 |
|
|
constant or register offset, if any offset; register offsets
|
| 271 |
|
|
can use unscaled () syntax (for LDNDW and STNDW). */
|
| 272 |
|
|
tic6x_operand_mem_ndw,
|
| 273 |
|
|
/* A memory reference using 15-bit link-time constant offset
|
| 274 |
|
|
relative to B14 or B15. */
|
| 275 |
|
|
tic6x_operand_mem_long,
|
| 276 |
|
|
/* A memory reference that only dereferences a register with no
|
| 277 |
|
|
further adjustments (*REG), that register being from the side
|
| 278 |
|
|
of the functional unit selected. */
|
| 279 |
|
|
tic6x_operand_mem_deref,
|
| 280 |
|
|
/* A functional unit name or a list thereof (for SPMASK and
|
| 281 |
|
|
SPMASKR). */
|
| 282 |
|
|
tic6x_operand_func_unit
|
| 283 |
|
|
} tic6x_operand_form;
|
| 284 |
|
|
|
| 285 |
|
|
/* Whether something is, or can be, read or written. */
|
| 286 |
|
|
typedef enum
|
| 287 |
|
|
{
|
| 288 |
|
|
tic6x_rw_none,
|
| 289 |
|
|
tic6x_rw_read,
|
| 290 |
|
|
tic6x_rw_write,
|
| 291 |
|
|
tic6x_rw_read_write
|
| 292 |
|
|
} tic6x_rw;
|
| 293 |
|
|
|
| 294 |
|
|
/* Description of a source operand and how it is used. */
|
| 295 |
|
|
typedef struct
|
| 296 |
|
|
{
|
| 297 |
|
|
/* The syntactic form of the operand. */
|
| 298 |
|
|
tic6x_operand_form form;
|
| 299 |
|
|
|
| 300 |
|
|
/* For non-constant operands, the size in bytes (1, 2, 4, 5 or
|
| 301 |
|
|
8). Ignored for constant operands. */
|
| 302 |
|
|
unsigned int size;
|
| 303 |
|
|
|
| 304 |
|
|
/* Whether the operand is read, written or both. In addition to the
|
| 305 |
|
|
operations described here, address registers are read on cycle 1
|
| 306 |
|
|
regardless of when the memory operand is read or written, and may
|
| 307 |
|
|
be modified as described by the addressing mode, and control
|
| 308 |
|
|
registers may be implicitly read by some instructions. There are
|
| 309 |
|
|
also some special cases not fully described by this
|
| 310 |
|
|
structure.
|
| 311 |
|
|
|
| 312 |
|
|
- For mpydp, the low part of src2 is read on cycles 1 and 3 but
|
| 313 |
|
|
not 2, and the high part on cycles 2 and 4 but not 3.
|
| 314 |
|
|
|
| 315 |
|
|
- The swap2 pseudo-operation maps to packlh2, reading the first
|
| 316 |
|
|
operand of swap2 twice. */
|
| 317 |
|
|
tic6x_rw rw;
|
| 318 |
|
|
|
| 319 |
|
|
/* The first and last cycles (1 for E1, etc.) at which the operand,
|
| 320 |
|
|
or the low part for two-register operands, is read or
|
| 321 |
|
|
written. */
|
| 322 |
|
|
unsigned short low_first;
|
| 323 |
|
|
unsigned short low_last;
|
| 324 |
|
|
|
| 325 |
|
|
/* Likewise, for the high part. */
|
| 326 |
|
|
unsigned short high_first;
|
| 327 |
|
|
unsigned short high_last;
|
| 328 |
|
|
} tic6x_operand_info;
|
| 329 |
|
|
|
| 330 |
|
|
/* Ways of converting an operand or functional unit specifier to a
|
| 331 |
|
|
field value. */
|
| 332 |
|
|
typedef enum
|
| 333 |
|
|
{
|
| 334 |
|
|
/* Store an unsigned assembly-time constant (which must fit) in
|
| 335 |
|
|
the field. */
|
| 336 |
|
|
tic6x_coding_ucst,
|
| 337 |
|
|
/* Store a signed constant (which must fit) in the field. This
|
| 338 |
|
|
may be used both for assembly-time constants and for link-time
|
| 339 |
|
|
constants. */
|
| 340 |
|
|
tic6x_coding_scst,
|
| 341 |
|
|
/* Subtract one from an unsigned assembly-time constant (which
|
| 342 |
|
|
must be strictly positive before the subtraction) and store the
|
| 343 |
|
|
value (which must fit) in the field. */
|
| 344 |
|
|
tic6x_coding_ucst_minus_one,
|
| 345 |
|
|
/* Negate a signed assembly-time constant, and store the result of
|
| 346 |
|
|
negation (which must fit) in the field. Used only for
|
| 347 |
|
|
pseudo-operations. */
|
| 348 |
|
|
tic6x_coding_scst_negate,
|
| 349 |
|
|
/* Store an unsigned link-time constant, implicitly DP-relative
|
| 350 |
|
|
and counting in bytes, in the field. For expression operands,
|
| 351 |
|
|
assembly-time constants are encoded as-is. For memory
|
| 352 |
|
|
reference operands, the offset is encoded as-is if [] syntax is
|
| 353 |
|
|
used and shifted if () is used. */
|
| 354 |
|
|
tic6x_coding_ulcst_dpr_byte,
|
| 355 |
|
|
/* Store an unsigned link-time constant, implicitly DP-relative
|
| 356 |
|
|
and counting in half-words, in the field. For expression
|
| 357 |
|
|
operands, assembly-time constants are encoded as-is. For
|
| 358 |
|
|
memory reference operands, the offset is encoded as-is if []
|
| 359 |
|
|
syntax is used and shifted if () is used. */
|
| 360 |
|
|
tic6x_coding_ulcst_dpr_half,
|
| 361 |
|
|
/* Store an unsigned link-time constant, implicitly DP-relative
|
| 362 |
|
|
and counting in words, in the field. For expression operands,
|
| 363 |
|
|
assembly-time constants are encoded as-is. For memory
|
| 364 |
|
|
reference operands, the offset is encoded as-is if [] syntax is
|
| 365 |
|
|
used and shifted if () is used. */
|
| 366 |
|
|
tic6x_coding_ulcst_dpr_word,
|
| 367 |
|
|
/* Store the low 16 bits of a link-time constant in the field;
|
| 368 |
|
|
considered unsigned for disassembly. */
|
| 369 |
|
|
tic6x_coding_lcst_low16,
|
| 370 |
|
|
/* Store the high 16 bits of a link-time constant in the field;
|
| 371 |
|
|
considered unsigned for disassembly. */
|
| 372 |
|
|
tic6x_coding_lcst_high16,
|
| 373 |
|
|
/* Store a signed PC-relative value (address of label minus
|
| 374 |
|
|
address of fetch packet containing the current instruction,
|
| 375 |
|
|
counted in words) in the field. */
|
| 376 |
|
|
tic6x_coding_pcrel,
|
| 377 |
|
|
/* Likewise, but counting in half-words if in a header-based fetch
|
| 378 |
|
|
packet. */
|
| 379 |
|
|
tic6x_coding_pcrel_half,
|
| 380 |
|
|
/* Encode the register number (even number for a register pair) in
|
| 381 |
|
|
the field. When applied to a memory reference, encode the base
|
| 382 |
|
|
register. */
|
| 383 |
|
|
tic6x_coding_reg,
|
| 384 |
|
|
/* Store 0 for register B14, 1 for register B15. When applied to
|
| 385 |
|
|
a memory reference, encode the base register. */
|
| 386 |
|
|
tic6x_coding_areg,
|
| 387 |
|
|
/* Store the low part of a control register address. */
|
| 388 |
|
|
tic6x_coding_crlo,
|
| 389 |
|
|
/* Store the high part of a control register address. */
|
| 390 |
|
|
tic6x_coding_crhi,
|
| 391 |
|
|
/* Encode the even register number for a register pair, shifted
|
| 392 |
|
|
right by one bit. */
|
| 393 |
|
|
tic6x_coding_reg_shift,
|
| 394 |
|
|
/* Store either the offset register or the 5-bit unsigned offset
|
| 395 |
|
|
for a memory reference. If an offset uses the unscaled ()
|
| 396 |
|
|
form, which is only permitted with constants, it is scaled
|
| 397 |
|
|
according to the access size of the operand before being
|
| 398 |
|
|
stored. */
|
| 399 |
|
|
tic6x_coding_mem_offset,
|
| 400 |
|
|
/* Store either the offset register or the 5-bit unsigned offset
|
| 401 |
|
|
for a memory reference, but with no scaling applied to the
|
| 402 |
|
|
offset (for nonaligned doubleword operations). */
|
| 403 |
|
|
tic6x_coding_mem_offset_noscale,
|
| 404 |
|
|
/* Store the addressing mode for a memory reference. */
|
| 405 |
|
|
tic6x_coding_mem_mode,
|
| 406 |
|
|
/* Store whether a memory reference is scaled. */
|
| 407 |
|
|
tic6x_coding_scaled,
|
| 408 |
|
|
/* Store the stage in an SPKERNEL instruction in the upper part of
|
| 409 |
|
|
the field. */
|
| 410 |
|
|
tic6x_coding_fstg,
|
| 411 |
|
|
/* Store the cycle in an SPKERNEL instruction in the lower part of
|
| 412 |
|
|
the field. */
|
| 413 |
|
|
tic6x_coding_fcyc,
|
| 414 |
|
|
/* Store the mask bits for functional units in the field in an
|
| 415 |
|
|
SPMASK or SPMASKR instruction. */
|
| 416 |
|
|
tic6x_coding_spmask,
|
| 417 |
|
|
/* Store the number of a register that is unused, or minimally
|
| 418 |
|
|
used, in this execute packet. The number must be the same for
|
| 419 |
|
|
all uses of this coding in a single instruction, but may be
|
| 420 |
|
|
different for different instructions in the execute packet.
|
| 421 |
|
|
This is for the "zero" pseudo-operation. This is not safe when
|
| 422 |
|
|
reads may occur from instructions in previous execute packets;
|
| 423 |
|
|
in such cases the programmer or compiler should use explicit
|
| 424 |
|
|
"sub" instructions for those cases of "zero" that cannot be
|
| 425 |
|
|
implemented as "mvk" for the processor specified. */
|
| 426 |
|
|
tic6x_coding_reg_unused,
|
| 427 |
|
|
/* Store 1 if the functional unit used is on side B, 0 for side
|
| 428 |
|
|
A. */
|
| 429 |
|
|
tic6x_coding_fu,
|
| 430 |
|
|
/* Store 1 if the data path used (source register for store,
|
| 431 |
|
|
destination for load) is on side B, 0 for side A. */
|
| 432 |
|
|
tic6x_coding_data_fu,
|
| 433 |
|
|
/* Store 1 if the cross path is being used, 0 otherwise. */
|
| 434 |
|
|
tic6x_coding_xpath
|
| 435 |
|
|
} tic6x_coding_method;
|
| 436 |
|
|
|
| 437 |
|
|
/* How to generate the value of a particular field. */
|
| 438 |
|
|
typedef struct
|
| 439 |
|
|
{
|
| 440 |
|
|
/* The name of the field. */
|
| 441 |
|
|
tic6x_insn_field_id field_id;
|
| 442 |
|
|
|
| 443 |
|
|
/* How it is encoded. */
|
| 444 |
|
|
tic6x_coding_method coding_method;
|
| 445 |
|
|
|
| 446 |
|
|
/* Source operand number, if any. */
|
| 447 |
|
|
unsigned int operand_num;
|
| 448 |
|
|
} tic6x_coding_field;
|
| 449 |
|
|
|
| 450 |
|
|
/* Types of instruction for pipeline purposes. The type determines
|
| 451 |
|
|
functional unit and cross path latency (when the same functional
|
| 452 |
|
|
unit can be used by other instructions, when the same cross path
|
| 453 |
|
|
can be used by other instructions). */
|
| 454 |
|
|
typedef enum
|
| 455 |
|
|
{
|
| 456 |
|
|
tic6x_pipeline_nop,
|
| 457 |
|
|
tic6x_pipeline_1cycle,
|
| 458 |
|
|
tic6x_pipeline_1616_m,
|
| 459 |
|
|
tic6x_pipeline_store,
|
| 460 |
|
|
tic6x_pipeline_mul_ext,
|
| 461 |
|
|
tic6x_pipeline_load,
|
| 462 |
|
|
tic6x_pipeline_branch,
|
| 463 |
|
|
tic6x_pipeline_2cycle_dp,
|
| 464 |
|
|
tic6x_pipeline_4cycle,
|
| 465 |
|
|
tic6x_pipeline_intdp,
|
| 466 |
|
|
tic6x_pipeline_dpcmp,
|
| 467 |
|
|
tic6x_pipeline_addsubdp,
|
| 468 |
|
|
tic6x_pipeline_mpyi,
|
| 469 |
|
|
tic6x_pipeline_mpyid,
|
| 470 |
|
|
tic6x_pipeline_mpydp,
|
| 471 |
|
|
tic6x_pipeline_mpyspdp,
|
| 472 |
|
|
tic6x_pipeline_mpysp2dp
|
| 473 |
|
|
} tic6x_pipeline_type;
|
| 474 |
|
|
|
| 475 |
|
|
/* Description of a control register. */
|
| 476 |
|
|
typedef struct
|
| 477 |
|
|
{
|
| 478 |
|
|
/* The name of the register. */
|
| 479 |
|
|
const char *name;
|
| 480 |
|
|
|
| 481 |
|
|
/* Which ISA variants include this control register. */
|
| 482 |
|
|
unsigned short isa_variants;
|
| 483 |
|
|
|
| 484 |
|
|
/* Whether it can be read, written or both (in supervisor mode).
|
| 485 |
|
|
Some registers use the same address, but different names, for
|
| 486 |
|
|
reading and writing. */
|
| 487 |
|
|
tic6x_rw rw;
|
| 488 |
|
|
|
| 489 |
|
|
/* crlo value for this register. */
|
| 490 |
|
|
unsigned int crlo;
|
| 491 |
|
|
|
| 492 |
|
|
/* Mask that, ANDed with the crhi value in the instruction, must be
|
| 493 |
|
|
0. 0 is always generated when generating code. */
|
| 494 |
|
|
unsigned int crhi_mask;
|
| 495 |
|
|
} tic6x_ctrl;
|
| 496 |
|
|
|
| 497 |
|
|
/* An index into the table of control registers. */
|
| 498 |
|
|
typedef enum
|
| 499 |
|
|
{
|
| 500 |
|
|
#define CTRL(name, isa, rw, crlo, crhi_mask) \
|
| 501 |
|
|
CONCAT2(tic6x_ctrl_,name),
|
| 502 |
|
|
#include "tic6x-control-registers.h"
|
| 503 |
|
|
#undef CTRL
|
| 504 |
|
|
tic6x_ctrl_max
|
| 505 |
|
|
} tic6x_ctrl_id;
|
| 506 |
|
|
|
| 507 |
|
|
/* The table itself. */
|
| 508 |
|
|
extern const tic6x_ctrl tic6x_ctrl_table[tic6x_ctrl_max];
|
| 509 |
|
|
|
| 510 |
|
|
/* An entry in the opcode table. */
|
| 511 |
|
|
typedef struct
|
| 512 |
|
|
{
|
| 513 |
|
|
/* The name of the instruction. */
|
| 514 |
|
|
const char *name;
|
| 515 |
|
|
|
| 516 |
|
|
/* Functional unit used by this instruction (basic information). */
|
| 517 |
|
|
tic6x_func_unit_base func_unit;
|
| 518 |
|
|
|
| 519 |
|
|
/* The format of this instruction. */
|
| 520 |
|
|
tic6x_insn_format_id format;
|
| 521 |
|
|
|
| 522 |
|
|
/* The pipeline type of this instruction. */
|
| 523 |
|
|
tic6x_pipeline_type type;
|
| 524 |
|
|
|
| 525 |
|
|
/* Which ISA variants include this instruction. */
|
| 526 |
|
|
unsigned short isa_variants;
|
| 527 |
|
|
|
| 528 |
|
|
/* Flags for this instruction. */
|
| 529 |
|
|
unsigned short flags;
|
| 530 |
|
|
|
| 531 |
|
|
/* Number of fixed fields, or fields with restricted value ranges,
|
| 532 |
|
|
for this instruction. */
|
| 533 |
|
|
unsigned int num_fixed_fields;
|
| 534 |
|
|
|
| 535 |
|
|
/* Values of fields fixed for this instruction. */
|
| 536 |
|
|
tic6x_fixed_field fixed_fields[TIC6X_MAX_FIXED_FIELDS];
|
| 537 |
|
|
|
| 538 |
|
|
/* The number of operands in the source form of this
|
| 539 |
|
|
instruction. */
|
| 540 |
|
|
unsigned int num_operands;
|
| 541 |
|
|
|
| 542 |
|
|
/* Information about individual operands. */
|
| 543 |
|
|
tic6x_operand_info operand_info[TIC6X_MAX_OPERANDS];
|
| 544 |
|
|
|
| 545 |
|
|
/* The number of variable fields for this instruction with encoding
|
| 546 |
|
|
instructions explicitly given. */
|
| 547 |
|
|
unsigned int num_variable_fields;
|
| 548 |
|
|
|
| 549 |
|
|
/* How fields (other than ones with fixed value) are computed from
|
| 550 |
|
|
the source operands and functional unit specifiers. In addition
|
| 551 |
|
|
to fields specified here:
|
| 552 |
|
|
|
| 553 |
|
|
- creg, if present, is set from the predicate, along with z which
|
| 554 |
|
|
must be present if creg is present.
|
| 555 |
|
|
|
| 556 |
|
|
- p, if present (on all non-compact instructions), is set from
|
| 557 |
|
|
the parallel bars.
|
| 558 |
|
|
*/
|
| 559 |
|
|
tic6x_coding_field variable_fields[TIC6X_MAX_VAR_FIELDS];
|
| 560 |
|
|
} tic6x_opcode;
|
| 561 |
|
|
|
| 562 |
|
|
/* An index into the table of opcodes. */
|
| 563 |
|
|
typedef enum
|
| 564 |
|
|
{
|
| 565 |
|
|
#define INSN(name, func_unit, format, type, isa, flags, fixed, ops, var) \
|
| 566 |
|
|
CONCAT6(tic6x_opcode_,name,_,func_unit,_,format),
|
| 567 |
|
|
#define INSNE(name, e, func_unit, format, type, isa, flags, fixed, ops, var) \
|
| 568 |
|
|
CONCAT4(tic6x_opcode_,name,_,e),
|
| 569 |
|
|
#include "tic6x-opcode-table.h"
|
| 570 |
|
|
#undef INSN
|
| 571 |
|
|
#undef INSNE
|
| 572 |
|
|
tic6x_opcode_max
|
| 573 |
|
|
} tic6x_opcode_id;
|
| 574 |
|
|
|
| 575 |
|
|
/* The table itself. */
|
| 576 |
|
|
extern const tic6x_opcode tic6x_opcode_table[tic6x_opcode_max];
|
| 577 |
|
|
|
| 578 |
|
|
/* A linked list of opcodes. */
|
| 579 |
|
|
typedef struct tic6x_opcode_list_tag
|
| 580 |
|
|
{
|
| 581 |
|
|
tic6x_opcode_id id;
|
| 582 |
|
|
struct tic6x_opcode_list_tag *next;
|
| 583 |
|
|
} tic6x_opcode_list;
|
| 584 |
|
|
|
| 585 |
|
|
/* The information from a fetch packet header. */
|
| 586 |
|
|
typedef struct
|
| 587 |
|
|
{
|
| 588 |
|
|
/* The header itself. */
|
| 589 |
|
|
unsigned int header;
|
| 590 |
|
|
|
| 591 |
|
|
/* Whether each word uses compact instructions. */
|
| 592 |
|
|
bfd_boolean word_compact[7];
|
| 593 |
|
|
|
| 594 |
|
|
/* Whether loads are protected. */
|
| 595 |
|
|
bfd_boolean prot;
|
| 596 |
|
|
|
| 597 |
|
|
/* Whether instructions use the high register set. */
|
| 598 |
|
|
bfd_boolean rs;
|
| 599 |
|
|
|
| 600 |
|
|
/* Data size. */
|
| 601 |
|
|
unsigned int dsz;
|
| 602 |
|
|
|
| 603 |
|
|
/* Whether compact instructions in the S unit are decoded as
|
| 604 |
|
|
branches. */
|
| 605 |
|
|
bfd_boolean br;
|
| 606 |
|
|
|
| 607 |
|
|
/* Whether compact instructions saturate. */
|
| 608 |
|
|
bfd_boolean sat;
|
| 609 |
|
|
|
| 610 |
|
|
/* P-bits. */
|
| 611 |
|
|
bfd_boolean p_bits[14];
|
| 612 |
|
|
} tic6x_fetch_packet_header;
|
| 613 |
|
|
|
| 614 |
|
|
#endif /* OPCODE_TIC6X_H */
|