答复: [PATCH] RISC-V: The 'multilib-generator' enhancement.
Sorry, I sent the wrong one. -邮件原件- 发件人: Geng Qi [mailto:gen...@linux.alibaba.com] 发送时间: 2021年9月27日 19:25 收件人: gcc-patches@gcc.gnu.org; cooper...@linux.alibaba.com 抄送: gengqi 主题: [PATCH] RISC-V: The 'multilib-generator' enhancement. From: gengqi gcc/ChangeLog: * config/riscv/arch-canonicalize (longext_sort): New function for sorting 'multi-letter'. * config/riscv/multilib-generator: Skip to next loop when current 'alt' is 'arch'. The 'arch' may not be the first of 'alts'. (_expand_combination): Add underline for the ext without '*'. This is because, a single-letter extension can always be treated well with a '_' prefix, but it cannot be separated out if it is appended to a multi-letter. --- gcc/config/riscv/arch-canonicalize | 14 +- gcc/config/riscv/multilib-generator | 12 +++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/gcc/config/riscv/arch-canonicalize b/gcc/config/riscv/arch-canonicalize index 2b4289e..a1e4570 100755 --- a/gcc/config/riscv/arch-canonicalize +++ b/gcc/config/riscv/arch-canonicalize @@ -74,8 +74,20 @@ def arch_canonicalize(arch): # becasue we just append extensions list to the arch string. std_exts += list(filter(lambda x:len(x) == 1, long_exts)) + def longext_sort (exts): +if not exts.startswith("zxm") and exts.startswith("z"): + # If "Z" extensions are named, they should be ordered first by CANONICAL. + if exts[1] not in CANONICAL_ORDER: +raise Exception("Unsupported extension `%s`" % exts) + canonical_sort = CANONICAL_ORDER.index(exts[1]) +else: + canonical_sort = -1 +return (exts.startswith("x"), exts.startswith("zxm"), +LONG_EXT_PREFIXES.index(exts[0]), canonical_sort, exts[1:]) + # Multi-letter extension must be in lexicographic order. - long_exts = list(sorted(filter(lambda x:len(x) != 1, long_exts))) + long_exts = list(sorted(filter(lambda x:len(x) != 1, long_exts), + key=longext_sort)) # Put extensions in canonical order. for ext in CANONICAL_ORDER: diff --git a/gcc/config/riscv/multilib-generator b/gcc/config/riscv/multilib-generator index 64ff15f..7b22537 100755 --- a/gcc/config/riscv/multilib-generator +++ b/gcc/config/riscv/multilib-generator @@ -68,15 +68,15 @@ def arch_canonicalize(arch): def _expand_combination(ext): exts = list(ext.split("*")) - # No need to expand if there is no `*`. - if len(exts) == 1: -return [(exts[0],)] - # Add underline to every extension. # e.g. # _b * zvamo => _b * _zvamo exts = list(map(lambda x: '_' + x, exts)) + # No need to expand if there is no `*`. + if len(exts) == 1: +return [(exts[0],)] + # Generate combination! ext_combs = [] for comb_len in range(1, len(exts)+1): @@ -147,7 +147,9 @@ for cfg in sys.argv[1:]: # Drop duplicated entry. alts = unique(alts) - for alt in alts[1:]: + for alt in alts: +if alt == arch: + continue arches[alt] = 1 reuse.append('march.%s/mabi.%s=march.%s/mabi.%s' % (arch, abi, alt, abi)) required.append('march=%s/mabi=%s' % (arch, abi)) -- 2.7.4
[PATCH 1/7] C-SKY: Add fpuv3 instructions and CK860 arch
gcc/ChangeLog: * config/csky/constraints.md ("W"): New constriant for mem operand with base reg, index register. ("Q"): Renamed and modified "csky_valid_fpuv2_mem_operand" to "csky_valid_mem_constraint_operand" to deal with both "Q" and "W" constraint. ("Dv"): New constraint for const double value that can be used at fmovi instruction. * config/csky/csky-modes.def (HFmode): New mode. * config/csky/csky-protos.h (csky_valid_fpuv2_mem_operand): Rename to "csky_valid_mem_constraint_operand" and new support for constraint "W". (get_output_csky_movedouble_length): New. (fpuv3_output_move): New. (fpuv3_const_double): New. * config/csky/csky.c (csky_option_override): New arch CK860 with fpv3. (decompose_csky_address): Robustness adjust. (csky_print_operand): New "CONST_DOUBLE" operand. (csky_output_move): New support for fpv3 instructions. (get_output_csky_movedouble_length): New. (fpuv3_output_move): New. (fpuv3_const_double): New. (csky_emit_compare): New cover for float comparsion. (csky_emit_compare_float): Refine. (csky_vaild_fpuv2_mem_operand): Rename to "csky_valid_mem_constraint_operand" and new support for constraint "W". (ck860_rtx_costs): New. (csky_rtx_costs): New subcall for CK860. (regno_reg_class): New vregs for fpuv3. (csky_dbx_regno): Likewise. (csky_cpu_cpp_builtins): New builtin macro for fpuv3. (csky_conditional_register_usage): New suporrot for fpuv3. (csky_dwarf_register_span): New suporrot for fpuv3. (csky_init_builtins, csky_mangle_type): New support for "__fp16" type. (ck810_legitimate_index_p): New support for fp16. * gcc/config/csky/csky.h (TARGET_TLS): ADD CK860. (CSKY_VREG_P, CSKY_VREG_LO_P, CSKY_VREG_HI_P): New support for fpuv3. (TARGET_SINGLE_FPU): New support for fpuv3. (TARGET_SUPPORT_FPV3): New macro. (FIRST_PSEUDO_REGISTER): Value change, since the new fpuv3 regs. (FIXED_REGISTERS, CALL_REALLY_USED_REGISTERS, REGISTER_NAMES, REG_CLASS_CONTENTS): Support for fpuv3. * gcc/config/csky/csky.md (movsf): Move to cksy_insn_fpu.md and adjust. (csky_movsf_fpv2): Likewise. (ck801_movsf): Likewise. (csky_movsf): Likewise. (movdf): Likewise. (csky_movdf_fpv2): Likewise. (ck801_movdf): Likewise. (csky_movdf): Likewise. (movsicc): Refine. Use "comparison_operatior" instead of "ordered_comparison_operatior". (addsicc): Likewise. (CSKY_FIRST_VFP3_REGNUM, CSKY_LAST_VFP3_REGNUM): New constant. (call_value_internal_vh): New insn. * config/csky/csky_cores.def (CK860): New arch and cpu. (fpv3): New 4 fpus: fpv3_hf, fpv3_hsf, fpv3_sdf and fpv3. * config/csky/csky_insn_fpu.md (mov): Move the float mov patterns from csky.md here. (fpuv2 instructions): Refactor. Separate all float patterns into emit-patterns and match-patterns, remain the emit-patterns here, and move the match-patterns to csky_insn_fpuv2.md. (fpuv3 instructions): Add patterns and fuse part of them with the fpuv2's. * config/csky/csky_insn_fpuv2.md: New file for fpuv2 instructions. * config/csky/csky_insn_fpuv3.md: New flie and new patterns for fpuv3 isntructions. * config/csky/csky_isa.def (fcr): New. (fpv3): New 4 isa sets: fpv3_hi, fpv3_hf, fpv3_sf and fpv3_df. (CK860): New definition for ck860. * gcc/config/csky/csky_tables.opt (ck860): New processors ck860, ck860f. And new arch ck860. (fpv3): New 4 fpus: fpv3_hf, fpv3_hsf, fpv3_sdf and fpv3. * config/csky/predicates.md (csky_float_comparsion_operator): Delete "geu", "gtu", "leu", "ltu", which will never appear at float comparison. * config/cksy/t-csky-elf, config/csky/t-csky-linux: New for ck860. * doc/md.texi: Add "Q" and "W" constraints for C-SKY. --- gcc/config/csky/constraints.md | 13 +- gcc/config/csky/csky-modes.def | 2 + gcc/config/csky/csky-protos.h | 7 +- gcc/config/csky/csky.c | 650 ++ gcc/config/csky/csky.h | 162 ++-- gcc/config/csky/csky.md| 127 ++ gcc/config/csky/csky_cores.def | 13 + gcc/config/csky/csky_insn_fpu.md | 798 +++-- gcc/config/csky/csky_insn_fpuv2.md | 470 ++ gcc/config/csky/csky_insn_fpuv3.md | 506 +++ gcc/config/csky/csky_isa.def | 15 + gcc/config/csky/csky_tables.opt| 21 + gcc/config/csky/predicates.md | 3 +- gcc/config/csky/t-csky-elf | 9 +- gcc/config/csky/t-csky-linux | 11 +- gcc/doc/md.texi| 8 + 16 files changed
[PATCH 5/7] C-SKY: Add insn "ldbs".
gcc/ChangeLog: config/csky/csky.md (cskyv2_sextend_ldbs): New insn. --- gcc/config/csky/csky.md | 10 ++ 1 file changed, 10 insertions(+) diff --git a/gcc/config/csky/csky.md b/gcc/config/csky/csky.md index 62875bf..ce9c252 100644 --- a/gcc/config/csky/csky.md +++ b/gcc/config/csky/csky.md @@ -1533,6 +1533,7 @@ }" ) +;; hi -> si (define_insn "extendhisi2" [(set (match_operand:SI0 "register_operand" "=r") (sign_extend:SI (match_operand:HI 1 "register_operand" "r")))] @@ -1557,6 +1558,15 @@ "sextb %0, %1" ) +(define_insn "*cskyv2_sextend_ldbs" + [(set (match_operand:SI0 "register_operand" "=r") +(sign_extend:SI (match_operand:QI 1 "csky_simple_mem_operand" "m")))] + "CSKY_ISA_FEATURE (E2)" + "ld.bs\t%0, %1" + [(set_attr "length" "4") + (set_attr "type" "load")] +) + ;; qi -> hi (define_insn "extendqihi2" [(set (match_operand:HI0 "register_operand" "=r") -- 2.7.4
[PATCH 3/7] C-SKY: Bug fix for bad setting of TARGET_DSP and TARGET_DIV.
gcc/ChangeLog: * config/csky/csky.c (csky_option_override): Init csky_arch_isa_features[] advanced, so TARGET_DSP and TARGET_DIV can be set well. --- gcc/config/csky/csky.c | 24 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/gcc/config/csky/csky.c b/gcc/config/csky/csky.c index 24560b1..18835f4 100644 --- a/gcc/config/csky/csky.c +++ b/gcc/config/csky/csky.c @@ -2680,6 +2680,18 @@ csky_option_override (void) TARGET_FDIVDU = 0; } + /* Initialize boolean versions of the architectural flags, for use + in the .md file. */ + +#undef CSKY_ISA +#define CSKY_ISA(IDENT, DESC)\ + { \ +csky_arch_isa_features[CSKY_ISA_FEATURE_GET (IDENT)] =\ + bitmap_bit_p (csky_active_target.isa, CSKY_ISA_FEATURE_GET (IDENT)); \ + } +#include "csky_isa.def" +#undef CSKY_ISA + /* Extended LRW instructions are enabled by default on CK801, disabled otherwise. */ if (TARGET_ELRW == -1) @@ -2752,18 +2764,6 @@ csky_option_override (void) TARGET_MULTIPLE_STLD = 0; } - /* Initialize boolean versions of the architectural flags, for use - in the .md file. */ - -#undef CSKY_ISA -#define CSKY_ISA(IDENT, DESC)\ - { \ -csky_arch_isa_features[CSKY_ISA_FEATURE_GET (IDENT)] =\ - bitmap_bit_p (csky_active_target.isa, CSKY_ISA_FEATURE_GET (IDENT)); \ - } -#include "csky_isa.def" -#undef CSKY_ISA - /* TODO */ /* Resynchronize the saved target options. */ -- 2.7.4
[PATCH 6/7] C-SKY: Cases for csky fpuv3 instructions.
gcc/testsuite/ChangeLog: * gcc/testsuite/gcc.target/csky/fpuv3/fpuv3.exp: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_div.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fadd.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fdtos.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fftoi_rm.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fftoi_rz.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fhtos.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fitof.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fmov.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fmovi.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fmula.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fmuls.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fneg.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fnmula.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fnmuls.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fstod.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fstoh.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fsub.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fxtof.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_h.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_hs.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_hsz.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_hz.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_ls.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_lsz.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_lt.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_ltz.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_max.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_min.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_mul.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_mula.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_muls.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_ne.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_nez.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_recip.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_sqrt.c: New. * gcc/testsuite/gcc.target/csky/fpuv3/fpv3_unordered.c: New. --- gcc/testsuite/gcc.target/csky/fpuv3/fpuv3.exp | 50 +++ gcc/testsuite/gcc.target/csky/fpuv3/fpv3_div.c | 15 gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fadd.c| 23 ++ gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fdtos.c | 11 +++ .../gcc.target/csky/fpuv3/fpv3_fftoi_rm.c | 55 + .../gcc.target/csky/fpuv3/fpv3_fftoi_rz.c | 41 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fhtos.c | 11 +++ gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fitof.c | 72 gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fmov.c| 96 ++ gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fmovi.c | 31 +++ gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fmula.c | 23 ++ gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fmuls.c | 23 ++ gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fneg.c| 22 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fnmula.c | 14 gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fnmuls.c | 14 gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fstod.c | 11 +++ gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fstoh.c | 11 +++ gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fsub.c| 23 ++ gcc/testsuite/gcc.target/csky/fpuv3/fpv3_fxtof.c | 76 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_h.c | 20 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_hs.c | 19 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_hsz.c | 21 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_hz.c | 20 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_ls.c | 19 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_lsz.c | 20 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_lt.c | 19 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_ltz.c | 20 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_max.c | 16 gcc/testsuite/gcc.target/csky/fpuv3/fpv3_min.c | 16 gcc/testsuite/gcc.target/csky/fpuv3/fpv3_mul.c | 15 gcc/testsuite/gcc.target/csky/fpuv3/fpv3_mula.c| 16 gcc/testsuite/gcc.target/csky/fpuv3/fpv3_muls.c| 16 gcc/testsuite/gcc.target/csky/fpuv3/fpv3_ne.c | 19 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_nez.c | 21 + gcc/testsuite/gcc.target/csky/fpuv3/fpv3_recip.c | 14 gcc/testsuite/gcc.target/csky/fpuv3/fpv3_sqrt.c| 16 .../gcc.target/csky/fpuv3/fpv3_unordered.c | 29 +++ 37 files changed, 958 insertions(+) create mode 100644 gcc/testsuite/gcc.target/csky/fpuv3/fpuv3.exp create mode 100644 gcc/testsuite/gcc.target/csky/fpuv3/fpv3_div.c create mode 100644 gcc/testsuite/gcc.target/csk
[PATCH 4/7] C-SKY: Separate FRAME_POINTER_REGNUM into FRAME_POINTER_REGNUM and HARD_FRAME_POINTER_REGNUM.
gcc/ChangeLog: * config/csky/csky.h (FRAME_POINTER_REGNUM): Use HARD_FRAME_POINTER_REGNUM and FRAME_POINTER_REGNUM instead of the signle definition. The signle definition may not work well at simplify_subreg_regno(). (ELIMINABLE_REGS): Add for HARD_FRAME_POINTER_REGNUM. * config/csky/csky.c (get_csky_live_regs, csky_can_eliminate, csky_initial_elimination_offset, csky_expand_prologue, csky_expand_epilogue): Add for HARD_FRAME_POINTER_REGNUM. --- gcc/config/csky/csky.c | 15 +-- gcc/config/csky/csky.h | 7 +-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/gcc/config/csky/csky.c b/gcc/config/csky/csky.c index 18835f4..6382e89 100644 --- a/gcc/config/csky/csky.c +++ b/gcc/config/csky/csky.c @@ -1751,12 +1751,12 @@ get_csky_live_regs (int *count) save = true; /* Frame pointer marked used. */ - else if (frame_pointer_needed && reg == FRAME_POINTER_REGNUM) + else if (frame_pointer_needed && reg == HARD_FRAME_POINTER_REGNUM) save = true; /* This is required for CK801/802 where FP is a fixed reg, otherwise we end up with no FP value available to the DWARF-2 unwinder. */ - else if (crtl->calls_eh_return && reg == FRAME_POINTER_REGNUM) + else if (crtl->calls_eh_return && reg == HARD_FRAME_POINTER_REGNUM) save = true; /* CK801/802 also need special handling for LR because it's clobbered @@ -1832,6 +1832,8 @@ csky_layout_stack_frame (void) static bool csky_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to) { + if (to == FRAME_POINTER_REGNUM) +return from != ARG_POINTER_REGNUM; if (to == STACK_POINTER_REGNUM) return !frame_pointer_needed; return true; @@ -1852,6 +1854,7 @@ csky_initial_elimination_offset (int from, int to) switch (from) { case FRAME_POINTER_REGNUM: +case HARD_FRAME_POINTER_REGNUM: offset = cfun->machine->reg_offset; break; @@ -1866,7 +1869,7 @@ csky_initial_elimination_offset (int from, int to) /* If we are asked for the offset to the frame pointer instead, then subtract the difference between the frame pointer and stack pointer. */ - if (to == FRAME_POINTER_REGNUM) + if (to == FRAME_POINTER_REGNUM || to == HARD_FRAME_POINTER_REGNUM) offset -= cfun->machine->reg_offset; return offset; } @@ -5789,7 +5792,7 @@ csky_expand_prologue (void) of the register save area. */ if (frame_pointer_needed) { - insn = emit_insn (gen_movsi (frame_pointer_rtx, stack_pointer_rtx)); + insn = emit_insn (gen_movsi (hard_frame_pointer_rtx, stack_pointer_rtx)); RTX_FRAME_RELATED_P (insn) = 1; } @@ -5852,7 +5855,7 @@ csky_expand_epilogue (void) /* Restore the SP to the base of the register save area. */ if (frame_pointer_needed) { - insn = emit_move_insn (stack_pointer_rtx, frame_pointer_rtx); + insn = emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx); RTX_FRAME_RELATED_P (insn) = 1; } else @@ -6008,7 +6011,7 @@ csky_set_eh_return_address (rtx source, rtx scratch) if (frame_pointer_needed) { - basereg = frame_pointer_rtx; + basereg = hard_frame_pointer_rtx; delta = 0; } else diff --git a/gcc/config/csky/csky.h b/gcc/config/csky/csky.h index 0246906..589c320 100644 --- a/gcc/config/csky/csky.h +++ b/gcc/config/csky/csky.h @@ -342,7 +342,8 @@ extern int csky_arch_isa_features[]; #define STACK_POINTER_REGNUM CSKY_SP_REGNUM /* Base register for access to local variables of the function. */ -#define FRAME_POINTER_REGNUM 8 +#define FRAME_POINTER_REGNUM 36 +#define HARD_FRAME_POINTER_REGNUM 8 /* Base register for access to arguments of the function. This is a fake register that is always eliminated. */ @@ -370,7 +371,9 @@ extern int csky_arch_isa_features[]; #define ELIMINABLE_REGS \ {{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM},\ { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM},\ - { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM }} + { ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM },\ + { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM },\ + { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM }} /* Define the offset between two registers, one to be eliminated, and the other its replacement, at the start of a routine. */ -- 2.7.4
[PATCH 2/7] C-SKY: Delete LO_REGS and HI_REGS, use HILO_REGS instead.
gcc/ChangeLog: * config/csky/constraints.md ("l", "h"): Delete. * config/csky/csky.h (reg_class, REG_CLASS_NAMES, REG_CLASS_CONTENTS): Delete LO_REGS and HI_REGS. * config/csky/csky.c (regno_reg_classm, csky_secondary_reload, csky_register_move_cost): Use HILO_REGS instead of LO_REGS and HI_REGS. --- gcc/config/csky/constraints.md | 2 -- gcc/config/csky/csky.c | 7 +++ gcc/config/csky/csky.h | 8 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/gcc/config/csky/constraints.md b/gcc/config/csky/constraints.md index 1f0bed2a..3f4d5df 100644 --- a/gcc/config/csky/constraints.md +++ b/gcc/config/csky/constraints.md @@ -24,8 +24,6 @@ (define_register_constraint "b" "LOW_REGS" "r0 - r15") (define_register_constraint "c" "C_REGS" "C register") (define_register_constraint "y" "HILO_REGS" "HI and LO registers") -(define_register_constraint "l" "LO_REGS" "LO register") -(define_register_constraint "h" "HI_REGS" "HI register") (define_register_constraint "v" "V_REGS" "vector registers") (define_register_constraint "z" "SP_REGS" "SP register") diff --git a/gcc/config/csky/csky.c b/gcc/config/csky/csky.c index c957443..24560b1 100644 --- a/gcc/config/csky/csky.c +++ b/gcc/config/csky/csky.c @@ -112,7 +112,7 @@ enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER] = /* Reserved. */ RESERVE_REGS, /* CC,HI,LO registers. */ - C_REGS, HI_REGS, LO_REGS, + C_REGS, HILO_REGS, HILO_REGS, /* Reserved. */ RESERVE_REGS, RESERVE_REGS, RESERVE_REGS, RESERVE_REGS, RESERVE_REGS, RESERVE_REGS, RESERVE_REGS, RESERVE_REGS, @@ -2477,8 +2477,7 @@ csky_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x, /* We always require a general register when copying anything to HI/LO_REGNUM, except when copying an SImode value from HI/LO_REGNUM to a general register, or when copying from register 0. */ - if ((rclass == HILO_REGS || rclass == LO_REGS || rclass == HI_REGS) - && !CSKY_GENERAL_REGNO_P (regno)) + if (rclass == HILO_REGS && !CSKY_GENERAL_REGNO_P (regno)) return GENERAL_REGS; if (rclass == V_REGS && !CSKY_GENERAL_REGNO_P (regno)) @@ -6549,7 +6548,7 @@ csky_register_move_cost (machine_mode mode ATTRIBUTE_UNUSED, || (CLASS) == LOW_REGS) #define HILO_REG_CLASS_P(CLASS) \ - ((CLASS) == HI_REGS || (CLASS) == LO_REGS || (CLASS) == HILO_REGS) + ((CLASS) == HILO_REGS) #define V_REG_CLASS_P(CLASS) \ ((CLASS) == V_REGS) diff --git a/gcc/config/csky/csky.h b/gcc/config/csky/csky.h index 0906e86..0246906 100644 --- a/gcc/config/csky/csky.h +++ b/gcc/config/csky/csky.h @@ -685,8 +685,6 @@ enum reg_class LOW_REGS, GENERAL_REGS, C_REGS, - HI_REGS, - LO_REGS, HILO_REGS, V_REGS, OTHER_REGS, @@ -706,8 +704,6 @@ enum reg_class "LOW_REGS", \ "GENERAL_REGS", \ "C_REGS",\ - "HI_REGS", \ - "LO_REGS", \ "HILO_REGS", \ "V_REGS",\ "OTHER_REGS",\ @@ -731,10 +727,6 @@ enum reg_class 0x, 0x, 0x},/* GENERAL_REGS */ \ {0x, 0x0002, 0x, 0x, \ 0x, 0x, 0x},/* C_REGS */ \ - {0x, 0x0004, 0x, 0x, \ - 0x, 0x, 0x},/* HI_REG */ \ - {0x, 0x0008, 0x, 0x, \ - 0x, 0x, 0x},/* LO_REG */ \ {0x, 0x000c, 0x, 0x, \ 0x, 0x, 0x},/* HILO_REGS */ \ {0x, 0xFFF0, 0x007FFF8F, 0x, \ -- 2.7.4
[PATCH] C-SKY: Add fpuv3 instructions and CK860 arch
From: gengq gcc/ChangeLog: * config/csky/constraints.md (W): New constriant for mem operand with a base reg with a index register. (Q): Renamed and modified "csky_valid_fpuv2_mem_operand" to "csky_valid_mem_constraint_operand" to deal with both "Q" and "W" constraint. (Dv): New constraint for const double value that can be used at fmovi instruction. * config/csky/csky-modes.def (HFmode): New mode. * config/csky/csky-protos.h (csky_valid_mem_constraint_operand): Declare. (get_output_csky_movedouble_length): Declare. (fpuv3_output_move): Declare. (fpuv3_const_double): Declare. * config/csky/csky.c (csky_option_override): New arch CK860 with fpv3. (decompose_csky_address): Robustness adjust. (csky_print_operand): New "CONST_DOUBLE" operand. (csky_output_move): New support for fpv3 instructions. (get_output_csky_movedouble_length): New function. (fpuv3_output_move): New function. (fpuv3_const_double): New function. (csky_emit_compare): New cover for float comparsion. (csky_emit_compare_float): Refine. (csky_valid_mem_constraint_operand): Rename from "csky_valid_fpuv2_mem_operand" and new support for constraint "W". (ck860_rtx_costs): New function. (csky_rtx_costs): New subcall for CK860. * gcc/config/csky/csky.h (TARGET_TLS): Add CK860. * gcc/config/csky/csky.md (movsf): Delete, and achieve it at csky_insn_fpu.md. (ck801_movsf): Delete, and achieve it at csky_insn_fpu.md. (csky_movsf): Delete, and achieve it at csky_insn_fpu.md. (movdf): Delete, achieve it at csky_insn_fpu.md. (ck801_movdf): Delete, and achieve it at csky_insn_fpu.md. (csky_movdf): Delete, and achieve it at csky_insn_fpu.md. (csky_movsf_fpv2): Delete, and achieve it at csky_insn_fpuv2.md. (csky_movdf_fpv2): Delete, and achieve it at csky_insn_fpuv2.md. (movsicc): Refine. Use "comparison_operatior" instead of "ordered_comparison_operatior". (addsicc): Likewise. * config/csky/csky_cores.def (CK860): New arch and cpu. (fpv3_hf, fpv3_hsf, fpv3_sdf, fpv3): New fpus. * config/csky/csky_insn_fpu.md: Refactor. For fpuv2, separate all float patterns into emit-patterns and match-patterns, remain the emit-patterns here, and move the match-patterns to csky_insn_fpuv2.md. For fpuv3, add patterns and fuse part of them with the fpuv2's. * config/csky/csky_insn_fpuv2.md: New file for fpuv2 instructions. * config/csky/csky_insn_fpuv3.md: New flie and new patterns for fpuv3 isntructions. * config/csky/csky_isa.def (fcr): New isa. (fpv3_hi, fpv3_hf, fpv3_sf, fpv3_df): New isa. (CK860): New definition. * gcc/config/csky/csky_tables.opt (ck860): New processors ck860, ck860f. And new arch ck860. (fpv3_hf, fpv3_hsf, fpv3_sdf, fpv3): New fpus. * config/csky/predicates.md (csky_float_comparsion_operator): Delete "geu", "gtu", "leu", "ltu", which will never appear at float comparison. * doc/md.texi: Add "Q" and "W" constraints for C-SKY. --- gcc/config/csky/constraints.md | 13 +- gcc/config/csky/csky-modes.def | 2 + gcc/config/csky/csky-protos.h | 7 +- gcc/config/csky/csky.c | 528 +++ gcc/config/csky/csky.h | 2 +- gcc/config/csky/csky.md| 120 + gcc/config/csky/csky_cores.def | 13 + gcc/config/csky/csky_insn_fpu.md | 797 - gcc/config/csky/csky_insn_fpuv2.md | 470 + gcc/config/csky/csky_insn_fpuv3.md | 418 +++ gcc/config/csky/csky_isa.def | 15 + gcc/config/csky/csky_tables.opt| 21 + gcc/config/csky/predicates.md | 3 +- gcc/doc/md.texi| 8 + 14 files changed, 1752 insertions(+), 665 deletions(-) create mode 100644 gcc/config/csky/csky_insn_fpuv2.md create mode 100644 gcc/config/csky/csky_insn_fpuv3.md diff --git a/gcc/config/csky/constraints.md b/gcc/config/csky/constraints.md index b9990b7dac9..874f698411b 100644 --- a/gcc/config/csky/constraints.md +++ b/gcc/config/csky/constraints.md @@ -34,7 +34,11 @@ (define_memory_constraint "Q" "Memory operands with base register, index register and short displacement for FPUV2" - (match_test "csky_valid_fpuv2_mem_operand (op)")) + (match_test "csky_valid_mem_constraint_operand (op, \"Q\")")) + +(define_memory_constraint "W" + "memory operands with base register, index register" + (match_test "csky_valid_mem_constraint_operand (op, \"W\")")) (define_constraint "R" "Memory operands whose address is a label_ref" @@ -172,3 +176,10 @@ "Constant in range [-8, -1]" (and (match_code "const_int") (match_test "CSKY_CONST_OK_FOR_US (ival)"))) + +(define_const