re PR target/19336 (HPPA64 does not support TImode)

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
This commit is contained in:
John David Anglin 2005-01-15 20:04:57 +00:00 committed by John David Anglin
parent 2d5ca9a017
commit 83c32f2e48
3 changed files with 62 additions and 0 deletions

View 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.

View 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;
/* 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,

View 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. */