答复: [PATCH] RISC-V: The 'multilib-generator' enhancement.

2021-09-27 Thread gengqi via Gcc-patches
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

2020-10-29 Thread gengqi via Gcc-patches
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".

2020-10-29 Thread gengqi via Gcc-patches
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.

2020-10-29 Thread gengqi via Gcc-patches
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.

2020-10-29 Thread gengqi via Gcc-patches
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.

2020-10-29 Thread gengqi via Gcc-patches
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.

2020-10-29 Thread gengqi via Gcc-patches
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

2020-08-27 Thread gengqi via Gcc-patches
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