Home | History | Annotate | Download | only in opcode
      1 /* TILE-Gx opcode information.
      2  *
      3  *    Copyright (C) 2011-2014 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 typedef unsigned long long tilegx_bundle_bits;
     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_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 
    377 static __inline unsigned int
    378 get_BFEnd_X0(tilegx_bundle_bits num)
    379 {
    380   const unsigned int n = (unsigned int)num;
    381   return (((n >> 12)) & 0x3f);
    382 }
    383 
    384 static __inline unsigned int
    385 get_BFOpcodeExtension_X0(tilegx_bundle_bits num)
    386 {
    387   const unsigned int n = (unsigned int)num;
    388   return (((n >> 24)) & 0xf);
    389 }
    390 
    391 static __inline unsigned int
    392 get_BFStart_X0(tilegx_bundle_bits num)
    393 {
    394   const unsigned int n = (unsigned int)num;
    395   return (((n >> 18)) & 0x3f);
    396 }
    397 
    398 static __inline unsigned int
    399 get_BrOff_X1(tilegx_bundle_bits n)
    400 {
    401   return (((unsigned int)(n >> 31)) & 0x0000003f) |
    402          (((unsigned int)(n >> 37)) & 0x0001ffc0);
    403 }
    404 
    405 static __inline unsigned int
    406 get_BrType_X1(tilegx_bundle_bits n)
    407 {
    408   return (((unsigned int)(n >> 54)) & 0x1f);
    409 }
    410 
    411 static __inline unsigned int
    412 get_Dest_Imm8_X1(tilegx_bundle_bits n)
    413 {
    414   return (((unsigned int)(n >> 31)) & 0x0000003f) |
    415          (((unsigned int)(n >> 43)) & 0x000000c0);
    416 }
    417 
    418 static __inline unsigned int
    419 get_Dest_X0(tilegx_bundle_bits num)
    420 {
    421   const unsigned int n = (unsigned int)num;
    422   return (((n >> 0)) & 0x3f);
    423 }
    424 
    425 static __inline unsigned int
    426 get_Dest_X1(tilegx_bundle_bits n)
    427 {
    428   return (((unsigned int)(n >> 31)) & 0x3f);
    429 }
    430 
    431 static __inline unsigned int
    432 get_Dest_Y0(tilegx_bundle_bits num)
    433 {
    434   const unsigned int n = (unsigned int)num;
    435   return (((n >> 0)) & 0x3f);
    436 }
    437 
    438 static __inline unsigned int
    439 get_Dest_Y1(tilegx_bundle_bits n)
    440 {
    441   return (((unsigned int)(n >> 31)) & 0x3f);
    442 }
    443 
    444 static __inline unsigned int
    445 get_Imm16_X0(tilegx_bundle_bits num)
    446 {
    447   const unsigned int n = (unsigned int)num;
    448   return (((n >> 12)) & 0xffff);
    449 }
    450 
    451 static __inline unsigned int
    452 get_Imm16_X1(tilegx_bundle_bits n)
    453 {
    454   return (((unsigned int)(n >> 43)) & 0xffff);
    455 }
    456 
    457 static __inline unsigned int
    458 get_Imm8OpcodeExtension_X0(tilegx_bundle_bits num)
    459 {
    460   const unsigned int n = (unsigned int)num;
    461   return (((n >> 20)) & 0xff);
    462 }
    463 
    464 static __inline unsigned int
    465 get_Imm8OpcodeExtension_X1(tilegx_bundle_bits n)
    466 {
    467   return (((unsigned int)(n >> 51)) & 0xff);
    468 }
    469 
    470 static __inline unsigned int
    471 get_Imm8_X0(tilegx_bundle_bits num)
    472 {
    473   const unsigned int n = (unsigned int)num;
    474   return (((n >> 12)) & 0xff);
    475 }
    476 
    477 static __inline unsigned int
    478 get_Imm8_X1(tilegx_bundle_bits n)
    479 {
    480   return (((unsigned int)(n >> 43)) & 0xff);
    481 }
    482 
    483 static __inline unsigned int
    484 get_Imm8_Y0(tilegx_bundle_bits num)
    485 {
    486   const unsigned int n = (unsigned int)num;
    487   return (((n >> 12)) & 0xff);
    488 }
    489 
    490 static __inline unsigned int
    491 get_Imm8_Y1(tilegx_bundle_bits n)
    492 {
    493   return (((unsigned int)(n >> 43)) & 0xff);
    494 }
    495 
    496 static __inline unsigned int
    497 get_JumpOff_X1(tilegx_bundle_bits n)
    498 {
    499   return (((unsigned int)(n >> 31)) & 0x7ffffff);
    500 }
    501 
    502 static __inline unsigned int
    503 get_JumpOpcodeExtension_X1(tilegx_bundle_bits n)
    504 {
    505   return (((unsigned int)(n >> 58)) & 0x1);
    506 }
    507 
    508 static __inline unsigned int
    509 get_MF_Imm14_X1(tilegx_bundle_bits n)
    510 {
    511   return (((unsigned int)(n >> 37)) & 0x3fff);
    512 }
    513 
    514 static __inline unsigned int
    515 get_MT_Imm14_X1(tilegx_bundle_bits n)
    516 {
    517   return (((unsigned int)(n >> 31)) & 0x0000003f) |
    518          (((unsigned int)(n >> 37)) & 0x00003fc0);
    519 }
    520 
    521 static __inline unsigned int
    522 get_Mode(tilegx_bundle_bits n)
    523 {
    524   return (((unsigned int)(n >> 62)) & 0x3);
    525 }
    526 
    527 static __inline unsigned int
    528 get_Opcode_X0(tilegx_bundle_bits num)
    529 {
    530   const unsigned int n = (unsigned int)num;
    531   return (((n >> 28)) & 0x7);
    532 }
    533 
    534 static __inline unsigned int
    535 get_Opcode_X1(tilegx_bundle_bits n)
    536 {
    537   return (((unsigned int)(n >> 59)) & 0x7);
    538 }
    539 
    540 static __inline unsigned int
    541 get_Opcode_Y0(tilegx_bundle_bits num)
    542 {
    543   const unsigned int n = (unsigned int)num;
    544   return (((n >> 27)) & 0xf);
    545 }
    546 
    547 static __inline unsigned int
    548 get_Opcode_Y1(tilegx_bundle_bits n)
    549 {
    550   return (((unsigned int)(n >> 58)) & 0xf);
    551 }
    552 
    553 static __inline unsigned int
    554 get_Opcode_Y2(tilegx_bundle_bits n)
    555 {
    556   return (((n >> 26)) & 0x00000001) |
    557          (((unsigned int)(n >> 56)) & 0x00000002);
    558 }
    559 
    560 static __inline unsigned int
    561 get_RRROpcodeExtension_X0(tilegx_bundle_bits num)
    562 {
    563   const unsigned int n = (unsigned int)num;
    564   return (((n >> 18)) & 0x3ff);
    565 }
    566 
    567 static __inline unsigned int
    568 get_RRROpcodeExtension_X1(tilegx_bundle_bits n)
    569 {
    570   return (((unsigned int)(n >> 49)) & 0x3ff);
    571 }
    572 
    573 static __inline unsigned int
    574 get_RRROpcodeExtension_Y0(tilegx_bundle_bits num)
    575 {
    576   const unsigned int n = (unsigned int)num;
    577   return (((n >> 18)) & 0x3);
    578 }
    579 
    580 static __inline unsigned int
    581 get_RRROpcodeExtension_Y1(tilegx_bundle_bits n)
    582 {
    583   return (((unsigned int)(n >> 49)) & 0x3);
    584 }
    585 
    586 static __inline unsigned int
    587 get_ShAmt_X0(tilegx_bundle_bits num)
    588 {
    589   const unsigned int n = (unsigned int)num;
    590   return (((n >> 12)) & 0x3f);
    591 }
    592 
    593 static __inline unsigned int
    594 get_ShAmt_X1(tilegx_bundle_bits n)
    595 {
    596   return (((unsigned int)(n >> 43)) & 0x3f);
    597 }
    598 
    599 static __inline unsigned int
    600 get_ShAmt_Y0(tilegx_bundle_bits num)
    601 {
    602   const unsigned int n = (unsigned int)num;
    603   return (((n >> 12)) & 0x3f);
    604 }
    605 
    606 static __inline unsigned int
    607 get_ShAmt_Y1(tilegx_bundle_bits n)
    608 {
    609   return (((unsigned int)(n >> 43)) & 0x3f);
    610 }
    611 
    612 static __inline unsigned int
    613 get_ShiftOpcodeExtension_X0(tilegx_bundle_bits num)
    614 {
    615   const unsigned int n = (unsigned int)num;
    616   return (((n >> 18)) & 0x3ff);
    617 }
    618 
    619 static __inline unsigned int
    620 get_ShiftOpcodeExtension_X1(tilegx_bundle_bits n)
    621 {
    622   return (((unsigned int)(n >> 49)) & 0x3ff);
    623 }
    624 
    625 static __inline unsigned int
    626 get_ShiftOpcodeExtension_Y0(tilegx_bundle_bits num)
    627 {
    628   const unsigned int n = (unsigned int)num;
    629   return (((n >> 18)) & 0x3);
    630 }
    631 
    632 static __inline unsigned int
    633 get_ShiftOpcodeExtension_Y1(tilegx_bundle_bits n)
    634 {
    635   return (((unsigned int)(n >> 49)) & 0x3);
    636 }
    637 
    638 static __inline unsigned int
    639 get_SrcA_X0(tilegx_bundle_bits num)
    640 {
    641   const unsigned int n = (unsigned int)num;
    642   return (((n >> 6)) & 0x3f);
    643 }
    644 
    645 static __inline unsigned int
    646 get_SrcA_X1(tilegx_bundle_bits n)
    647 {
    648   return (((unsigned int)(n >> 37)) & 0x3f);
    649 }
    650 
    651 static __inline unsigned int
    652 get_SrcA_Y0(tilegx_bundle_bits num)
    653 {
    654   const unsigned int n = (unsigned int)num;
    655   return (((n >> 6)) & 0x3f);
    656 }
    657 
    658 static __inline unsigned int
    659 get_SrcA_Y1(tilegx_bundle_bits n)
    660 {
    661   return (((unsigned int)(n >> 37)) & 0x3f);
    662 }
    663 
    664 static __inline unsigned int
    665 get_SrcA_Y2(tilegx_bundle_bits num)
    666 {
    667   const unsigned int n = (unsigned int)num;
    668   return (((n >> 20)) & 0x3f);
    669 }
    670 
    671 static __inline unsigned int
    672 get_SrcBDest_Y2(tilegx_bundle_bits n)
    673 {
    674   return (((unsigned int)(n >> 51)) & 0x3f);
    675 }
    676 
    677 static __inline unsigned int
    678 get_SrcB_X0(tilegx_bundle_bits num)
    679 {
    680   const unsigned int n = (unsigned int)num;
    681   return (((n >> 12)) & 0x3f);
    682 }
    683 
    684 static __inline unsigned int
    685 get_SrcB_X1(tilegx_bundle_bits n)
    686 {
    687   return (((unsigned int)(n >> 43)) & 0x3f);
    688 }
    689 
    690 static __inline unsigned int
    691 get_SrcB_Y0(tilegx_bundle_bits num)
    692 {
    693   const unsigned int n = (unsigned int)num;
    694   return (((n >> 12)) & 0x3f);
    695 }
    696 
    697 static __inline unsigned int
    698 get_SrcB_Y1(tilegx_bundle_bits n)
    699 {
    700   return (((unsigned int)(n >> 43)) & 0x3f);
    701 }
    702 
    703 static __inline unsigned int
    704 get_UnaryOpcodeExtension_X0(tilegx_bundle_bits num)
    705 {
    706   const unsigned int n = (unsigned int)num;
    707   return (((n >> 12)) & 0x3f);
    708 }
    709 
    710 static __inline unsigned int
    711 get_UnaryOpcodeExtension_X1(tilegx_bundle_bits n)
    712 {
    713   return (((unsigned int)(n >> 43)) & 0x3f);
    714 }
    715 
    716 static __inline unsigned int
    717 get_UnaryOpcodeExtension_Y0(tilegx_bundle_bits num)
    718 {
    719   const unsigned int n = (unsigned int)num;
    720   return (((n >> 12)) & 0x3f);
    721 }
    722 
    723 static __inline unsigned int
    724 get_UnaryOpcodeExtension_Y1(tilegx_bundle_bits n)
    725 {
    726   return (((unsigned int)(n >> 43)) & 0x3f);
    727 }
    728 
    729 
    730 static __inline int
    731 sign_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 
    739 static __inline tilegx_bundle_bits
    740 create_BFEnd_X0(int num)
    741 {
    742   const unsigned int n = (unsigned int)num;
    743   return ((n & 0x3f) << 12);
    744 }
    745 
    746 static __inline tilegx_bundle_bits
    747 create_BFOpcodeExtension_X0(int num)
    748 {
    749   const unsigned int n = (unsigned int)num;
    750   return ((n & 0xf) << 24);
    751 }
    752 
    753 static __inline tilegx_bundle_bits
    754 create_BFStart_X0(int num)
    755 {
    756   const unsigned int n = (unsigned int)num;
    757   return ((n & 0x3f) << 18);
    758 }
    759 
    760 static __inline tilegx_bundle_bits
    761 create_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 
    768 static __inline tilegx_bundle_bits
    769 create_BrType_X1(int num)
    770 {
    771   const unsigned int n = (unsigned int)num;
    772   return (((tilegx_bundle_bits)(n & 0x1f)) << 54);
    773 }
    774 
    775 static __inline tilegx_bundle_bits
    776 create_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 
    783 static __inline tilegx_bundle_bits
    784 create_Dest_X0(int num)
    785 {
    786   const unsigned int n = (unsigned int)num;
    787   return ((n & 0x3f) << 0);
    788 }
    789 
    790 static __inline tilegx_bundle_bits
    791 create_Dest_X1(int num)
    792 {
    793   const unsigned int n = (unsigned int)num;
    794   return (((tilegx_bundle_bits)(n & 0x3f)) << 31);
    795 }
    796 
    797 static __inline tilegx_bundle_bits
    798 create_Dest_Y0(int num)
    799 {
    800   const unsigned int n = (unsigned int)num;
    801   return ((n & 0x3f) << 0);
    802 }
    803 
    804 static __inline tilegx_bundle_bits
    805 create_Dest_Y1(int num)
    806 {
    807   const unsigned int n = (unsigned int)num;
    808   return (((tilegx_bundle_bits)(n & 0x3f)) << 31);
    809 }
    810 
    811 static __inline tilegx_bundle_bits
    812 create_Imm16_X0(int num)
    813 {
    814   const unsigned int n = (unsigned int)num;
    815   return ((n & 0xffff) << 12);
    816 }
    817 
    818 static __inline tilegx_bundle_bits
    819 create_Imm16_X1(int num)
    820 {
    821   const unsigned int n = (unsigned int)num;
    822   return (((tilegx_bundle_bits)(n & 0xffff)) << 43);
    823 }
    824 
    825 static __inline tilegx_bundle_bits
    826 create_Imm8OpcodeExtension_X0(int num)
    827 {
    828   const unsigned int n = (unsigned int)num;
    829   return ((n & 0xff) << 20);
    830 }
    831 
    832 static __inline tilegx_bundle_bits
    833 create_Imm8OpcodeExtension_X1(int num)
    834 {
    835   const unsigned int n = (unsigned int)num;
    836   return (((tilegx_bundle_bits)(n & 0xff)) << 51);
    837 }
    838 
    839 static __inline tilegx_bundle_bits
    840 create_Imm8_X0(int num)
    841 {
    842   const unsigned int n = (unsigned int)num;
    843   return ((n & 0xff) << 12);
    844 }
    845 
    846 static __inline tilegx_bundle_bits
    847 create_Imm8_X1(int num)
    848 {
    849   const unsigned int n = (unsigned int)num;
    850   return (((tilegx_bundle_bits)(n & 0xff)) << 43);
    851 }
    852 
    853 static __inline tilegx_bundle_bits
    854 create_Imm8_Y0(int num)
    855 {
    856   const unsigned int n = (unsigned int)num;
    857   return ((n & 0xff) << 12);
    858 }
    859 
    860 static __inline tilegx_bundle_bits
    861 create_Imm8_Y1(int num)
    862 {
    863   const unsigned int n = (unsigned int)num;
    864   return (((tilegx_bundle_bits)(n & 0xff)) << 43);
    865 }
    866 
    867 static __inline tilegx_bundle_bits
    868 create_JumpOff_X1(int num)
    869 {
    870   const unsigned int n = (unsigned int)num;
    871   return (((tilegx_bundle_bits)(n & 0x7ffffff)) << 31);
    872 }
    873 
    874 static __inline tilegx_bundle_bits
    875 create_JumpOpcodeExtension_X1(int num)
    876 {
    877   const unsigned int n = (unsigned int)num;
    878   return (((tilegx_bundle_bits)(n & 0x1)) << 58);
    879 }
    880 
    881 static __inline tilegx_bundle_bits
    882 create_MF_Imm14_X1(int num)
    883 {
    884   const unsigned int n = (unsigned int)num;
    885   return (((tilegx_bundle_bits)(n & 0x3fff)) << 37);
    886 }
    887 
    888 static __inline tilegx_bundle_bits
    889 create_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 
    896 static __inline tilegx_bundle_bits
    897 create_Mode(int num)
    898 {
    899   const unsigned int n = (unsigned int)num;
    900   return (((tilegx_bundle_bits)(n & 0x3)) << 62);
    901 }
    902 
    903 static __inline tilegx_bundle_bits
    904 create_Opcode_X0(int num)
    905 {
    906   const unsigned int n = (unsigned int)num;
    907   return ((n & 0x7) << 28);
    908 }
    909 
    910 static __inline tilegx_bundle_bits
    911 create_Opcode_X1(int num)
    912 {
    913   const unsigned int n = (unsigned int)num;
    914   return (((tilegx_bundle_bits)(n & 0x7)) << 59);
    915 }
    916 
    917 static __inline tilegx_bundle_bits
    918 create_Opcode_Y0(int num)
    919 {
    920   const unsigned int n = (unsigned int)num;
    921   return ((n & 0xf) << 27);
    922 }
    923 
    924 static __inline tilegx_bundle_bits
    925 create_Opcode_Y1(int num)
    926 {
    927   const unsigned int n = (unsigned int)num;
    928   return (((tilegx_bundle_bits)(n & 0xf)) << 58);
    929 }
    930 
    931 static __inline tilegx_bundle_bits
    932 create_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 
    939 static __inline tilegx_bundle_bits
    940 create_RRROpcodeExtension_X0(int num)
    941 {
    942   const unsigned int n = (unsigned int)num;
    943   return ((n & 0x3ff) << 18);
    944 }
    945 
    946 static __inline tilegx_bundle_bits
    947 create_RRROpcodeExtension_X1(int num)
    948 {
    949   const unsigned int n = (unsigned int)num;
    950   return (((tilegx_bundle_bits)(n & 0x3ff)) << 49);
    951 }
    952 
    953 static __inline tilegx_bundle_bits
    954 create_RRROpcodeExtension_Y0(int num)
    955 {
    956   const unsigned int n = (unsigned int)num;
    957   return ((n & 0x3) << 18);
    958 }
    959 
    960 static __inline tilegx_bundle_bits
    961 create_RRROpcodeExtension_Y1(int num)
    962 {
    963   const unsigned int n = (unsigned int)num;
    964   return (((tilegx_bundle_bits)(n & 0x3)) << 49);
    965 }
    966 
    967 static __inline tilegx_bundle_bits
    968 create_ShAmt_X0(int num)
    969 {
    970   const unsigned int n = (unsigned int)num;
    971   return ((n & 0x3f) << 12);
    972 }
    973 
    974 static __inline tilegx_bundle_bits
    975 create_ShAmt_X1(int num)
    976 {
    977   const unsigned int n = (unsigned int)num;
    978   return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
    979 }
    980 
    981 static __inline tilegx_bundle_bits
    982 create_ShAmt_Y0(int num)
    983 {
    984   const unsigned int n = (unsigned int)num;
    985   return ((n & 0x3f) << 12);
    986 }
    987 
    988 static __inline tilegx_bundle_bits
    989 create_ShAmt_Y1(int num)
    990 {
    991   const unsigned int n = (unsigned int)num;
    992   return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
    993 }
    994 
    995 static __inline tilegx_bundle_bits
    996 create_ShiftOpcodeExtension_X0(int num)
    997 {
    998   const unsigned int n = (unsigned int)num;
    999   return ((n & 0x3ff) << 18);
   1000 }
   1001 
   1002 static __inline tilegx_bundle_bits
   1003 create_ShiftOpcodeExtension_X1(int num)
   1004 {
   1005   const unsigned int n = (unsigned int)num;
   1006   return (((tilegx_bundle_bits)(n & 0x3ff)) << 49);
   1007 }
   1008 
   1009 static __inline tilegx_bundle_bits
   1010 create_ShiftOpcodeExtension_Y0(int num)
   1011 {
   1012   const unsigned int n = (unsigned int)num;
   1013   return ((n & 0x3) << 18);
   1014 }
   1015 
   1016 static __inline tilegx_bundle_bits
   1017 create_ShiftOpcodeExtension_Y1(int num)
   1018 {
   1019   const unsigned int n = (unsigned int)num;
   1020   return (((tilegx_bundle_bits)(n & 0x3)) << 49);
   1021 }
   1022 
   1023 static __inline tilegx_bundle_bits
   1024 create_SrcA_X0(int num)
   1025 {
   1026   const unsigned int n = (unsigned int)num;
   1027   return ((n & 0x3f) << 6);
   1028 }
   1029 
   1030 static __inline tilegx_bundle_bits
   1031 create_SrcA_X1(int num)
   1032 {
   1033   const unsigned int n = (unsigned int)num;
   1034   return (((tilegx_bundle_bits)(n & 0x3f)) << 37);
   1035 }
   1036 
   1037 static __inline tilegx_bundle_bits
   1038 create_SrcA_Y0(int num)
   1039 {
   1040   const unsigned int n = (unsigned int)num;
   1041   return ((n & 0x3f) << 6);
   1042 }
   1043 
   1044 static __inline tilegx_bundle_bits
   1045 create_SrcA_Y1(int num)
   1046 {
   1047   const unsigned int n = (unsigned int)num;
   1048   return (((tilegx_bundle_bits)(n & 0x3f)) << 37);
   1049 }
   1050 
   1051 static __inline tilegx_bundle_bits
   1052 create_SrcA_Y2(int num)
   1053 {
   1054   const unsigned int n = (unsigned int)num;
   1055   return ((n & 0x3f) << 20);
   1056 }
   1057 
   1058 static __inline tilegx_bundle_bits
   1059 create_SrcBDest_Y2(int num)
   1060 {
   1061   const unsigned int n = (unsigned int)num;
   1062   return (((tilegx_bundle_bits)(n & 0x3f)) << 51);
   1063 }
   1064 
   1065 static __inline tilegx_bundle_bits
   1066 create_SrcB_X0(int num)
   1067 {
   1068   const unsigned int n = (unsigned int)num;
   1069   return ((n & 0x3f) << 12);
   1070 }
   1071 
   1072 static __inline tilegx_bundle_bits
   1073 create_SrcB_X1(int num)
   1074 {
   1075   const unsigned int n = (unsigned int)num;
   1076   return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
   1077 }
   1078 
   1079 static __inline tilegx_bundle_bits
   1080 create_SrcB_Y0(int num)
   1081 {
   1082   const unsigned int n = (unsigned int)num;
   1083   return ((n & 0x3f) << 12);
   1084 }
   1085 
   1086 static __inline tilegx_bundle_bits
   1087 create_SrcB_Y1(int num)
   1088 {
   1089   const unsigned int n = (unsigned int)num;
   1090   return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
   1091 }
   1092 
   1093 static __inline tilegx_bundle_bits
   1094 create_UnaryOpcodeExtension_X0(int num)
   1095 {
   1096   const unsigned int n = (unsigned int)num;
   1097   return ((n & 0x3f) << 12);
   1098 }
   1099 
   1100 static __inline tilegx_bundle_bits
   1101 create_UnaryOpcodeExtension_X1(int num)
   1102 {
   1103   const unsigned int n = (unsigned int)num;
   1104   return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
   1105 }
   1106 
   1107 static __inline tilegx_bundle_bits
   1108 create_UnaryOpcodeExtension_Y0(int num)
   1109 {
   1110   const unsigned int n = (unsigned int)num;
   1111   return ((n & 0x3f) << 12);
   1112 }
   1113 
   1114 static __inline tilegx_bundle_bits
   1115 create_UnaryOpcodeExtension_Y1(int num)
   1116 {
   1117   const unsigned int n = (unsigned int)num;
   1118   return (((tilegx_bundle_bits)(n & 0x3f)) << 43);
   1119 }
   1120 
   1121 
   1122 typedef 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 
   1133 typedef 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 
   1144 enum
   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 
   1170 struct 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 
   1204 extern const struct tilegx_operand tilegx_operands[];
   1205 
   1206 /* One finite-state machine per pipe for rapid instruction decoding. */
   1207 extern const unsigned short * const
   1208 tilegx_bundle_decoder_fsms[TILEGX_NUM_PIPELINE_ENCODINGS];
   1209 
   1210 
   1211 struct 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 
   1252 extern const struct tilegx_opcode tilegx_opcodes[];
   1253 
   1254 /* Used for non-textual disassembly into structs. */
   1255 struct 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. */
   1264 extern 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" */
   1273 extern const char * const tilegx_register_names[];
   1274 
   1275 /* Descriptor for a special-purpose register. */
   1276 struct 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. */
   1286 extern const struct tilegx_spr tilegx_sprs[];
   1287 
   1288 /* Number of special-purpose registers. */
   1289 extern const int tilegx_num_sprs;
   1290 
   1291 extern const char *
   1292 get_tilegx_spr_name (int num);
   1293 #endif /* !__KERNEL__ && !_LIBC */
   1294 
   1295 /* Make a few "tile_" variables to simply common code between
   1296    architectures.  */
   1297 
   1298 typedef 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 */
   1305