1/* TILE-Gx opcode information.
2 *
3 * Copyright 2011 Tilera Corporation. All Rights Reserved.
4 *
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.
8 *
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
13 *   more details.
14 *
15 *
16 *
17 *
18 *
19 */
20
21#ifndef opcode_tile_h
22#define opcode_tile_h
23
24#include <arch/opcode.h>
25
26
27enum
28{
29  TILEGX_MAX_OPERANDS = 4 /* bfexts */
30};
31
32typedef enum
33{
34  TILEGX_OPC_BPT,
35  TILEGX_OPC_INFO,
36  TILEGX_OPC_INFOL,
37  TILEGX_OPC_MOVE,
38  TILEGX_OPC_MOVEI,
39  TILEGX_OPC_MOVELI,
40  TILEGX_OPC_PREFETCH,
41  TILEGX_OPC_PREFETCH_ADD_L1,
42  TILEGX_OPC_PREFETCH_ADD_L1_FAULT,
43  TILEGX_OPC_PREFETCH_ADD_L2,
44  TILEGX_OPC_PREFETCH_ADD_L2_FAULT,
45  TILEGX_OPC_PREFETCH_ADD_L3,
46  TILEGX_OPC_PREFETCH_ADD_L3_FAULT,
47  TILEGX_OPC_PREFETCH_L1,
48  TILEGX_OPC_PREFETCH_L1_FAULT,
49  TILEGX_OPC_PREFETCH_L2,
50  TILEGX_OPC_PREFETCH_L2_FAULT,
51  TILEGX_OPC_PREFETCH_L3,
52  TILEGX_OPC_PREFETCH_L3_FAULT,
53  TILEGX_OPC_RAISE,
54  TILEGX_OPC_ADD,
55  TILEGX_OPC_ADDI,
56  TILEGX_OPC_ADDLI,
57  TILEGX_OPC_ADDX,
58  TILEGX_OPC_ADDXI,
59  TILEGX_OPC_ADDXLI,
60  TILEGX_OPC_ADDXSC,
61  TILEGX_OPC_AND,
62  TILEGX_OPC_ANDI,
63  TILEGX_OPC_BEQZ,
64  TILEGX_OPC_BEQZT,
65  TILEGX_OPC_BFEXTS,
66  TILEGX_OPC_BFEXTU,
67  TILEGX_OPC_BFINS,
68  TILEGX_OPC_BGEZ,
69  TILEGX_OPC_BGEZT,
70  TILEGX_OPC_BGTZ,
71  TILEGX_OPC_BGTZT,
72  TILEGX_OPC_BLBC,
73  TILEGX_OPC_BLBCT,
74  TILEGX_OPC_BLBS,
75  TILEGX_OPC_BLBST,
76  TILEGX_OPC_BLEZ,
77  TILEGX_OPC_BLEZT,
78  TILEGX_OPC_BLTZ,
79  TILEGX_OPC_BLTZT,
80  TILEGX_OPC_BNEZ,
81  TILEGX_OPC_BNEZT,
82  TILEGX_OPC_CLZ,
83  TILEGX_OPC_CMOVEQZ,
84  TILEGX_OPC_CMOVNEZ,
85  TILEGX_OPC_CMPEQ,
86  TILEGX_OPC_CMPEQI,
87  TILEGX_OPC_CMPEXCH,
88  TILEGX_OPC_CMPEXCH4,
89  TILEGX_OPC_CMPLES,
90  TILEGX_OPC_CMPLEU,
91  TILEGX_OPC_CMPLTS,
92  TILEGX_OPC_CMPLTSI,
93  TILEGX_OPC_CMPLTU,
94  TILEGX_OPC_CMPLTUI,
95  TILEGX_OPC_CMPNE,
96  TILEGX_OPC_CMUL,
97  TILEGX_OPC_CMULA,
98  TILEGX_OPC_CMULAF,
99  TILEGX_OPC_CMULF,
100  TILEGX_OPC_CMULFR,
101  TILEGX_OPC_CMULH,
102  TILEGX_OPC_CMULHR,
103  TILEGX_OPC_CRC32_32,
104  TILEGX_OPC_CRC32_8,
105  TILEGX_OPC_CTZ,
106  TILEGX_OPC_DBLALIGN,
107  TILEGX_OPC_DBLALIGN2,
108  TILEGX_OPC_DBLALIGN4,
109  TILEGX_OPC_DBLALIGN6,
110  TILEGX_OPC_DRAIN,
111  TILEGX_OPC_DTLBPR,
112  TILEGX_OPC_EXCH,
113  TILEGX_OPC_EXCH4,
114  TILEGX_OPC_FDOUBLE_ADD_FLAGS,
115  TILEGX_OPC_FDOUBLE_ADDSUB,
116  TILEGX_OPC_FDOUBLE_MUL_FLAGS,
117  TILEGX_OPC_FDOUBLE_PACK1,
118  TILEGX_OPC_FDOUBLE_PACK2,
119  TILEGX_OPC_FDOUBLE_SUB_FLAGS,
120  TILEGX_OPC_FDOUBLE_UNPACK_MAX,
121  TILEGX_OPC_FDOUBLE_UNPACK_MIN,
122  TILEGX_OPC_FETCHADD,
123  TILEGX_OPC_FETCHADD4,
124  TILEGX_OPC_FETCHADDGEZ,
125  TILEGX_OPC_FETCHADDGEZ4,
126  TILEGX_OPC_FETCHAND,
127  TILEGX_OPC_FETCHAND4,
128  TILEGX_OPC_FETCHOR,
129  TILEGX_OPC_FETCHOR4,
130  TILEGX_OPC_FINV,
131  TILEGX_OPC_FLUSH,
132  TILEGX_OPC_FLUSHWB,
133  TILEGX_OPC_FNOP,
134  TILEGX_OPC_FSINGLE_ADD1,
135  TILEGX_OPC_FSINGLE_ADDSUB2,
136  TILEGX_OPC_FSINGLE_MUL1,
137  TILEGX_OPC_FSINGLE_MUL2,
138  TILEGX_OPC_FSINGLE_PACK1,
139  TILEGX_OPC_FSINGLE_PACK2,
140  TILEGX_OPC_FSINGLE_SUB1,
141  TILEGX_OPC_ICOH,
142  TILEGX_OPC_ILL,
143  TILEGX_OPC_INV,
144  TILEGX_OPC_IRET,
145  TILEGX_OPC_J,
146  TILEGX_OPC_JAL,
147  TILEGX_OPC_JALR,
148  TILEGX_OPC_JALRP,
149  TILEGX_OPC_JR,
150  TILEGX_OPC_JRP,
151  TILEGX_OPC_LD,
152  TILEGX_OPC_LD1S,
153  TILEGX_OPC_LD1S_ADD,
154  TILEGX_OPC_LD1U,
155  TILEGX_OPC_LD1U_ADD,
156  TILEGX_OPC_LD2S,
157  TILEGX_OPC_LD2S_ADD,
158  TILEGX_OPC_LD2U,
159  TILEGX_OPC_LD2U_ADD,
160  TILEGX_OPC_LD4S,
161  TILEGX_OPC_LD4S_ADD,
162  TILEGX_OPC_LD4U,
163  TILEGX_OPC_LD4U_ADD,
164  TILEGX_OPC_LD_ADD,
165  TILEGX_OPC_LDNA,
166  TILEGX_OPC_LDNA_ADD,
167  TILEGX_OPC_LDNT,
168  TILEGX_OPC_LDNT1S,
169  TILEGX_OPC_LDNT1S_ADD,
170  TILEGX_OPC_LDNT1U,
171  TILEGX_OPC_LDNT1U_ADD,
172  TILEGX_OPC_LDNT2S,
173  TILEGX_OPC_LDNT2S_ADD,
174  TILEGX_OPC_LDNT2U,
175  TILEGX_OPC_LDNT2U_ADD,
176  TILEGX_OPC_LDNT4S,
177  TILEGX_OPC_LDNT4S_ADD,
178  TILEGX_OPC_LDNT4U,
179  TILEGX_OPC_LDNT4U_ADD,
180  TILEGX_OPC_LDNT_ADD,
181  TILEGX_OPC_LNK,
182  TILEGX_OPC_MF,
183  TILEGX_OPC_MFSPR,
184  TILEGX_OPC_MM,
185  TILEGX_OPC_MNZ,
186  TILEGX_OPC_MTSPR,
187  TILEGX_OPC_MUL_HS_HS,
188  TILEGX_OPC_MUL_HS_HU,
189  TILEGX_OPC_MUL_HS_LS,
190  TILEGX_OPC_MUL_HS_LU,
191  TILEGX_OPC_MUL_HU_HU,
192  TILEGX_OPC_MUL_HU_LS,
193  TILEGX_OPC_MUL_HU_LU,
194  TILEGX_OPC_MUL_LS_LS,
195  TILEGX_OPC_MUL_LS_LU,
196  TILEGX_OPC_MUL_LU_LU,
197  TILEGX_OPC_MULA_HS_HS,
198  TILEGX_OPC_MULA_HS_HU,
199  TILEGX_OPC_MULA_HS_LS,
200  TILEGX_OPC_MULA_HS_LU,
201  TILEGX_OPC_MULA_HU_HU,
202  TILEGX_OPC_MULA_HU_LS,
203  TILEGX_OPC_MULA_HU_LU,
204  TILEGX_OPC_MULA_LS_LS,
205  TILEGX_OPC_MULA_LS_LU,
206  TILEGX_OPC_MULA_LU_LU,
207  TILEGX_OPC_MULAX,
208  TILEGX_OPC_MULX,
209  TILEGX_OPC_MZ,
210  TILEGX_OPC_NAP,
211  TILEGX_OPC_NOP,
212  TILEGX_OPC_NOR,
213  TILEGX_OPC_OR,
214  TILEGX_OPC_ORI,
215  TILEGX_OPC_PCNT,
216  TILEGX_OPC_REVBITS,
217  TILEGX_OPC_REVBYTES,
218  TILEGX_OPC_ROTL,
219  TILEGX_OPC_ROTLI,
220  TILEGX_OPC_SHL,
221  TILEGX_OPC_SHL16INSLI,
222  TILEGX_OPC_SHL1ADD,
223  TILEGX_OPC_SHL1ADDX,
224  TILEGX_OPC_SHL2ADD,
225  TILEGX_OPC_SHL2ADDX,
226  TILEGX_OPC_SHL3ADD,
227  TILEGX_OPC_SHL3ADDX,
228  TILEGX_OPC_SHLI,
229  TILEGX_OPC_SHLX,
230  TILEGX_OPC_SHLXI,
231  TILEGX_OPC_SHRS,
232  TILEGX_OPC_SHRSI,
233  TILEGX_OPC_SHRU,
234  TILEGX_OPC_SHRUI,
235  TILEGX_OPC_SHRUX,
236  TILEGX_OPC_SHRUXI,
237  TILEGX_OPC_SHUFFLEBYTES,
238  TILEGX_OPC_ST,
239  TILEGX_OPC_ST1,
240  TILEGX_OPC_ST1_ADD,
241  TILEGX_OPC_ST2,
242  TILEGX_OPC_ST2_ADD,
243  TILEGX_OPC_ST4,
244  TILEGX_OPC_ST4_ADD,
245  TILEGX_OPC_ST_ADD,
246  TILEGX_OPC_STNT,
247  TILEGX_OPC_STNT1,
248  TILEGX_OPC_STNT1_ADD,
249  TILEGX_OPC_STNT2,
250  TILEGX_OPC_STNT2_ADD,
251  TILEGX_OPC_STNT4,
252  TILEGX_OPC_STNT4_ADD,
253  TILEGX_OPC_STNT_ADD,
254  TILEGX_OPC_SUB,
255  TILEGX_OPC_SUBX,
256  TILEGX_OPC_SUBXSC,
257  TILEGX_OPC_SWINT0,
258  TILEGX_OPC_SWINT1,
259  TILEGX_OPC_SWINT2,
260  TILEGX_OPC_SWINT3,
261  TILEGX_OPC_TBLIDXB0,
262  TILEGX_OPC_TBLIDXB1,
263  TILEGX_OPC_TBLIDXB2,
264  TILEGX_OPC_TBLIDXB3,
265  TILEGX_OPC_V1ADD,
266  TILEGX_OPC_V1ADDI,
267  TILEGX_OPC_V1ADDUC,
268  TILEGX_OPC_V1ADIFFU,
269  TILEGX_OPC_V1AVGU,
270  TILEGX_OPC_V1CMPEQ,
271  TILEGX_OPC_V1CMPEQI,
272  TILEGX_OPC_V1CMPLES,
273  TILEGX_OPC_V1CMPLEU,
274  TILEGX_OPC_V1CMPLTS,
275  TILEGX_OPC_V1CMPLTSI,
276  TILEGX_OPC_V1CMPLTU,
277  TILEGX_OPC_V1CMPLTUI,
278  TILEGX_OPC_V1CMPNE,
279  TILEGX_OPC_V1DDOTPU,
280  TILEGX_OPC_V1DDOTPUA,
281  TILEGX_OPC_V1DDOTPUS,
282  TILEGX_OPC_V1DDOTPUSA,
283  TILEGX_OPC_V1DOTP,
284  TILEGX_OPC_V1DOTPA,
285  TILEGX_OPC_V1DOTPU,
286  TILEGX_OPC_V1DOTPUA,
287  TILEGX_OPC_V1DOTPUS,
288  TILEGX_OPC_V1DOTPUSA,
289  TILEGX_OPC_V1INT_H,
290  TILEGX_OPC_V1INT_L,
291  TILEGX_OPC_V1MAXU,
292  TILEGX_OPC_V1MAXUI,
293  TILEGX_OPC_V1MINU,
294  TILEGX_OPC_V1MINUI,
295  TILEGX_OPC_V1MNZ,
296  TILEGX_OPC_V1MULTU,
297  TILEGX_OPC_V1MULU,
298  TILEGX_OPC_V1MULUS,
299  TILEGX_OPC_V1MZ,
300  TILEGX_OPC_V1SADAU,
301  TILEGX_OPC_V1SADU,
302  TILEGX_OPC_V1SHL,
303  TILEGX_OPC_V1SHLI,
304  TILEGX_OPC_V1SHRS,
305  TILEGX_OPC_V1SHRSI,
306  TILEGX_OPC_V1SHRU,
307  TILEGX_OPC_V1SHRUI,
308  TILEGX_OPC_V1SUB,
309  TILEGX_OPC_V1SUBUC,
310  TILEGX_OPC_V2ADD,
311  TILEGX_OPC_V2ADDI,
312  TILEGX_OPC_V2ADDSC,
313  TILEGX_OPC_V2ADIFFS,
314  TILEGX_OPC_V2AVGS,
315  TILEGX_OPC_V2CMPEQ,
316  TILEGX_OPC_V2CMPEQI,
317  TILEGX_OPC_V2CMPLES,
318  TILEGX_OPC_V2CMPLEU,
319  TILEGX_OPC_V2CMPLTS,
320  TILEGX_OPC_V2CMPLTSI,
321  TILEGX_OPC_V2CMPLTU,
322  TILEGX_OPC_V2CMPLTUI,
323  TILEGX_OPC_V2CMPNE,
324  TILEGX_OPC_V2DOTP,
325  TILEGX_OPC_V2DOTPA,
326  TILEGX_OPC_V2INT_H,
327  TILEGX_OPC_V2INT_L,
328  TILEGX_OPC_V2MAXS,
329  TILEGX_OPC_V2MAXSI,
330  TILEGX_OPC_V2MINS,
331  TILEGX_OPC_V2MINSI,
332  TILEGX_OPC_V2MNZ,
333  TILEGX_OPC_V2MULFSC,
334  TILEGX_OPC_V2MULS,
335  TILEGX_OPC_V2MULTS,
336  TILEGX_OPC_V2MZ,
337  TILEGX_OPC_V2PACKH,
338  TILEGX_OPC_V2PACKL,
339  TILEGX_OPC_V2PACKUC,
340  TILEGX_OPC_V2SADAS,
341  TILEGX_OPC_V2SADAU,
342  TILEGX_OPC_V2SADS,
343  TILEGX_OPC_V2SADU,
344  TILEGX_OPC_V2SHL,
345  TILEGX_OPC_V2SHLI,
346  TILEGX_OPC_V2SHLSC,
347  TILEGX_OPC_V2SHRS,
348  TILEGX_OPC_V2SHRSI,
349  TILEGX_OPC_V2SHRU,
350  TILEGX_OPC_V2SHRUI,
351  TILEGX_OPC_V2SUB,
352  TILEGX_OPC_V2SUBSC,
353  TILEGX_OPC_V4ADD,
354  TILEGX_OPC_V4ADDSC,
355  TILEGX_OPC_V4INT_H,
356  TILEGX_OPC_V4INT_L,
357  TILEGX_OPC_V4PACKSC,
358  TILEGX_OPC_V4SHL,
359  TILEGX_OPC_V4SHLSC,
360  TILEGX_OPC_V4SHRS,
361  TILEGX_OPC_V4SHRU,
362  TILEGX_OPC_V4SUB,
363  TILEGX_OPC_V4SUBSC,
364  TILEGX_OPC_WH64,
365  TILEGX_OPC_XOR,
366  TILEGX_OPC_XORI,
367  TILEGX_OPC_NONE
368} tilegx_mnemonic;
369
370
371
372typedef enum
373{
374  TILEGX_PIPELINE_X0,
375  TILEGX_PIPELINE_X1,
376  TILEGX_PIPELINE_Y0,
377  TILEGX_PIPELINE_Y1,
378  TILEGX_PIPELINE_Y2,
379} tilegx_pipeline;
380
381#define tilegx_is_x_pipeline(p) ((int)(p) <= (int)TILEGX_PIPELINE_X1)
382
383typedef enum
384{
385  TILEGX_OP_TYPE_REGISTER,
386  TILEGX_OP_TYPE_IMMEDIATE,
387  TILEGX_OP_TYPE_ADDRESS,
388  TILEGX_OP_TYPE_SPR
389} tilegx_operand_type;
390
391struct tilegx_operand
392{
393  /* Is this operand a register, immediate or address? */
394  tilegx_operand_type type;
395
396  /* The default relocation type for this operand.  */
397  signed int default_reloc : 16;
398
399  /* How many bits is this value? (used for range checking) */
400  unsigned int num_bits : 5;
401
402  /* Is the value signed? (used for range checking) */
403  unsigned int is_signed : 1;
404
405  /* Is this operand a source register? */
406  unsigned int is_src_reg : 1;
407
408  /* Is this operand written? (i.e. is it a destination register) */
409  unsigned int is_dest_reg : 1;
410
411  /* Is this operand PC-relative? */
412  unsigned int is_pc_relative : 1;
413
414  /* By how many bits do we right shift the value before inserting? */
415  unsigned int rightshift : 2;
416
417  /* Return the bits for this operand to be ORed into an existing bundle. */
418  tilegx_bundle_bits (*insert) (int op);
419
420  /* Extract this operand and return it. */
421  unsigned int (*extract) (tilegx_bundle_bits bundle);
422};
423
424
425extern const struct tilegx_operand tilegx_operands[];
426
427/* One finite-state machine per pipe for rapid instruction decoding. */
428extern const unsigned short * const
429tilegx_bundle_decoder_fsms[TILEGX_NUM_PIPELINE_ENCODINGS];
430
431
432struct tilegx_opcode
433{
434  /* The opcode mnemonic, e.g. "add" */
435  const char *name;
436
437  /* The enum value for this mnemonic. */
438  tilegx_mnemonic mnemonic;
439
440  /* A bit mask of which of the five pipes this instruction
441     is compatible with:
442     X0  0x01
443     X1  0x02
444     Y0  0x04
445     Y1  0x08
446     Y2  0x10 */
447  unsigned char pipes;
448
449  /* How many operands are there? */
450  unsigned char num_operands;
451
452  /* Which register does this write implicitly, or TREG_ZERO if none? */
453  unsigned char implicitly_written_register;
454
455  /* Can this be bundled with other instructions (almost always true). */
456  unsigned char can_bundle;
457
458  /* The description of the operands. Each of these is an
459   * index into the tilegx_operands[] table. */
460  unsigned char operands[TILEGX_NUM_PIPELINE_ENCODINGS][TILEGX_MAX_OPERANDS];
461
462};
463
464extern const struct tilegx_opcode tilegx_opcodes[];
465
466/* Used for non-textual disassembly into structs. */
467struct tilegx_decoded_instruction
468{
469  const struct tilegx_opcode *opcode;
470  const struct tilegx_operand *operands[TILEGX_MAX_OPERANDS];
471  long long operand_values[TILEGX_MAX_OPERANDS];
472};
473
474
475/* Disassemble a bundle into a struct for machine processing. */
476extern int parse_insn_tilegx(tilegx_bundle_bits bits,
477                             unsigned long long pc,
478                             struct tilegx_decoded_instruction
479                             decoded[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE]);
480
481
482
483#endif /* opcode_tilegx_h */
484