1 /* TILEPro opcode information.
3 * Copyright 2011 Tilera Corporation. All Rights Reserved.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation, version 2.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
12 * NON INFRINGEMENT. See the GNU General Public License for
21 #ifndef opcode_tilepro_h
22 #define opcode_tilepro_h
24 #include <arch/opcode.h>
29 TILEPRO_MAX_OPERANDS
= 5 /* mm */
44 TILEPRO_OPC_MOVELI_SN
,
53 TILEPRO_OPC_ADDBS_U_SN
,
70 TILEPRO_OPC_ADIFFB_U_SN
,
72 TILEPRO_OPC_ADIFFH_SN
,
79 TILEPRO_OPC_AVGB_U_SN
,
103 TILEPRO_OPC_BLEZT_SN
,
113 TILEPRO_OPC_BYTEX_SN
,
120 TILEPRO_OPC_CRC32_32
,
121 TILEPRO_OPC_CRC32_32_SN
,
123 TILEPRO_OPC_CRC32_8_SN
,
128 TILEPRO_OPC_DWORD_ALIGN
,
129 TILEPRO_OPC_DWORD_ALIGN_SN
,
136 TILEPRO_OPC_INTHB_SN
,
138 TILEPRO_OPC_INTHH_SN
,
140 TILEPRO_OPC_INTLB_SN
,
142 TILEPRO_OPC_INTLH_SN
,
158 TILEPRO_OPC_LBADD_SN
,
160 TILEPRO_OPC_LBADD_U_SN
,
166 TILEPRO_OPC_LHADD_SN
,
168 TILEPRO_OPC_LHADD_U_SN
,
174 TILEPRO_OPC_LW_NA_SN
,
176 TILEPRO_OPC_LWADD_SN
,
177 TILEPRO_OPC_LWADD_NA
,
178 TILEPRO_OPC_LWADD_NA_SN
,
180 TILEPRO_OPC_MAXB_U_SN
,
184 TILEPRO_OPC_MAXIB_U_SN
,
186 TILEPRO_OPC_MAXIH_SN
,
190 TILEPRO_OPC_MINB_U_SN
,
194 TILEPRO_OPC_MINIB_U_SN
,
196 TILEPRO_OPC_MINIH_SN
,
205 TILEPRO_OPC_MULHH_SS
,
206 TILEPRO_OPC_MULHH_SS_SN
,
207 TILEPRO_OPC_MULHH_SU
,
208 TILEPRO_OPC_MULHH_SU_SN
,
209 TILEPRO_OPC_MULHH_UU
,
210 TILEPRO_OPC_MULHH_UU_SN
,
211 TILEPRO_OPC_MULHHA_SS
,
212 TILEPRO_OPC_MULHHA_SS_SN
,
213 TILEPRO_OPC_MULHHA_SU
,
214 TILEPRO_OPC_MULHHA_SU_SN
,
215 TILEPRO_OPC_MULHHA_UU
,
216 TILEPRO_OPC_MULHHA_UU_SN
,
217 TILEPRO_OPC_MULHHSA_UU
,
218 TILEPRO_OPC_MULHHSA_UU_SN
,
219 TILEPRO_OPC_MULHL_SS
,
220 TILEPRO_OPC_MULHL_SS_SN
,
221 TILEPRO_OPC_MULHL_SU
,
222 TILEPRO_OPC_MULHL_SU_SN
,
223 TILEPRO_OPC_MULHL_US
,
224 TILEPRO_OPC_MULHL_US_SN
,
225 TILEPRO_OPC_MULHL_UU
,
226 TILEPRO_OPC_MULHL_UU_SN
,
227 TILEPRO_OPC_MULHLA_SS
,
228 TILEPRO_OPC_MULHLA_SS_SN
,
229 TILEPRO_OPC_MULHLA_SU
,
230 TILEPRO_OPC_MULHLA_SU_SN
,
231 TILEPRO_OPC_MULHLA_US
,
232 TILEPRO_OPC_MULHLA_US_SN
,
233 TILEPRO_OPC_MULHLA_UU
,
234 TILEPRO_OPC_MULHLA_UU_SN
,
235 TILEPRO_OPC_MULHLSA_UU
,
236 TILEPRO_OPC_MULHLSA_UU_SN
,
237 TILEPRO_OPC_MULLL_SS
,
238 TILEPRO_OPC_MULLL_SS_SN
,
239 TILEPRO_OPC_MULLL_SU
,
240 TILEPRO_OPC_MULLL_SU_SN
,
241 TILEPRO_OPC_MULLL_UU
,
242 TILEPRO_OPC_MULLL_UU_SN
,
243 TILEPRO_OPC_MULLLA_SS
,
244 TILEPRO_OPC_MULLLA_SS_SN
,
245 TILEPRO_OPC_MULLLA_SU
,
246 TILEPRO_OPC_MULLLA_SU_SN
,
247 TILEPRO_OPC_MULLLA_UU
,
248 TILEPRO_OPC_MULLLA_UU_SN
,
249 TILEPRO_OPC_MULLLSA_UU
,
250 TILEPRO_OPC_MULLLSA_UU_SN
,
269 TILEPRO_OPC_PACKBS_U
,
270 TILEPRO_OPC_PACKBS_U_SN
,
272 TILEPRO_OPC_PACKHB_SN
,
274 TILEPRO_OPC_PACKHS_SN
,
276 TILEPRO_OPC_PACKLB_SN
,
290 TILEPRO_OPC_SADAB_U_SN
,
292 TILEPRO_OPC_SADAH_SN
,
294 TILEPRO_OPC_SADAH_U_SN
,
296 TILEPRO_OPC_SADB_U_SN
,
300 TILEPRO_OPC_SADH_U_SN
,
312 TILEPRO_OPC_SEQIB_SN
,
314 TILEPRO_OPC_SEQIH_SN
,
326 TILEPRO_OPC_SHLIB_SN
,
328 TILEPRO_OPC_SHLIH_SN
,
338 TILEPRO_OPC_SHRIB_SN
,
340 TILEPRO_OPC_SHRIH_SN
,
344 TILEPRO_OPC_SLT_U_SN
,
348 TILEPRO_OPC_SLTB_U_SN
,
352 TILEPRO_OPC_SLTE_U_SN
,
354 TILEPRO_OPC_SLTEB_SN
,
356 TILEPRO_OPC_SLTEB_U_SN
,
358 TILEPRO_OPC_SLTEH_SN
,
360 TILEPRO_OPC_SLTEH_U_SN
,
364 TILEPRO_OPC_SLTH_U_SN
,
368 TILEPRO_OPC_SLTI_U_SN
,
370 TILEPRO_OPC_SLTIB_SN
,
372 TILEPRO_OPC_SLTIB_U_SN
,
374 TILEPRO_OPC_SLTIH_SN
,
376 TILEPRO_OPC_SLTIH_U_SN
,
392 TILEPRO_OPC_SRAIB_SN
,
394 TILEPRO_OPC_SRAIH_SN
,
400 TILEPRO_OPC_SUBBS_U_SN
,
404 TILEPRO_OPC_SUBHS_SN
,
413 TILEPRO_OPC_TBLIDXB0
,
414 TILEPRO_OPC_TBLIDXB0_SN
,
415 TILEPRO_OPC_TBLIDXB1
,
416 TILEPRO_OPC_TBLIDXB1_SN
,
417 TILEPRO_OPC_TBLIDXB2
,
418 TILEPRO_OPC_TBLIDXB2_SN
,
419 TILEPRO_OPC_TBLIDXB3
,
420 TILEPRO_OPC_TBLIDXB3_SN
,
443 #define tilepro_is_x_pipeline(p) ((int)(p) <= (int)TILEPRO_PIPELINE_X1)
447 TILEPRO_OP_TYPE_REGISTER
,
448 TILEPRO_OP_TYPE_IMMEDIATE
,
449 TILEPRO_OP_TYPE_ADDRESS
,
451 } tilepro_operand_type
;
453 struct tilepro_operand
455 /* Is this operand a register, immediate or address? */
456 tilepro_operand_type type
;
458 /* The default relocation type for this operand. */
459 signed int default_reloc
: 16;
461 /* How many bits is this value? (used for range checking) */
462 unsigned int num_bits
: 5;
464 /* Is the value signed? (used for range checking) */
465 unsigned int is_signed
: 1;
467 /* Is this operand a source register? */
468 unsigned int is_src_reg
: 1;
470 /* Is this operand written? (i.e. is it a destination register) */
471 unsigned int is_dest_reg
: 1;
473 /* Is this operand PC-relative? */
474 unsigned int is_pc_relative
: 1;
476 /* By how many bits do we right shift the value before inserting? */
477 unsigned int rightshift
: 2;
479 /* Return the bits for this operand to be ORed into an existing bundle. */
480 tilepro_bundle_bits (*insert
) (int op
);
482 /* Extract this operand and return it. */
483 unsigned int (*extract
) (tilepro_bundle_bits bundle
);
487 extern const struct tilepro_operand tilepro_operands
[];
489 /* One finite-state machine per pipe for rapid instruction decoding. */
490 extern const unsigned short * const
491 tilepro_bundle_decoder_fsms
[TILEPRO_NUM_PIPELINE_ENCODINGS
];
494 struct tilepro_opcode
496 /* The opcode mnemonic, e.g. "add" */
499 /* The enum value for this mnemonic. */
500 tilepro_mnemonic mnemonic
;
502 /* A bit mask of which of the five pipes this instruction
511 /* How many operands are there? */
512 unsigned char num_operands
;
514 /* Which register does this write implicitly, or TREG_ZERO if none? */
515 unsigned char implicitly_written_register
;
517 /* Can this be bundled with other instructions (almost always true). */
518 unsigned char can_bundle
;
520 /* The description of the operands. Each of these is an
521 * index into the tilepro_operands[] table. */
522 unsigned char operands
[TILEPRO_NUM_PIPELINE_ENCODINGS
][TILEPRO_MAX_OPERANDS
];
526 extern const struct tilepro_opcode tilepro_opcodes
[];
529 /* Used for non-textual disassembly into structs. */
530 struct tilepro_decoded_instruction
532 const struct tilepro_opcode
*opcode
;
533 const struct tilepro_operand
*operands
[TILEPRO_MAX_OPERANDS
];
534 int operand_values
[TILEPRO_MAX_OPERANDS
];
538 /* Disassemble a bundle into a struct for machine processing. */
539 extern int parse_insn_tilepro(tilepro_bundle_bits bits
,
541 struct tilepro_decoded_instruction
542 decoded
[TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE
]);
545 /* Given a set of bundle bits and a specific pipe, returns which
546 * instruction the bundle contains in that pipe.
548 extern const struct tilepro_opcode
*
549 find_opcode(tilepro_bundle_bits bits
, tilepro_pipeline pipe
);
553 #endif /* opcode_tilepro_h */