]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/19336 (HPPA64 does not support TImode)
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Sat, 15 Jan 2005 20:04:57 +0000 (20:04 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Sat, 15 Jan 2005 20:04:57 +0000 (20:04 +0000)
PR target/19336
* pa.c (pa_scalar_mode_supported_p): New function.
(TARGET_SCALAR_MODE_SUPPORTED_P): Define.
* pa.h (MIN_UNITS_PER_WORD): Add comment.

From-SVN: r93703

gcc/ChangeLog
gcc/config/pa/pa.c
gcc/config/pa/pa.h

index 81cfd921c038ac867e0efba76061ebe0764ee9b9..ab3a41e46d1bde7091319dc554876c10f977ae5d 100644 (file)
@@ -1,5 +1,10 @@
 2005-01-15  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
+       PR target/19336
+       * pa.c (pa_scalar_mode_supported_p): New function.
+       (TARGET_SCALAR_MODE_SUPPORTED_P): Define.
+       * pa.h (MIN_UNITS_PER_WORD): Add comment.
+
        * pa-protos.h (prefetch_operand): Delete.
        (prefetch_cc_operand, prefetch_nocc_operand): New declations.
        * pa.c (prefetch_operand): Delete.
index 7d0dff5ccf0c9662ae1f97c6d2e8a3cbf3af58d8..c470165f1511d878a9fcc2f1527ec476865e87df 100644 (file)
@@ -123,6 +123,7 @@ static void pa_asm_out_destructor (rtx, int);
 static void pa_init_builtins (void);
 static rtx hppa_builtin_saveregs (void);
 static tree hppa_gimplify_va_arg_expr (tree, tree, tree *, tree *);
+static bool pa_scalar_mode_supported_p (enum machine_mode);
 static void copy_fp_args (rtx) ATTRIBUTE_UNUSED;
 static int length_fp_args (rtx) ATTRIBUTE_UNUSED;
 static struct deferred_plabel *get_plabel (const char *)
@@ -292,6 +293,9 @@ static size_t n_deferred_plabels = 0;
 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
 #define TARGET_GIMPLIFY_VA_ARG_EXPR hppa_gimplify_va_arg_expr
 
+#undef TARGET_SCALAR_MODE_SUPPORTED_P
+#define TARGET_SCALAR_MODE_SUPPORTED_P pa_scalar_mode_supported_p
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 /* Parse the -mfixed-range= option string.  */
@@ -6219,6 +6223,50 @@ hppa_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
     }
 }
 
+/* True if MODE is valid for the target.  By "valid", we mean able to
+   be manipulated in non-trivial ways.  In particular, this means all
+   the arithmetic is supported.
+
+   Currently, TImode is not valid as the HP 64-bit runtime documentation
+   doesn't document the alignment and calling conventions for this type. 
+   Thus, we return false when PRECISION is 2 * BITS_PER_WORD and
+   2 * BITS_PER_WORD isn't equal LONG_LONG_TYPE_SIZE.  */
+
+static bool
+pa_scalar_mode_supported_p (enum machine_mode mode)
+{
+  int precision = GET_MODE_PRECISION (mode);
+
+  switch (GET_MODE_CLASS (mode))
+    {
+    case MODE_PARTIAL_INT:
+    case MODE_INT:
+      if (precision == CHAR_TYPE_SIZE)
+       return true;
+      if (precision == SHORT_TYPE_SIZE)
+       return true;
+      if (precision == INT_TYPE_SIZE)
+       return true;
+      if (precision == LONG_TYPE_SIZE)
+       return true;
+      if (precision == LONG_LONG_TYPE_SIZE)
+       return true;
+      return false;
+
+    case MODE_FLOAT:
+      if (precision == FLOAT_TYPE_SIZE)
+       return true;
+      if (precision == DOUBLE_TYPE_SIZE)
+       return true;
+      if (precision == LONG_DOUBLE_TYPE_SIZE)
+       return true;
+      return false;
+
+    default:
+      gcc_unreachable ();
+    }
+}
+
 /* This routine handles all the normal conditional branch sequences we
    might need to generate.  It handles compare immediate vs compare
    register, nullification of delay slots, varying length branches,
index 61a33258e2c3a7bb31c289f1cfdbe2090864c855..48e459a84ffc55debcdd9c9d0c013d8ba5ce09a2 100644 (file)
@@ -484,6 +484,15 @@ typedef struct machine_function GTY(())
 
 /* Width of a word, in units (bytes).  */
 #define UNITS_PER_WORD (TARGET_64BIT ? 8 : 4)
+
+/* Minimum number of units in a word.  If this is undefined, the default
+   is UNITS_PER_WORD.  Otherwise, it is the constant value that is the
+   smallest value that UNITS_PER_WORD can have at run-time.
+
+   FIXME: This needs to be 4 when TARGET_64BIT is true to suppress the
+   building of various TImode routines in libgcc.  The HP runtime
+   specification doesn't provide the alignment requirements and calling
+   conventions for TImode variables.  */
 #define MIN_UNITS_PER_WORD 4
 
 /* Allocation boundary (in *bits*) for storing arguments in argument list.  */