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