source: trunk/libs/newlib/src/include/opcode/tilegx.h @ 509

Last change on this file since 509 was 444, checked in by satin@…, 7 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 29.2 KB
Line 
1/* TILE-Gx opcode information.
2 *
3 *    Copyright 2011 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
21#ifndef opcode_tile_h
22#define opcode_tile_h
23
24typedef unsigned long long tilegx_bundle_bits;
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_LD4S_TLS,
38  TILEGX_OPC_LD_TLS,
39  TILEGX_OPC_MOVE,
40  TILEGX_OPC_MOVEI,
41  TILEGX_OPC_MOVELI,
42  TILEGX_OPC_PREFETCH,
43  TILEGX_OPC_PREFETCH_ADD_L1,
44  TILEGX_OPC_PREFETCH_ADD_L1_FAULT,
45  TILEGX_OPC_PREFETCH_ADD_L2,
46  TILEGX_OPC_PREFETCH_ADD_L2_FAULT,
47  TILEGX_OPC_PREFETCH_ADD_L3,
48  TILEGX_OPC_PREFETCH_ADD_L3_FAULT,
49  TILEGX_OPC_PREFETCH_L1,
50  TILEGX_OPC_PREFETCH_L1_FAULT,
51  TILEGX_OPC_PREFETCH_L2,
52  TILEGX_OPC_PREFETCH_L2_FAULT,
53  TILEGX_OPC_PREFETCH_L3,
54  TILEGX_OPC_PREFETCH_L3_FAULT,
55  TILEGX_OPC_RAISE,
56  TILEGX_OPC_ADD,
57  TILEGX_OPC_ADDI,
58  TILEGX_OPC_ADDLI,
59  TILEGX_OPC_ADDX,
60  TILEGX_OPC_ADDXI,
61  TILEGX_OPC_ADDXLI,
62  TILEGX_OPC_ADDXSC,
63  TILEGX_OPC_AND,
64  TILEGX_OPC_ANDI,
65  TILEGX_OPC_BEQZ,
66  TILEGX_OPC_BEQZT,
67  TILEGX_OPC_BFEXTS,
68  TILEGX_OPC_BFEXTU,
69  TILEGX_OPC_BFINS,
70  TILEGX_OPC_BGEZ,
71  TILEGX_OPC_BGEZT,
72  TILEGX_OPC_BGTZ,
73  TILEGX_OPC_BGTZT,
74  TILEGX_OPC_BLBC,
75  TILEGX_OPC_BLBCT,
76  TILEGX_OPC_BLBS,
77  TILEGX_OPC_BLBST,
78  TILEGX_OPC_BLEZ,
79  TILEGX_OPC_BLEZT,
80  TILEGX_OPC_BLTZ,
81  TILEGX_OPC_BLTZT,
82  TILEGX_OPC_BNEZ,
83  TILEGX_OPC_BNEZT,
84  TILEGX_OPC_CLZ,
85  TILEGX_OPC_CMOVEQZ,
86  TILEGX_OPC_CMOVNEZ,
87  TILEGX_OPC_CMPEQ,
88  TILEGX_OPC_CMPEQI,
89  TILEGX_OPC_CMPEXCH,
90  TILEGX_OPC_CMPEXCH4,
91  TILEGX_OPC_CMPLES,
92  TILEGX_OPC_CMPLEU,
93  TILEGX_OPC_CMPLTS,
94  TILEGX_OPC_CMPLTSI,
95  TILEGX_OPC_CMPLTU,
96  TILEGX_OPC_CMPLTUI,
97  TILEGX_OPC_CMPNE,
98  TILEGX_OPC_CMUL,
99  TILEGX_OPC_CMULA,
100  TILEGX_OPC_CMULAF,
101  TILEGX_OPC_CMULF,
102  TILEGX_OPC_CMULFR,
103  TILEGX_OPC_CMULH,
104  TILEGX_OPC_CMULHR,
105  TILEGX_OPC_CRC32_32,
106  TILEGX_OPC_CRC32_8,
107  TILEGX_OPC_CTZ,
108  TILEGX_OPC_DBLALIGN,
109  TILEGX_OPC_DBLALIGN2,
110  TILEGX_OPC_DBLALIGN4,
111  TILEGX_OPC_DBLALIGN6,
112  TILEGX_OPC_DRAIN,
113  TILEGX_OPC_DTLBPR,
114  TILEGX_OPC_EXCH,
115  TILEGX_OPC_EXCH4,
116  TILEGX_OPC_FDOUBLE_ADD_FLAGS,
117  TILEGX_OPC_FDOUBLE_ADDSUB,
118  TILEGX_OPC_FDOUBLE_MUL_FLAGS,
119  TILEGX_OPC_FDOUBLE_PACK1,
120  TILEGX_OPC_FDOUBLE_PACK2,
121  TILEGX_OPC_FDOUBLE_SUB_FLAGS,
122  TILEGX_OPC_FDOUBLE_UNPACK_MAX,
123  TILEGX_OPC_FDOUBLE_UNPACK_MIN,
124  TILEGX_OPC_FETCHADD,
125  TILEGX_OPC_FETCHADD4,
126  TILEGX_OPC_FETCHADDGEZ,
127  TILEGX_OPC_FETCHADDGEZ4,
128  TILEGX_OPC_FETCHAND,
129  TILEGX_OPC_FETCHAND4,
130  TILEGX_OPC_FETCHOR,
131  TILEGX_OPC_FETCHOR4,
132  TILEGX_OPC_FINV,
133  TILEGX_OPC_FLUSH,
134  TILEGX_OPC_FLUSHWB,
135  TILEGX_OPC_FNOP,
136  TILEGX_OPC_FSINGLE_ADD1,
137  TILEGX_OPC_FSINGLE_ADDSUB2,
138  TILEGX_OPC_FSINGLE_MUL1,
139  TILEGX_OPC_FSINGLE_MUL2,
140  TILEGX_OPC_FSINGLE_PACK1,
141  TILEGX_OPC_FSINGLE_PACK2,
142  TILEGX_OPC_FSINGLE_SUB1,
143  TILEGX_OPC_ICOH,
144  TILEGX_OPC_ILL,
145  TILEGX_OPC_INV,
146  TILEGX_OPC_IRET,
147  TILEGX_OPC_J,
148  TILEGX_OPC_JAL,
149  TILEGX_OPC_JALR,
150  TILEGX_OPC_JALRP,
151  TILEGX_OPC_JR,
152  TILEGX_OPC_JRP,
153  TILEGX_OPC_LD,
154  TILEGX_OPC_LD1S,
155  TILEGX_OPC_LD1S_ADD,
156  TILEGX_OPC_LD1U,
157  TILEGX_OPC_LD1U_ADD,
158  TILEGX_OPC_LD2S,
159  TILEGX_OPC_LD2S_ADD,
160  TILEGX_OPC_LD2U,
161  TILEGX_OPC_LD2U_ADD,
162  TILEGX_OPC_LD4S,
163  TILEGX_OPC_LD4S_ADD,
164  TILEGX_OPC_LD4U,
165  TILEGX_OPC_LD4U_ADD,
166  TILEGX_OPC_LD_ADD,
167  TILEGX_OPC_LDNA,
168  TILEGX_OPC_LDNA_ADD,
169  TILEGX_OPC_LDNT,
170  TILEGX_OPC_LDNT1S,
171  TILEGX_OPC_LDNT1S_ADD,
172  TILEGX_OPC_LDNT1U,
173  TILEGX_OPC_LDNT1U_ADD,
174  TILEGX_OPC_LDNT2S,
175  TILEGX_OPC_LDNT2S_ADD,
176  TILEGX_OPC_LDNT2U,
177  TILEGX_OPC_LDNT2U_ADD,
178  TILEGX_OPC_LDNT4S,
179  TILEGX_OPC_LDNT4S_ADD,
180  TILEGX_OPC_LDNT4U,
181  TILEGX_OPC_LDNT4U_ADD,
182  TILEGX_OPC_LDNT_ADD,
183  TILEGX_OPC_LNK,
184  TILEGX_OPC_MF,
185  TILEGX_OPC_MFSPR,
186  TILEGX_OPC_MM,
187  TILEGX_OPC_MNZ,
188  TILEGX_OPC_MTSPR,
189  TILEGX_OPC_MUL_HS_HS,
190  TILEGX_OPC_MUL_HS_HU,
191  TILEGX_OPC_MUL_HS_LS,
192  TILEGX_OPC_MUL_HS_LU,
193  TILEGX_OPC_MUL_HU_HU,
194  TILEGX_OPC_MUL_HU_LS,
195  TILEGX_OPC_MUL_HU_LU,
196  TILEGX_OPC_MUL_LS_LS,
197  TILEGX_OPC_MUL_LS_LU,
198  TILEGX_OPC_MUL_LU_LU,
199  TILEGX_OPC_MULA_HS_HS,
200  TILEGX_OPC_MULA_HS_HU,
201  TILEGX_OPC_MULA_HS_LS,
202  TILEGX_OPC_MULA_HS_LU,
203  TILEGX_OPC_MULA_HU_HU,
204  TILEGX_OPC_MULA_HU_LS,
205  TILEGX_OPC_MULA_HU_LU,
206  TILEGX_OPC_MULA_LS_LS,
207  TILEGX_OPC_MULA_LS_LU,
208  TILEGX_OPC_MULA_LU_LU,
209  TILEGX_OPC_MULAX,
210  TILEGX_OPC_MULX,
211  TILEGX_OPC_MZ,
212  TILEGX_OPC_NAP,
213  TILEGX_OPC_NOP,
214  TILEGX_OPC_NOR,
215  TILEGX_OPC_OR,
216  TILEGX_OPC_ORI,
217  TILEGX_OPC_PCNT,
218  TILEGX_OPC_REVBITS,
219  TILEGX_OPC_REVBYTES,
220  TILEGX_OPC_ROTL,
221  TILEGX_OPC_ROTLI,
222  TILEGX_OPC_SHL,
223  TILEGX_OPC_SHL16INSLI,
224  TILEGX_OPC_SHL1ADD,
225  TILEGX_OPC_SHL1ADDX,
226  TILEGX_OPC_SHL2ADD,
227  TILEGX_OPC_SHL2ADDX,
228  TILEGX_OPC_SHL3ADD,
229  TILEGX_OPC_SHL3ADDX,
230  TILEGX_OPC_SHLI,
231  TILEGX_OPC_SHLX,
232  TILEGX_OPC_SHLXI,
233  TILEGX_OPC_SHRS,
234  TILEGX_OPC_SHRSI,
235  TILEGX_OPC_SHRU,
236  TILEGX_OPC_SHRUI,
237  TILEGX_OPC_SHRUX,
238  TILEGX_OPC_SHRUXI,
239  TILEGX_OPC_SHUFFLEBYTES,
240  TILEGX_OPC_ST,
241  TILEGX_OPC_ST1,
242  TILEGX_OPC_ST1_ADD,
243  TILEGX_OPC_ST2,
244  TILEGX_OPC_ST2_ADD,
245  TILEGX_OPC_ST4,
246  TILEGX_OPC_ST4_ADD,
247  TILEGX_OPC_ST_ADD,
248  TILEGX_OPC_STNT,
249  TILEGX_OPC_STNT1,
250  TILEGX_OPC_STNT1_ADD,
251  TILEGX_OPC_STNT2,
252  TILEGX_OPC_STNT2_ADD,
253  TILEGX_OPC_STNT4,
254  TILEGX_OPC_STNT4_ADD,
255  TILEGX_OPC_STNT_ADD,
256  TILEGX_OPC_SUB,
257  TILEGX_OPC_SUBX,
258  TILEGX_OPC_SUBXSC,
259  TILEGX_OPC_SWINT0,
260  TILEGX_OPC_SWINT1,
261  TILEGX_OPC_SWINT2,
262  TILEGX_OPC_SWINT3,
263  TILEGX_OPC_TBLIDXB0,
264  TILEGX_OPC_TBLIDXB1,
265  TILEGX_OPC_TBLIDXB2,
266  TILEGX_OPC_TBLIDXB3,
267  TILEGX_OPC_V1ADD,
268  TILEGX_OPC_V1ADDI,
269  TILEGX_OPC_V1ADDUC,
270  TILEGX_OPC_V1ADIFFU,
271  TILEGX_OPC_V1AVGU,
272  TILEGX_OPC_V1CMPEQ,
273  TILEGX_OPC_V1CMPEQI,
274  TILEGX_OPC_V1CMPLES,
275  TILEGX_OPC_V1CMPLEU,
276  TILEGX_OPC_V1CMPLTS,
277  TILEGX_OPC_V1CMPLTSI,
278  TILEGX_OPC_V1CMPLTU,
279  TILEGX_OPC_V1CMPLTUI,
280  TILEGX_OPC_V1CMPNE,
281  TILEGX_OPC_V1DDOTPU,
282  TILEGX_OPC_V1DDOTPUA,
283  TILEGX_OPC_V1DDOTPUS,
284  TILEGX_OPC_V1DDOTPUSA,
285  TILEGX_OPC_V1DOTP,
286  TILEGX_OPC_V1DOTPA,
287  TILEGX_OPC_V1DOTPU,
288  TILEGX_OPC_V1DOTPUA,
289  TILEGX_OPC_V1DOTPUS,
290  TILEGX_OPC_V1DOTPUSA,
291  TILEGX_OPC_V1INT_H,
292  TILEGX_OPC_V1INT_L,
293  TILEGX_OPC_V1MAXU,
294  TILEGX_OPC_V1MAXUI,
295  TILEGX_OPC_V1MINU,
296  TILEGX_OPC_V1MINUI,
297  TILEGX_OPC_V1MNZ,
298  TILEGX_OPC_V1MULTU,
299  TILEGX_OPC_V1MULU,
300  TILEGX_OPC_V1MULUS,
301  TILEGX_OPC_V1MZ,
302  TILEGX_OPC_V1SADAU,
303  TILEGX_OPC_V1SADU,
304  TILEGX_OPC_V1SHL,
305  TILEGX_OPC_V1SHLI,
306  TILEGX_OPC_V1SHRS,
307  TILEGX_OPC_V1SHRSI,
308  TILEGX_OPC_V1SHRU,
309  TILEGX_OPC_V1SHRUI,
310  TILEGX_OPC_V1SUB,
311  TILEGX_OPC_V1SUBUC,
312  TILEGX_OPC_V2ADD,
313  TILEGX_OPC_V2ADDI,
314  TILEGX_OPC_V2ADDSC,
315  TILEGX_OPC_V2ADIFFS,
316  TILEGX_OPC_V2AVGS,
317  TILEGX_OPC_V2CMPEQ,
318  TILEGX_OPC_V2CMPEQI,
319  TILEGX_OPC_V2CMPLES,
320  TILEGX_OPC_V2CMPLEU,
321  TILEGX_OPC_V2CMPLTS,
322  TILEGX_OPC_V2CMPLTSI,
323  TILEGX_OPC_V2CMPLTU,
324  TILEGX_OPC_V2CMPLTUI,
325  TILEGX_OPC_V2CMPNE,
326  TILEGX_OPC_V2DOTP,
327  TILEGX_OPC_V2DOTPA,
328  TILEGX_OPC_V2INT_H,
329  TILEGX_OPC_V2INT_L,
330  TILEGX_OPC_V2MAXS,
331  TILEGX_OPC_V2MAXSI,
332  TILEGX_OPC_V2MINS,
333  TILEGX_OPC_V2MINSI,
334  TILEGX_OPC_V2MNZ,
335  TILEGX_OPC_V2MULFSC,
336  TILEGX_OPC_V2MULS,
337  TILEGX_OPC_V2MULTS,
338  TILEGX_OPC_V2MZ,
339  TILEGX_OPC_V2PACKH,
340  TILEGX_OPC_V2PACKL,
341  TILEGX_OPC_V2PACKUC,
342  TILEGX_OPC_V2SADAS,
343  TILEGX_OPC_V2SADAU,
344  TILEGX_OPC_V2SADS,
345  TILEGX_OPC_V2SADU,
346  TILEGX_OPC_V2SHL,
347  TILEGX_OPC_V2SHLI,
348  TILEGX_OPC_V2SHLSC,
349  TILEGX_OPC_V2SHRS,
350  TILEGX_OPC_V2SHRSI,
351  TILEGX_OPC_V2SHRU,
352  TILEGX_OPC_V2SHRUI,
353  TILEGX_OPC_V2SUB,
354  TILEGX_OPC_V2SUBSC,
355  TILEGX_OPC_V4ADD,
356  TILEGX_OPC_V4ADDSC,
357  TILEGX_OPC_V4INT_H,
358  TILEGX_OPC_V4INT_L,
359  TILEGX_OPC_V4PACKSC,
360  TILEGX_OPC_V4SHL,
361  TILEGX_OPC_V4SHLSC,
362  TILEGX_OPC_V4SHRS,
363  TILEGX_OPC_V4SHRU,
364  TILEGX_OPC_V4SUB,
365  TILEGX_OPC_V4SUBSC,
366  TILEGX_OPC_WH64,
367  TILEGX_OPC_XOR,
368  TILEGX_OPC_XORI,
369  TILEGX_OPC_NONE
370} tilegx_mnemonic;
371
372/* 64-bit pattern for a { bpt ; nop } bundle. */
373#define TILEGX_BPT_BUNDLE 0x286a44ae51485000ULL
374
375
376
377static __inline unsigned int
378get_BFEnd_X0(tilegx_bundle_bits num)
379{
380  const unsigned int n = (unsigned int)num;
381  return (((n >> 12)) & 0x3f);
382}
383
384static __inline unsigned int
385get_BFOpcodeExtension_X0(tilegx_bundle_bits num)
386{
387  const unsigned int n = (unsigned int)num;
388  return (((n >> 24)) & 0xf);
389}
390
391static __inline unsigned int
392get_BFStart_X0(tilegx_bundle_bits num)
393{
394  const unsigned int n = (unsigned int)num;
395  return (((n >> 18)) & 0x3f);
396}
397
398static __inline unsigned int
399get_BrOff_X1(tilegx_bundle_bits n)
400{
401  return (((unsigned int)(n >> 31)) & 0x0000003f) |
402         (((unsigned int)(n >> 37)) & 0x0001ffc0);
403}
404
405static __inline unsigned int
406get_BrType_X1(tilegx_bundle_bits n)
407{
408  return (((unsigned int)(n >> 54)) & 0x1f);
409}
410
411static __inline unsigned int
412get_Dest_Imm8_X1(tilegx_bundle_bits n)
413{
414  return (((unsigned int)(n >> 31)) & 0x0000003f) |
415         (((unsigned int)(n >> 43)) & 0x000000c0);
416}
417
418static __inline unsigned int
419get_Dest_X0(tilegx_bundle_bits num)
420{
421  const unsigned int n = (unsigned int)num;
422  return (((n >> 0)) & 0x3f);
423}
424
425static __inline unsigned int
426get_Dest_X1(tilegx_bundle_bits n)
427{
428  return (((unsigned int)(n >> 31)) & 0x3f);
429}
430
431static __inline unsigned int
432get_Dest_Y0(tilegx_bundle_bits num)
433{
434  const unsigned int n = (unsigned int)num;
435  return (((n >> 0)) & 0x3f);
436}
437
438static __inline unsigned int
439get_Dest_Y1(tilegx_bundle_bits n)
440{
441  return (((unsigned int)(n >> 31)) & 0x3f);
442}
443
444static __inline unsigned int
445get_Imm16_X0(tilegx_bundle_bits num)
446{
447  const unsigned int n = (unsigned int)num;
448  return (((n >> 12)) & 0xffff);
449}
450
451static __inline unsigned int
452get_Imm16_X1(tilegx_bundle_bits n)
453{
454  return (((unsigned int)(n >> 43)) & 0xffff);
455}
456
457static __inline unsigned int
458get_Imm8OpcodeExtension_X0(tilegx_bundle_bits num)
459{
460  const unsigned int n = (unsigned int)num;
461  return (((n >> 20)) & 0xff);
462}
463
464static __inline unsigned int
465get_Imm8OpcodeExtension_X1(tilegx_bundle_bits n)
466{
467  return (((unsigned int)(n >> 51)) & 0xff);
468}
469
470static __inline unsigned int
471get_Imm8_X0(tilegx_bundle_bits num)
472{
473  const unsigned int n = (unsigned int)num;
474  return (((n >> 12)) & 0xff);
475}
476
477static __inline unsigned int
478get_Imm8_X1(tilegx_bundle_bits n)
479{
480  return (((unsigned int)(n >> 43)) & 0xff);
481}
482
483static __inline unsigned int
484get_Imm8_Y0(tilegx_bundle_bits num)
485{
486  const unsigned int n = (unsigned int)num;
487  return (((n >> 12)) & 0xff);
488}
489
490static __inline unsigned int
491get_Imm8_Y1(tilegx_bundle_bits n)
492{
493  return (((unsigned int)(n >> 43)) & 0xff);
494}
495
496static __inline unsigned int
497get_JumpOff_X1(tilegx_bundle_bits n)
498{
499  return (((unsigned int)(n >> 31)) & 0x7ffffff);
500}
501
502static __inline unsigned int
503get_JumpOpcodeExtension_X1(tilegx_bundle_bits n)
504{
505  return (((unsigned int)(n >> 58)) & 0x1);
506}
507
508static __inline unsigned int
509get_MF_Imm14_X1(tilegx_bundle_bits n)
510{
511  return (((unsigned int)(n >> 37)) & 0x3fff);
512}
513
514static __inline unsigned int
515get_MT_Imm14_X1(tilegx_bundle_bits n)
516{
517  return (((unsigned int)(n >> 31)) & 0x0000003f) |
518         (((unsigned int)(n >> 37)) & 0x00003fc0);
519}
520
521static __inline unsigned int
522get_Mode(tilegx_bundle_bits n)
523{
524  return (((unsigned int)(n >> 62)) & 0x3);
525}
526
527static __inline unsigned int
528get_Opcode_X0(tilegx_bundle_bits num)
529{
530  const unsigned int n = (unsigned int)num;
531  return (((n >> 28)) & 0x7);
532}
533
534static __inline unsigned int
535get_Opcode_X1(tilegx_bundle_bits n)
536{
537  return (((unsigned int)(n >> 59)) & 0x7);
538}
539
540static __inline unsigned int
541get_Opcode_Y0(tilegx_bundle_bits num)
542{
543  const unsigned int n = (unsigned int)num;
544  return (((n >> 27)) & 0xf);
545}
546
547static __inline unsigned int
548get_Opcode_Y1(tilegx_bundle_bits n)
549{
550  return (((unsigned int)(n >> 58)) & 0xf);
551}
552
553static __inline unsigned int
554get_Opcode_Y2(tilegx_bundle_bits n)
555{
556  return (((n >> 26)) & 0x00000001) |
557         (((unsigned int)(n >> 56)) & 0x00000002);
558}
559
560static __inline unsigned int
561get_RRROpcodeExtension_X0(tilegx_bundle_bits num)
562{
563  const unsigned int n = (unsigned int)num;
564  return (((n >> 18)) & 0x3ff);
565}
566
567static __inline unsigned int
568get_RRROpcodeExtension_X1(tilegx_bundle_bits n)
569{
570  return (((unsigned int)(n >> 49)) & 0x3ff);
571}
572
573static __inline unsigned int
574get_RRROpcodeExtension_Y0(tilegx_bundle_bits num)
575{
576  const unsigned int n = (unsigned int)num;
577  return (((n >> 18)) & 0x3);
578}
579
580static __inline unsigned int
581get_RRROpcodeExtension_Y1(tilegx_bundle_bits n)
582{
583  return (((unsigned int)(n >> 49)) & 0x3);
584}
585
586static __inline unsigned int
587get_ShAmt_X0(tilegx_bundle_bits num)
588{
589  const unsigned int n = (unsigned int)num;
590  return (((n >> 12)) & 0x3f);
591}
592
593static __inline unsigned int
594get_ShAmt_X1(tilegx_bundle_bits n)
595{
596  return (((unsigned int)(n >> 43)) & 0x3f);
597}
598
599static __inline unsigned int
600get_ShAmt_Y0(tilegx_bundle_bits num)
601{
602  const unsigned int n = (unsigned int)num;
603  return (((n >> 12)) & 0x3f);
604}
605
606static __inline unsigned int
607get_ShAmt_Y1(tilegx_bundle_bits n)
608{
609  return (((unsigned int)(n >> 43)) & 0x3f);
610}
611
612static __inline unsigned int
613get_ShiftOpcodeExtension_X0(tilegx_bundle_bits num)
614{
615  const unsigned int n = (unsigned int)num;
616  return (((n >> 18)) & 0x3ff);
617}
618
619static __inline unsigned int
620get_ShiftOpcodeExtension_X1(tilegx_bundle_bits n)
621{
622  return (((unsigned int)(n >> 49)) & 0x3ff);
623}
624
625static __inline unsigned int
626get_ShiftOpcodeExtension_Y0(tilegx_bundle_bits num)
627{
628  const unsigned int n = (unsigned int)num;
629  return (((n >> 18)) & 0x3);
630}
631
632static __inline unsigned int
633get_ShiftOpcodeExtension_Y1(tilegx_bundle_bits n)
634{
635  return (((unsigned int)(n >> 49)) & 0x3);
636}
637
638static __inline unsigned int
639get_SrcA_X0(tilegx_bundle_bits num)
640{
641  const unsigned int n = (unsigned int)num;
642  return (((n >> 6)) & 0x3f);
643}
644
645static __inline unsigned int
646get_SrcA_X1(tilegx_bundle_bits n)
647{
648  return (((unsigned int)(n >> 37)) & 0x3f);
649}
650
651static __inline unsigned int
652get_SrcA_Y0(tilegx_bundle_bits num)
653{
654  const unsigned int n = (unsigned int)num;
655  return (((n >> 6)) & 0x3f);
656}
657
658static __inline unsigned int
659get_SrcA_Y1(tilegx_bundle_bits n)
660{
661  return (((unsigned int)(n >> 37)) & 0x3f);
662}
663
664static __inline unsigned int
665get_SrcA_Y2(tilegx_bundle_bits num)
666{
667  const unsigned int n = (unsigned int)num;
668  return (((n >> 20)) & 0x3f);
669}
670
671static __inline unsigned int
672get_SrcBDest_Y2(tilegx_bundle_bits n)
673{
674  return (((unsigned int)(n >> 51)) & 0x3f);
675}
676
677static __inline unsigned int
678get_SrcB_X0(tilegx_bundle_bits num)
679{
680  const unsigned int n = (unsigned int)num;
681  return (((n >> 12)) & 0x3f);
682}
683
684static __inline unsigned int
685get_SrcB_X1(tilegx_bundle_bits n)
686{
687  return (((unsigned int)(n >> 43)) & 0x3f);
688}
689
690static __inline unsigned int
691get_SrcB_Y0(tilegx_bundle_bits num)
692{
693  const unsigned int n = (unsigned int)num;
694  return (((n >> 12)) & 0x3f);
695}
696
697static __inline unsigned int
698get_SrcB_Y1(tilegx_bundle_bits n)
699{
700  return (((unsigned int)(n >> 43)) & 0x3f);
701}
702
703static __inline unsigned int
704get_UnaryOpcodeExtension_X0(tilegx_bundle_bits num)
705{
706  const unsigned int n = (unsigned int)num;
707  return (((n >> 12)) & 0x3f);
708}
709
710static __inline unsigned int
711get_UnaryOpcodeExtension_X1(tilegx_bundle_bits n)
712{
713  return (((unsigned int)(n >> 43)) & 0x3f);
714}
715
716static __inline unsigned int
717get_UnaryOpcodeExtension_Y0(tilegx_bundle_bits num)
718{
719  const unsigned int n = (unsigned int)num;
720  return (((n >> 12)) & 0x3f);
721}
722
723static __inline unsigned int
724get_UnaryOpcodeExtension_Y1(tilegx_bundle_bits n)
725{
726  return (((unsigned int)(n >> 43)) & 0x3f);
727}
728
729
730static __inline int
731sign_extend(int n, int num_bits)
732{
733  int shift = (int)(sizeof(int) * 8 - num_bits);
734  return (n << shift) >> shift;
735}
736
737
738
739static __inline tilegx_bundle_bits
740create_BFEnd_X0(int num)
741{
742  const unsigned int n = (unsigned int)num;
743  return ((n & 0x3f) << 12);
744}
745
746static __inline tilegx_bundle_bits
747create_BFOpcodeExtension_X0(int num)
748{
749  const unsigned int n = (unsigned int)num;
750  return ((n & 0xf) << 24);
751}
752
753static __inline tilegx_bundle_bits
754create_BFStart_X0(int num)
755{
756  const unsigned int n = (unsigned int)num;
757  return ((n & 0x3f) << 18);
758}
759
760static __inline tilegx_bundle_bits
761create_BrOff_X1(int num)
762{
763  const unsigned int n = (unsigned int)num;
764  return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) |
765         (((tilegx_bundle_bits)(n & 0x0001ffc0)) << 37);
766}
767
768static __inline tilegx_bundle_bits
769create_BrType_X1(int num)
770{
771  const unsigned int n = (unsigned int)num;
772  return (((tilegx_bundle_bits)(n & 0x1f)) << 54);
773}
774
775static __inline tilegx_bundle_bits
776create_Dest_Imm8_X1(int num)
777{
778  const unsigned int n = (unsigned int)num;
779  return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) |
780         (((tilegx_bundle_bits)(n & 0x000000c0)) << 43);
781}
782
783static __inline tilegx_bundle_bits
784create_Dest_X0(int num)
785{
786  const unsigned int n = (unsigned int)num;
787  return ((n & 0x3f) << 0);
788}
789
790static __inline tilegx_bundle_bits
791create_Dest_X1(int num)
792{
793  const unsigned int n = (unsigned int)num;
794  return (((tilegx_bundle_bits)(n & 0x3f)) << 31);
795}
796
797static __inline tilegx_bundle_bits
798create_Dest_Y0(int num)
799{
800  const unsigned int n = (unsigned int)num;
801  return ((n & 0x3f) << 0);
802}
803
804static __inline tilegx_bundle_bits
805create_Dest_Y1(int num)
806{
807  const unsigned int n = (unsigned int)num;
808  return (((tilegx_bundle_bits)(n & 0x3f)) << 31);
809}
810
811static __inline tilegx_bundle_bits
812create_Imm16_X0(int num)
813{
814  const unsigned int n = (unsigned int)num;
815  return ((n & 0xffff) << 12);
816}
817
818static __inline tilegx_bundle_bits
819create_Imm16_X1(int num)
820{
821  const unsigned int n = (unsigned int)num;
822  return (((tilegx_bundle_bits)(n & 0xffff)) << 43);
823}
824
825static __inline tilegx_bundle_bits
826create_Imm8OpcodeExtension_X0(int num)
827{
828  const unsigned int n = (unsigned int)num;
829  return ((n & 0xff) << 20);
830}
831
832static __inline tilegx_bundle_bits
833create_Imm8OpcodeExtension_X1(int num)
834{
835  const unsigned int n = (unsigned int)num;
836  return (((tilegx_bundle_bits)(n & 0xff)) << 51);
837}
838
839static __inline tilegx_bundle_bits
840create_Imm8_X0(int num)
841{
842  const unsigned int n = (unsigned int)num;
843  return ((n & 0xff) << 12);
844}
845
846static __inline tilegx_bundle_bits
847create_Imm8_X1(int num)
848{
849  const unsigned int n = (unsigned int)num;
850  return (((tilegx_bundle_bits)(n & 0xff)) << 43);
851}
852
853static __inline tilegx_bundle_bits
854create_Imm8_Y0(int num)
855{
856  const unsigned int n = (unsigned int)num;
857  return ((n & 0xff) << 12);
858}
859
860static __inline tilegx_bundle_bits
861create_Imm8_Y1(int num)
862{
863  const unsigned int n = (unsigned int)num;
864  return (((tilegx_bundle_bits)(n & 0xff)) << 43);
865}
866
867static __inline tilegx_bundle_bits
868create_JumpOff_X1(int num)
869{
870  const unsigned int n = (unsigned int)num;
871  return (((tilegx_bundle_bits)(n & 0x7ffffff)) << 31);
872}
873
874static __inline tilegx_bundle_bits
875create_JumpOpcodeExtension_X1(int num)
876{
877  const unsigned int n = (unsigned int)num;
878  return (((tilegx_bundle_bits)(n & 0x1)) << 58);
879}
880
881static __inline tilegx_bundle_bits
882create_MF_Imm14_X1(int num)
883{
884  const unsigned int n = (unsigned int)num;
885  return (((tilegx_bundle_bits)(n & 0x3fff)) << 37);
886}
887
888static __inline tilegx_bundle_bits
889create_MT_Imm14_X1(int num)
890{
891  const unsigned int n = (unsigned int)num;
892  return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) |
893         (((tilegx_bundle_bits)(n & 0x00003fc0)) << 37);
894}
895
896static __inline tilegx_bundle_bits
897create_Mode(int num)
898{
899  const unsigned int n = (unsigned int)num;
900  return (((tilegx_bundle_bits)(n & 0x3)) << 62);
901}
902
903static __inline tilegx_bundle_bits
904create_Opcode_X0(int num)
905{
906  const unsigned int n = (unsigned int)num;
907  return ((n & 0x7) << 28);
908}
909
910static __inline tilegx_bundle_bits
911create_Opcode_X1(int num)
912{
913  const unsigned int n = (unsigned int)num;
914  return (((tilegx_bundle_bits)(n & 0x7)) << 59);
915}
916
917static __inline tilegx_bundle_bits
918create_Opcode_Y0(int num)
919{
920  const unsigned int n = (unsigned int)num;
921  return ((n & 0xf) << 27);
922}
923
924static __inline tilegx_bundle_bits
925create_Opcode_Y1(int num)
926{
927  const unsigned int n = (unsigned int)num;
928  return (((tilegx_bundle_bits)(n & 0xf)) << 58);
929}
930
931static __inline tilegx_bundle_bits
932create_Opcode_Y2(int num)
933{
934  const unsigned int n = (unsigned int)num;
935  return ((n & 0x00000001) << 26) |
936         (((tilegx_bundle_bits)(n & 0x00000002)) << 56);
937}
938
939static __inline tilegx_bundle_bits
940create_RRROpcodeExtension_X0(int num)
941{
942  const unsigned int n = (unsigned int)num;
943  return ((n & 0x3ff) << 18);
944}
945
946static __inline tilegx_bundle_bits
947create_RRROpcodeExtension_X1(int num)
948{
949  const unsigned int n = (unsigned int)num;
950  return (((tilegx_bundle_bits)(n & 0x3ff)) << 49);
951}
952
953static __inline tilegx_bundle_bits
954create_RRROpcodeExtension_Y0(int num)
955{
956  const unsigned int n = (unsigned int)num;
957  return ((n & 0x3) << 18);
958}
959
960static __inline tilegx_bundle_bits
961create_RRROpcodeExtension_Y1(int num)
962{
963  const unsigned int n = (unsigned int)num;
964  return (((tilegx_bundle_bits)(n & 0x3)) << 49);
965}
966
967static __inline tilegx_bundle_bits
968create_ShAmt_X0(int num)
969{
970  const unsigned int n = (unsigned int)num;
971  return ((n & 0x3f) << 12);
972}
973
974static __inline tilegx_bundle_bits
975create_ShAmt_X1(int num)
976{
977  const unsigned int n = (unsigned int)num;
978  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
979}
980
981static __inline tilegx_bundle_bits
982create_ShAmt_Y0(int num)
983{
984  const unsigned int n = (unsigned int)num;
985  return ((n & 0x3f) << 12);
986}
987
988static __inline tilegx_bundle_bits
989create_ShAmt_Y1(int num)
990{
991  const unsigned int n = (unsigned int)num;
992  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
993}
994
995static __inline tilegx_bundle_bits
996create_ShiftOpcodeExtension_X0(int num)
997{
998  const unsigned int n = (unsigned int)num;
999  return ((n & 0x3ff) << 18);
1000}
1001
1002static __inline tilegx_bundle_bits
1003create_ShiftOpcodeExtension_X1(int num)
1004{
1005  const unsigned int n = (unsigned int)num;
1006  return (((tilegx_bundle_bits)(n & 0x3ff)) << 49);
1007}
1008
1009static __inline tilegx_bundle_bits
1010create_ShiftOpcodeExtension_Y0(int num)
1011{
1012  const unsigned int n = (unsigned int)num;
1013  return ((n & 0x3) << 18);
1014}
1015
1016static __inline tilegx_bundle_bits
1017create_ShiftOpcodeExtension_Y1(int num)
1018{
1019  const unsigned int n = (unsigned int)num;
1020  return (((tilegx_bundle_bits)(n & 0x3)) << 49);
1021}
1022
1023static __inline tilegx_bundle_bits
1024create_SrcA_X0(int num)
1025{
1026  const unsigned int n = (unsigned int)num;
1027  return ((n & 0x3f) << 6);
1028}
1029
1030static __inline tilegx_bundle_bits
1031create_SrcA_X1(int num)
1032{
1033  const unsigned int n = (unsigned int)num;
1034  return (((tilegx_bundle_bits)(n & 0x3f)) << 37);
1035}
1036
1037static __inline tilegx_bundle_bits
1038create_SrcA_Y0(int num)
1039{
1040  const unsigned int n = (unsigned int)num;
1041  return ((n & 0x3f) << 6);
1042}
1043
1044static __inline tilegx_bundle_bits
1045create_SrcA_Y1(int num)
1046{
1047  const unsigned int n = (unsigned int)num;
1048  return (((tilegx_bundle_bits)(n & 0x3f)) << 37);
1049}
1050
1051static __inline tilegx_bundle_bits
1052create_SrcA_Y2(int num)
1053{
1054  const unsigned int n = (unsigned int)num;
1055  return ((n & 0x3f) << 20);
1056}
1057
1058static __inline tilegx_bundle_bits
1059create_SrcBDest_Y2(int num)
1060{
1061  const unsigned int n = (unsigned int)num;
1062  return (((tilegx_bundle_bits)(n & 0x3f)) << 51);
1063}
1064
1065static __inline tilegx_bundle_bits
1066create_SrcB_X0(int num)
1067{
1068  const unsigned int n = (unsigned int)num;
1069  return ((n & 0x3f) << 12);
1070}
1071
1072static __inline tilegx_bundle_bits
1073create_SrcB_X1(int num)
1074{
1075  const unsigned int n = (unsigned int)num;
1076  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
1077}
1078
1079static __inline tilegx_bundle_bits
1080create_SrcB_Y0(int num)
1081{
1082  const unsigned int n = (unsigned int)num;
1083  return ((n & 0x3f) << 12);
1084}
1085
1086static __inline tilegx_bundle_bits
1087create_SrcB_Y1(int num)
1088{
1089  const unsigned int n = (unsigned int)num;
1090  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
1091}
1092
1093static __inline tilegx_bundle_bits
1094create_UnaryOpcodeExtension_X0(int num)
1095{
1096  const unsigned int n = (unsigned int)num;
1097  return ((n & 0x3f) << 12);
1098}
1099
1100static __inline tilegx_bundle_bits
1101create_UnaryOpcodeExtension_X1(int num)
1102{
1103  const unsigned int n = (unsigned int)num;
1104  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
1105}
1106
1107static __inline tilegx_bundle_bits
1108create_UnaryOpcodeExtension_Y0(int num)
1109{
1110  const unsigned int n = (unsigned int)num;
1111  return ((n & 0x3f) << 12);
1112}
1113
1114static __inline tilegx_bundle_bits
1115create_UnaryOpcodeExtension_Y1(int num)
1116{
1117  const unsigned int n = (unsigned int)num;
1118  return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
1119}
1120
1121
1122typedef enum
1123{
1124  TILEGX_PIPELINE_X0,
1125  TILEGX_PIPELINE_X1,
1126  TILEGX_PIPELINE_Y0,
1127  TILEGX_PIPELINE_Y1,
1128  TILEGX_PIPELINE_Y2,
1129} tilegx_pipeline;
1130
1131#define tilegx_is_x_pipeline(p) ((int)(p) <= (int)TILEGX_PIPELINE_X1)
1132
1133typedef enum
1134{
1135  TILEGX_OP_TYPE_REGISTER,
1136  TILEGX_OP_TYPE_IMMEDIATE,
1137  TILEGX_OP_TYPE_ADDRESS,
1138  TILEGX_OP_TYPE_SPR
1139} tilegx_operand_type;
1140
1141/* These are the bits that determine if a bundle is in the X encoding. */
1142#define TILEGX_BUNDLE_MODE_MASK ((tilegx_bundle_bits)3 << 62)
1143
1144enum
1145{
1146  /* Maximum number of instructions in a bundle (2 for X, 3 for Y). */
1147  TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE = 3,
1148
1149  /* How many different pipeline encodings are there? X0, X1, Y0, Y1, Y2. */
1150  TILEGX_NUM_PIPELINE_ENCODINGS = 5,
1151
1152  /* Log base 2 of TILEGX_BUNDLE_SIZE_IN_BYTES. */
1153  TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES = 3,
1154
1155  /* Instructions take this many bytes. */
1156  TILEGX_BUNDLE_SIZE_IN_BYTES = 1 << TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES,
1157
1158  /* Log base 2 of TILEGX_BUNDLE_ALIGNMENT_IN_BYTES. */
1159  TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES = 3,
1160
1161  /* Bundles should be aligned modulo this number of bytes. */
1162  TILEGX_BUNDLE_ALIGNMENT_IN_BYTES =
1163    (1 << TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES),
1164
1165  /* Number of registers (some are magic, such as network I/O). */
1166  TILEGX_NUM_REGISTERS = 64,
1167};
1168
1169
1170struct tilegx_operand
1171{
1172  /* Is this operand a register, immediate or address? */
1173  tilegx_operand_type type;
1174
1175  /* The default relocation type for this operand.  */
1176  signed int default_reloc : 16;
1177
1178  /* How many bits is this value? (used for range checking) */
1179  unsigned int num_bits : 5;
1180
1181  /* Is the value signed? (used for range checking) */
1182  unsigned int is_signed : 1;
1183
1184  /* Is this operand a source register? */
1185  unsigned int is_src_reg : 1;
1186
1187  /* Is this operand written? (i.e. is it a destination register) */
1188  unsigned int is_dest_reg : 1;
1189
1190  /* Is this operand PC-relative? */
1191  unsigned int is_pc_relative : 1;
1192
1193  /* By how many bits do we right shift the value before inserting? */
1194  unsigned int rightshift : 2;
1195
1196  /* Return the bits for this operand to be ORed into an existing bundle. */
1197  tilegx_bundle_bits (*insert) (int op);
1198
1199  /* Extract this operand and return it. */
1200  unsigned int (*extract) (tilegx_bundle_bits bundle);
1201};
1202
1203
1204extern const struct tilegx_operand tilegx_operands[];
1205
1206/* One finite-state machine per pipe for rapid instruction decoding. */
1207extern const unsigned short * const
1208tilegx_bundle_decoder_fsms[TILEGX_NUM_PIPELINE_ENCODINGS];
1209
1210
1211struct tilegx_opcode
1212{
1213  /* The opcode mnemonic, e.g. "add" */
1214  const char *name;
1215
1216  /* The enum value for this mnemonic. */
1217  tilegx_mnemonic mnemonic;
1218
1219  /* A bit mask of which of the five pipes this instruction
1220     is compatible with:
1221     X0  0x01
1222     X1  0x02
1223     Y0  0x04
1224     Y1  0x08
1225     Y2  0x10 */
1226  unsigned char pipes;
1227
1228  /* How many operands are there? */
1229  unsigned char num_operands;
1230
1231  /* Which register does this write implicitly, or TREG_ZERO if none? */
1232  unsigned char implicitly_written_register;
1233
1234  /* Can this be bundled with other instructions (almost always true). */
1235  unsigned char can_bundle;
1236
1237  /* The description of the operands. Each of these is an
1238   * index into the tilegx_operands[] table. */
1239  unsigned char operands[TILEGX_NUM_PIPELINE_ENCODINGS][TILEGX_MAX_OPERANDS];
1240
1241#if !defined(__KERNEL__) && !defined(_LIBC)
1242  /* A mask of which bits have predefined values for each pipeline.
1243   * This is useful for disassembly. */
1244  tilegx_bundle_bits fixed_bit_masks[TILEGX_NUM_PIPELINE_ENCODINGS];
1245
1246  /* For each bit set in fixed_bit_masks, what the value is for this
1247   * instruction. */
1248  tilegx_bundle_bits fixed_bit_values[TILEGX_NUM_PIPELINE_ENCODINGS];
1249#endif
1250};
1251
1252extern const struct tilegx_opcode tilegx_opcodes[];
1253
1254/* Used for non-textual disassembly into structs. */
1255struct tilegx_decoded_instruction
1256{
1257  const struct tilegx_opcode *opcode;
1258  const struct tilegx_operand *operands[TILEGX_MAX_OPERANDS];
1259  long long operand_values[TILEGX_MAX_OPERANDS];
1260};
1261
1262
1263/* Disassemble a bundle into a struct for machine processing. */
1264extern int parse_insn_tilegx(tilegx_bundle_bits bits,
1265                             unsigned long long pc,
1266                             struct tilegx_decoded_instruction
1267                             decoded[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE]);
1268
1269
1270#if !defined(__KERNEL__) && !defined(_LIBC)
1271/* Canonical names of all the registers. */
1272/* ISSUE: This table lives in "tile-dis.c" */
1273extern const char * const tilegx_register_names[];
1274
1275/* Descriptor for a special-purpose register. */
1276struct tilegx_spr
1277{
1278  /* The number */
1279  int number;
1280
1281  /* The name */
1282  const char *name;
1283};
1284
1285/* List of all the SPRs; ordered by increasing number. */
1286extern const struct tilegx_spr tilegx_sprs[];
1287
1288/* Number of special-purpose registers. */
1289extern const int tilegx_num_sprs;
1290
1291extern const char *
1292get_tilegx_spr_name (int num);
1293#endif /* !__KERNEL__ && !_LIBC */
1294
1295/* Make a few "tile_" variables to simply common code between
1296   architectures.  */
1297
1298typedef tilegx_bundle_bits tile_bundle_bits;
1299#define TILE_BUNDLE_SIZE_IN_BYTES TILEGX_BUNDLE_SIZE_IN_BYTES
1300#define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEGX_BUNDLE_ALIGNMENT_IN_BYTES
1301#define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \
1302  TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES
1303
1304#endif /* opcode_tilegx_h */
Note: See TracBrowser for help on using the repository browser.