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