config.gcc: Unify V850 architecture options and add support for newer V850 architectures.
authorNick Clifton <nickc@redhat.com>
Tue, 7 Jun 2011 14:00:13 +0000 (14:00 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Tue, 7 Jun 2011 14:00:13 +0000 (14:00 +0000)
* config.gcc: Unify V850 architecture options and add support for
newer V850 architectures.
* config/v850/t-v850e: Delete.

From-SVN: r174744

gcc/ChangeLog
gcc/config.gcc
gcc/config/v850/t-v850e [deleted file]
gcc/config/v850/v850.c
gcc/config/v850/v850.h
gcc/config/v850/v850.md

index 4dd12e31dbc0143619ca6cd075d71dfa1384af62..812b9be768fb004a63a95fe0dd7d68cb2f1180d4 100644 (file)
@@ -1,3 +1,9 @@
+2011-06-07  Nick Clifton  <nickc@redhat.com>
+
+       * config.gcc: Unify V850 architecture options and add support for
+       newer V850 architectures.
+       * config/v850/t-v850e: Delete.
+
 2011-06-07  Richard Guenther  <rguenther@suse.de>
 
        * tree.c (build_common_tree_nodes): Also initialize size_type_node.
index 624129bf4240f39917f030e7ef7f78ebf44b811c..5d88d1bf60d0fdc9ff6c40ff40192cbc293240ae 100644 (file)
@@ -2559,29 +2559,28 @@ spu-*-elf*)
        c_target_objs="${c_target_objs} spu-c.o"
        cxx_target_objs="${cxx_target_objs} spu-c.o"
        ;;
-v850e1-*-*)
-       target_cpu_default="TARGET_CPU_v850e1"
-       tm_file="dbxelf.h elfos.h newlib-stdint.h v850/v850.h"
-       tm_p_file=v850/v850-protos.h
-       tmake_file=v850/t-v850e
-       md_file=v850/v850.md
-       extra_modes=v850/v850-modes.def
-       out_file=v850/v850.c
-       extra_options="${extra_options} v850/v850.opt"
-       if test x$stabs = xyes
-       then
-               tm_file="${tm_file} dbx.h"
-       fi
-       use_collect2=no
-       c_target_objs="v850-c.o"
-       cxx_target_objs="v850-c.o"
-       use_gcc_stdint=wrap
-       ;;
-v850e-*-*)
-       target_cpu_default="TARGET_CPU_v850e"
+
+v850*-*-*)
+       case ${target} in
+       v850e2v3-*-*)
+               target_cpu_default="TARGET_CPU_v850e2v3"
+               ;;
+       v850e2-*-*)
+               target_cpu_default="TARGET_CPU_v850e2"
+               ;;
+       v850e1-*-* | v850es-*-*)
+               target_cpu_default="TARGET_CPU_v850e1"
+               ;;
+       v850e-*-*)
+               target_cpu_default="TARGET_CPU_v850e"
+               ;;
+       v850-*-*)
+               target_cpu_default="TARGET_CPU_generic"
+               ;;
+       esac
        tm_file="dbxelf.h elfos.h newlib-stdint.h v850/v850.h"
        tm_p_file=v850/v850-protos.h
-       tmake_file=v850/t-v850e
+       tmake_file=v850/t-v850
        md_file=v850/v850.md
        extra_modes=v850/v850-modes.def
        out_file=v850/v850.c
@@ -2595,19 +2594,6 @@ v850e-*-*)
        cxx_target_objs="v850-c.o"
        use_gcc_stdint=wrap
        ;;
-v850-*-*)
-       target_cpu_default="TARGET_CPU_generic"
-       tm_file="dbxelf.h elfos.h newlib-stdint.h ${tm_file}"
-       tmake_file=v850/t-v850
-       if test x$stabs = xyes
-       then
-               tm_file="${tm_file} dbx.h"
-       fi
-       use_collect2=no
-       c_target_objs="v850-c.o"
-       cxx_target_objs="v850-c.o"
-       use_gcc_stdint=wrap
-       ;;
 vax-*-linux*)
        tm_file="${tm_file} dbxelf.h elfos.h gnu-user.h linux.h vax/elf.h vax/linux.h"
        extra_options="${extra_options} vax/elf.opt"
@@ -3493,7 +3479,7 @@ case "${target}" in
        v850*-*-*)
                supported_defaults=cpu
                case ${with_cpu} in
-               "" | v850e | v850e1)
+               "" | v850e | v850e1 | v850e2 | v850es | v850e2v3)
                        # OK
                        ;;
                *)
@@ -3621,14 +3607,15 @@ case ${target} in
                ;;
 
        v850*-*-*)
-               # FIXME: The v850 is "special" in that it does not support
-               # runtime CPU selection, only --with-cpu.
                case "x$with_cpu" in
                x)
                        ;;
-               xv850e)
+               xv850e | xv850e1 | xv850e2 | xv850e2v3)
                        target_cpu_default2="TARGET_CPU_$with_cpu"
                        ;;
+               xv850es)
+                       target_cpu_default2="TARGET_CPU_v850e1"
+                       ;;
                esac
                ;;
 esac
diff --git a/gcc/config/v850/t-v850e b/gcc/config/v850/t-v850e
deleted file mode 100644 (file)
index 1eb7685..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-# Copyright (C) 2003, 2008, 2009, 2010 Free Software Foundation, Inc.
-#
-# This file is part of GCC.
-#
-# GCC is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# GCC is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-LIB1ASMSRC = v850/lib1funcs.asm
-LIB1ASMFUNCS   = _mulsi3 \
-                 _divsi3 \
-                 _udivsi3 \
-                 _modsi3 \
-                 _umodsi3 \
-                 _save_2 \
-                 _save_20 \
-                 _save_21 \
-                 _save_22 \
-                 _save_23 \
-                 _save_24 \
-                 _save_25 \
-                 _save_26 \
-                 _save_27 \
-                 _save_28 \
-                 _save_29 \
-                 _save_2c \
-                 _save_20c \
-                 _save_21c \
-                 _save_22c \
-                 _save_23c \
-                 _save_24c \
-                 _save_25c \
-                 _save_26c \
-                 _save_27c \
-                 _save_28c \
-                 _save_29c \
-                 _save_31c \
-                 _save_interrupt \
-                 _save_all_interrupt \
-                  _callt_save_20 \
-                 _callt_save_21 \
-                 _callt_save_22 \
-                 _callt_save_23 \
-                 _callt_save_24 \
-                 _callt_save_25 \
-                 _callt_save_26 \
-                 _callt_save_27 \
-                 _callt_save_28 \
-                 _callt_save_29 \
-                 _callt_save_20c \
-                 _callt_save_21c \
-                 _callt_save_22c \
-                 _callt_save_23c \
-                 _callt_save_24c \
-                 _callt_save_25c \
-                 _callt_save_26c \
-                 _callt_save_27c \
-                 _callt_save_28c \
-                 _callt_save_29c \
-                 _callt_save_31c \
-                 _callt_save_interrupt \
-                 _callt_save_all_interrupt \
-                 _callt_save_r2_r29 \
-                 _callt_save_r2_r31 \
-                 _negdi2 \
-                 _cmpdi2 \
-                 _ucmpdi2 \
-                 _muldi3
-
-# We want fine grained libraries, so use the new code to build the
-# floating point emulation libraries.
-FPBIT = fp-bit.c
-DPBIT = dp-bit.c
-
-dp-bit.c: $(srcdir)/config/fp-bit.c
-       echo '#ifdef __LITTLE_ENDIAN__' > dp-bit.c
-       echo '#define FLOAT_BIT_ORDER_MISMATCH' >>dp-bit.c
-       echo '#endif'           >> dp-bit.c
-       cat $(srcdir)/config/fp-bit.c >> dp-bit.c
-
-fp-bit.c: $(srcdir)/config/fp-bit.c
-       echo '#define FLOAT' > fp-bit.c
-       echo '#ifdef __LITTLE_ENDIAN__' >> fp-bit.c
-       echo '#define FLOAT_BIT_ORDER_MISMATCH' >>fp-bit.c
-       echo '#endif'           >> fp-bit.c
-       cat $(srcdir)/config/fp-bit.c >> fp-bit.c
-
-# Create target-specific versions of the libraries
-MULTILIB_OPTIONS  = mv850
-MULTILIB_DIRNAMES = v850
-INSTALL_LIBGCC    = install-multilib
-
-TCFLAGS = -mno-app-regs -msmall-sld -Wa,-mwarn-signed-overflow -Wa,-mwarn-unsigned-overflow
-
-v850-c.o: $(srcdir)/config/v850/v850-c.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
-  $(TM_H) $(CPPLIB_H) $(TREE_H) $(C_PRAGMA_H) $(GGC_H) $(TM_P_H)
-       $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
-               $(srcdir)/config/v850/v850-c.c 
-
-# Local Variables:
-# mode: Makefile
-# End:
index 45dad92c35610a2d79a0086048f9e78f74c572db..cb31f9aa381ff9f4ad82834821696a5ad93e0376 100644 (file)
@@ -118,9 +118,18 @@ v850_handle_option (struct gcc_options *opts,
 
     case OPT_mv850e:
     case OPT_mv850e1:
+    case OPT_mv850es:
       opts->x_target_flags &= ~(MASK_CPU ^ MASK_V850E);
       return true;
 
+    case OPT_mv850e2:
+      opts->x_target_flags &= ~(MASK_CPU ^ MASK_V850E2);
+      return true;
+
+    case OPT_mv850e2v3:
+      opts->x_target_flags &= ~(MASK_CPU ^ MASK_V850E2V3);
+      return true;
+
     case OPT_mtda_:
       v850_handle_memory_option (SMALL_MEMORY_TDA, opts,
                                 decoded->orig_option_with_args_text,
@@ -3130,6 +3139,23 @@ v850_legitimate_constant_p (enum machine_mode mode ATTRIBUTE_UNUSED, rtx x)
               && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
               && !CONST_OK_FOR_K (INTVAL (XEXP (XEXP (x, 0), 1)))));
 }
+
+static int
+v850_memory_move_cost (enum machine_mode mode, bool in)
+{
+  switch (GET_MODE_SIZE (mode))
+    {
+    case 0:
+      return in ? 24 : 8;
+    case 1:
+    case 2:
+    case 3:
+    case 4:
+      return in ? 6 : 2;
+    default:
+      return (GET_MODE_SIZE (mode) / 2) * (in ? 3 : 1);
+    }
+}
 \f
 /* V850 specific attributes.  */
 
@@ -3151,6 +3177,10 @@ static const struct attribute_spec v850_attribute_table[] =
 };
 \f
 /* Initialize the GCC target structure.  */
+
+#undef  TARGET_MEMORY_MOVE_COST
+#define TARGET_MEMORY_MOVE_COST v850_memory_move_cost
+
 #undef  TARGET_ASM_ALIGNED_HI_OP
 #define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
 
index ea3bcbb97edcf25c83ec68f01f343cae1039451c..6595a2e65cbdf9d66d55a30bf850e65fb4d6151b 100644 (file)
@@ -113,7 +113,7 @@ extern GTY(()) rtx v850_compare_op1;
     builtin_define ("__EP__");                 \
 } while(0)
 
-#define MASK_CPU (MASK_V850 | MASK_V850E)
+#define MASK_CPU (MASK_V850 | MASK_V850E | MASK_V850E1 | MASK_V850E2 | MASK_V850E2V3)
 \f
 /* Target machine storage layout */
 
@@ -156,7 +156,7 @@ extern GTY(()) rtx v850_compare_op1;
 
 /* Allocation boundary (in *bits*) for the code of a function.
    16 is the minimum boundary; 32 would give better performance.  */
-#define FUNCTION_BOUNDARY 16
+#define FUNCTION_BOUNDARY (optimize_size ? 16 : 32)
 
 /* No data type wants to be aligned rounder than this.  */
 #define BIGGEST_ALIGNMENT      32
index 88e42c65e904849f482af18c203b00497b1c5ab9..cae929da79469d7ec22c7e5b34bf026059602755 100644 (file)
 
 (define_insn "*movsi_high"
   [(set (match_operand:SI 0 "register_operand" "=r")
-       (high:SI (match_operand 1 "" "")))]
+       (high:SI (match_operand 1 "immediate_operand" "i")))]
   ""
   "movhi hi(%1),%.,%0"
   [(set_attr "length" "4")
        (mod:SI (match_dup 1)
                (match_dup 2)))
    (clobber (reg:CC CC_REGNUM))]
-  "TARGET_V850E"
-  "div %2,%0,%3"
+  "TARGET_V850E || TARGET_V850E2_ALL"
+  {
+   if (TARGET_V850E2_ALL)
+     return "divq %2,%0,%3";
+   else
+     return "div %2,%0,%3";
+  }
   [(set_attr "length" "4")
    (set_attr "cc" "clobber")
    (set_attr "type" "div")])
        (umod:SI (match_dup 1)
                 (match_dup 2)))
    (clobber (reg:CC CC_REGNUM))]
-  "TARGET_V850E"
-  "divu %2,%0,%3"
+  "TARGET_V850E || TARGET_V850E2_ALL"
+  {
+    if (TARGET_V850E2_ALL)
+      return "divqu %2,%0,%3";
+   else
+      return "divu %2,%0,%3";
+  }
   [(set_attr "length" "4")
    (set_attr "cc" "clobber")
    (set_attr "type" "div")])
        (mod:HI (match_dup 1)
                (match_dup 2)))
    (clobber (reg:CC CC_REGNUM))]
-  "TARGET_V850E"
+  "TARGET_V850E || TARGET_V850E2_ALL"
   "divh %2,%0,%3"
   [(set_attr "length" "4")
    (set_attr "cc" "clobber")
        (umod:HI (match_dup 1)
                 (match_dup 2)))
    (clobber (reg:CC CC_REGNUM))]
-  "TARGET_V850E"
+  "TARGET_V850E || TARGET_V850E2_ALL"
   "zxh %0 ; divhu %2,%0,%3"
   [(set_attr "length" "4")
    (set_attr "cc" "clobber")
 ;; EXTEND INSTRUCTIONS
 ;; ----------------------------------------------------------------------
 
-(define_insn ""
+(define_insn "*zero_extendhisi2_v850e"
   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
        (zero_extend:SI
         (match_operand:HI 1 "nonimmediate_operand" "0,r,T,m")))
   [(set_attr "length" "2,4,2,4")
    (set_attr "cc" "none_0hit,set_zn,none_0hit,none_0hit")])
 
-(define_insn "zero_extendhisi2"
+(define_insn "*zero_extendhisi2_v850"
   [(set (match_operand:SI 0 "register_operand" "=r")
        (zero_extend:SI
        (match_operand:HI 1 "register_operand" "r")))
-   (clobber (reg:CC CC_REGNUM))]
+   (clobber (reg:CC CC_REGNUM))]  ;; A lie, but we have to match the expander
   ""
   "andi 65535,%1,%0"
   [(set_attr "length" "4")
    (set_attr "cc" "set_zn")])
 
-(define_insn ""
+(define_expand "zero_extendhisi2"
+  [(parallel [(set (match_operand:SI 0 "register_operand")
+                  (zero_extend:SI
+                   (match_operand:HI 1 "nonimmediate_operand")))
+             (clobber (reg:CC CC_REGNUM))])]
+  ""
+  {
+    if (! (TARGET_V850E || TARGET_V850E2_ALL))
+      operands[1] = force_reg (HImode, operands[1]);
+  }
+)
+
+(define_insn "*zero_extendqisi2_v850e"
   [(set (match_operand:SI 0 "register_operand" "=r,r,r,r")
        (zero_extend:SI
        (match_operand:QI 1 "nonimmediate_operand" "0,r,T,m")))
   [(set_attr "length" "2,4,2,4")
    (set_attr "cc" "none_0hit,set_zn,none_0hit,none_0hit")])
 
-(define_insn "zero_extendqisi2"
+(define_insn "*zero_extendqisi2_v850"
   [(set (match_operand:SI 0 "register_operand" "=r")
        (zero_extend:SI
-       (match_operand:QI 1 "register_operand" "r")))
-   (clobber (reg:CC CC_REGNUM))]
+        (match_operand:QI 1 "register_operand" "r")))
+   (clobber (reg:CC CC_REGNUM))] ;; A lie, but we have to match the expander
   ""
   "andi 255,%1,%0"
   [(set_attr "length" "4")
    (set_attr "cc" "set_zn")])
 
+(define_expand "zero_extendqisi2"
+  [(parallel [(set (match_operand:SI 0 "register_operand")
+                  (zero_extend:SI
+                    (match_operand:QI 1 "nonimmediate_operand")))
+             (clobber (reg:CC CC_REGNUM))])]
+  ""
+  {
+    if (! (TARGET_V850E || TARGET_V850E2_ALL))
+      operands[1] = force_reg (QImode, operands[1]);
+  }
+)
+
 ;;- sign extension instructions
 
 ;; ??? The extendhisi2 pattern should not emit shifts for v850e?