md.texi (define_c_enum, [...]): Document.
gcc/ * doc/md.texi (define_c_enum, define_enum): Document. * read-md.h (md_constant): Add a parent_enum field. (enum_value, enum_type): New structures. (upcase_string, traverse_enum_types): Declare. * read-md.c (enum_types): New variable. (upcase_string, add_constant): New functions. (handle_constants): Don't create the hash table here. Use add_constant. (traverse_md_constants): Don't check for a null md_constants. (decimal_string, handle_enum, traverse_enum_types): New functions. (read_md_files): Initialize md_constants and md_enums. * genconstants.c (print_md_constant): Ignore info argument. Only print constants that belong to no enum. (print_enum_type): New function. (main): Don't pass stdout to print_md_constant. Call print_enum_type for each defined enum type. * config/mips/mips.md (processor): New define_enum. (unspec): New define_c_enum. (UNSPEC_COMPARE_AND_SWAP, UNSPEC_COMPARE_AND_SWAP_12) (UNSPEC_SYNC_OLD_OP, UNSPEC_SYNC_NEW_OP, UNSPEC_SYNC_NEW_OP_12) (UNSPEC_SYNC_OLD_OP_12, UNSPEC_SYNC_EXCHANGE, UNSPEC_SYNC_EXCHANGE_12) (UNSPEC_MEMORY_BARRIER): Moved to sync.md. (UNSPEC_ADDQ, UNSPEC_ADDQ_S, UNSPEC_SUBQ, UNSPEC_SUBQ_S, UNSPEC_ADDSC) (UNSPEC_ADDWC, UNSPEC_MODSUB, UNSPEC_RADDU_W_QB, UNSPEC_ABSQ_S) (UNSPEC_PRECRQ_QB_PH, UNSPEC_PRECRQ_PH_W, UNSPEC_PRECRQ_RS_PH_W) (UNSPEC_PRECRQU_S_QB_PH, UNSPEC_PRECEQ_W_PHL, UNSPEC_PRECEQ_W_PHR) (UNSPEC_PRECEQU_PH_QBL, UNSPEC_PRECEQU_PH_QBR, UNSPEC_PRECEQU_PH_QBLA) (UNSPEC_PRECEQU_PH_QBRA, UNSPEC_PRECEU_PH_QBL, UNSPEC_PRECEU_PH_QBR) (UNSPEC_PRECEU_PH_QBLA, UNSPEC_PRECEU_PH_QBRA, UNSPEC_SHLL) (UNSPEC_SHLL_S, UNSPEC_SHRL_QB, UNSPEC_SHRA_PH, UNSPEC_SHRA_R) (UNSPEC_MULEU_S_PH_QBL, UNSPEC_MULEU_S_PH_QBR, UNSPEC_MULQ_RS_PH) (UNSPEC_MULEQ_S_W_PHL, UNSPEC_MULEQ_S_W_PHR, UNSPEC_DPAU_H_QBL) (UNSPEC_DPAU_H_QBR, UNSPEC_DPSU_H_QBL, UNSPEC_DPSU_H_QBR) (UNSPEC_DPAQ_S_W_PH, UNSPEC_DPSQ_S_W_PH, UNSPEC_MULSAQ_S_W_PH) (UNSPEC_DPAQ_SA_L_W, UNSPEC_DPSQ_SA_L_W, UNSPEC_MAQ_S_W_PHL) (UNSPEC_MAQ_S_W_PHR, UNSPEC_MAQ_SA_W_PHL, UNSPEC_MAQ_SA_W_PHR) (UNSPEC_BITREV, UNSPEC_INSV, UNSPEC_REPL_QB, UNSPEC_REPL_PH) (UNSPEC_CMP_EQ, UNSPEC_CMP_LT, UNSPEC_CMP_LE, UNSPEC_CMPGU_EQ_QB) (UNSPEC_CMPGU_LT_QB, UNSPEC_CMPGU_LE_QB, UNSPEC_PICK, UNSPEC_PACKRL_PH) (UNSPEC_EXTR_W, UNSPEC_EXTR_R_W, UNSPEC_EXTR_RS_W, UNSPEC_EXTR_S_H) (UNSPEC_EXTP, UNSPEC_EXTPDP, UNSPEC_SHILO, UNSPEC_MTHLIP, UNSPEC_WRDSP) (UNSPEC_RDDSP): Move to mips-dsp.md. (UNSPEC_ABSQ_S_QB, UNSPEC_ADDU_PH, UNSPEC_ADDU_S_PH, UNSPEC_ADDUH_QB) (UNSPEC_ADDUH_R_QB, UNSPEC_APPEND, UNSPEC_BALIGN, UNSPEC_CMPGDU_EQ_QB) (UNSPEC_CMPGDU_LT_QB, UNSPEC_CMPGDU_LE_QB, UNSPEC_DPA_W_PH) (UNSPEC_DPS_W_PH, UNSPEC_MADD, UNSPEC_MADDU, UNSPEC_MSUB, UNSPEC_MSUBU) (UNSPEC_MUL_PH, UNSPEC_MUL_S_PH, UNSPEC_MULQ_RS_W, UNSPEC_MULQ_S_PH) (UNSPEC_MULQ_S_W, UNSPEC_MULSA_W_PH, UNSPEC_MULT, UNSPEC_MULTU) (UNSPEC_PRECR_QB_PH, UNSPEC_PRECR_SRA_PH_W, UNSPEC_PRECR_SRA_R_PH_W) (UNSPEC_PREPEND, UNSPEC_SHRA_QB, UNSPEC_SHRA_R_QB, UNSPEC_SHRL_PH) (UNSPEC_SUBU_PH, UNSPEC_SUBU_S_PH, UNSPEC_SUBUH_QB, UNSPEC_SUBUH_R_QB) (UNSPEC_ADDQH_PH, UNSPEC_ADDQH_R_PH, UNSPEC_ADDQH_W, UNSPEC_ADDQH_R_W) (UNSPEC_SUBQH_PH, UNSPEC_SUBQH_R_PH, UNSPEC_SUBQH_W, UNSPEC_SUBQH_R_W) (UNSPEC_DPAX_W_PH, UNSPEC_DPSX_W_PH, UNSPEC_DPAQX_S_W_PH) (UNSPEC_DPAQX_SA_W_PH, UNSPEC_DPSQX_S_W_PH, UNSPEC_DPSQX_SA_W_PH): Moved to mips-dspr2.md. (UNSPEC_MOVE_TF_PS, UNSPEC_C, UNSPEC_ALNV_PS, UNSPEC_CABS) (UNSPEC_ADDR_PS, UNSPEC_CVT_PW_PS, UNSPEC_CVT_PS_PW, UNSPEC_MULR_PS) (UNSPEC_ABS_PS, UNSPEC_RSQRT1, UNSPEC_RSQRT2, UNSPEC_RECIP1) (UNSPEC_RECIP2, UNSPEC_SINGLE_CC, UNSPEC_SCC): Moved from mips-ps-3d.md. (UNSPEC_LOONGSON_PAVG, UNSPEC_LOONGSON_PCMPEQ, UNSPEC_LOONGSON_PCMPGT) (UNSPEC_LOONGSON_PEXTR, UNSPEC_LOONGSON_PINSR_0) (UNSPEC_LOONGSON_PINSR_1, UNSPEC_LOONGSON_PINSR_2) (UNSPEC_LOONGSON_PINSR_3, UNSPEC_LOONGSON_PMADD) (UNSPEC_LOONGSON_PMOVMSK, UNSPEC_LOONGSON_PMULHU) (UNSPEC_LOONGSON_PMULH, UNSPEC_LOONGSON_PMULL, UNSPEC_LOONGSON_PMULU) (UNSPEC_LOONGSON_PASUBUB, UNSPEC_LOONGSON_BIADD, UNSPEC_LOONGSON_PSADBH) (UNSPEC_LOONGSON_PSHUFH, UNSPEC_LOONGSON_PUNPCKH) (UNSPEC_LOONGSON_PUNPCKL, UNSPEC_LOONGSON_PADDD) (UNSPEC_LOONGSON_PSUBD): Move to mips-loongson.md. (UNSPEC_LOONGSON_ALU1_TURN_ENABLED_INSN) (UNSPEC_LOONGSON_ALU2_TURN_ENABLED_INSN) (UNSPEC_LOONGSON_FALU1_TURN_ENABLED_INSN) (UNSPEC_LOONGSON_FALU2_TURN_ENABLED_INSN): Moved to mips-loongson2ef.md. (cpu): Update comment. * config/mips/sync.md (UNSPEC_COMPARE_AND_SWAP) (UNSPEC_COMPARE_AND_SWAP_12, UNSPEC_SYNC_OLD_OP, UNSPEC_SYNC_NEW_OP) (UNSPEC_SYNC_NEW_OP_12, UNSPEC_SYNC_OLD_OP_12, UNSPEC_SYNC_EXCHANGE) (UNSPEC_SYNC_EXCHANGE_12, UNSPEC_MEMORY_BARRIER): Moved from mips.md. * config/mips/loongson.md (UNSPEC_LOONGSON_PAVG, UNSPEC_LOONGSON_PCMPEQ) (UNSPEC_LOONGSON_PCMPGT, UNSPEC_LOONGSON_PEXTR, UNSPEC_LOONGSON_PINSR_0) (UNSPEC_LOONGSON_PINSR_1, UNSPEC_LOONGSON_PINSR_2) (UNSPEC_LOONGSON_PINSR_3, UNSPEC_LOONGSON_PMADD) (UNSPEC_LOONGSON_PMOVMSK, UNSPEC_LOONGSON_PMULHU) (UNSPEC_LOONGSON_PMULH, UNSPEC_LOONGSON_PMULL, UNSPEC_LOONGSON_PMULU) (UNSPEC_LOONGSON_PASUBUB, UNSPEC_LOONGSON_BIADD, UNSPEC_LOONGSON_PSADBH) (UNSPEC_LOONGSON_PSHUFH, UNSPEC_LOONGSON_PUNPCKH) (UNSPEC_LOONGSON_PUNPCKL, UNSPEC_LOONGSON_PADDD) (UNSPEC_LOONGSON_PSUBD): Moved from mips.md * config/mips/loongson2ef.md (UNSPEC_LOONGSON_ALU1_TURN_ENABLED_INSN) (UNSPEC_LOONGSON_ALU2_TURN_ENABLED_INSN) (UNSPEC_LOONGSON_FALU1_TURN_ENABLED_INSN) (UNSPEC_LOONGSON_FALU2_TURN_ENABLED_INSN): Moved from mips.md * config/mips/mips-dsp.md (UNSPEC_ADDQ, UNSPEC_ADDQ_S, UNSPEC_SUBQ) (UNSPEC_SUBQ_S, UNSPEC_ADDSC, UNSPEC_ADDWC, UNSPEC_MODSUB) (UNSPEC_RADDU_W_QB, UNSPEC_ABSQ_S, UNSPEC_PRECRQ_QB_PH) (UNSPEC_PRECRQ_PH_W, UNSPEC_PRECRQ_RS_PH_W, UNSPEC_PRECRQU_S_QB_PH) (UNSPEC_PRECEQ_W_PHL, UNSPEC_PRECEQ_W_PHR, UNSPEC_PRECEQU_PH_QBL) (UNSPEC_PRECEQU_PH_QBR, UNSPEC_PRECEQU_PH_QBLA, UNSPEC_PRECEQU_PH_QBRA) (UNSPEC_PRECEU_PH_QBL, UNSPEC_PRECEU_PH_QBR, UNSPEC_PRECEU_PH_QBLA) (UNSPEC_PRECEU_PH_QBRA, UNSPEC_SHLL, UNSPEC_SHLL_S, UNSPEC_SHRL_QB) (UNSPEC_SHRA_PH, UNSPEC_SHRA_R, UNSPEC_MULEU_S_PH_QBL) (UNSPEC_MULEU_S_PH_QBR, UNSPEC_MULQ_RS_PH, UNSPEC_MULEQ_S_W_PHL) (UNSPEC_MULEQ_S_W_PHR, UNSPEC_DPAU_H_QBL, UNSPEC_DPAU_H_QBR) (UNSPEC_DPSU_H_QBL, UNSPEC_DPSU_H_QBR, UNSPEC_DPAQ_S_W_PH) (UNSPEC_DPSQ_S_W_PH, UNSPEC_MULSAQ_S_W_PH, UNSPEC_DPAQ_SA_L_W) (UNSPEC_DPSQ_SA_L_W, UNSPEC_MAQ_S_W_PHL, UNSPEC_MAQ_S_W_PHR) (UNSPEC_MAQ_SA_W_PHL, UNSPEC_MAQ_SA_W_PHR, UNSPEC_BITREV, UNSPEC_INSV) (UNSPEC_REPL_QB, UNSPEC_REPL_PH, UNSPEC_CMP_EQ, UNSPEC_CMP_LT) (UNSPEC_CMP_LE, UNSPEC_CMPGU_EQ_QB, UNSPEC_CMPGU_LT_QB) (UNSPEC_CMPGU_LE_QB, UNSPEC_PICK, UNSPEC_PACKRL_PH, UNSPEC_EXTR_W) (UNSPEC_EXTR_R_W, UNSPEC_EXTR_RS_W, UNSPEC_EXTR_S_H, UNSPEC_EXTP) (UNSPEC_EXTPDP, UNSPEC_SHILO, UNSPEC_MTHLIP, UNSPEC_WRDSP) (UNSPEC_RDDSP): Moved from mips.md. * config/mips/mips-dspr2.md (UNSPEC_ABSQ_S_QB, UNSPEC_ADDU_PH) (UNSPEC_ADDU_S_PH, UNSPEC_ADDUH_QB, UNSPEC_ADDUH_R_QB, UNSPEC_APPEND) (UNSPEC_BALIGN, UNSPEC_CMPGDU_EQ_QB, UNSPEC_CMPGDU_LT_QB) (UNSPEC_CMPGDU_LE_QB, UNSPEC_DPA_W_PH, UNSPEC_DPS_W_PH, UNSPEC_MADD) (UNSPEC_MADDU, UNSPEC_MSUB, UNSPEC_MSUBU, UNSPEC_MUL_PH) (UNSPEC_MUL_S_PH, UNSPEC_MULQ_RS_W, UNSPEC_MULQ_S_PH, UNSPEC_MULQ_S_W) (UNSPEC_MULSA_W_PH, UNSPEC_MULT, UNSPEC_MULTU, UNSPEC_PRECR_QB_PH) (UNSPEC_PRECR_SRA_PH_W, UNSPEC_PRECR_SRA_R_PH_W, UNSPEC_PREPEND) (UNSPEC_SHRA_QB, UNSPEC_SHRA_R_QB, UNSPEC_SHRL_PH, UNSPEC_SUBU_PH) (UNSPEC_SUBU_S_PH, UNSPEC_SUBUH_QB, UNSPEC_SUBUH_R_QB, UNSPEC_ADDQH_PH) (UNSPEC_ADDQH_R_PH, UNSPEC_ADDQH_W, UNSPEC_ADDQH_R_W, UNSPEC_SUBQH_PH) (UNSPEC_SUBQH_R_PH, UNSPEC_SUBQH_W, UNSPEC_SUBQH_R_W, UNSPEC_DPAX_W_PH) (UNSPEC_DPSX_W_PH, UNSPEC_DPAQX_S_W_PH, UNSPEC_DPAQX_SA_W_PH) (UNSPEC_DPSQX_S_W_PH, UNSPEC_DPSQX_SA_W_PH): Moved from mips.md. * config/mips/mips-ps-3d.md (UNSPEC_MOVE_TF_PS, UNSPEC_C) (UNSPEC_ALNV_PS, UNSPEC_CABS, UNSPEC_ADDR_PS, UNSPEC_CVT_PW_PS) (UNSPEC_CVT_PS_PW, UNSPEC_MULR_PS, UNSPEC_ABS_PS, UNSPEC_RSQRT1) (UNSPEC_RSQRT2, UNSPEC_RECIP1, UNSPEC_RECIP2, UNSPEC_SINGLE_CC) (UNSPEC_SCC): Moved from mips.md. * config/mips/mips.c (mips_arch, mips_tune): Change enum from "processor_type" to "processor". (mips_rtx_cost_data): Replace PROCESSOR_MAX with NUM_PROCESSOR_VALUES. * config/mips/mips.h (processor_type): Delete. (mips_cpu_info.cpu, mips_arch, mips_tune): Change enum from "processor_type" to "processor". From-SVN: r160580
This commit is contained in:
parent
c513ce776c
commit
24609606bd
14 changed files with 764 additions and 323 deletions
142
gcc/ChangeLog
142
gcc/ChangeLog
|
@ -1,3 +1,145 @@
|
|||
2010-06-10 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
|
||||
* doc/md.texi (define_c_enum, define_enum): Document.
|
||||
* read-md.h (md_constant): Add a parent_enum field.
|
||||
(enum_value, enum_type): New structures.
|
||||
(upcase_string, traverse_enum_types): Declare.
|
||||
* read-md.c (enum_types): New variable.
|
||||
(upcase_string, add_constant): New functions.
|
||||
(handle_constants): Don't create the hash table here.
|
||||
Use add_constant.
|
||||
(traverse_md_constants): Don't check for a null md_constants.
|
||||
(decimal_string, handle_enum, traverse_enum_types): New functions.
|
||||
(read_md_files): Initialize md_constants and md_enums.
|
||||
* genconstants.c (print_md_constant): Ignore info argument.
|
||||
Only print constants that belong to no enum.
|
||||
(print_enum_type): New function.
|
||||
(main): Don't pass stdout to print_md_constant. Call print_enum_type
|
||||
for each defined enum type.
|
||||
* config/mips/mips.md (processor): New define_enum.
|
||||
(unspec): New define_c_enum.
|
||||
(UNSPEC_COMPARE_AND_SWAP, UNSPEC_COMPARE_AND_SWAP_12)
|
||||
(UNSPEC_SYNC_OLD_OP, UNSPEC_SYNC_NEW_OP, UNSPEC_SYNC_NEW_OP_12)
|
||||
(UNSPEC_SYNC_OLD_OP_12, UNSPEC_SYNC_EXCHANGE, UNSPEC_SYNC_EXCHANGE_12)
|
||||
(UNSPEC_MEMORY_BARRIER): Moved to sync.md.
|
||||
(UNSPEC_ADDQ, UNSPEC_ADDQ_S, UNSPEC_SUBQ, UNSPEC_SUBQ_S, UNSPEC_ADDSC)
|
||||
(UNSPEC_ADDWC, UNSPEC_MODSUB, UNSPEC_RADDU_W_QB, UNSPEC_ABSQ_S)
|
||||
(UNSPEC_PRECRQ_QB_PH, UNSPEC_PRECRQ_PH_W, UNSPEC_PRECRQ_RS_PH_W)
|
||||
(UNSPEC_PRECRQU_S_QB_PH, UNSPEC_PRECEQ_W_PHL, UNSPEC_PRECEQ_W_PHR)
|
||||
(UNSPEC_PRECEQU_PH_QBL, UNSPEC_PRECEQU_PH_QBR, UNSPEC_PRECEQU_PH_QBLA)
|
||||
(UNSPEC_PRECEQU_PH_QBRA, UNSPEC_PRECEU_PH_QBL, UNSPEC_PRECEU_PH_QBR)
|
||||
(UNSPEC_PRECEU_PH_QBLA, UNSPEC_PRECEU_PH_QBRA, UNSPEC_SHLL)
|
||||
(UNSPEC_SHLL_S, UNSPEC_SHRL_QB, UNSPEC_SHRA_PH, UNSPEC_SHRA_R)
|
||||
(UNSPEC_MULEU_S_PH_QBL, UNSPEC_MULEU_S_PH_QBR, UNSPEC_MULQ_RS_PH)
|
||||
(UNSPEC_MULEQ_S_W_PHL, UNSPEC_MULEQ_S_W_PHR, UNSPEC_DPAU_H_QBL)
|
||||
(UNSPEC_DPAU_H_QBR, UNSPEC_DPSU_H_QBL, UNSPEC_DPSU_H_QBR)
|
||||
(UNSPEC_DPAQ_S_W_PH, UNSPEC_DPSQ_S_W_PH, UNSPEC_MULSAQ_S_W_PH)
|
||||
(UNSPEC_DPAQ_SA_L_W, UNSPEC_DPSQ_SA_L_W, UNSPEC_MAQ_S_W_PHL)
|
||||
(UNSPEC_MAQ_S_W_PHR, UNSPEC_MAQ_SA_W_PHL, UNSPEC_MAQ_SA_W_PHR)
|
||||
(UNSPEC_BITREV, UNSPEC_INSV, UNSPEC_REPL_QB, UNSPEC_REPL_PH)
|
||||
(UNSPEC_CMP_EQ, UNSPEC_CMP_LT, UNSPEC_CMP_LE, UNSPEC_CMPGU_EQ_QB)
|
||||
(UNSPEC_CMPGU_LT_QB, UNSPEC_CMPGU_LE_QB, UNSPEC_PICK, UNSPEC_PACKRL_PH)
|
||||
(UNSPEC_EXTR_W, UNSPEC_EXTR_R_W, UNSPEC_EXTR_RS_W, UNSPEC_EXTR_S_H)
|
||||
(UNSPEC_EXTP, UNSPEC_EXTPDP, UNSPEC_SHILO, UNSPEC_MTHLIP, UNSPEC_WRDSP)
|
||||
(UNSPEC_RDDSP): Move to mips-dsp.md.
|
||||
(UNSPEC_ABSQ_S_QB, UNSPEC_ADDU_PH, UNSPEC_ADDU_S_PH, UNSPEC_ADDUH_QB)
|
||||
(UNSPEC_ADDUH_R_QB, UNSPEC_APPEND, UNSPEC_BALIGN, UNSPEC_CMPGDU_EQ_QB)
|
||||
(UNSPEC_CMPGDU_LT_QB, UNSPEC_CMPGDU_LE_QB, UNSPEC_DPA_W_PH)
|
||||
(UNSPEC_DPS_W_PH, UNSPEC_MADD, UNSPEC_MADDU, UNSPEC_MSUB, UNSPEC_MSUBU)
|
||||
(UNSPEC_MUL_PH, UNSPEC_MUL_S_PH, UNSPEC_MULQ_RS_W, UNSPEC_MULQ_S_PH)
|
||||
(UNSPEC_MULQ_S_W, UNSPEC_MULSA_W_PH, UNSPEC_MULT, UNSPEC_MULTU)
|
||||
(UNSPEC_PRECR_QB_PH, UNSPEC_PRECR_SRA_PH_W, UNSPEC_PRECR_SRA_R_PH_W)
|
||||
(UNSPEC_PREPEND, UNSPEC_SHRA_QB, UNSPEC_SHRA_R_QB, UNSPEC_SHRL_PH)
|
||||
(UNSPEC_SUBU_PH, UNSPEC_SUBU_S_PH, UNSPEC_SUBUH_QB, UNSPEC_SUBUH_R_QB)
|
||||
(UNSPEC_ADDQH_PH, UNSPEC_ADDQH_R_PH, UNSPEC_ADDQH_W, UNSPEC_ADDQH_R_W)
|
||||
(UNSPEC_SUBQH_PH, UNSPEC_SUBQH_R_PH, UNSPEC_SUBQH_W, UNSPEC_SUBQH_R_W)
|
||||
(UNSPEC_DPAX_W_PH, UNSPEC_DPSX_W_PH, UNSPEC_DPAQX_S_W_PH)
|
||||
(UNSPEC_DPAQX_SA_W_PH, UNSPEC_DPSQX_S_W_PH, UNSPEC_DPSQX_SA_W_PH):
|
||||
Moved to mips-dspr2.md.
|
||||
(UNSPEC_MOVE_TF_PS, UNSPEC_C, UNSPEC_ALNV_PS, UNSPEC_CABS)
|
||||
(UNSPEC_ADDR_PS, UNSPEC_CVT_PW_PS, UNSPEC_CVT_PS_PW, UNSPEC_MULR_PS)
|
||||
(UNSPEC_ABS_PS, UNSPEC_RSQRT1, UNSPEC_RSQRT2, UNSPEC_RECIP1)
|
||||
(UNSPEC_RECIP2, UNSPEC_SINGLE_CC, UNSPEC_SCC): Moved from mips-ps-3d.md.
|
||||
(UNSPEC_LOONGSON_PAVG, UNSPEC_LOONGSON_PCMPEQ, UNSPEC_LOONGSON_PCMPGT)
|
||||
(UNSPEC_LOONGSON_PEXTR, UNSPEC_LOONGSON_PINSR_0)
|
||||
(UNSPEC_LOONGSON_PINSR_1, UNSPEC_LOONGSON_PINSR_2)
|
||||
(UNSPEC_LOONGSON_PINSR_3, UNSPEC_LOONGSON_PMADD)
|
||||
(UNSPEC_LOONGSON_PMOVMSK, UNSPEC_LOONGSON_PMULHU)
|
||||
(UNSPEC_LOONGSON_PMULH, UNSPEC_LOONGSON_PMULL, UNSPEC_LOONGSON_PMULU)
|
||||
(UNSPEC_LOONGSON_PASUBUB, UNSPEC_LOONGSON_BIADD, UNSPEC_LOONGSON_PSADBH)
|
||||
(UNSPEC_LOONGSON_PSHUFH, UNSPEC_LOONGSON_PUNPCKH)
|
||||
(UNSPEC_LOONGSON_PUNPCKL, UNSPEC_LOONGSON_PADDD)
|
||||
(UNSPEC_LOONGSON_PSUBD): Move to mips-loongson.md.
|
||||
(UNSPEC_LOONGSON_ALU1_TURN_ENABLED_INSN)
|
||||
(UNSPEC_LOONGSON_ALU2_TURN_ENABLED_INSN)
|
||||
(UNSPEC_LOONGSON_FALU1_TURN_ENABLED_INSN)
|
||||
(UNSPEC_LOONGSON_FALU2_TURN_ENABLED_INSN): Moved to mips-loongson2ef.md.
|
||||
(cpu): Update comment.
|
||||
* config/mips/sync.md (UNSPEC_COMPARE_AND_SWAP)
|
||||
(UNSPEC_COMPARE_AND_SWAP_12, UNSPEC_SYNC_OLD_OP, UNSPEC_SYNC_NEW_OP)
|
||||
(UNSPEC_SYNC_NEW_OP_12, UNSPEC_SYNC_OLD_OP_12, UNSPEC_SYNC_EXCHANGE)
|
||||
(UNSPEC_SYNC_EXCHANGE_12, UNSPEC_MEMORY_BARRIER): Moved from mips.md.
|
||||
* config/mips/loongson.md (UNSPEC_LOONGSON_PAVG, UNSPEC_LOONGSON_PCMPEQ)
|
||||
(UNSPEC_LOONGSON_PCMPGT, UNSPEC_LOONGSON_PEXTR, UNSPEC_LOONGSON_PINSR_0)
|
||||
(UNSPEC_LOONGSON_PINSR_1, UNSPEC_LOONGSON_PINSR_2)
|
||||
(UNSPEC_LOONGSON_PINSR_3, UNSPEC_LOONGSON_PMADD)
|
||||
(UNSPEC_LOONGSON_PMOVMSK, UNSPEC_LOONGSON_PMULHU)
|
||||
(UNSPEC_LOONGSON_PMULH, UNSPEC_LOONGSON_PMULL, UNSPEC_LOONGSON_PMULU)
|
||||
(UNSPEC_LOONGSON_PASUBUB, UNSPEC_LOONGSON_BIADD, UNSPEC_LOONGSON_PSADBH)
|
||||
(UNSPEC_LOONGSON_PSHUFH, UNSPEC_LOONGSON_PUNPCKH)
|
||||
(UNSPEC_LOONGSON_PUNPCKL, UNSPEC_LOONGSON_PADDD)
|
||||
(UNSPEC_LOONGSON_PSUBD): Moved from mips.md
|
||||
* config/mips/loongson2ef.md (UNSPEC_LOONGSON_ALU1_TURN_ENABLED_INSN)
|
||||
(UNSPEC_LOONGSON_ALU2_TURN_ENABLED_INSN)
|
||||
(UNSPEC_LOONGSON_FALU1_TURN_ENABLED_INSN)
|
||||
(UNSPEC_LOONGSON_FALU2_TURN_ENABLED_INSN): Moved from mips.md
|
||||
* config/mips/mips-dsp.md (UNSPEC_ADDQ, UNSPEC_ADDQ_S, UNSPEC_SUBQ)
|
||||
(UNSPEC_SUBQ_S, UNSPEC_ADDSC, UNSPEC_ADDWC, UNSPEC_MODSUB)
|
||||
(UNSPEC_RADDU_W_QB, UNSPEC_ABSQ_S, UNSPEC_PRECRQ_QB_PH)
|
||||
(UNSPEC_PRECRQ_PH_W, UNSPEC_PRECRQ_RS_PH_W, UNSPEC_PRECRQU_S_QB_PH)
|
||||
(UNSPEC_PRECEQ_W_PHL, UNSPEC_PRECEQ_W_PHR, UNSPEC_PRECEQU_PH_QBL)
|
||||
(UNSPEC_PRECEQU_PH_QBR, UNSPEC_PRECEQU_PH_QBLA, UNSPEC_PRECEQU_PH_QBRA)
|
||||
(UNSPEC_PRECEU_PH_QBL, UNSPEC_PRECEU_PH_QBR, UNSPEC_PRECEU_PH_QBLA)
|
||||
(UNSPEC_PRECEU_PH_QBRA, UNSPEC_SHLL, UNSPEC_SHLL_S, UNSPEC_SHRL_QB)
|
||||
(UNSPEC_SHRA_PH, UNSPEC_SHRA_R, UNSPEC_MULEU_S_PH_QBL)
|
||||
(UNSPEC_MULEU_S_PH_QBR, UNSPEC_MULQ_RS_PH, UNSPEC_MULEQ_S_W_PHL)
|
||||
(UNSPEC_MULEQ_S_W_PHR, UNSPEC_DPAU_H_QBL, UNSPEC_DPAU_H_QBR)
|
||||
(UNSPEC_DPSU_H_QBL, UNSPEC_DPSU_H_QBR, UNSPEC_DPAQ_S_W_PH)
|
||||
(UNSPEC_DPSQ_S_W_PH, UNSPEC_MULSAQ_S_W_PH, UNSPEC_DPAQ_SA_L_W)
|
||||
(UNSPEC_DPSQ_SA_L_W, UNSPEC_MAQ_S_W_PHL, UNSPEC_MAQ_S_W_PHR)
|
||||
(UNSPEC_MAQ_SA_W_PHL, UNSPEC_MAQ_SA_W_PHR, UNSPEC_BITREV, UNSPEC_INSV)
|
||||
(UNSPEC_REPL_QB, UNSPEC_REPL_PH, UNSPEC_CMP_EQ, UNSPEC_CMP_LT)
|
||||
(UNSPEC_CMP_LE, UNSPEC_CMPGU_EQ_QB, UNSPEC_CMPGU_LT_QB)
|
||||
(UNSPEC_CMPGU_LE_QB, UNSPEC_PICK, UNSPEC_PACKRL_PH, UNSPEC_EXTR_W)
|
||||
(UNSPEC_EXTR_R_W, UNSPEC_EXTR_RS_W, UNSPEC_EXTR_S_H, UNSPEC_EXTP)
|
||||
(UNSPEC_EXTPDP, UNSPEC_SHILO, UNSPEC_MTHLIP, UNSPEC_WRDSP)
|
||||
(UNSPEC_RDDSP): Moved from mips.md.
|
||||
* config/mips/mips-dspr2.md (UNSPEC_ABSQ_S_QB, UNSPEC_ADDU_PH)
|
||||
(UNSPEC_ADDU_S_PH, UNSPEC_ADDUH_QB, UNSPEC_ADDUH_R_QB, UNSPEC_APPEND)
|
||||
(UNSPEC_BALIGN, UNSPEC_CMPGDU_EQ_QB, UNSPEC_CMPGDU_LT_QB)
|
||||
(UNSPEC_CMPGDU_LE_QB, UNSPEC_DPA_W_PH, UNSPEC_DPS_W_PH, UNSPEC_MADD)
|
||||
(UNSPEC_MADDU, UNSPEC_MSUB, UNSPEC_MSUBU, UNSPEC_MUL_PH)
|
||||
(UNSPEC_MUL_S_PH, UNSPEC_MULQ_RS_W, UNSPEC_MULQ_S_PH, UNSPEC_MULQ_S_W)
|
||||
(UNSPEC_MULSA_W_PH, UNSPEC_MULT, UNSPEC_MULTU, UNSPEC_PRECR_QB_PH)
|
||||
(UNSPEC_PRECR_SRA_PH_W, UNSPEC_PRECR_SRA_R_PH_W, UNSPEC_PREPEND)
|
||||
(UNSPEC_SHRA_QB, UNSPEC_SHRA_R_QB, UNSPEC_SHRL_PH, UNSPEC_SUBU_PH)
|
||||
(UNSPEC_SUBU_S_PH, UNSPEC_SUBUH_QB, UNSPEC_SUBUH_R_QB, UNSPEC_ADDQH_PH)
|
||||
(UNSPEC_ADDQH_R_PH, UNSPEC_ADDQH_W, UNSPEC_ADDQH_R_W, UNSPEC_SUBQH_PH)
|
||||
(UNSPEC_SUBQH_R_PH, UNSPEC_SUBQH_W, UNSPEC_SUBQH_R_W, UNSPEC_DPAX_W_PH)
|
||||
(UNSPEC_DPSX_W_PH, UNSPEC_DPAQX_S_W_PH, UNSPEC_DPAQX_SA_W_PH)
|
||||
(UNSPEC_DPSQX_S_W_PH, UNSPEC_DPSQX_SA_W_PH): Moved from mips.md.
|
||||
* config/mips/mips-ps-3d.md (UNSPEC_MOVE_TF_PS, UNSPEC_C)
|
||||
(UNSPEC_ALNV_PS, UNSPEC_CABS, UNSPEC_ADDR_PS, UNSPEC_CVT_PW_PS)
|
||||
(UNSPEC_CVT_PS_PW, UNSPEC_MULR_PS, UNSPEC_ABS_PS, UNSPEC_RSQRT1)
|
||||
(UNSPEC_RSQRT2, UNSPEC_RECIP1, UNSPEC_RECIP2, UNSPEC_SINGLE_CC)
|
||||
(UNSPEC_SCC): Moved from mips.md.
|
||||
* config/mips/mips.c (mips_arch, mips_tune): Change enum from
|
||||
"processor_type" to "processor".
|
||||
(mips_rtx_cost_data): Replace PROCESSOR_MAX with NUM_PROCESSOR_VALUES.
|
||||
* config/mips/mips.h (processor_type): Delete.
|
||||
(mips_cpu_info.cpu, mips_arch, mips_tune): Change enum from
|
||||
"processor_type" to "processor".
|
||||
|
||||
2010-06-10 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
|
||||
* configure.ac (tm_include_list): Add insn-constants.h.
|
||||
|
|
|
@ -18,6 +18,31 @@
|
|||
;; along with GCC; see the file COPYING3. If not see
|
||||
;; <http://www.gnu.org/licenses/>.
|
||||
|
||||
(define_c_enum "unspec" [
|
||||
UNSPEC_LOONGSON_PAVG
|
||||
UNSPEC_LOONGSON_PCMPEQ
|
||||
UNSPEC_LOONGSON_PCMPGT
|
||||
UNSPEC_LOONGSON_PEXTR
|
||||
UNSPEC_LOONGSON_PINSR_0
|
||||
UNSPEC_LOONGSON_PINSR_1
|
||||
UNSPEC_LOONGSON_PINSR_2
|
||||
UNSPEC_LOONGSON_PINSR_3
|
||||
UNSPEC_LOONGSON_PMADD
|
||||
UNSPEC_LOONGSON_PMOVMSK
|
||||
UNSPEC_LOONGSON_PMULHU
|
||||
UNSPEC_LOONGSON_PMULH
|
||||
UNSPEC_LOONGSON_PMULL
|
||||
UNSPEC_LOONGSON_PMULU
|
||||
UNSPEC_LOONGSON_PASUBUB
|
||||
UNSPEC_LOONGSON_BIADD
|
||||
UNSPEC_LOONGSON_PSADBH
|
||||
UNSPEC_LOONGSON_PSHUFH
|
||||
UNSPEC_LOONGSON_PUNPCKH
|
||||
UNSPEC_LOONGSON_PUNPCKL
|
||||
UNSPEC_LOONGSON_PADDD
|
||||
UNSPEC_LOONGSON_PSUBD
|
||||
])
|
||||
|
||||
;; Mode iterators and attributes.
|
||||
|
||||
;; 64-bit vectors of bytes.
|
||||
|
|
|
@ -17,6 +17,13 @@
|
|||
;; along with GCC; see the file COPYING3. If not see
|
||||
;; <http://www.gnu.org/licenses/>.
|
||||
|
||||
(define_c_enum "unspec" [
|
||||
UNSPEC_LOONGSON_ALU1_TURN_ENABLED_INSN
|
||||
UNSPEC_LOONGSON_ALU2_TURN_ENABLED_INSN
|
||||
UNSPEC_LOONGSON_FALU1_TURN_ENABLED_INSN
|
||||
UNSPEC_LOONGSON_FALU2_TURN_ENABLED_INSN
|
||||
])
|
||||
|
||||
;; Automaton for integer instructions.
|
||||
(define_automaton "ls2_alu")
|
||||
|
||||
|
|
|
@ -16,6 +16,78 @@
|
|||
;; along with GCC; see the file COPYING3. If not see
|
||||
;; <http://www.gnu.org/licenses/>.
|
||||
|
||||
;; MIPS DSP ASE Revision 0.98 3/24/2005
|
||||
(define_c_enum "unspec" [
|
||||
UNSPEC_ADDQ
|
||||
UNSPEC_ADDQ_S
|
||||
UNSPEC_SUBQ
|
||||
UNSPEC_SUBQ_S
|
||||
UNSPEC_ADDSC
|
||||
UNSPEC_ADDWC
|
||||
UNSPEC_MODSUB
|
||||
UNSPEC_RADDU_W_QB
|
||||
UNSPEC_ABSQ_S
|
||||
UNSPEC_PRECRQ_QB_PH
|
||||
UNSPEC_PRECRQ_PH_W
|
||||
UNSPEC_PRECRQ_RS_PH_W
|
||||
UNSPEC_PRECRQU_S_QB_PH
|
||||
UNSPEC_PRECEQ_W_PHL
|
||||
UNSPEC_PRECEQ_W_PHR
|
||||
UNSPEC_PRECEQU_PH_QBL
|
||||
UNSPEC_PRECEQU_PH_QBR
|
||||
UNSPEC_PRECEQU_PH_QBLA
|
||||
UNSPEC_PRECEQU_PH_QBRA
|
||||
UNSPEC_PRECEU_PH_QBL
|
||||
UNSPEC_PRECEU_PH_QBR
|
||||
UNSPEC_PRECEU_PH_QBLA
|
||||
UNSPEC_PRECEU_PH_QBRA
|
||||
UNSPEC_SHLL
|
||||
UNSPEC_SHLL_S
|
||||
UNSPEC_SHRL_QB
|
||||
UNSPEC_SHRA_PH
|
||||
UNSPEC_SHRA_R
|
||||
UNSPEC_MULEU_S_PH_QBL
|
||||
UNSPEC_MULEU_S_PH_QBR
|
||||
UNSPEC_MULQ_RS_PH
|
||||
UNSPEC_MULEQ_S_W_PHL
|
||||
UNSPEC_MULEQ_S_W_PHR
|
||||
UNSPEC_DPAU_H_QBL
|
||||
UNSPEC_DPAU_H_QBR
|
||||
UNSPEC_DPSU_H_QBL
|
||||
UNSPEC_DPSU_H_QBR
|
||||
UNSPEC_DPAQ_S_W_PH
|
||||
UNSPEC_DPSQ_S_W_PH
|
||||
UNSPEC_MULSAQ_S_W_PH
|
||||
UNSPEC_DPAQ_SA_L_W
|
||||
UNSPEC_DPSQ_SA_L_W
|
||||
UNSPEC_MAQ_S_W_PHL
|
||||
UNSPEC_MAQ_S_W_PHR
|
||||
UNSPEC_MAQ_SA_W_PHL
|
||||
UNSPEC_MAQ_SA_W_PHR
|
||||
UNSPEC_BITREV
|
||||
UNSPEC_INSV
|
||||
UNSPEC_REPL_QB
|
||||
UNSPEC_REPL_PH
|
||||
UNSPEC_CMP_EQ
|
||||
UNSPEC_CMP_LT
|
||||
UNSPEC_CMP_LE
|
||||
UNSPEC_CMPGU_EQ_QB
|
||||
UNSPEC_CMPGU_LT_QB
|
||||
UNSPEC_CMPGU_LE_QB
|
||||
UNSPEC_PICK
|
||||
UNSPEC_PACKRL_PH
|
||||
UNSPEC_EXTR_W
|
||||
UNSPEC_EXTR_R_W
|
||||
UNSPEC_EXTR_RS_W
|
||||
UNSPEC_EXTR_S_H
|
||||
UNSPEC_EXTP
|
||||
UNSPEC_EXTPDP
|
||||
UNSPEC_SHILO
|
||||
UNSPEC_MTHLIP
|
||||
UNSPEC_WRDSP
|
||||
UNSPEC_RDDSP
|
||||
])
|
||||
|
||||
(define_constants
|
||||
[(CCDSP_PO_REGNUM 182)
|
||||
(CCDSP_SC_REGNUM 183)
|
||||
|
|
|
@ -18,6 +18,58 @@
|
|||
;;
|
||||
; MIPS DSP ASE REV 2 Revision 0.02 11/24/2006
|
||||
|
||||
(define_c_enum "unspec" [
|
||||
UNSPEC_ABSQ_S_QB
|
||||
UNSPEC_ADDU_PH
|
||||
UNSPEC_ADDU_S_PH
|
||||
UNSPEC_ADDUH_QB
|
||||
UNSPEC_ADDUH_R_QB
|
||||
UNSPEC_APPEND
|
||||
UNSPEC_BALIGN
|
||||
UNSPEC_CMPGDU_EQ_QB
|
||||
UNSPEC_CMPGDU_LT_QB
|
||||
UNSPEC_CMPGDU_LE_QB
|
||||
UNSPEC_DPA_W_PH
|
||||
UNSPEC_DPS_W_PH
|
||||
UNSPEC_MADD
|
||||
UNSPEC_MADDU
|
||||
UNSPEC_MSUB
|
||||
UNSPEC_MSUBU
|
||||
UNSPEC_MUL_PH
|
||||
UNSPEC_MUL_S_PH
|
||||
UNSPEC_MULQ_RS_W
|
||||
UNSPEC_MULQ_S_PH
|
||||
UNSPEC_MULQ_S_W
|
||||
UNSPEC_MULSA_W_PH
|
||||
UNSPEC_MULT
|
||||
UNSPEC_MULTU
|
||||
UNSPEC_PRECR_QB_PH
|
||||
UNSPEC_PRECR_SRA_PH_W
|
||||
UNSPEC_PRECR_SRA_R_PH_W
|
||||
UNSPEC_PREPEND
|
||||
UNSPEC_SHRA_QB
|
||||
UNSPEC_SHRA_R_QB
|
||||
UNSPEC_SHRL_PH
|
||||
UNSPEC_SUBU_PH
|
||||
UNSPEC_SUBU_S_PH
|
||||
UNSPEC_SUBUH_QB
|
||||
UNSPEC_SUBUH_R_QB
|
||||
UNSPEC_ADDQH_PH
|
||||
UNSPEC_ADDQH_R_PH
|
||||
UNSPEC_ADDQH_W
|
||||
UNSPEC_ADDQH_R_W
|
||||
UNSPEC_SUBQH_PH
|
||||
UNSPEC_SUBQH_R_PH
|
||||
UNSPEC_SUBQH_W
|
||||
UNSPEC_SUBQH_R_W
|
||||
UNSPEC_DPAX_W_PH
|
||||
UNSPEC_DPSX_W_PH
|
||||
UNSPEC_DPAQX_S_W_PH
|
||||
UNSPEC_DPAQX_SA_W_PH
|
||||
UNSPEC_DPSQX_S_W_PH
|
||||
UNSPEC_DPSQX_SA_W_PH
|
||||
])
|
||||
|
||||
(define_insn "mips_absq_s_qb"
|
||||
[(parallel
|
||||
[(set (match_operand:V4QI 0 "register_operand" "=d")
|
||||
|
|
|
@ -17,6 +17,30 @@
|
|||
;; along with GCC; see the file COPYING3. If not see
|
||||
;; <http://www.gnu.org/licenses/>.
|
||||
|
||||
(define_c_enum "unspec" [
|
||||
UNSPEC_MOVE_TF_PS
|
||||
UNSPEC_C
|
||||
|
||||
;; MIPS64/MIPS32R2 alnv.ps
|
||||
UNSPEC_ALNV_PS
|
||||
|
||||
;; MIPS-3D instructions
|
||||
UNSPEC_CABS
|
||||
|
||||
UNSPEC_ADDR_PS
|
||||
UNSPEC_CVT_PW_PS
|
||||
UNSPEC_CVT_PS_PW
|
||||
UNSPEC_MULR_PS
|
||||
UNSPEC_ABS_PS
|
||||
|
||||
UNSPEC_RSQRT1
|
||||
UNSPEC_RSQRT2
|
||||
UNSPEC_RECIP1
|
||||
UNSPEC_RECIP2
|
||||
UNSPEC_SINGLE_CC
|
||||
UNSPEC_SCC
|
||||
])
|
||||
|
||||
(define_insn "*movcc_v2sf_<mode>"
|
||||
[(set (match_operand:V2SF 0 "register_operand" "=f,f")
|
||||
(if_then_else:V2SF
|
||||
|
|
|
@ -504,11 +504,11 @@ struct mips_asm_switch mips_noat = { "at", 0 };
|
|||
static bool mips_branch_likely;
|
||||
|
||||
/* The current instruction-set architecture. */
|
||||
enum processor_type mips_arch;
|
||||
enum processor mips_arch;
|
||||
const struct mips_cpu_info *mips_arch_info;
|
||||
|
||||
/* The processor that we should tune the code for. */
|
||||
enum processor_type mips_tune;
|
||||
enum processor mips_tune;
|
||||
const struct mips_cpu_info *mips_tune_info;
|
||||
|
||||
/* The ISA level associated with mips_arch. */
|
||||
|
@ -797,7 +797,8 @@ static const struct mips_rtx_cost_data mips_rtx_cost_optimize_size = {
|
|||
};
|
||||
|
||||
/* Costs to use when optimizing for speed, indexed by processor. */
|
||||
static const struct mips_rtx_cost_data mips_rtx_cost_data[PROCESSOR_MAX] = {
|
||||
static const struct mips_rtx_cost_data
|
||||
mips_rtx_cost_data[NUM_PROCESSOR_VALUES] = {
|
||||
{ /* R3000 */
|
||||
COSTS_N_INSNS (2), /* fp_add */
|
||||
COSTS_N_INSNS (4), /* fp_mult_sf */
|
||||
|
|
|
@ -28,53 +28,6 @@ along with GCC; see the file COPYING3. If not see
|
|||
|
||||
/* MIPS external variables defined in mips.c. */
|
||||
|
||||
/* Which processor to schedule for. Since there is no difference between
|
||||
a R2000 and R3000 in terms of the scheduler, we collapse them into
|
||||
just an R3000. The elements of the enumeration must match exactly
|
||||
the cpu attribute in the mips.md machine description. */
|
||||
|
||||
enum processor_type {
|
||||
PROCESSOR_R3000,
|
||||
PROCESSOR_4KC,
|
||||
PROCESSOR_4KP,
|
||||
PROCESSOR_5KC,
|
||||
PROCESSOR_5KF,
|
||||
PROCESSOR_20KC,
|
||||
PROCESSOR_24KC,
|
||||
PROCESSOR_24KF2_1,
|
||||
PROCESSOR_24KF1_1,
|
||||
PROCESSOR_74KC,
|
||||
PROCESSOR_74KF2_1,
|
||||
PROCESSOR_74KF1_1,
|
||||
PROCESSOR_74KF3_2,
|
||||
PROCESSOR_LOONGSON_2E,
|
||||
PROCESSOR_LOONGSON_2F,
|
||||
PROCESSOR_M4K,
|
||||
PROCESSOR_OCTEON,
|
||||
PROCESSOR_R3900,
|
||||
PROCESSOR_R6000,
|
||||
PROCESSOR_R4000,
|
||||
PROCESSOR_R4100,
|
||||
PROCESSOR_R4111,
|
||||
PROCESSOR_R4120,
|
||||
PROCESSOR_R4130,
|
||||
PROCESSOR_R4300,
|
||||
PROCESSOR_R4600,
|
||||
PROCESSOR_R4650,
|
||||
PROCESSOR_R5000,
|
||||
PROCESSOR_R5400,
|
||||
PROCESSOR_R5500,
|
||||
PROCESSOR_R7000,
|
||||
PROCESSOR_R8000,
|
||||
PROCESSOR_R9000,
|
||||
PROCESSOR_R10000,
|
||||
PROCESSOR_SB1,
|
||||
PROCESSOR_SB1A,
|
||||
PROCESSOR_SR71000,
|
||||
PROCESSOR_XLR,
|
||||
PROCESSOR_MAX
|
||||
};
|
||||
|
||||
/* Costs of various operations on the different architectures. */
|
||||
|
||||
struct mips_rtx_cost_data
|
||||
|
@ -121,7 +74,7 @@ struct mips_cpu_info {
|
|||
/* The internal processor number that most closely matches this
|
||||
entry. Several processors can have the same value, if there's no
|
||||
difference between them from GCC's point of view. */
|
||||
enum processor_type cpu;
|
||||
enum processor cpu;
|
||||
|
||||
/* The ISA level that the processor implements. */
|
||||
int isa;
|
||||
|
@ -3065,8 +3018,8 @@ extern int mips_dbx_regno[];
|
|||
extern int mips_dwarf_regno[];
|
||||
extern bool mips_split_p[];
|
||||
extern bool mips_split_hi_p[];
|
||||
extern enum processor_type mips_arch; /* which cpu to codegen for */
|
||||
extern enum processor_type mips_tune; /* which cpu to schedule for */
|
||||
extern enum processor mips_arch; /* which cpu to codegen for */
|
||||
extern enum processor mips_tune; /* which cpu to schedule for */
|
||||
extern int mips_isa; /* architectural level */
|
||||
extern int mips_abi; /* which ABI to use */
|
||||
extern const struct mips_cpu_info *mips_arch_info;
|
||||
|
|
|
@ -23,247 +23,119 @@
|
|||
;; along with GCC; see the file COPYING3. If not see
|
||||
;; <http://www.gnu.org/licenses/>.
|
||||
|
||||
(define_constants
|
||||
[(UNSPEC_LOAD_LOW 0)
|
||||
(UNSPEC_LOAD_HIGH 1)
|
||||
(UNSPEC_STORE_WORD 2)
|
||||
(UNSPEC_GET_FNADDR 3)
|
||||
(UNSPEC_BLOCKAGE 4)
|
||||
(UNSPEC_POTENTIAL_CPRESTORE 5)
|
||||
(UNSPEC_CPRESTORE 6)
|
||||
(UNSPEC_RESTORE_GP 7)
|
||||
(UNSPEC_MOVE_GP 8)
|
||||
(UNSPEC_EH_RETURN 9)
|
||||
(UNSPEC_CONSTTABLE_INT 10)
|
||||
(UNSPEC_CONSTTABLE_FLOAT 11)
|
||||
(UNSPEC_ALIGN 14)
|
||||
(UNSPEC_HIGH 17)
|
||||
(UNSPEC_LOAD_LEFT 18)
|
||||
(UNSPEC_LOAD_RIGHT 19)
|
||||
(UNSPEC_STORE_LEFT 20)
|
||||
(UNSPEC_STORE_RIGHT 21)
|
||||
(UNSPEC_LOADGP 22)
|
||||
(UNSPEC_LOAD_CALL 23)
|
||||
(UNSPEC_LOAD_GOT 24)
|
||||
(UNSPEC_GP 25)
|
||||
(UNSPEC_MFHI 26)
|
||||
(UNSPEC_MTHI 27)
|
||||
(UNSPEC_SET_HILO 28)
|
||||
(UNSPEC_TLS_LDM 29)
|
||||
(UNSPEC_TLS_GET_TP 30)
|
||||
(UNSPEC_MFHC1 31)
|
||||
(UNSPEC_MTHC1 32)
|
||||
(UNSPEC_CLEAR_HAZARD 33)
|
||||
(UNSPEC_RDHWR 34)
|
||||
(UNSPEC_SYNCI 35)
|
||||
(UNSPEC_SYNC 36)
|
||||
(UNSPEC_COMPARE_AND_SWAP 37)
|
||||
(UNSPEC_COMPARE_AND_SWAP_12 38)
|
||||
(UNSPEC_SYNC_OLD_OP 39)
|
||||
(UNSPEC_SYNC_NEW_OP 40)
|
||||
(UNSPEC_SYNC_NEW_OP_12 41)
|
||||
(UNSPEC_SYNC_OLD_OP_12 42)
|
||||
(UNSPEC_SYNC_EXCHANGE 43)
|
||||
(UNSPEC_SYNC_EXCHANGE_12 44)
|
||||
(UNSPEC_MEMORY_BARRIER 45)
|
||||
(UNSPEC_SET_GOT_VERSION 46)
|
||||
(UNSPEC_UPDATE_GOT_VERSION 47)
|
||||
(UNSPEC_COPYGP 48)
|
||||
(UNSPEC_ERET 49)
|
||||
(UNSPEC_DERET 50)
|
||||
(UNSPEC_DI 51)
|
||||
(UNSPEC_EHB 52)
|
||||
(UNSPEC_RDPGPR 53)
|
||||
(UNSPEC_COP0 54)
|
||||
;; Used in a call expression in place of args_size. It's present for PIC
|
||||
;; indirect calls where it contains args_size and the function symbol.
|
||||
(UNSPEC_CALL_ATTR 55)
|
||||
|
||||
(UNSPEC_ADDRESS_FIRST 100)
|
||||
(define_enum "processor" [
|
||||
r3000
|
||||
4kc
|
||||
4kp
|
||||
5kc
|
||||
5kf
|
||||
20kc
|
||||
24kc
|
||||
24kf2_1
|
||||
24kf1_1
|
||||
74kc
|
||||
74kf2_1
|
||||
74kf1_1
|
||||
74kf3_2
|
||||
loongson_2e
|
||||
loongson_2f
|
||||
m4k
|
||||
octeon
|
||||
r3900
|
||||
r6000
|
||||
r4000
|
||||
r4100
|
||||
r4111
|
||||
r4120
|
||||
r4130
|
||||
r4300
|
||||
r4600
|
||||
r4650
|
||||
r5000
|
||||
r5400
|
||||
r5500
|
||||
r7000
|
||||
r8000
|
||||
r9000
|
||||
r10000
|
||||
sb1
|
||||
sb1a
|
||||
sr71000
|
||||
xlr
|
||||
])
|
||||
|
||||
(TLS_GET_TP_REGNUM 3)
|
||||
(define_c_enum "unspec" [
|
||||
;; Unaligned accesses.
|
||||
UNSPEC_LOAD_LEFT
|
||||
UNSPEC_LOAD_RIGHT
|
||||
UNSPEC_STORE_LEFT
|
||||
UNSPEC_STORE_RIGHT
|
||||
|
||||
;; Floating-point moves.
|
||||
UNSPEC_LOAD_LOW
|
||||
UNSPEC_LOAD_HIGH
|
||||
UNSPEC_STORE_WORD
|
||||
UNSPEC_MFHC1
|
||||
UNSPEC_MTHC1
|
||||
|
||||
;; HI/LO moves.
|
||||
UNSPEC_MFHI
|
||||
UNSPEC_MTHI
|
||||
UNSPEC_SET_HILO
|
||||
|
||||
;; GP manipulation.
|
||||
UNSPEC_LOADGP
|
||||
UNSPEC_COPYGP
|
||||
UNSPEC_MOVE_GP
|
||||
UNSPEC_POTENTIAL_CPRESTORE
|
||||
UNSPEC_CPRESTORE
|
||||
UNSPEC_RESTORE_GP
|
||||
UNSPEC_EH_RETURN
|
||||
UNSPEC_GP
|
||||
UNSPEC_SET_GOT_VERSION
|
||||
UNSPEC_UPDATE_GOT_VERSION
|
||||
|
||||
;; Symbolic accesses.
|
||||
UNSPEC_LOAD_CALL
|
||||
UNSPEC_LOAD_GOT
|
||||
UNSPEC_TLS_LDM
|
||||
UNSPEC_TLS_GET_TP
|
||||
|
||||
;; MIPS16 constant pools.
|
||||
UNSPEC_ALIGN
|
||||
UNSPEC_CONSTTABLE_INT
|
||||
UNSPEC_CONSTTABLE_FLOAT
|
||||
|
||||
;; Blockage and synchronisation.
|
||||
UNSPEC_BLOCKAGE
|
||||
UNSPEC_CLEAR_HAZARD
|
||||
UNSPEC_RDHWR
|
||||
UNSPEC_SYNCI
|
||||
UNSPEC_SYNC
|
||||
|
||||
;; Cache manipulation.
|
||||
UNSPEC_MIPS_CACHE
|
||||
UNSPEC_R10K_CACHE_BARRIER
|
||||
|
||||
;; Interrupt handling.
|
||||
UNSPEC_ERET
|
||||
UNSPEC_DERET
|
||||
UNSPEC_DI
|
||||
UNSPEC_EHB
|
||||
UNSPEC_RDPGPR
|
||||
UNSPEC_COP0
|
||||
|
||||
;; Used in a call expression in place of args_size. It's present for PIC
|
||||
;; indirect calls where it contains args_size and the function symbol.
|
||||
UNSPEC_CALL_ATTR
|
||||
])
|
||||
|
||||
(define_constants
|
||||
[(TLS_GET_TP_REGNUM 3)
|
||||
(RETURN_ADDR_REGNUM 31)
|
||||
(CPRESTORE_SLOT_REGNUM 76)
|
||||
(GOT_VERSION_REGNUM 79)
|
||||
|
||||
;; For MIPS Paired-Singled Floating Point Instructions.
|
||||
|
||||
(UNSPEC_MOVE_TF_PS 200)
|
||||
(UNSPEC_C 201)
|
||||
|
||||
;; MIPS64/MIPS32R2 alnv.ps
|
||||
(UNSPEC_ALNV_PS 202)
|
||||
|
||||
;; MIPS-3D instructions
|
||||
(UNSPEC_CABS 203)
|
||||
|
||||
(UNSPEC_ADDR_PS 204)
|
||||
(UNSPEC_CVT_PW_PS 205)
|
||||
(UNSPEC_CVT_PS_PW 206)
|
||||
(UNSPEC_MULR_PS 207)
|
||||
(UNSPEC_ABS_PS 208)
|
||||
|
||||
(UNSPEC_RSQRT1 209)
|
||||
(UNSPEC_RSQRT2 210)
|
||||
(UNSPEC_RECIP1 211)
|
||||
(UNSPEC_RECIP2 212)
|
||||
(UNSPEC_SINGLE_CC 213)
|
||||
(UNSPEC_SCC 214)
|
||||
|
||||
;; MIPS DSP ASE Revision 0.98 3/24/2005
|
||||
(UNSPEC_ADDQ 300)
|
||||
(UNSPEC_ADDQ_S 301)
|
||||
(UNSPEC_SUBQ 302)
|
||||
(UNSPEC_SUBQ_S 303)
|
||||
(UNSPEC_ADDSC 304)
|
||||
(UNSPEC_ADDWC 305)
|
||||
(UNSPEC_MODSUB 306)
|
||||
(UNSPEC_RADDU_W_QB 307)
|
||||
(UNSPEC_ABSQ_S 308)
|
||||
(UNSPEC_PRECRQ_QB_PH 309)
|
||||
(UNSPEC_PRECRQ_PH_W 310)
|
||||
(UNSPEC_PRECRQ_RS_PH_W 311)
|
||||
(UNSPEC_PRECRQU_S_QB_PH 312)
|
||||
(UNSPEC_PRECEQ_W_PHL 313)
|
||||
(UNSPEC_PRECEQ_W_PHR 314)
|
||||
(UNSPEC_PRECEQU_PH_QBL 315)
|
||||
(UNSPEC_PRECEQU_PH_QBR 316)
|
||||
(UNSPEC_PRECEQU_PH_QBLA 317)
|
||||
(UNSPEC_PRECEQU_PH_QBRA 318)
|
||||
(UNSPEC_PRECEU_PH_QBL 319)
|
||||
(UNSPEC_PRECEU_PH_QBR 320)
|
||||
(UNSPEC_PRECEU_PH_QBLA 321)
|
||||
(UNSPEC_PRECEU_PH_QBRA 322)
|
||||
(UNSPEC_SHLL 323)
|
||||
(UNSPEC_SHLL_S 324)
|
||||
(UNSPEC_SHRL_QB 325)
|
||||
(UNSPEC_SHRA_PH 326)
|
||||
(UNSPEC_SHRA_R 327)
|
||||
(UNSPEC_MULEU_S_PH_QBL 328)
|
||||
(UNSPEC_MULEU_S_PH_QBR 329)
|
||||
(UNSPEC_MULQ_RS_PH 330)
|
||||
(UNSPEC_MULEQ_S_W_PHL 331)
|
||||
(UNSPEC_MULEQ_S_W_PHR 332)
|
||||
(UNSPEC_DPAU_H_QBL 333)
|
||||
(UNSPEC_DPAU_H_QBR 334)
|
||||
(UNSPEC_DPSU_H_QBL 335)
|
||||
(UNSPEC_DPSU_H_QBR 336)
|
||||
(UNSPEC_DPAQ_S_W_PH 337)
|
||||
(UNSPEC_DPSQ_S_W_PH 338)
|
||||
(UNSPEC_MULSAQ_S_W_PH 339)
|
||||
(UNSPEC_DPAQ_SA_L_W 340)
|
||||
(UNSPEC_DPSQ_SA_L_W 341)
|
||||
(UNSPEC_MAQ_S_W_PHL 342)
|
||||
(UNSPEC_MAQ_S_W_PHR 343)
|
||||
(UNSPEC_MAQ_SA_W_PHL 344)
|
||||
(UNSPEC_MAQ_SA_W_PHR 345)
|
||||
(UNSPEC_BITREV 346)
|
||||
(UNSPEC_INSV 347)
|
||||
(UNSPEC_REPL_QB 348)
|
||||
(UNSPEC_REPL_PH 349)
|
||||
(UNSPEC_CMP_EQ 350)
|
||||
(UNSPEC_CMP_LT 351)
|
||||
(UNSPEC_CMP_LE 352)
|
||||
(UNSPEC_CMPGU_EQ_QB 353)
|
||||
(UNSPEC_CMPGU_LT_QB 354)
|
||||
(UNSPEC_CMPGU_LE_QB 355)
|
||||
(UNSPEC_PICK 356)
|
||||
(UNSPEC_PACKRL_PH 357)
|
||||
(UNSPEC_EXTR_W 358)
|
||||
(UNSPEC_EXTR_R_W 359)
|
||||
(UNSPEC_EXTR_RS_W 360)
|
||||
(UNSPEC_EXTR_S_H 361)
|
||||
(UNSPEC_EXTP 362)
|
||||
(UNSPEC_EXTPDP 363)
|
||||
(UNSPEC_SHILO 364)
|
||||
(UNSPEC_MTHLIP 365)
|
||||
(UNSPEC_WRDSP 366)
|
||||
(UNSPEC_RDDSP 367)
|
||||
|
||||
;; MIPS DSP ASE REV 2 Revision 0.02 11/24/2006
|
||||
(UNSPEC_ABSQ_S_QB 400)
|
||||
(UNSPEC_ADDU_PH 401)
|
||||
(UNSPEC_ADDU_S_PH 402)
|
||||
(UNSPEC_ADDUH_QB 403)
|
||||
(UNSPEC_ADDUH_R_QB 404)
|
||||
(UNSPEC_APPEND 405)
|
||||
(UNSPEC_BALIGN 406)
|
||||
(UNSPEC_CMPGDU_EQ_QB 407)
|
||||
(UNSPEC_CMPGDU_LT_QB 408)
|
||||
(UNSPEC_CMPGDU_LE_QB 409)
|
||||
(UNSPEC_DPA_W_PH 410)
|
||||
(UNSPEC_DPS_W_PH 411)
|
||||
(UNSPEC_MADD 412)
|
||||
(UNSPEC_MADDU 413)
|
||||
(UNSPEC_MSUB 414)
|
||||
(UNSPEC_MSUBU 415)
|
||||
(UNSPEC_MUL_PH 416)
|
||||
(UNSPEC_MUL_S_PH 417)
|
||||
(UNSPEC_MULQ_RS_W 418)
|
||||
(UNSPEC_MULQ_S_PH 419)
|
||||
(UNSPEC_MULQ_S_W 420)
|
||||
(UNSPEC_MULSA_W_PH 421)
|
||||
(UNSPEC_MULT 422)
|
||||
(UNSPEC_MULTU 423)
|
||||
(UNSPEC_PRECR_QB_PH 424)
|
||||
(UNSPEC_PRECR_SRA_PH_W 425)
|
||||
(UNSPEC_PRECR_SRA_R_PH_W 426)
|
||||
(UNSPEC_PREPEND 427)
|
||||
(UNSPEC_SHRA_QB 428)
|
||||
(UNSPEC_SHRA_R_QB 429)
|
||||
(UNSPEC_SHRL_PH 430)
|
||||
(UNSPEC_SUBU_PH 431)
|
||||
(UNSPEC_SUBU_S_PH 432)
|
||||
(UNSPEC_SUBUH_QB 433)
|
||||
(UNSPEC_SUBUH_R_QB 434)
|
||||
(UNSPEC_ADDQH_PH 435)
|
||||
(UNSPEC_ADDQH_R_PH 436)
|
||||
(UNSPEC_ADDQH_W 437)
|
||||
(UNSPEC_ADDQH_R_W 438)
|
||||
(UNSPEC_SUBQH_PH 439)
|
||||
(UNSPEC_SUBQH_R_PH 440)
|
||||
(UNSPEC_SUBQH_W 441)
|
||||
(UNSPEC_SUBQH_R_W 442)
|
||||
(UNSPEC_DPAX_W_PH 443)
|
||||
(UNSPEC_DPSX_W_PH 444)
|
||||
(UNSPEC_DPAQX_S_W_PH 445)
|
||||
(UNSPEC_DPAQX_SA_W_PH 446)
|
||||
(UNSPEC_DPSQX_S_W_PH 447)
|
||||
(UNSPEC_DPSQX_SA_W_PH 448)
|
||||
|
||||
;; ST Microelectronics Loongson-2E/2F.
|
||||
(UNSPEC_LOONGSON_PAVG 500)
|
||||
(UNSPEC_LOONGSON_PCMPEQ 501)
|
||||
(UNSPEC_LOONGSON_PCMPGT 502)
|
||||
(UNSPEC_LOONGSON_PEXTR 503)
|
||||
(UNSPEC_LOONGSON_PINSR_0 504)
|
||||
(UNSPEC_LOONGSON_PINSR_1 505)
|
||||
(UNSPEC_LOONGSON_PINSR_2 506)
|
||||
(UNSPEC_LOONGSON_PINSR_3 507)
|
||||
(UNSPEC_LOONGSON_PMADD 508)
|
||||
(UNSPEC_LOONGSON_PMOVMSK 509)
|
||||
(UNSPEC_LOONGSON_PMULHU 510)
|
||||
(UNSPEC_LOONGSON_PMULH 511)
|
||||
(UNSPEC_LOONGSON_PMULL 512)
|
||||
(UNSPEC_LOONGSON_PMULU 513)
|
||||
(UNSPEC_LOONGSON_PASUBUB 514)
|
||||
(UNSPEC_LOONGSON_BIADD 515)
|
||||
(UNSPEC_LOONGSON_PSADBH 516)
|
||||
(UNSPEC_LOONGSON_PSHUFH 517)
|
||||
(UNSPEC_LOONGSON_PUNPCKH 518)
|
||||
(UNSPEC_LOONGSON_PUNPCKL 519)
|
||||
(UNSPEC_LOONGSON_PADDD 520)
|
||||
(UNSPEC_LOONGSON_PSUBD 521)
|
||||
|
||||
;; Used in loongson2ef.md
|
||||
(UNSPEC_LOONGSON_ALU1_TURN_ENABLED_INSN 530)
|
||||
(UNSPEC_LOONGSON_ALU2_TURN_ENABLED_INSN 531)
|
||||
(UNSPEC_LOONGSON_FALU1_TURN_ENABLED_INSN 532)
|
||||
(UNSPEC_LOONGSON_FALU2_TURN_ENABLED_INSN 533)
|
||||
|
||||
(UNSPEC_MIPS_CACHE 600)
|
||||
(UNSPEC_R10K_CACHE_BARRIER 601)
|
||||
|
||||
;; PIC long branch sequences are never longer than 100 bytes.
|
||||
(MAX_PIC_BRANCH_LENGTH 100)
|
||||
]
|
||||
|
@ -637,7 +509,7 @@
|
|||
] (const_int 4)))
|
||||
|
||||
;; Attribute describing the processor. This attribute must match exactly
|
||||
;; with the processor_type enumeration in mips.h.
|
||||
;; with the processor enumeration above.
|
||||
(define_attr "cpu"
|
||||
"r3000,4kc,4kp,5kc,5kf,20kc,24kc,24kf2_1,24kf1_1,74kc,74kf2_1,74kf1_1,74kf3_2,loongson_2e,loongson_2f,m4k,octeon,r3900,r6000,r4000,r4100,r4111,r4120,r4130,r4300,r4600,r4650,r5000,r5400,r5500,r7000,r8000,r9000,r10000,sb1,sb1a,sr71000,xlr"
|
||||
(const (symbol_ref "mips_tune_attr")))
|
||||
|
@ -6581,3 +6453,7 @@
|
|||
|
||||
; ST-Microelectronics Loongson-2E/2F-specific patterns.
|
||||
(include "loongson.md")
|
||||
|
||||
(define_c_enum "unspec" [
|
||||
UNSPEC_ADDRESS_FIRST
|
||||
])
|
||||
|
|
|
@ -19,6 +19,18 @@
|
|||
;; along with GCC; see the file COPYING3. If not see
|
||||
;; <http://www.gnu.org/licenses/>.
|
||||
|
||||
(define_c_enum "unspec" [
|
||||
UNSPEC_COMPARE_AND_SWAP
|
||||
UNSPEC_COMPARE_AND_SWAP_12
|
||||
UNSPEC_SYNC_OLD_OP
|
||||
UNSPEC_SYNC_NEW_OP
|
||||
UNSPEC_SYNC_NEW_OP_12
|
||||
UNSPEC_SYNC_OLD_OP_12
|
||||
UNSPEC_SYNC_EXCHANGE
|
||||
UNSPEC_SYNC_EXCHANGE_12
|
||||
UNSPEC_MEMORY_BARRIER
|
||||
])
|
||||
|
||||
;; Atomic fetch bitwise operations.
|
||||
(define_code_iterator fetchop_bit [ior xor and])
|
||||
|
||||
|
|
|
@ -7902,6 +7902,88 @@ You could write:
|
|||
|
||||
The constants that are defined with a define_constant are also output
|
||||
in the insn-codes.h header file as #defines.
|
||||
|
||||
@cindex enumerations
|
||||
@findex define_c_enum
|
||||
You can also use the machine description file to define enumerations.
|
||||
Like the constants defined by @code{define_constant}, these enumerations
|
||||
are visible to both the machine description file and the main C code.
|
||||
|
||||
The syntax is as follows:
|
||||
|
||||
@smallexample
|
||||
(define_c_enum "@var{name}" [
|
||||
@var{value0}
|
||||
@var{value1}
|
||||
@dots{}
|
||||
@var{valuen}
|
||||
])
|
||||
@end smallexample
|
||||
|
||||
This definition causes the equivalent of the following C code to appear
|
||||
in @file{insn-constants.h}:
|
||||
|
||||
@smallexample
|
||||
enum @var{name} @{
|
||||
@var{value0} = 0,
|
||||
@var{value1} = 1,
|
||||
@dots{}
|
||||
@var{valuen} = @var{n}
|
||||
@};
|
||||
#define NUM_@var{cname}_VALUES (@var{n} + 1)
|
||||
@end smallexample
|
||||
|
||||
where @var{cname} is the capitalized form of @var{name}.
|
||||
It also makes each @var{valuei} available in the machine description
|
||||
file, just as if it had been declared with:
|
||||
|
||||
@smallexample
|
||||
(define_constants [(@var{valuei} @var{i})])
|
||||
@end smallexample
|
||||
|
||||
Each @var{valuei} is usually an upper-case identifier and usually
|
||||
begins with @var{cname}.
|
||||
|
||||
You can split the enumeration definition into as many statements as
|
||||
you like. The above example is directly equivalent to:
|
||||
|
||||
@smallexample
|
||||
(define_c_enum "@var{name}" [@var{value0}])
|
||||
(define_c_enum "@var{name}" [@var{value1}])
|
||||
@dots{}
|
||||
(define_c_enum "@var{name}" [@var{valuen}])
|
||||
@end smallexample
|
||||
|
||||
Splitting the enumeration helps to improve the modularity of each
|
||||
individual @code{.md} file. For example, if a port defines its
|
||||
synchronization instructions in a separate @file{sync.md} file,
|
||||
it is convenient to define all synchronization-specific enumeration
|
||||
values in @file{sync.md} rather than in the main @file{.md} file.
|
||||
|
||||
@findex define_enum
|
||||
Another way of defining an enumeration is to use @code{define_enum}:
|
||||
|
||||
@smallexample
|
||||
(define_enum "@var{name}" [
|
||||
@var{value0}
|
||||
@var{value1}
|
||||
@dots{}
|
||||
@var{valuen}
|
||||
])
|
||||
@end smallexample
|
||||
|
||||
This directive implies:
|
||||
|
||||
@smallexample
|
||||
(define_c_enum "@var{name}" [
|
||||
@var{cname}_@var{cvalue0}
|
||||
@var{cname}_@var{cvalue1}
|
||||
@dots{}
|
||||
@var{cname}_@var{cvaluen}
|
||||
])
|
||||
@end smallexample
|
||||
|
||||
where @var{cvaluei} is the capitalized form of @var{valuei}.
|
||||
@end ifset
|
||||
@ifset INTERNALS
|
||||
@node Iterators
|
||||
|
|
|
@ -35,12 +35,40 @@ along with GCC; see the file COPYING3. If not see
|
|||
the current constant definition. */
|
||||
|
||||
static int
|
||||
print_md_constant (void **slot, void *info)
|
||||
print_md_constant (void **slot, void *info ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct md_constant *def = (struct md_constant *) *slot;
|
||||
FILE *file = (FILE *) info;
|
||||
|
||||
fprintf (file, "#define %s %s\n", def->name, def->value);
|
||||
if (!def->parent_enum)
|
||||
printf ("#define %s %s\n", def->name, def->value);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Called via traverse_enums. Emit an enum definition for
|
||||
enum_type *SLOT. */
|
||||
|
||||
static int
|
||||
print_enum_type (void **slot, void *info ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct enum_type *def;
|
||||
struct enum_value *value;
|
||||
char *value_name;
|
||||
|
||||
def = (struct enum_type *) *slot;
|
||||
printf ("\nenum %s {", def->name);
|
||||
for (value = def->values; value; value = value->next)
|
||||
{
|
||||
printf ("\n %s = %s", value->def->name, value->def->value);
|
||||
if (value->next)
|
||||
putc (',', stdout);
|
||||
}
|
||||
printf ("\n};\n");
|
||||
|
||||
/* Define NUM_<enum>_VALUES to be the largest enum value + 1. */
|
||||
value_name = ACONCAT (("num_", def->name, "_values", NULL));
|
||||
upcase_string (value_name);
|
||||
printf ("#define %s %d\n", value_name, def->num_values);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -60,7 +88,8 @@ main (int argc, char **argv)
|
|||
puts ("#ifndef GCC_INSN_CONSTANTS_H");
|
||||
puts ("#define GCC_INSN_CONSTANTS_H\n");
|
||||
|
||||
traverse_md_constants (print_md_constant, stdout);
|
||||
traverse_md_constants (print_md_constant, 0);
|
||||
traverse_enum_types (print_enum_type, 0);
|
||||
|
||||
puts ("\n#endif /* GCC_INSN_CONSTANTS_H */");
|
||||
|
||||
|
|
179
gcc/read-md.c
179
gcc/read-md.c
|
@ -92,6 +92,9 @@ static size_t max_include_len;
|
|||
constant expansion should occur. */
|
||||
static htab_t md_constants;
|
||||
|
||||
/* A table of enum_type structures, hashed by name. */
|
||||
static htab_t enum_types;
|
||||
|
||||
static void handle_file (directive_handler_t);
|
||||
|
||||
/* Given an object that starts with a char * name field, return a hash
|
||||
|
@ -671,6 +674,52 @@ scan_comma_elt (const char **pstr)
|
|||
return start;
|
||||
}
|
||||
|
||||
/* Convert STRING to uppercase. */
|
||||
|
||||
void
|
||||
upcase_string (char *string)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; string[i]; i++)
|
||||
string[i] = TOUPPER (string[i]);
|
||||
}
|
||||
|
||||
/* Add a NAME = VALUE definition to md_constants-style hash table DEFS,
|
||||
where both NAME and VALUE are malloc()ed strings. PARENT_ENUM is the
|
||||
enum to which NAME belongs, or null if NAME is a stand-alone constant. */
|
||||
|
||||
static struct md_constant *
|
||||
add_constant (htab_t defs, char *name, char *value,
|
||||
struct enum_type *parent_enum)
|
||||
{
|
||||
struct md_constant *def, tmp_def;
|
||||
void **entry_ptr;
|
||||
|
||||
tmp_def.name = name;
|
||||
entry_ptr = htab_find_slot (defs, &tmp_def, INSERT);
|
||||
if (*entry_ptr)
|
||||
{
|
||||
def = (struct md_constant *) *entry_ptr;
|
||||
if (strcmp (def->value, value) != 0)
|
||||
fatal_with_file_and_line ("redefinition of `%s', was `%s', now `%s'",
|
||||
def->name, def->value, value);
|
||||
else if (parent_enum || def->parent_enum)
|
||||
fatal_with_file_and_line ("redefinition of `%s'", def->name);
|
||||
free (name);
|
||||
free (value);
|
||||
}
|
||||
else
|
||||
{
|
||||
def = XNEW (struct md_constant);
|
||||
def->name = name;
|
||||
def->value = value;
|
||||
def->parent_enum = parent_enum;
|
||||
*entry_ptr = def;
|
||||
}
|
||||
return def;
|
||||
}
|
||||
|
||||
/* Process a define_constants directive, starting with the optional space
|
||||
after the "define_constants". */
|
||||
|
||||
|
@ -680,45 +729,23 @@ handle_constants (void)
|
|||
int c;
|
||||
htab_t defs;
|
||||
|
||||
defs = md_constants;
|
||||
if (! defs)
|
||||
defs = htab_create (32, leading_string_hash,
|
||||
leading_string_eq_p, (htab_del) 0);
|
||||
|
||||
c = read_skip_spaces ();
|
||||
if (c != '[')
|
||||
fatal_expected_char ('[', c);
|
||||
|
||||
/* Disable constant expansion during definition processing. */
|
||||
defs = md_constants;
|
||||
md_constants = 0;
|
||||
while ( (c = read_skip_spaces ()) != ']')
|
||||
{
|
||||
struct md_name name, value;
|
||||
struct md_constant *def, tmp_def;
|
||||
void **entry_ptr;
|
||||
|
||||
if (c != '(')
|
||||
fatal_expected_char ('(', c);
|
||||
|
||||
read_name (&name);
|
||||
read_name (&value);
|
||||
|
||||
tmp_def.name = name.string;
|
||||
entry_ptr = htab_find_slot (defs, &tmp_def, INSERT);
|
||||
if (*entry_ptr)
|
||||
{
|
||||
def = (struct md_constant *) *entry_ptr;
|
||||
if (strcmp (def->value, value.string) != 0)
|
||||
fatal_with_file_and_line ("redefinition of %s, was %s, now %s",
|
||||
def->name, def->value, value.string);
|
||||
}
|
||||
else
|
||||
{
|
||||
def = XNEW (struct md_constant);
|
||||
def->name = xstrdup (name.string);
|
||||
def->value = xstrdup (value.string);
|
||||
*entry_ptr = def;
|
||||
}
|
||||
add_constant (defs, xstrdup (name.string), xstrdup (value.string), 0);
|
||||
|
||||
c = read_skip_spaces ();
|
||||
if (c != ')')
|
||||
|
@ -734,8 +761,100 @@ handle_constants (void)
|
|||
void
|
||||
traverse_md_constants (htab_trav callback, void *info)
|
||||
{
|
||||
if (md_constants)
|
||||
htab_traverse (md_constants, callback, info);
|
||||
htab_traverse (md_constants, callback, info);
|
||||
}
|
||||
|
||||
/* Return a malloc()ed decimal string that represents number NUMBER. */
|
||||
|
||||
static char *
|
||||
decimal_string (int number)
|
||||
{
|
||||
/* A safe overestimate. +1 for sign, +1 for null terminator. */
|
||||
char buffer[sizeof (int) * CHAR_BIT + 1 + 1];
|
||||
|
||||
sprintf (buffer, "%d", number);
|
||||
return xstrdup (buffer);
|
||||
}
|
||||
|
||||
/* Process a define_enum or define_c_enum directive, starting with
|
||||
the optional space after the "define_enum". LINENO is the line
|
||||
number on which the directive started and MD_P is true if the
|
||||
directive is a define_enum rather than a define_c_enum. */
|
||||
|
||||
static void
|
||||
handle_enum (int lineno, bool md_p)
|
||||
{
|
||||
char *enum_name, *value_name;
|
||||
struct md_name name;
|
||||
struct enum_type *def;
|
||||
struct enum_value *ev;
|
||||
void **slot;
|
||||
int c;
|
||||
|
||||
enum_name = read_string (false);
|
||||
slot = htab_find_slot (enum_types, &enum_name, INSERT);
|
||||
if (*slot)
|
||||
{
|
||||
def = (struct enum_type *) *slot;
|
||||
if (def->md_p != md_p)
|
||||
error_with_line (lineno, "redefining `%s' as a different type of enum",
|
||||
enum_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
def = XNEW (struct enum_type);
|
||||
def->name = enum_name;
|
||||
def->md_p = md_p;
|
||||
def->values = 0;
|
||||
def->tail_ptr = &def->values;
|
||||
def->num_values = 0;
|
||||
*slot = def;
|
||||
}
|
||||
|
||||
c = read_skip_spaces ();
|
||||
if (c != '[')
|
||||
fatal_expected_char ('[', c);
|
||||
|
||||
while ((c = read_skip_spaces ()) != ']')
|
||||
{
|
||||
if (c == EOF)
|
||||
{
|
||||
error_with_line (lineno, "unterminated construct");
|
||||
exit (1);
|
||||
}
|
||||
unread_char (c);
|
||||
read_name (&name);
|
||||
|
||||
ev = XNEW (struct enum_value);
|
||||
ev->next = 0;
|
||||
if (md_p)
|
||||
{
|
||||
value_name = concat (def->name, "_", name.string, NULL);
|
||||
upcase_string (value_name);
|
||||
ev->name = xstrdup (name.string);
|
||||
}
|
||||
else
|
||||
{
|
||||
value_name = xstrdup (name.string);
|
||||
ev->name = value_name;
|
||||
}
|
||||
ev->def = add_constant (md_constants, value_name,
|
||||
decimal_string (def->num_values), def);
|
||||
|
||||
*def->tail_ptr = ev;
|
||||
def->tail_ptr = &ev->next;
|
||||
def->num_values++;
|
||||
}
|
||||
}
|
||||
|
||||
/* For every enum definition, call CALLBACK with two arguments:
|
||||
a pointer to the constant definition and INFO. Stop when CALLBACK
|
||||
returns zero. */
|
||||
|
||||
void
|
||||
traverse_enum_types (htab_trav callback, void *info)
|
||||
{
|
||||
htab_traverse (enum_types, callback, info);
|
||||
}
|
||||
|
||||
/* Process an "include" directive, starting with the optional space
|
||||
|
@ -834,6 +953,10 @@ handle_file (directive_handler_t handle_directive)
|
|||
read_name (&directive);
|
||||
if (strcmp (directive.string, "define_constants") == 0)
|
||||
handle_constants ();
|
||||
else if (strcmp (directive.string, "define_enum") == 0)
|
||||
handle_enum (lineno, true);
|
||||
else if (strcmp (directive.string, "define_c_enum") == 0)
|
||||
handle_enum (lineno, false);
|
||||
else if (strcmp (directive.string, "include") == 0)
|
||||
handle_include (lineno, handle_directive);
|
||||
else if (handle_directive)
|
||||
|
@ -911,6 +1034,10 @@ read_md_files (int argc, char **argv, bool (*parse_opt) (const char *),
|
|||
obstack_init (&ptr_loc_obstack);
|
||||
joined_conditions = htab_create (161, leading_ptr_hash, leading_ptr_eq_p, 0);
|
||||
obstack_init (&joined_conditions_obstack);
|
||||
md_constants = htab_create (31, leading_string_hash,
|
||||
leading_string_eq_p, (htab_del) 0);
|
||||
enum_types = htab_create (31, leading_string_hash,
|
||||
leading_string_eq_p, (htab_del) 0);
|
||||
|
||||
/* Unlock the stdio streams. */
|
||||
unlock_std_streams ();
|
||||
|
|
|
@ -33,12 +33,49 @@ struct md_name {
|
|||
char *string;
|
||||
};
|
||||
|
||||
/* This structure represents a constant defined by define_constant.
|
||||
NAME is the name of the constant and VALUE is the string it
|
||||
expands to. */
|
||||
/* This structure represents a constant defined by define_constant,
|
||||
define_enum, or such-like. */
|
||||
struct md_constant {
|
||||
/* The name of the constant. */
|
||||
char *name;
|
||||
|
||||
/* The string to which the constants expands. */
|
||||
char *value;
|
||||
|
||||
/* If the constant is associated with a enumeration, this field
|
||||
points to that enumeration, otherwise it is null. */
|
||||
struct enum_type *parent_enum;
|
||||
};
|
||||
|
||||
/* This structure represents one value in an enum_type. */
|
||||
struct enum_value {
|
||||
/* The next value in the enum, or null if this is the last. */
|
||||
struct enum_value *next;
|
||||
|
||||
/* The name of the value as it appears in the .md file. */
|
||||
char *name;
|
||||
|
||||
/* The definition of the related C value. */
|
||||
struct md_constant *def;
|
||||
};
|
||||
|
||||
/* This structure represents an enum defined by define_enum or the like. */
|
||||
struct enum_type {
|
||||
/* The C name of the enumeration. */
|
||||
char *name;
|
||||
|
||||
/* True if this is an md-style enum (DEFINE_ENUM) rather than
|
||||
a C-style enum (DEFINE_C_ENUM). */
|
||||
bool md_p;
|
||||
|
||||
/* The values of the enumeration. There is always at least one. */
|
||||
struct enum_value *values;
|
||||
|
||||
/* A pointer to the null terminator in VALUES. */
|
||||
struct enum_value **tail_ptr;
|
||||
|
||||
/* The number of enumeration values. */
|
||||
unsigned int num_values;
|
||||
};
|
||||
|
||||
/* A callback that handles a single .md-file directive, up to but not
|
||||
|
@ -95,6 +132,8 @@ extern char *read_string (int);
|
|||
extern void read_skip_construct (int, int);
|
||||
extern int n_comma_elts (const char *);
|
||||
extern const char *scan_comma_elt (const char **);
|
||||
extern void upcase_string (char *);
|
||||
extern void traverse_md_constants (htab_trav, void *);
|
||||
extern void traverse_enum_types (htab_trav, void *);
|
||||
extern bool read_md_files (int, char **, bool (*) (const char *),
|
||||
directive_handler_t);
|
||||
|
|
Loading…
Add table
Reference in a new issue