diff options
author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-02-18 19:35:08 +0000 |
---|---|---|
committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-02-18 19:35:08 +0000 |
commit | e52a3bedc98dd99019f94952357e0ca46c34501b (patch) | |
tree | de15fe52360bf719ed5c0a49ace9daae5c91c295 /gcc/sbitmap.c | |
parent | 8c960e2a9be4a8806a2e4ba8164c3e7aff63817f (diff) | |
download | gcc-e52a3bedc98dd99019f94952357e0ca46c34501b.tar.gz |
* sbitmap.c (sbitmap_resize): New function.
* sbitmap.h (sbitmap_resize): Prototype here.
* recog.c (split_all_insns): Use sbitmap_resize.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@63058 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/sbitmap.c')
-rw-r--r-- | gcc/sbitmap.c | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/gcc/sbitmap.c b/gcc/sbitmap.c index 8514a221227..e79ff940812 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 * |