diff options
Diffstat (limited to 'arch/tile/include/asm/tile-desc_32.h')
| -rw-r--r-- | arch/tile/include/asm/tile-desc_32.h | 553 | 
1 files changed, 553 insertions, 0 deletions
diff --git a/arch/tile/include/asm/tile-desc_32.h b/arch/tile/include/asm/tile-desc_32.h new file mode 100644 index 00000000000..f09c5c43b0b --- /dev/null +++ b/arch/tile/include/asm/tile-desc_32.h @@ -0,0 +1,553 @@ +/* TILEPro opcode information. + * + * Copyright 2011 Tilera Corporation. All Rights Reserved. + * + *   This program is free software; you can redistribute it and/or + *   modify it under the terms of the GNU General Public License + *   as published by the Free Software Foundation, version 2. + * + *   This program is distributed in the hope that it will be useful, but + *   WITHOUT ANY WARRANTY; without even the implied warranty of + *   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or + *   NON INFRINGEMENT.  See the GNU General Public License for + *   more details. + * + * + * + * + * + */ + +#ifndef opcode_tilepro_h +#define opcode_tilepro_h + +#include <arch/opcode.h> + + +enum +{ +  TILEPRO_MAX_OPERANDS = 5 /* mm */ +}; + +typedef enum +{ +  TILEPRO_OPC_BPT, +  TILEPRO_OPC_INFO, +  TILEPRO_OPC_INFOL, +  TILEPRO_OPC_J, +  TILEPRO_OPC_JAL, +  TILEPRO_OPC_MOVE, +  TILEPRO_OPC_MOVE_SN, +  TILEPRO_OPC_MOVEI, +  TILEPRO_OPC_MOVEI_SN, +  TILEPRO_OPC_MOVELI, +  TILEPRO_OPC_MOVELI_SN, +  TILEPRO_OPC_MOVELIS, +  TILEPRO_OPC_PREFETCH, +  TILEPRO_OPC_RAISE, +  TILEPRO_OPC_ADD, +  TILEPRO_OPC_ADD_SN, +  TILEPRO_OPC_ADDB, +  TILEPRO_OPC_ADDB_SN, +  TILEPRO_OPC_ADDBS_U, +  TILEPRO_OPC_ADDBS_U_SN, +  TILEPRO_OPC_ADDH, +  TILEPRO_OPC_ADDH_SN, +  TILEPRO_OPC_ADDHS, +  TILEPRO_OPC_ADDHS_SN, +  TILEPRO_OPC_ADDI, +  TILEPRO_OPC_ADDI_SN, +  TILEPRO_OPC_ADDIB, +  TILEPRO_OPC_ADDIB_SN, +  TILEPRO_OPC_ADDIH, +  TILEPRO_OPC_ADDIH_SN, +  TILEPRO_OPC_ADDLI, +  TILEPRO_OPC_ADDLI_SN, +  TILEPRO_OPC_ADDLIS, +  TILEPRO_OPC_ADDS, +  TILEPRO_OPC_ADDS_SN, +  TILEPRO_OPC_ADIFFB_U, +  TILEPRO_OPC_ADIFFB_U_SN, +  TILEPRO_OPC_ADIFFH, +  TILEPRO_OPC_ADIFFH_SN, +  TILEPRO_OPC_AND, +  TILEPRO_OPC_AND_SN, +  TILEPRO_OPC_ANDI, +  TILEPRO_OPC_ANDI_SN, +  TILEPRO_OPC_AULI, +  TILEPRO_OPC_AVGB_U, +  TILEPRO_OPC_AVGB_U_SN, +  TILEPRO_OPC_AVGH, +  TILEPRO_OPC_AVGH_SN, +  TILEPRO_OPC_BBNS, +  TILEPRO_OPC_BBNS_SN, +  TILEPRO_OPC_BBNST, +  TILEPRO_OPC_BBNST_SN, +  TILEPRO_OPC_BBS, +  TILEPRO_OPC_BBS_SN, +  TILEPRO_OPC_BBST, +  TILEPRO_OPC_BBST_SN, +  TILEPRO_OPC_BGEZ, +  TILEPRO_OPC_BGEZ_SN, +  TILEPRO_OPC_BGEZT, +  TILEPRO_OPC_BGEZT_SN, +  TILEPRO_OPC_BGZ, +  TILEPRO_OPC_BGZ_SN, +  TILEPRO_OPC_BGZT, +  TILEPRO_OPC_BGZT_SN, +  TILEPRO_OPC_BITX, +  TILEPRO_OPC_BITX_SN, +  TILEPRO_OPC_BLEZ, +  TILEPRO_OPC_BLEZ_SN, +  TILEPRO_OPC_BLEZT, +  TILEPRO_OPC_BLEZT_SN, +  TILEPRO_OPC_BLZ, +  TILEPRO_OPC_BLZ_SN, +  TILEPRO_OPC_BLZT, +  TILEPRO_OPC_BLZT_SN, +  TILEPRO_OPC_BNZ, +  TILEPRO_OPC_BNZ_SN, +  TILEPRO_OPC_BNZT, +  TILEPRO_OPC_BNZT_SN, +  TILEPRO_OPC_BYTEX, +  TILEPRO_OPC_BYTEX_SN, +  TILEPRO_OPC_BZ, +  TILEPRO_OPC_BZ_SN, +  TILEPRO_OPC_BZT, +  TILEPRO_OPC_BZT_SN, +  TILEPRO_OPC_CLZ, +  TILEPRO_OPC_CLZ_SN, +  TILEPRO_OPC_CRC32_32, +  TILEPRO_OPC_CRC32_32_SN, +  TILEPRO_OPC_CRC32_8, +  TILEPRO_OPC_CRC32_8_SN, +  TILEPRO_OPC_CTZ, +  TILEPRO_OPC_CTZ_SN, +  TILEPRO_OPC_DRAIN, +  TILEPRO_OPC_DTLBPR, +  TILEPRO_OPC_DWORD_ALIGN, +  TILEPRO_OPC_DWORD_ALIGN_SN, +  TILEPRO_OPC_FINV, +  TILEPRO_OPC_FLUSH, +  TILEPRO_OPC_FNOP, +  TILEPRO_OPC_ICOH, +  TILEPRO_OPC_ILL, +  TILEPRO_OPC_INTHB, +  TILEPRO_OPC_INTHB_SN, +  TILEPRO_OPC_INTHH, +  TILEPRO_OPC_INTHH_SN, +  TILEPRO_OPC_INTLB, +  TILEPRO_OPC_INTLB_SN, +  TILEPRO_OPC_INTLH, +  TILEPRO_OPC_INTLH_SN, +  TILEPRO_OPC_INV, +  TILEPRO_OPC_IRET, +  TILEPRO_OPC_JALB, +  TILEPRO_OPC_JALF, +  TILEPRO_OPC_JALR, +  TILEPRO_OPC_JALRP, +  TILEPRO_OPC_JB, +  TILEPRO_OPC_JF, +  TILEPRO_OPC_JR, +  TILEPRO_OPC_JRP, +  TILEPRO_OPC_LB, +  TILEPRO_OPC_LB_SN, +  TILEPRO_OPC_LB_U, +  TILEPRO_OPC_LB_U_SN, +  TILEPRO_OPC_LBADD, +  TILEPRO_OPC_LBADD_SN, +  TILEPRO_OPC_LBADD_U, +  TILEPRO_OPC_LBADD_U_SN, +  TILEPRO_OPC_LH, +  TILEPRO_OPC_LH_SN, +  TILEPRO_OPC_LH_U, +  TILEPRO_OPC_LH_U_SN, +  TILEPRO_OPC_LHADD, +  TILEPRO_OPC_LHADD_SN, +  TILEPRO_OPC_LHADD_U, +  TILEPRO_OPC_LHADD_U_SN, +  TILEPRO_OPC_LNK, +  TILEPRO_OPC_LNK_SN, +  TILEPRO_OPC_LW, +  TILEPRO_OPC_LW_SN, +  TILEPRO_OPC_LW_NA, +  TILEPRO_OPC_LW_NA_SN, +  TILEPRO_OPC_LWADD, +  TILEPRO_OPC_LWADD_SN, +  TILEPRO_OPC_LWADD_NA, +  TILEPRO_OPC_LWADD_NA_SN, +  TILEPRO_OPC_MAXB_U, +  TILEPRO_OPC_MAXB_U_SN, +  TILEPRO_OPC_MAXH, +  TILEPRO_OPC_MAXH_SN, +  TILEPRO_OPC_MAXIB_U, +  TILEPRO_OPC_MAXIB_U_SN, +  TILEPRO_OPC_MAXIH, +  TILEPRO_OPC_MAXIH_SN, +  TILEPRO_OPC_MF, +  TILEPRO_OPC_MFSPR, +  TILEPRO_OPC_MINB_U, +  TILEPRO_OPC_MINB_U_SN, +  TILEPRO_OPC_MINH, +  TILEPRO_OPC_MINH_SN, +  TILEPRO_OPC_MINIB_U, +  TILEPRO_OPC_MINIB_U_SN, +  TILEPRO_OPC_MINIH, +  TILEPRO_OPC_MINIH_SN, +  TILEPRO_OPC_MM, +  TILEPRO_OPC_MNZ, +  TILEPRO_OPC_MNZ_SN, +  TILEPRO_OPC_MNZB, +  TILEPRO_OPC_MNZB_SN, +  TILEPRO_OPC_MNZH, +  TILEPRO_OPC_MNZH_SN, +  TILEPRO_OPC_MTSPR, +  TILEPRO_OPC_MULHH_SS, +  TILEPRO_OPC_MULHH_SS_SN, +  TILEPRO_OPC_MULHH_SU, +  TILEPRO_OPC_MULHH_SU_SN, +  TILEPRO_OPC_MULHH_UU, +  TILEPRO_OPC_MULHH_UU_SN, +  TILEPRO_OPC_MULHHA_SS, +  TILEPRO_OPC_MULHHA_SS_SN, +  TILEPRO_OPC_MULHHA_SU, +  TILEPRO_OPC_MULHHA_SU_SN, +  TILEPRO_OPC_MULHHA_UU, +  TILEPRO_OPC_MULHHA_UU_SN, +  TILEPRO_OPC_MULHHSA_UU, +  TILEPRO_OPC_MULHHSA_UU_SN, +  TILEPRO_OPC_MULHL_SS, +  TILEPRO_OPC_MULHL_SS_SN, +  TILEPRO_OPC_MULHL_SU, +  TILEPRO_OPC_MULHL_SU_SN, +  TILEPRO_OPC_MULHL_US, +  TILEPRO_OPC_MULHL_US_SN, +  TILEPRO_OPC_MULHL_UU, +  TILEPRO_OPC_MULHL_UU_SN, +  TILEPRO_OPC_MULHLA_SS, +  TILEPRO_OPC_MULHLA_SS_SN, +  TILEPRO_OPC_MULHLA_SU, +  TILEPRO_OPC_MULHLA_SU_SN, +  TILEPRO_OPC_MULHLA_US, +  TILEPRO_OPC_MULHLA_US_SN, +  TILEPRO_OPC_MULHLA_UU, +  TILEPRO_OPC_MULHLA_UU_SN, +  TILEPRO_OPC_MULHLSA_UU, +  TILEPRO_OPC_MULHLSA_UU_SN, +  TILEPRO_OPC_MULLL_SS, +  TILEPRO_OPC_MULLL_SS_SN, +  TILEPRO_OPC_MULLL_SU, +  TILEPRO_OPC_MULLL_SU_SN, +  TILEPRO_OPC_MULLL_UU, +  TILEPRO_OPC_MULLL_UU_SN, +  TILEPRO_OPC_MULLLA_SS, +  TILEPRO_OPC_MULLLA_SS_SN, +  TILEPRO_OPC_MULLLA_SU, +  TILEPRO_OPC_MULLLA_SU_SN, +  TILEPRO_OPC_MULLLA_UU, +  TILEPRO_OPC_MULLLA_UU_SN, +  TILEPRO_OPC_MULLLSA_UU, +  TILEPRO_OPC_MULLLSA_UU_SN, +  TILEPRO_OPC_MVNZ, +  TILEPRO_OPC_MVNZ_SN, +  TILEPRO_OPC_MVZ, +  TILEPRO_OPC_MVZ_SN, +  TILEPRO_OPC_MZ, +  TILEPRO_OPC_MZ_SN, +  TILEPRO_OPC_MZB, +  TILEPRO_OPC_MZB_SN, +  TILEPRO_OPC_MZH, +  TILEPRO_OPC_MZH_SN, +  TILEPRO_OPC_NAP, +  TILEPRO_OPC_NOP, +  TILEPRO_OPC_NOR, +  TILEPRO_OPC_NOR_SN, +  TILEPRO_OPC_OR, +  TILEPRO_OPC_OR_SN, +  TILEPRO_OPC_ORI, +  TILEPRO_OPC_ORI_SN, +  TILEPRO_OPC_PACKBS_U, +  TILEPRO_OPC_PACKBS_U_SN, +  TILEPRO_OPC_PACKHB, +  TILEPRO_OPC_PACKHB_SN, +  TILEPRO_OPC_PACKHS, +  TILEPRO_OPC_PACKHS_SN, +  TILEPRO_OPC_PACKLB, +  TILEPRO_OPC_PACKLB_SN, +  TILEPRO_OPC_PCNT, +  TILEPRO_OPC_PCNT_SN, +  TILEPRO_OPC_RL, +  TILEPRO_OPC_RL_SN, +  TILEPRO_OPC_RLI, +  TILEPRO_OPC_RLI_SN, +  TILEPRO_OPC_S1A, +  TILEPRO_OPC_S1A_SN, +  TILEPRO_OPC_S2A, +  TILEPRO_OPC_S2A_SN, +  TILEPRO_OPC_S3A, +  TILEPRO_OPC_S3A_SN, +  TILEPRO_OPC_SADAB_U, +  TILEPRO_OPC_SADAB_U_SN, +  TILEPRO_OPC_SADAH, +  TILEPRO_OPC_SADAH_SN, +  TILEPRO_OPC_SADAH_U, +  TILEPRO_OPC_SADAH_U_SN, +  TILEPRO_OPC_SADB_U, +  TILEPRO_OPC_SADB_U_SN, +  TILEPRO_OPC_SADH, +  TILEPRO_OPC_SADH_SN, +  TILEPRO_OPC_SADH_U, +  TILEPRO_OPC_SADH_U_SN, +  TILEPRO_OPC_SB, +  TILEPRO_OPC_SBADD, +  TILEPRO_OPC_SEQ, +  TILEPRO_OPC_SEQ_SN, +  TILEPRO_OPC_SEQB, +  TILEPRO_OPC_SEQB_SN, +  TILEPRO_OPC_SEQH, +  TILEPRO_OPC_SEQH_SN, +  TILEPRO_OPC_SEQI, +  TILEPRO_OPC_SEQI_SN, +  TILEPRO_OPC_SEQIB, +  TILEPRO_OPC_SEQIB_SN, +  TILEPRO_OPC_SEQIH, +  TILEPRO_OPC_SEQIH_SN, +  TILEPRO_OPC_SH, +  TILEPRO_OPC_SHADD, +  TILEPRO_OPC_SHL, +  TILEPRO_OPC_SHL_SN, +  TILEPRO_OPC_SHLB, +  TILEPRO_OPC_SHLB_SN, +  TILEPRO_OPC_SHLH, +  TILEPRO_OPC_SHLH_SN, +  TILEPRO_OPC_SHLI, +  TILEPRO_OPC_SHLI_SN, +  TILEPRO_OPC_SHLIB, +  TILEPRO_OPC_SHLIB_SN, +  TILEPRO_OPC_SHLIH, +  TILEPRO_OPC_SHLIH_SN, +  TILEPRO_OPC_SHR, +  TILEPRO_OPC_SHR_SN, +  TILEPRO_OPC_SHRB, +  TILEPRO_OPC_SHRB_SN, +  TILEPRO_OPC_SHRH, +  TILEPRO_OPC_SHRH_SN, +  TILEPRO_OPC_SHRI, +  TILEPRO_OPC_SHRI_SN, +  TILEPRO_OPC_SHRIB, +  TILEPRO_OPC_SHRIB_SN, +  TILEPRO_OPC_SHRIH, +  TILEPRO_OPC_SHRIH_SN, +  TILEPRO_OPC_SLT, +  TILEPRO_OPC_SLT_SN, +  TILEPRO_OPC_SLT_U, +  TILEPRO_OPC_SLT_U_SN, +  TILEPRO_OPC_SLTB, +  TILEPRO_OPC_SLTB_SN, +  TILEPRO_OPC_SLTB_U, +  TILEPRO_OPC_SLTB_U_SN, +  TILEPRO_OPC_SLTE, +  TILEPRO_OPC_SLTE_SN, +  TILEPRO_OPC_SLTE_U, +  TILEPRO_OPC_SLTE_U_SN, +  TILEPRO_OPC_SLTEB, +  TILEPRO_OPC_SLTEB_SN, +  TILEPRO_OPC_SLTEB_U, +  TILEPRO_OPC_SLTEB_U_SN, +  TILEPRO_OPC_SLTEH, +  TILEPRO_OPC_SLTEH_SN, +  TILEPRO_OPC_SLTEH_U, +  TILEPRO_OPC_SLTEH_U_SN, +  TILEPRO_OPC_SLTH, +  TILEPRO_OPC_SLTH_SN, +  TILEPRO_OPC_SLTH_U, +  TILEPRO_OPC_SLTH_U_SN, +  TILEPRO_OPC_SLTI, +  TILEPRO_OPC_SLTI_SN, +  TILEPRO_OPC_SLTI_U, +  TILEPRO_OPC_SLTI_U_SN, +  TILEPRO_OPC_SLTIB, +  TILEPRO_OPC_SLTIB_SN, +  TILEPRO_OPC_SLTIB_U, +  TILEPRO_OPC_SLTIB_U_SN, +  TILEPRO_OPC_SLTIH, +  TILEPRO_OPC_SLTIH_SN, +  TILEPRO_OPC_SLTIH_U, +  TILEPRO_OPC_SLTIH_U_SN, +  TILEPRO_OPC_SNE, +  TILEPRO_OPC_SNE_SN, +  TILEPRO_OPC_SNEB, +  TILEPRO_OPC_SNEB_SN, +  TILEPRO_OPC_SNEH, +  TILEPRO_OPC_SNEH_SN, +  TILEPRO_OPC_SRA, +  TILEPRO_OPC_SRA_SN, +  TILEPRO_OPC_SRAB, +  TILEPRO_OPC_SRAB_SN, +  TILEPRO_OPC_SRAH, +  TILEPRO_OPC_SRAH_SN, +  TILEPRO_OPC_SRAI, +  TILEPRO_OPC_SRAI_SN, +  TILEPRO_OPC_SRAIB, +  TILEPRO_OPC_SRAIB_SN, +  TILEPRO_OPC_SRAIH, +  TILEPRO_OPC_SRAIH_SN, +  TILEPRO_OPC_SUB, +  TILEPRO_OPC_SUB_SN, +  TILEPRO_OPC_SUBB, +  TILEPRO_OPC_SUBB_SN, +  TILEPRO_OPC_SUBBS_U, +  TILEPRO_OPC_SUBBS_U_SN, +  TILEPRO_OPC_SUBH, +  TILEPRO_OPC_SUBH_SN, +  TILEPRO_OPC_SUBHS, +  TILEPRO_OPC_SUBHS_SN, +  TILEPRO_OPC_SUBS, +  TILEPRO_OPC_SUBS_SN, +  TILEPRO_OPC_SW, +  TILEPRO_OPC_SWADD, +  TILEPRO_OPC_SWINT0, +  TILEPRO_OPC_SWINT1, +  TILEPRO_OPC_SWINT2, +  TILEPRO_OPC_SWINT3, +  TILEPRO_OPC_TBLIDXB0, +  TILEPRO_OPC_TBLIDXB0_SN, +  TILEPRO_OPC_TBLIDXB1, +  TILEPRO_OPC_TBLIDXB1_SN, +  TILEPRO_OPC_TBLIDXB2, +  TILEPRO_OPC_TBLIDXB2_SN, +  TILEPRO_OPC_TBLIDXB3, +  TILEPRO_OPC_TBLIDXB3_SN, +  TILEPRO_OPC_TNS, +  TILEPRO_OPC_TNS_SN, +  TILEPRO_OPC_WH64, +  TILEPRO_OPC_XOR, +  TILEPRO_OPC_XOR_SN, +  TILEPRO_OPC_XORI, +  TILEPRO_OPC_XORI_SN, +  TILEPRO_OPC_NONE +} tilepro_mnemonic; + + + + +typedef enum +{ +  TILEPRO_PIPELINE_X0, +  TILEPRO_PIPELINE_X1, +  TILEPRO_PIPELINE_Y0, +  TILEPRO_PIPELINE_Y1, +  TILEPRO_PIPELINE_Y2, +} tilepro_pipeline; + +#define tilepro_is_x_pipeline(p) ((int)(p) <= (int)TILEPRO_PIPELINE_X1) + +typedef enum +{ +  TILEPRO_OP_TYPE_REGISTER, +  TILEPRO_OP_TYPE_IMMEDIATE, +  TILEPRO_OP_TYPE_ADDRESS, +  TILEPRO_OP_TYPE_SPR +} tilepro_operand_type; + +struct tilepro_operand +{ +  /* Is this operand a register, immediate or address? */ +  tilepro_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. */ +  tilepro_bundle_bits (*insert) (int op); + +  /* Extract this operand and return it. */ +  unsigned int (*extract) (tilepro_bundle_bits bundle); +}; + + +extern const struct tilepro_operand tilepro_operands[]; + +/* One finite-state machine per pipe for rapid instruction decoding. */ +extern const unsigned short * const +tilepro_bundle_decoder_fsms[TILEPRO_NUM_PIPELINE_ENCODINGS]; + + +struct tilepro_opcode +{ +  /* The opcode mnemonic, e.g. "add" */ +  const char *name; + +  /* The enum value for this mnemonic. */ +  tilepro_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 tilepro_operands[] table. */ +  unsigned char operands[TILEPRO_NUM_PIPELINE_ENCODINGS][TILEPRO_MAX_OPERANDS]; + +}; + +extern const struct tilepro_opcode tilepro_opcodes[]; + + +/* Used for non-textual disassembly into structs. */ +struct tilepro_decoded_instruction +{ +  const struct tilepro_opcode *opcode; +  const struct tilepro_operand *operands[TILEPRO_MAX_OPERANDS]; +  int operand_values[TILEPRO_MAX_OPERANDS]; +}; + + +/* Disassemble a bundle into a struct for machine processing. */ +extern int parse_insn_tilepro(tilepro_bundle_bits bits, +                              unsigned int pc, +                              struct tilepro_decoded_instruction +                              decoded[TILEPRO_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 tilepro_opcode * +find_opcode(tilepro_bundle_bits bits, tilepro_pipeline pipe); + + + +#endif /* opcode_tilepro_h */  | 
