machmode.h (mode_for_size, [...]): SIZE now signed.

* machmode.h (mode_for_size, smallest_mode_for_size): SIZE now signed.
	* stor-layout.c (mode_for_size, smallest_mode_for_size): Likewise.
	(mode_for_size_tree): New function.
	(layout_decl, layout_type): Call it and clean up BLKmode checks.
	* tree.h (mode_for_size_tree): New declaration.

From-SVN: r32326
This commit is contained in:
Richard Kenner 2000-03-04 16:40:05 +00:00 committed by Richard Kenner
parent 32070bf2d8
commit 72c602fc01
4 changed files with 60 additions and 27 deletions

View File

@ -1,5 +1,11 @@
Sat Mar 4 11:32:30 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* machmode.h (mode_for_size, smallest_mode_for_size): SIZE now signed.
* stor-layout.c (mode_for_size, smallest_mode_for_size): Likewise.
(mode_for_size_tree): New function.
(layout_decl, layout_type): Call it and clean up BLKmode checks.
* tree.h (mode_for_size_tree): New declaration.
* toplev.c (debug_ignore_block): Mark arg BLOCK as possibly unused.
2000-03-04 Jason Merrill <jason@casey.cygnus.com>

View File

@ -1,5 +1,6 @@
/* Machine mode definitions for GNU C-Compiler; included by rtl.h and tree.h.
Copyright (C) 1991, 93, 94, 96, 98, 99, 2000 Free Software Foundation, Inc.
Copyright (C) 1991, 1993, 1994, 1996, 1998, 1999, 2000
Free Software Foundation, Inc.
This file is part of GNU CC.
@ -105,12 +106,12 @@ extern const unsigned char mode_wider_mode[];
If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
The value is BLKmode if no other mode is found. */
extern enum machine_mode mode_for_size PARAMS ((unsigned int, enum mode_class, int));
extern enum machine_mode mode_for_size PARAMS ((int, enum mode_class, int));
/* Similar, but find the smallest mode for a given width. */
extern enum machine_mode smallest_mode_for_size PARAMS ((unsigned int,
enum mode_class));
extern enum machine_mode smallest_mode_for_size
PARAMS ((int, enum mode_class));
/* Return an integer mode of the exact same size as the input mode,

View File

@ -150,30 +150,52 @@ variable_size (size)
enum machine_mode
mode_for_size (size, class, limit)
unsigned int size;
int size;
enum mode_class class;
int limit;
{
register enum machine_mode mode;
if (limit && size > (unsigned int)(MAX_FIXED_MODE_SIZE))
if (limit && size > MAX_FIXED_MODE_SIZE)
return BLKmode;
/* Get the first mode which has this size, in the specified class. */
for (mode = GET_CLASS_NARROWEST_MODE (class); mode != VOIDmode;
mode = GET_MODE_WIDER_MODE (mode))
if ((unsigned int)GET_MODE_BITSIZE (mode) == size)
if (GET_MODE_BITSIZE (mode) == size)
return mode;
return BLKmode;
}
/* Similar, except passed a tree node. */
enum machine_mode
mode_for_size_tree (size, class, limit)
tree size;
enum mode_class class;
int limit;
{
if (TREE_CODE (size) != INTEGER_CST
|| TREE_INT_CST_HIGH (size) != 0
/* If the low-order part is so high as to appear negative, we can't
find a mode for that many bits. */
|| TREE_INT_CST_LOW (size) < 0
/* What we really want to say here is that the size can fit in a
host integer, but we know there's no way we'd find a mode for
this many bits, so there's no point in doing the precise test. */
|| TREE_INT_CST_LOW (size) > 1000)
return BLKmode;
else
return mode_for_size (TREE_INT_CST_LOW (size), class, limit);
}
/* Similar, but never return BLKmode; return the narrowest mode that
contains at least the requested number of bits. */
enum machine_mode
smallest_mode_for_size (size, class)
unsigned int size;
int size;
enum mode_class class;
{
register enum machine_mode mode;
@ -182,7 +204,7 @@ smallest_mode_for_size (size, class)
specified class. */
for (mode = GET_CLASS_NARROWEST_MODE (class); mode != VOIDmode;
mode = GET_MODE_WIDER_MODE (mode))
if ((unsigned int)GET_MODE_BITSIZE (mode) >= size)
if (GET_MODE_BITSIZE (mode) >= size)
return mode;
abort ();
@ -332,7 +354,7 @@ layout_decl (decl, known_align)
&& GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT)
{
register enum machine_mode xmode
= mode_for_size (TREE_INT_CST_LOW (DECL_SIZE (decl)), MODE_INT, 1);
= mode_for_size_tree (DECL_SIZE (decl), MODE_INT, 1);
if (xmode != BLKmode
&& known_align % GET_MODE_ALIGNMENT (xmode) == 0)
@ -1058,19 +1080,17 @@ layout_type (type)
TYPE_MODE (type) = BLKmode;
if (TYPE_SIZE (type) != 0
&& TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
/* BLKmode elements force BLKmode aggregate;
else extract/store fields may lose. */
&& (TYPE_MODE (TREE_TYPE (type)) != BLKmode
|| TYPE_NO_FORCE_BLK (TREE_TYPE (type))))
{
TYPE_MODE (type)
= mode_for_size (TREE_INT_CST_LOW (TYPE_SIZE (type)),
MODE_INT, 1);
= mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1);
if (STRICT_ALIGNMENT && TYPE_ALIGN (type) < BIGGEST_ALIGNMENT
&& ((int) TYPE_ALIGN (type)
< TREE_INT_CST_LOW (TYPE_SIZE (type)))
if (TYPE_MODE (type) != BLKmode
&& STRICT_ALIGNMENT && TYPE_ALIGN (type) < BIGGEST_ALIGNMENT
&& TYPE_ALIGN (type) < GET_MODE_ALIGNMENT (TYPE_MODE (type))
&& TYPE_MODE (type) != BLKmode)
{
TYPE_NO_FORCE_BLK (type) = 1;
@ -1136,21 +1156,20 @@ layout_type (type)
TYPE_MODE (type) = mode;
else
TYPE_MODE (type)
= mode_for_size (TREE_INT_CST_LOW (TYPE_SIZE (type)),
MODE_INT, 1);
= mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1);
/* If structure's known alignment is less than
what the scalar mode would need, and it matters,
then stick with BLKmode. */
if (STRICT_ALIGNMENT
if (TYPE_MODE (type) != BLKmode
&& STRICT_ALIGNMENT
&& ! (TYPE_ALIGN (type) >= BIGGEST_ALIGNMENT
|| ((int) TYPE_ALIGN (type)
>= TREE_INT_CST_LOW (TYPE_SIZE (type)))))
|| (TYPE_ALIGN (type) >=
GET_MODE_ALIGNMENT (TYPE_MODE (type)))))
{
if (TYPE_MODE (type) != BLKmode)
/* If this is the only reason this type is BLKmode,
then don't force containing types to be BLKmode. */
TYPE_NO_FORCE_BLK (type) = 1;
/* If this is the only reason this type is BLKmode,
then don't force containing types to be BLKmode. */
TYPE_NO_FORCE_BLK (type) = 1;
TYPE_MODE (type) = BLKmode;
}
@ -1195,8 +1214,7 @@ layout_type (type)
}
TYPE_MODE (type)
= mode_for_size (TREE_INT_CST_LOW (TYPE_SIZE (type)),
MODE_INT, 1);
= mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1);
union_lose: ;
}

View File

@ -1799,6 +1799,14 @@ extern tree type_hash_canon PARAMS ((int, tree));
extern void layout_decl PARAMS ((tree, unsigned));
/* Return the mode for data of a given size SIZE and mode class CLASS.
If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
The value is BLKmode if no other mode is found. This is like
mode_for_size, but is passed a tree. */
extern enum machine_mode mode_for_size_tree PARAMS ((tree, enum mode_class,
int));
/* Return an expr equal to X but certainly not valid as an lvalue. */
extern tree non_lvalue PARAMS ((tree));