93013a0f53
This change is the result of some work to make the backtrace code more shareable between kernel, libc, and gdb. For the kernel, some good effects are to eliminate the hacky "VirtualAddress" typedef in favor of "unsigned long", to eliminate a bunch of spurious kernel doc comments, to remove the dead "bt_read_memory" function, and to use "__tilegx__" in #ifdefs instead of "TILE_CHIP". Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
1513 lines
32 KiB
C
1513 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]);
|
|
|
|
|
|
/* Given a set of bundle bits and a specific pipe, returns which
|
|
* instruction the bundle contains in that pipe.
|
|
*/
|
|
extern const struct tile_opcode *
|
|
find_opcode(tile_bundle_bits bits, tile_pipeline pipe);
|
|
|
|
|
|
|
|
#endif /* opcode_tile_h */
|