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 
27 enum
28 {
29   TILEGX_MAX_OPERANDS = 4 /* bfexts */
30 };
31 
32 typedef 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 
372 typedef 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 
383 typedef 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 
391 struct 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 
425 extern const struct tilegx_operand tilegx_operands[];
426 
427 /* One finite-state machine per pipe for rapid instruction decoding. */
428 extern const unsigned short * const
429 tilegx_bundle_decoder_fsms[TILEGX_NUM_PIPELINE_ENCODINGS];
430 
431 
432 struct 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 
464 extern const struct tilegx_opcode tilegx_opcodes[];
465 
466 /* Used for non-textual disassembly into structs. */
467 struct 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. */
476 extern 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