aboutsummaryrefslogtreecommitdiff
path: root/gcc/sbitmap.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2003-02-18 19:35:08 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2003-02-18 19:35:08 +0000
commite360ab394f9e67d79095b9d01fc1d68af0007bbc (patch)
treede15fe52360bf719ed5c0a49ace9daae5c91c295 /gcc/sbitmap.c
parent6b00cbc7f441c9c8f3f38772bd7ff520e9765b70 (diff)
downloadgcc-e360ab394f9e67d79095b9d01fc1d68af0007bbc.zip
gcc-e360ab394f9e67d79095b9d01fc1d68af0007bbc.tar.gz
gcc-e360ab394f9e67d79095b9d01fc1d68af0007bbc.tar.bz2
sbitmap.c (sbitmap_resize): New function.
* sbitmap.c (sbitmap_resize): New function. * sbitmap.h (sbitmap_resize): Prototype here. * recog.c (split_all_insns): Use sbitmap_resize. From-SVN: r63058
Diffstat (limited to 'gcc/sbitmap.c')
-rw-r--r--gcc/sbitmap.c60
1 files changed, 59 insertions, 1 deletions
diff --git a/gcc/sbitmap.c b/gcc/sbitmap.c
index 8514a22..e79ff94 100644
--- a/gcc/sbitmap.c
+++ b/gcc/sbitmap.c
@@ -1,5 +1,5 @@
/* Simple bitmaps.
- Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
This file is part of GCC.
@@ -49,6 +49,64 @@ sbitmap_alloc (n_elms)
return bmap;
}
+/* Resize a simple bitmap BMAP to N_ELMS bits. If increasing the
+ size of BMAP, clear the new bits to zero if the DEF argument
+ is zero, and set them to one otherwise. */
+
+sbitmap
+sbitmap_resize (bmap, n_elms, def)
+ sbitmap bmap;
+ unsigned int n_elms;
+ int def;
+{
+ unsigned int bytes, size, amt;
+ unsigned int last_bit;
+
+ size = SBITMAP_SET_SIZE (n_elms);
+ bytes = size * sizeof (SBITMAP_ELT_TYPE);
+ if (bytes > bmap->bytes)
+ {
+ amt = (sizeof (struct simple_bitmap_def)
+ + bytes - sizeof (SBITMAP_ELT_TYPE));
+ bmap = (sbitmap) xrealloc ((PTR) bmap, amt);
+ }
+
+ if (n_elms > bmap->n_bits)
+ {
+ if (def)
+ {
+ memset ((PTR) (bmap->elms + bmap->size), -1, bytes - bmap->bytes);
+
+ /* Set the new bits if the original last element. */
+ last_bit = bmap->n_bits % SBITMAP_ELT_BITS;
+ if (last_bit)
+ bmap->elms[bmap->size - 1]
+ |= ~((SBITMAP_ELT_TYPE)-1 >> (SBITMAP_ELT_BITS - last_bit));
+
+ /* Clear the unused bit in the new last element. */
+ last_bit = n_elms % SBITMAP_ELT_BITS;
+ if (last_bit)
+ bmap->elms[size - 1]
+ &= (SBITMAP_ELT_TYPE)-1 >> (SBITMAP_ELT_BITS - last_bit);
+ }
+ else
+ memset ((PTR) (bmap->elms + bmap->size), 0, bytes - bmap->bytes);
+ }
+ else if (n_elms < bmap->n_bits)
+ {
+ /* Clear the surplus bits in the last word. */
+ last_bit = n_elms % SBITMAP_ELT_BITS;
+ if (last_bit)
+ bmap->elms[size - 1]
+ &= (SBITMAP_ELT_TYPE)-1 >> (SBITMAP_ELT_BITS - last_bit);
+ }
+
+ bmap->n_bits = n_elms;
+ bmap->size = size;
+ bmap->bytes = bytes;
+ return bmap;
+}
+
/* Allocate a vector of N_VECS bitmaps of N_ELMS bits. */
sbitmap *