863fbac671
The C file (tile-desc_{32,64}.c) was about 300KB before this change, and is now shrunk down to 100K. The original file included support for BFD in the binutils toolchain, which is not necessary in the kernel; the kernel version only needs to include enough support to enable the single-stepper and backtracer. Signed-off-by: Chris Metcalf <cmetcalf@tilera.com> Acked-by: Arnd Bergmann <arnd@arndb.de>
1507 lines
32 KiB
C
1507 lines
32 KiB
C
/* tile.h -- Header file for TILE opcode table
|
|
Copyright (C) 2005 Free Software Foundation, Inc.
|
|
Contributed by Tilera Corp. */
|
|
|
|
#ifndef opcode_tile_h
|
|
#define opcode_tile_h
|
|
|
|
typedef unsigned long long tile_bundle_bits;
|
|
|
|
|
|
enum
|
|
{
|
|
TILE_MAX_OPERANDS = 5 /* mm */
|
|
};
|
|
|
|
typedef enum
|
|
{
|
|
TILE_OPC_BPT,
|
|
TILE_OPC_INFO,
|
|
TILE_OPC_INFOL,
|
|
TILE_OPC_J,
|
|
TILE_OPC_JAL,
|
|
TILE_OPC_MOVE,
|
|
TILE_OPC_MOVE_SN,
|
|
TILE_OPC_MOVEI,
|
|
TILE_OPC_MOVEI_SN,
|
|
TILE_OPC_MOVELI,
|
|
TILE_OPC_MOVELI_SN,
|
|
TILE_OPC_MOVELIS,
|
|
TILE_OPC_PREFETCH,
|
|
TILE_OPC_RAISE,
|
|
TILE_OPC_ADD,
|
|
TILE_OPC_ADD_SN,
|
|
TILE_OPC_ADDB,
|
|
TILE_OPC_ADDB_SN,
|
|
TILE_OPC_ADDBS_U,
|
|
TILE_OPC_ADDBS_U_SN,
|
|
TILE_OPC_ADDH,
|
|
TILE_OPC_ADDH_SN,
|
|
TILE_OPC_ADDHS,
|
|
TILE_OPC_ADDHS_SN,
|
|
TILE_OPC_ADDI,
|
|
TILE_OPC_ADDI_SN,
|
|
TILE_OPC_ADDIB,
|
|
TILE_OPC_ADDIB_SN,
|
|
TILE_OPC_ADDIH,
|
|
TILE_OPC_ADDIH_SN,
|
|
TILE_OPC_ADDLI,
|
|
TILE_OPC_ADDLI_SN,
|
|
TILE_OPC_ADDLIS,
|
|
TILE_OPC_ADDS,
|
|
TILE_OPC_ADDS_SN,
|
|
TILE_OPC_ADIFFB_U,
|
|
TILE_OPC_ADIFFB_U_SN,
|
|
TILE_OPC_ADIFFH,
|
|
TILE_OPC_ADIFFH_SN,
|
|
TILE_OPC_AND,
|
|
TILE_OPC_AND_SN,
|
|
TILE_OPC_ANDI,
|
|
TILE_OPC_ANDI_SN,
|
|
TILE_OPC_AULI,
|
|
TILE_OPC_AVGB_U,
|
|
TILE_OPC_AVGB_U_SN,
|
|
TILE_OPC_AVGH,
|
|
TILE_OPC_AVGH_SN,
|
|
TILE_OPC_BBNS,
|
|
TILE_OPC_BBNS_SN,
|
|
TILE_OPC_BBNST,
|
|
TILE_OPC_BBNST_SN,
|
|
TILE_OPC_BBS,
|
|
TILE_OPC_BBS_SN,
|
|
TILE_OPC_BBST,
|
|
TILE_OPC_BBST_SN,
|
|
TILE_OPC_BGEZ,
|
|
TILE_OPC_BGEZ_SN,
|
|
TILE_OPC_BGEZT,
|
|
TILE_OPC_BGEZT_SN,
|
|
TILE_OPC_BGZ,
|
|
TILE_OPC_BGZ_SN,
|
|
TILE_OPC_BGZT,
|
|
TILE_OPC_BGZT_SN,
|
|
TILE_OPC_BITX,
|
|
TILE_OPC_BITX_SN,
|
|
TILE_OPC_BLEZ,
|
|
TILE_OPC_BLEZ_SN,
|
|
TILE_OPC_BLEZT,
|
|
TILE_OPC_BLEZT_SN,
|
|
TILE_OPC_BLZ,
|
|
TILE_OPC_BLZ_SN,
|
|
TILE_OPC_BLZT,
|
|
TILE_OPC_BLZT_SN,
|
|
TILE_OPC_BNZ,
|
|
TILE_OPC_BNZ_SN,
|
|
TILE_OPC_BNZT,
|
|
TILE_OPC_BNZT_SN,
|
|
TILE_OPC_BYTEX,
|
|
TILE_OPC_BYTEX_SN,
|
|
TILE_OPC_BZ,
|
|
TILE_OPC_BZ_SN,
|
|
TILE_OPC_BZT,
|
|
TILE_OPC_BZT_SN,
|
|
TILE_OPC_CLZ,
|
|
TILE_OPC_CLZ_SN,
|
|
TILE_OPC_CRC32_32,
|
|
TILE_OPC_CRC32_32_SN,
|
|
TILE_OPC_CRC32_8,
|
|
TILE_OPC_CRC32_8_SN,
|
|
TILE_OPC_CTZ,
|
|
TILE_OPC_CTZ_SN,
|
|
TILE_OPC_DRAIN,
|
|
TILE_OPC_DTLBPR,
|
|
TILE_OPC_DWORD_ALIGN,
|
|
TILE_OPC_DWORD_ALIGN_SN,
|
|
TILE_OPC_FINV,
|
|
TILE_OPC_FLUSH,
|
|
TILE_OPC_FNOP,
|
|
TILE_OPC_ICOH,
|
|
TILE_OPC_ILL,
|
|
TILE_OPC_INTHB,
|
|
TILE_OPC_INTHB_SN,
|
|
TILE_OPC_INTHH,
|
|
TILE_OPC_INTHH_SN,
|
|
TILE_OPC_INTLB,
|
|
TILE_OPC_INTLB_SN,
|
|
TILE_OPC_INTLH,
|
|
TILE_OPC_INTLH_SN,
|
|
TILE_OPC_INV,
|
|
TILE_OPC_IRET,
|
|
TILE_OPC_JALB,
|
|
TILE_OPC_JALF,
|
|
TILE_OPC_JALR,
|
|
TILE_OPC_JALRP,
|
|
TILE_OPC_JB,
|
|
TILE_OPC_JF,
|
|
TILE_OPC_JR,
|
|
TILE_OPC_JRP,
|
|
TILE_OPC_LB,
|
|
TILE_OPC_LB_SN,
|
|
TILE_OPC_LB_U,
|
|
TILE_OPC_LB_U_SN,
|
|
TILE_OPC_LBADD,
|
|
TILE_OPC_LBADD_SN,
|
|
TILE_OPC_LBADD_U,
|
|
TILE_OPC_LBADD_U_SN,
|
|
TILE_OPC_LH,
|
|
TILE_OPC_LH_SN,
|
|
TILE_OPC_LH_U,
|
|
TILE_OPC_LH_U_SN,
|
|
TILE_OPC_LHADD,
|
|
TILE_OPC_LHADD_SN,
|
|
TILE_OPC_LHADD_U,
|
|
TILE_OPC_LHADD_U_SN,
|
|
TILE_OPC_LNK,
|
|
TILE_OPC_LNK_SN,
|
|
TILE_OPC_LW,
|
|
TILE_OPC_LW_SN,
|
|
TILE_OPC_LW_NA,
|
|
TILE_OPC_LW_NA_SN,
|
|
TILE_OPC_LWADD,
|
|
TILE_OPC_LWADD_SN,
|
|
TILE_OPC_LWADD_NA,
|
|
TILE_OPC_LWADD_NA_SN,
|
|
TILE_OPC_MAXB_U,
|
|
TILE_OPC_MAXB_U_SN,
|
|
TILE_OPC_MAXH,
|
|
TILE_OPC_MAXH_SN,
|
|
TILE_OPC_MAXIB_U,
|
|
TILE_OPC_MAXIB_U_SN,
|
|
TILE_OPC_MAXIH,
|
|
TILE_OPC_MAXIH_SN,
|
|
TILE_OPC_MF,
|
|
TILE_OPC_MFSPR,
|
|
TILE_OPC_MINB_U,
|
|
TILE_OPC_MINB_U_SN,
|
|
TILE_OPC_MINH,
|
|
TILE_OPC_MINH_SN,
|
|
TILE_OPC_MINIB_U,
|
|
TILE_OPC_MINIB_U_SN,
|
|
TILE_OPC_MINIH,
|
|
TILE_OPC_MINIH_SN,
|
|
TILE_OPC_MM,
|
|
TILE_OPC_MNZ,
|
|
TILE_OPC_MNZ_SN,
|
|
TILE_OPC_MNZB,
|
|
TILE_OPC_MNZB_SN,
|
|
TILE_OPC_MNZH,
|
|
TILE_OPC_MNZH_SN,
|
|
TILE_OPC_MTSPR,
|
|
TILE_OPC_MULHH_SS,
|
|
TILE_OPC_MULHH_SS_SN,
|
|
TILE_OPC_MULHH_SU,
|
|
TILE_OPC_MULHH_SU_SN,
|
|
TILE_OPC_MULHH_UU,
|
|
TILE_OPC_MULHH_UU_SN,
|
|
TILE_OPC_MULHHA_SS,
|
|
TILE_OPC_MULHHA_SS_SN,
|
|
TILE_OPC_MULHHA_SU,
|
|
TILE_OPC_MULHHA_SU_SN,
|
|
TILE_OPC_MULHHA_UU,
|
|
TILE_OPC_MULHHA_UU_SN,
|
|
TILE_OPC_MULHHSA_UU,
|
|
TILE_OPC_MULHHSA_UU_SN,
|
|
TILE_OPC_MULHL_SS,
|
|
TILE_OPC_MULHL_SS_SN,
|
|
TILE_OPC_MULHL_SU,
|
|
TILE_OPC_MULHL_SU_SN,
|
|
TILE_OPC_MULHL_US,
|
|
TILE_OPC_MULHL_US_SN,
|
|
TILE_OPC_MULHL_UU,
|
|
TILE_OPC_MULHL_UU_SN,
|
|
TILE_OPC_MULHLA_SS,
|
|
TILE_OPC_MULHLA_SS_SN,
|
|
TILE_OPC_MULHLA_SU,
|
|
TILE_OPC_MULHLA_SU_SN,
|
|
TILE_OPC_MULHLA_US,
|
|
TILE_OPC_MULHLA_US_SN,
|
|
TILE_OPC_MULHLA_UU,
|
|
TILE_OPC_MULHLA_UU_SN,
|
|
TILE_OPC_MULHLSA_UU,
|
|
TILE_OPC_MULHLSA_UU_SN,
|
|
TILE_OPC_MULLL_SS,
|
|
TILE_OPC_MULLL_SS_SN,
|
|
TILE_OPC_MULLL_SU,
|
|
TILE_OPC_MULLL_SU_SN,
|
|
TILE_OPC_MULLL_UU,
|
|
TILE_OPC_MULLL_UU_SN,
|
|
TILE_OPC_MULLLA_SS,
|
|
TILE_OPC_MULLLA_SS_SN,
|
|
TILE_OPC_MULLLA_SU,
|
|
TILE_OPC_MULLLA_SU_SN,
|
|
TILE_OPC_MULLLA_UU,
|
|
TILE_OPC_MULLLA_UU_SN,
|
|
TILE_OPC_MULLLSA_UU,
|
|
TILE_OPC_MULLLSA_UU_SN,
|
|
TILE_OPC_MVNZ,
|
|
TILE_OPC_MVNZ_SN,
|
|
TILE_OPC_MVZ,
|
|
TILE_OPC_MVZ_SN,
|
|
TILE_OPC_MZ,
|
|
TILE_OPC_MZ_SN,
|
|
TILE_OPC_MZB,
|
|
TILE_OPC_MZB_SN,
|
|
TILE_OPC_MZH,
|
|
TILE_OPC_MZH_SN,
|
|
TILE_OPC_NAP,
|
|
TILE_OPC_NOP,
|
|
TILE_OPC_NOR,
|
|
TILE_OPC_NOR_SN,
|
|
TILE_OPC_OR,
|
|
TILE_OPC_OR_SN,
|
|
TILE_OPC_ORI,
|
|
TILE_OPC_ORI_SN,
|
|
TILE_OPC_PACKBS_U,
|
|
TILE_OPC_PACKBS_U_SN,
|
|
TILE_OPC_PACKHB,
|
|
TILE_OPC_PACKHB_SN,
|
|
TILE_OPC_PACKHS,
|
|
TILE_OPC_PACKHS_SN,
|
|
TILE_OPC_PACKLB,
|
|
TILE_OPC_PACKLB_SN,
|
|
TILE_OPC_PCNT,
|
|
TILE_OPC_PCNT_SN,
|
|
TILE_OPC_RL,
|
|
TILE_OPC_RL_SN,
|
|
TILE_OPC_RLI,
|
|
TILE_OPC_RLI_SN,
|
|
TILE_OPC_S1A,
|
|
TILE_OPC_S1A_SN,
|
|
TILE_OPC_S2A,
|
|
TILE_OPC_S2A_SN,
|
|
TILE_OPC_S3A,
|
|
TILE_OPC_S3A_SN,
|
|
TILE_OPC_SADAB_U,
|
|
TILE_OPC_SADAB_U_SN,
|
|
TILE_OPC_SADAH,
|
|
TILE_OPC_SADAH_SN,
|
|
TILE_OPC_SADAH_U,
|
|
TILE_OPC_SADAH_U_SN,
|
|
TILE_OPC_SADB_U,
|
|
TILE_OPC_SADB_U_SN,
|
|
TILE_OPC_SADH,
|
|
TILE_OPC_SADH_SN,
|
|
TILE_OPC_SADH_U,
|
|
TILE_OPC_SADH_U_SN,
|
|
TILE_OPC_SB,
|
|
TILE_OPC_SBADD,
|
|
TILE_OPC_SEQ,
|
|
TILE_OPC_SEQ_SN,
|
|
TILE_OPC_SEQB,
|
|
TILE_OPC_SEQB_SN,
|
|
TILE_OPC_SEQH,
|
|
TILE_OPC_SEQH_SN,
|
|
TILE_OPC_SEQI,
|
|
TILE_OPC_SEQI_SN,
|
|
TILE_OPC_SEQIB,
|
|
TILE_OPC_SEQIB_SN,
|
|
TILE_OPC_SEQIH,
|
|
TILE_OPC_SEQIH_SN,
|
|
TILE_OPC_SH,
|
|
TILE_OPC_SHADD,
|
|
TILE_OPC_SHL,
|
|
TILE_OPC_SHL_SN,
|
|
TILE_OPC_SHLB,
|
|
TILE_OPC_SHLB_SN,
|
|
TILE_OPC_SHLH,
|
|
TILE_OPC_SHLH_SN,
|
|
TILE_OPC_SHLI,
|
|
TILE_OPC_SHLI_SN,
|
|
TILE_OPC_SHLIB,
|
|
TILE_OPC_SHLIB_SN,
|
|
TILE_OPC_SHLIH,
|
|
TILE_OPC_SHLIH_SN,
|
|
TILE_OPC_SHR,
|
|
TILE_OPC_SHR_SN,
|
|
TILE_OPC_SHRB,
|
|
TILE_OPC_SHRB_SN,
|
|
TILE_OPC_SHRH,
|
|
TILE_OPC_SHRH_SN,
|
|
TILE_OPC_SHRI,
|
|
TILE_OPC_SHRI_SN,
|
|
TILE_OPC_SHRIB,
|
|
TILE_OPC_SHRIB_SN,
|
|
TILE_OPC_SHRIH,
|
|
TILE_OPC_SHRIH_SN,
|
|
TILE_OPC_SLT,
|
|
TILE_OPC_SLT_SN,
|
|
TILE_OPC_SLT_U,
|
|
TILE_OPC_SLT_U_SN,
|
|
TILE_OPC_SLTB,
|
|
TILE_OPC_SLTB_SN,
|
|
TILE_OPC_SLTB_U,
|
|
TILE_OPC_SLTB_U_SN,
|
|
TILE_OPC_SLTE,
|
|
TILE_OPC_SLTE_SN,
|
|
TILE_OPC_SLTE_U,
|
|
TILE_OPC_SLTE_U_SN,
|
|
TILE_OPC_SLTEB,
|
|
TILE_OPC_SLTEB_SN,
|
|
TILE_OPC_SLTEB_U,
|
|
TILE_OPC_SLTEB_U_SN,
|
|
TILE_OPC_SLTEH,
|
|
TILE_OPC_SLTEH_SN,
|
|
TILE_OPC_SLTEH_U,
|
|
TILE_OPC_SLTEH_U_SN,
|
|
TILE_OPC_SLTH,
|
|
TILE_OPC_SLTH_SN,
|
|
TILE_OPC_SLTH_U,
|
|
TILE_OPC_SLTH_U_SN,
|
|
TILE_OPC_SLTI,
|
|
TILE_OPC_SLTI_SN,
|
|
TILE_OPC_SLTI_U,
|
|
TILE_OPC_SLTI_U_SN,
|
|
TILE_OPC_SLTIB,
|
|
TILE_OPC_SLTIB_SN,
|
|
TILE_OPC_SLTIB_U,
|
|
TILE_OPC_SLTIB_U_SN,
|
|
TILE_OPC_SLTIH,
|
|
TILE_OPC_SLTIH_SN,
|
|
TILE_OPC_SLTIH_U,
|
|
TILE_OPC_SLTIH_U_SN,
|
|
TILE_OPC_SNE,
|
|
TILE_OPC_SNE_SN,
|
|
TILE_OPC_SNEB,
|
|
TILE_OPC_SNEB_SN,
|
|
TILE_OPC_SNEH,
|
|
TILE_OPC_SNEH_SN,
|
|
TILE_OPC_SRA,
|
|
TILE_OPC_SRA_SN,
|
|
TILE_OPC_SRAB,
|
|
TILE_OPC_SRAB_SN,
|
|
TILE_OPC_SRAH,
|
|
TILE_OPC_SRAH_SN,
|
|
TILE_OPC_SRAI,
|
|
TILE_OPC_SRAI_SN,
|
|
TILE_OPC_SRAIB,
|
|
TILE_OPC_SRAIB_SN,
|
|
TILE_OPC_SRAIH,
|
|
TILE_OPC_SRAIH_SN,
|
|
TILE_OPC_SUB,
|
|
TILE_OPC_SUB_SN,
|
|
TILE_OPC_SUBB,
|
|
TILE_OPC_SUBB_SN,
|
|
TILE_OPC_SUBBS_U,
|
|
TILE_OPC_SUBBS_U_SN,
|
|
TILE_OPC_SUBH,
|
|
TILE_OPC_SUBH_SN,
|
|
TILE_OPC_SUBHS,
|
|
TILE_OPC_SUBHS_SN,
|
|
TILE_OPC_SUBS,
|
|
TILE_OPC_SUBS_SN,
|
|
TILE_OPC_SW,
|
|
TILE_OPC_SWADD,
|
|
TILE_OPC_SWINT0,
|
|
TILE_OPC_SWINT1,
|
|
TILE_OPC_SWINT2,
|
|
TILE_OPC_SWINT3,
|
|
TILE_OPC_TBLIDXB0,
|
|
TILE_OPC_TBLIDXB0_SN,
|
|
TILE_OPC_TBLIDXB1,
|
|
TILE_OPC_TBLIDXB1_SN,
|
|
TILE_OPC_TBLIDXB2,
|
|
TILE_OPC_TBLIDXB2_SN,
|
|
TILE_OPC_TBLIDXB3,
|
|
TILE_OPC_TBLIDXB3_SN,
|
|
TILE_OPC_TNS,
|
|
TILE_OPC_TNS_SN,
|
|
TILE_OPC_WH64,
|
|
TILE_OPC_XOR,
|
|
TILE_OPC_XOR_SN,
|
|
TILE_OPC_XORI,
|
|
TILE_OPC_XORI_SN,
|
|
TILE_OPC_NONE
|
|
} tile_mnemonic;
|
|
|
|
/* 64-bit pattern for a { bpt ; nop } bundle. */
|
|
#define TILE_BPT_BUNDLE 0x400b3cae70166000ULL
|
|
|
|
|
|
#define TILE_ELF_MACHINE_CODE EM_TILEPRO
|
|
|
|
#define TILE_ELF_NAME "elf32-tilepro"
|
|
|
|
|
|
static __inline unsigned int
|
|
get_BrOff_SN(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 0)) & 0x3ff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_BrOff_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0x00007fff) |
|
|
(((unsigned int)(n >> 20)) & 0x00018000);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_BrType_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 31)) & 0xf);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Dest_Imm8_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 31)) & 0x0000003f) |
|
|
(((unsigned int)(n >> 43)) & 0x000000c0);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Dest_SN(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 2)) & 0x3);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Dest_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 0)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Dest_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 31)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Dest_Y0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 0)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Dest_Y1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 31)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Imm16_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 12)) & 0xffff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Imm16_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0xffff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Imm8_SN(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 0)) & 0xff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Imm8_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 12)) & 0xff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Imm8_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0xff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Imm8_Y0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 12)) & 0xff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Imm8_Y1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0xff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_ImmOpcodeExtension_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 20)) & 0x7f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_ImmOpcodeExtension_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 51)) & 0x7f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_ImmRROpcodeExtension_SN(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 8)) & 0x3);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_JOffLong_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0x00007fff) |
|
|
(((unsigned int)(n >> 20)) & 0x00018000) |
|
|
(((unsigned int)(n >> 14)) & 0x001e0000) |
|
|
(((unsigned int)(n >> 16)) & 0x07e00000) |
|
|
(((unsigned int)(n >> 31)) & 0x18000000);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_JOff_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0x00007fff) |
|
|
(((unsigned int)(n >> 20)) & 0x00018000) |
|
|
(((unsigned int)(n >> 14)) & 0x001e0000) |
|
|
(((unsigned int)(n >> 16)) & 0x07e00000) |
|
|
(((unsigned int)(n >> 31)) & 0x08000000);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_MF_Imm15_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 37)) & 0x00003fff) |
|
|
(((unsigned int)(n >> 44)) & 0x00004000);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_MMEnd_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 18)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_MMEnd_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 49)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_MMStart_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 23)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_MMStart_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 54)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_MT_Imm15_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 31)) & 0x0000003f) |
|
|
(((unsigned int)(n >> 37)) & 0x00003fc0) |
|
|
(((unsigned int)(n >> 44)) & 0x00004000);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Mode(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 63)) & 0x1);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_NoRegOpcodeExtension_SN(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 0)) & 0xf);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Opcode_SN(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 10)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Opcode_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 28)) & 0x7);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Opcode_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 59)) & 0xf);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Opcode_Y0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 27)) & 0xf);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Opcode_Y1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 59)) & 0xf);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Opcode_Y2(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 56)) & 0x7);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_RROpcodeExtension_SN(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 4)) & 0xf);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_RRROpcodeExtension_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 18)) & 0x1ff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_RRROpcodeExtension_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 49)) & 0x1ff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_RRROpcodeExtension_Y0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 18)) & 0x3);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_RRROpcodeExtension_Y1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 49)) & 0x3);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_RouteOpcodeExtension_SN(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 0)) & 0x3ff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_S_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 27)) & 0x1);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_S_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 58)) & 0x1);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_ShAmt_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 12)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_ShAmt_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_ShAmt_Y0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 12)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_ShAmt_Y1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_SrcA_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 6)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_SrcA_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 37)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_SrcA_Y0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 6)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_SrcA_Y1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 37)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_SrcA_Y2(tile_bundle_bits n)
|
|
{
|
|
return (((n >> 26)) & 0x00000001) |
|
|
(((unsigned int)(n >> 50)) & 0x0000003e);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_SrcBDest_Y2(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 20)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_SrcB_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 12)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_SrcB_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_SrcB_Y0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 12)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_SrcB_Y1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0x3f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_Src_SN(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 0)) & 0x3);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_UnOpcodeExtension_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 12)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_UnOpcodeExtension_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_UnOpcodeExtension_Y0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 12)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_UnOpcodeExtension_Y1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 43)) & 0x1f);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_UnShOpcodeExtension_X0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 17)) & 0x3ff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_UnShOpcodeExtension_X1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 48)) & 0x3ff);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_UnShOpcodeExtension_Y0(tile_bundle_bits num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((n >> 17)) & 0x7);
|
|
}
|
|
|
|
static __inline unsigned int
|
|
get_UnShOpcodeExtension_Y1(tile_bundle_bits n)
|
|
{
|
|
return (((unsigned int)(n >> 48)) & 0x7);
|
|
}
|
|
|
|
|
|
static __inline int
|
|
sign_extend(int n, int num_bits)
|
|
{
|
|
int shift = (int)(sizeof(int) * 8 - num_bits);
|
|
return (n << shift) >> shift;
|
|
}
|
|
|
|
|
|
|
|
static __inline tile_bundle_bits
|
|
create_BrOff_SN(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3ff) << 0);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_BrOff_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x00007fff)) << 43) |
|
|
(((tile_bundle_bits)(n & 0x00018000)) << 20);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_BrType_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0xf)) << 31);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Dest_Imm8_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x0000003f)) << 31) |
|
|
(((tile_bundle_bits)(n & 0x000000c0)) << 43);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Dest_SN(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3) << 2);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Dest_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3f) << 0);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Dest_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x3f)) << 31);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Dest_Y0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3f) << 0);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Dest_Y1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x3f)) << 31);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Imm16_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0xffff) << 12);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Imm16_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0xffff)) << 43);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Imm8_SN(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0xff) << 0);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Imm8_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0xff) << 12);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Imm8_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0xff)) << 43);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Imm8_Y0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0xff) << 12);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Imm8_Y1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0xff)) << 43);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_ImmOpcodeExtension_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x7f) << 20);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_ImmOpcodeExtension_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x7f)) << 51);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_ImmRROpcodeExtension_SN(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3) << 8);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_JOffLong_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x00007fff)) << 43) |
|
|
(((tile_bundle_bits)(n & 0x00018000)) << 20) |
|
|
(((tile_bundle_bits)(n & 0x001e0000)) << 14) |
|
|
(((tile_bundle_bits)(n & 0x07e00000)) << 16) |
|
|
(((tile_bundle_bits)(n & 0x18000000)) << 31);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_JOff_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x00007fff)) << 43) |
|
|
(((tile_bundle_bits)(n & 0x00018000)) << 20) |
|
|
(((tile_bundle_bits)(n & 0x001e0000)) << 14) |
|
|
(((tile_bundle_bits)(n & 0x07e00000)) << 16) |
|
|
(((tile_bundle_bits)(n & 0x08000000)) << 31);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_MF_Imm15_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x00003fff)) << 37) |
|
|
(((tile_bundle_bits)(n & 0x00004000)) << 44);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_MMEnd_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x1f) << 18);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_MMEnd_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x1f)) << 49);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_MMStart_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x1f) << 23);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_MMStart_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x1f)) << 54);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_MT_Imm15_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x0000003f)) << 31) |
|
|
(((tile_bundle_bits)(n & 0x00003fc0)) << 37) |
|
|
(((tile_bundle_bits)(n & 0x00004000)) << 44);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Mode(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x1)) << 63);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_NoRegOpcodeExtension_SN(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0xf) << 0);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Opcode_SN(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3f) << 10);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Opcode_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x7) << 28);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Opcode_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0xf)) << 59);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Opcode_Y0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0xf) << 27);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Opcode_Y1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0xf)) << 59);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Opcode_Y2(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x7)) << 56);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_RROpcodeExtension_SN(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0xf) << 4);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_RRROpcodeExtension_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x1ff) << 18);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_RRROpcodeExtension_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x1ff)) << 49);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_RRROpcodeExtension_Y0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3) << 18);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_RRROpcodeExtension_Y1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x3)) << 49);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_RouteOpcodeExtension_SN(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3ff) << 0);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_S_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x1) << 27);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_S_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x1)) << 58);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_ShAmt_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x1f) << 12);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_ShAmt_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x1f)) << 43);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_ShAmt_Y0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x1f) << 12);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_ShAmt_Y1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x1f)) << 43);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_SrcA_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3f) << 6);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_SrcA_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x3f)) << 37);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_SrcA_Y0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3f) << 6);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_SrcA_Y1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x3f)) << 37);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_SrcA_Y2(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x00000001) << 26) |
|
|
(((tile_bundle_bits)(n & 0x0000003e)) << 50);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_SrcBDest_Y2(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3f) << 20);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_SrcB_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3f) << 12);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_SrcB_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x3f)) << 43);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_SrcB_Y0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3f) << 12);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_SrcB_Y1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x3f)) << 43);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_Src_SN(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3) << 0);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_UnOpcodeExtension_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x1f) << 12);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_UnOpcodeExtension_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x1f)) << 43);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_UnOpcodeExtension_Y0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x1f) << 12);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_UnOpcodeExtension_Y1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x1f)) << 43);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_UnShOpcodeExtension_X0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x3ff) << 17);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_UnShOpcodeExtension_X1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x3ff)) << 48);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_UnShOpcodeExtension_Y0(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return ((n & 0x7) << 17);
|
|
}
|
|
|
|
static __inline tile_bundle_bits
|
|
create_UnShOpcodeExtension_Y1(int num)
|
|
{
|
|
const unsigned int n = (unsigned int)num;
|
|
return (((tile_bundle_bits)(n & 0x7)) << 48);
|
|
}
|
|
|
|
|
|
|
|
typedef enum
|
|
{
|
|
TILE_PIPELINE_X0,
|
|
TILE_PIPELINE_X1,
|
|
TILE_PIPELINE_Y0,
|
|
TILE_PIPELINE_Y1,
|
|
TILE_PIPELINE_Y2,
|
|
} tile_pipeline;
|
|
|
|
#define tile_is_x_pipeline(p) ((int)(p) <= (int)TILE_PIPELINE_X1)
|
|
|
|
typedef enum
|
|
{
|
|
TILE_OP_TYPE_REGISTER,
|
|
TILE_OP_TYPE_IMMEDIATE,
|
|
TILE_OP_TYPE_ADDRESS,
|
|
TILE_OP_TYPE_SPR
|
|
} tile_operand_type;
|
|
|
|
/* This is the bit that determines if a bundle is in the Y encoding. */
|
|
#define TILE_BUNDLE_Y_ENCODING_MASK ((tile_bundle_bits)1 << 63)
|
|
|
|
enum
|
|
{
|
|
/* Maximum number of instructions in a bundle (2 for X, 3 for Y). */
|
|
TILE_MAX_INSTRUCTIONS_PER_BUNDLE = 3,
|
|
|
|
/* How many different pipeline encodings are there? X0, X1, Y0, Y1, Y2. */
|
|
TILE_NUM_PIPELINE_ENCODINGS = 5,
|
|
|
|
/* Log base 2 of TILE_BUNDLE_SIZE_IN_BYTES. */
|
|
TILE_LOG2_BUNDLE_SIZE_IN_BYTES = 3,
|
|
|
|
/* Instructions take this many bytes. */
|
|
TILE_BUNDLE_SIZE_IN_BYTES = 1 << TILE_LOG2_BUNDLE_SIZE_IN_BYTES,
|
|
|
|
/* Log base 2 of TILE_BUNDLE_ALIGNMENT_IN_BYTES. */
|
|
TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES = 3,
|
|
|
|
/* Bundles should be aligned modulo this number of bytes. */
|
|
TILE_BUNDLE_ALIGNMENT_IN_BYTES =
|
|
(1 << TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES),
|
|
|
|
/* Log base 2 of TILE_SN_INSTRUCTION_SIZE_IN_BYTES. */
|
|
TILE_LOG2_SN_INSTRUCTION_SIZE_IN_BYTES = 1,
|
|
|
|
/* Static network instructions take this many bytes. */
|
|
TILE_SN_INSTRUCTION_SIZE_IN_BYTES =
|
|
(1 << TILE_LOG2_SN_INSTRUCTION_SIZE_IN_BYTES),
|
|
|
|
/* Number of registers (some are magic, such as network I/O). */
|
|
TILE_NUM_REGISTERS = 64,
|
|
|
|
/* Number of static network registers. */
|
|
TILE_NUM_SN_REGISTERS = 4
|
|
};
|
|
|
|
|
|
struct tile_operand
|
|
{
|
|
/* Is this operand a register, immediate or address? */
|
|
tile_operand_type type;
|
|
|
|
/* The default relocation type for this operand. */
|
|
signed int default_reloc : 16;
|
|
|
|
/* How many bits is this value? (used for range checking) */
|
|
unsigned int num_bits : 5;
|
|
|
|
/* Is the value signed? (used for range checking) */
|
|
unsigned int is_signed : 1;
|
|
|
|
/* Is this operand a source register? */
|
|
unsigned int is_src_reg : 1;
|
|
|
|
/* Is this operand written? (i.e. is it a destination register) */
|
|
unsigned int is_dest_reg : 1;
|
|
|
|
/* Is this operand PC-relative? */
|
|
unsigned int is_pc_relative : 1;
|
|
|
|
/* By how many bits do we right shift the value before inserting? */
|
|
unsigned int rightshift : 2;
|
|
|
|
/* Return the bits for this operand to be ORed into an existing bundle. */
|
|
tile_bundle_bits (*insert) (int op);
|
|
|
|
/* Extract this operand and return it. */
|
|
unsigned int (*extract) (tile_bundle_bits bundle);
|
|
};
|
|
|
|
|
|
extern const struct tile_operand tile_operands[];
|
|
|
|
/* One finite-state machine per pipe for rapid instruction decoding. */
|
|
extern const unsigned short * const
|
|
tile_bundle_decoder_fsms[TILE_NUM_PIPELINE_ENCODINGS];
|
|
|
|
|
|
struct tile_opcode
|
|
{
|
|
/* The opcode mnemonic, e.g. "add" */
|
|
const char *name;
|
|
|
|
/* The enum value for this mnemonic. */
|
|
tile_mnemonic mnemonic;
|
|
|
|
/* A bit mask of which of the five pipes this instruction
|
|
is compatible with:
|
|
X0 0x01
|
|
X1 0x02
|
|
Y0 0x04
|
|
Y1 0x08
|
|
Y2 0x10 */
|
|
unsigned char pipes;
|
|
|
|
/* How many operands are there? */
|
|
unsigned char num_operands;
|
|
|
|
/* Which register does this write implicitly, or TREG_ZERO if none? */
|
|
unsigned char implicitly_written_register;
|
|
|
|
/* Can this be bundled with other instructions (almost always true). */
|
|
unsigned char can_bundle;
|
|
|
|
/* The description of the operands. Each of these is an
|
|
* index into the tile_operands[] table. */
|
|
unsigned char operands[TILE_NUM_PIPELINE_ENCODINGS][TILE_MAX_OPERANDS];
|
|
|
|
};
|
|
|
|
extern const struct tile_opcode tile_opcodes[];
|
|
|
|
|
|
/* Used for non-textual disassembly into structs. */
|
|
struct tile_decoded_instruction
|
|
{
|
|
const struct tile_opcode *opcode;
|
|
const struct tile_operand *operands[TILE_MAX_OPERANDS];
|
|
int operand_values[TILE_MAX_OPERANDS];
|
|
};
|
|
|
|
|
|
/* Disassemble a bundle into a struct for machine processing. */
|
|
extern int parse_insn_tile(tile_bundle_bits bits,
|
|
unsigned int pc,
|
|
struct tile_decoded_instruction
|
|
decoded[TILE_MAX_INSTRUCTIONS_PER_BUNDLE]);
|
|
|
|
|
|
|
|
#endif /* opcode_tile_h */
|