aboutsummaryrefslogtreecommitdiff
path: root/gcc/ggc-page.c
diff options
context:
space:
mode:
authorZack Weinberg <zack@codesourcery.com>2002-08-24 03:20:33 +0000
committerZack Weinberg <zack@gcc.gnu.org>2002-08-24 03:20:33 +0000
commit280cf02aff113def7aa6d7a4a7a527ca8fce4df4 (patch)
treea77c2142c30ef92cd834b61d17ae51d942b6fc8d /gcc/ggc-page.c
parent314b5a68e3bc44a4a1c5558717e37608b6ffb546 (diff)
downloadgcc-280cf02aff113def7aa6d7a4a7a527ca8fce4df4.zip
gcc-280cf02aff113def7aa6d7a4a7a527ca8fce4df4.tar.gz
gcc-280cf02aff113def7aa6d7a4a7a527ca8fce4df4.tar.bz2
ggc-page.c (compute_inverse): Short circuit calculation for object sizes larger than half a page.
* ggc-page.c (compute_inverse): Short circuit calculation for object sizes larger than half a page. From-SVN: r56548
Diffstat (limited to 'gcc/ggc-page.c')
-rw-r--r--gcc/ggc-page.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/ggc-page.c b/gcc/ggc-page.c
index af3af1a..294bdfc 100644
--- a/gcc/ggc-page.c
+++ b/gcc/ggc-page.c
@@ -1080,6 +1080,18 @@ compute_inverse (order)
{
unsigned size, inv, e;
+ /* There can be only one object per "page" in a bucket for sizes
+ larger than half a machine page; it will always have offset zero. */
+ if (OBJECT_SIZE (order) > G.pagesize/2)
+ {
+ if (OBJECTS_PER_PAGE (order) != 1)
+ abort ();
+
+ DIV_MULT (order) = 1;
+ DIV_SHIFT (order) = 0;
+ return;
+ }
+
size = OBJECT_SIZE (order);
e = 0;
while (size % 2 == 0)