2006-03-29 Andreas Krebbel <krebbel1@de.ibm.com>
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Mar 2006 11:55:53 +0000 (11:55 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Mar 2006 11:55:53 +0000 (11:55 +0000)
* config.gcc (s390-*-linux-*, s390x-*-linux*): Add t-dfprules to
tmake_file.
* config/s390/s390.c (S390_scalar_mode_supported_p): New function.
(NR_C_MODES): Add TDmode, DDmode and SDmode.
(s390_output_pool_entry, ): Accept MODE_DECIMAL_FLOAT.
(s390_hard_regno_mode_ok): Disallow TDmode in integer regs.
(s390_function_arg_float): Allow SDmode and DDmode values to be
passed in floating point registers.
(s390_function_arg_integer, s390_function_value): Replace MODE_FLOAT
check with SCALAR_FLOAT_MODE_P.
(TARGET_SCALAR_MODE_SUPPORTED_P): Define target macro.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112491 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config.gcc
gcc/config/s390/s390.c

index c9be20c..1dbe439 100644 (file)
@@ -1,3 +1,17 @@
+2006-03-29  Andreas Krebbel  <krebbel1@de.ibm.com>
+
+       * config.gcc (s390-*-linux-*, s390x-*-linux*): Add t-dfprules to 
+       tmake_file.
+       * config/s390/s390.c (S390_scalar_mode_supported_p): New function.
+       (NR_C_MODES): Add TDmode, DDmode and SDmode.
+       (s390_output_pool_entry, ): Accept MODE_DECIMAL_FLOAT.
+       (s390_hard_regno_mode_ok): Disallow TDmode in integer regs.
+       (s390_function_arg_float): Allow SDmode and DDmode values to be
+       passed in floating point registers.
+       (s390_function_arg_integer, s390_function_value): Replace MODE_FLOAT 
+       check with SCALAR_FLOAT_MODE_P.
+       (TARGET_SCALAR_MODE_SUPPORTED_P): Define target macro.
+
 2006-03-28  Zdenek Dvorak <dvorakz@suse.cz>
 
        PR tree-optimization/25985
index 96a547e..ef6364d 100644 (file)
@@ -1887,7 +1887,7 @@ rs6000-ibm-aix[56789].* | powerpc-ibm-aix[56789].*)
        ;;
 s390-*-linux*)
        tm_file="s390/s390.h dbxelf.h elfos.h svr4.h linux.h s390/linux.h"
-       tmake_file="${tmake_file} s390/t-crtstuff s390/t-linux"
+       tmake_file="${tmake_file} t-dfprules s390/t-crtstuff s390/t-linux"
        ;;
 s390x-*-linux*)
        tm_file="s390/s390x.h s390/s390.h dbxelf.h elfos.h svr4.h linux.h s390/linux.h"
@@ -1895,7 +1895,7 @@ s390x-*-linux*)
        md_file=s390/s390.md
        extra_modes=s390/s390-modes.def
        out_file=s390/s390.c
-       tmake_file="${tmake_file} s390/t-crtstuff s390/t-linux s390/t-linux64"
+       tmake_file="${tmake_file} t-dfprules s390/t-crtstuff s390/t-linux s390/t-linux64"
        ;;
 s390x-ibm-tpf*)
         tm_file="s390/s390x.h s390/s390.h dbxelf.h elfos.h svr4.h s390/tpf.h"
index 1ee6fba..fdd4b5c 100644 (file)
@@ -334,6 +334,16 @@ struct machine_function GTY(())
 #define REGNO_PAIR_OK(REGNO, MODE)                               \
   (HARD_REGNO_NREGS ((REGNO), (MODE)) == 1 || !((REGNO) & 1))
 
+/* Return true if the back end supports mode MODE.  */
+static bool
+s390_scalar_mode_supported_p (enum machine_mode mode)
+{
+  if (DECIMAL_FLOAT_MODE_P (mode))
+    return true;
+  else
+    return default_scalar_mode_supported_p (mode);
+}
+
 /* Set the has_landing_pad_p flag in struct machine_function to VALUE.  */
 
 void
@@ -5259,12 +5269,12 @@ replace_ltrel_base (rtx *x)
 /* We keep a list of constants which we have to add to internal
    constant tables in the middle of large functions.  */
 
-#define NR_C_MODES 8
+#define NR_C_MODES 11
 enum machine_mode constant_modes[NR_C_MODES] =
 {
-  TFmode, TImode,
-  DFmode, DImode,
-  SFmode, SImode,
+  TFmode, TImode, TDmode,
+  DFmode, DImode, DDmode,
+  SFmode, SImode, SDmode,
   HImode,
   QImode
 };
@@ -6207,6 +6217,7 @@ s390_output_pool_entry (rtx exp, enum machine_mode mode, unsigned int align)
   switch (GET_MODE_CLASS (mode))
     {
     case MODE_FLOAT:
+    case MODE_DECIMAL_FLOAT:
       gcc_assert (GET_CODE (exp) == CONST_DOUBLE);
 
       REAL_VALUE_FROM_CONST_DOUBLE (r, exp);
@@ -6782,7 +6793,7 @@ s390_hard_regno_mode_ok (unsigned int regno, enum machine_mode mode)
       if (REGNO_PAIR_OK (regno, mode))
        {
          if (TARGET_64BIT 
-             || (mode != TFmode && mode != TCmode))
+             || (mode != TFmode && mode != TCmode && mode != TDmode))
            return true;
        }         
       break;
@@ -7601,7 +7612,7 @@ s390_function_arg_float (enum machine_mode mode, tree type)
 
   /* No type info available for some library calls ...  */
   if (!type)
-    return mode == SFmode || mode == DFmode;
+    return mode == SFmode || mode == DFmode || mode == SDmode || mode == DDmode;
 
   /* The ABI says that record types with a single member are treated
      just like that member would be.  */
@@ -7643,7 +7654,7 @@ s390_function_arg_integer (enum machine_mode mode, tree type)
   /* No type info available for some library calls ...  */
   if (!type)
     return GET_MODE_CLASS (mode) == MODE_INT
-          || (TARGET_SOFT_FLOAT &&  GET_MODE_CLASS (mode) == MODE_FLOAT);
+          || (TARGET_SOFT_FLOAT &&  SCALAR_FLOAT_MODE_P (mode));
 
   /* We accept small integral (and similar) types.  */
   if (INTEGRAL_TYPE_P (type)
@@ -7805,11 +7816,10 @@ s390_function_value (tree type, enum machine_mode mode)
       mode = promote_mode (type, TYPE_MODE (type), &unsignedp, 1);
     }
 
-  gcc_assert (GET_MODE_CLASS (mode) == MODE_INT
-               || GET_MODE_CLASS (mode) == MODE_FLOAT);
+  gcc_assert (GET_MODE_CLASS (mode) == MODE_INT || SCALAR_FLOAT_MODE_P (mode));
   gcc_assert (GET_MODE_SIZE (mode) <= 8);
 
-  if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT)
+  if (TARGET_HARD_FLOAT && SCALAR_FLOAT_MODE_P (mode))
     return gen_rtx_REG (mode, 16);
   else
     return gen_rtx_REG (mode, 2);
@@ -9303,6 +9313,9 @@ s390_reorg (void)
 #define TARGET_MANGLE_FUNDAMENTAL_TYPE s390_mangle_fundamental_type
 #endif
 
+#undef TARGET_SCALAR_MODE_SUPPORTED_P
+#define TARGET_SCALAR_MODE_SUPPORTED_P s390_scalar_mode_supported_p
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 #include "gt-s390.h"