From 2304a656cfa29ae91fc64eab1ef18b7cada18b30 Mon Sep 17 00:00:00 2001 From: Joel Dice Date: Mon, 10 Nov 2008 21:25:36 -0700 Subject: [PATCH] in releaseRegister, if the register is not the exclusive site of a value, steal it --- src/compiler.cpp | 118 +++++++++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 56 deletions(-) diff --git a/src/compiler.cpp b/src/compiler.cpp index 391df0b5d4..0ecf5df82f 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -1694,62 +1694,6 @@ toString(Context* c, Site* sites, char* buffer, unsigned size) } } -void -releaseRegister(Context* c, Value* v, unsigned frameIndex, - unsigned sizeInBytes, int r) -{ - Site* source = 0; - for (SiteIterator it(v); it.hasMore();) { - Site* s = it.next(); - if (s->usesRegister(c, r)) { - if (DebugRegisters) { - char buffer[256]; s->toString(c, buffer, 256); - fprintf(stderr, "%p (%s) in %p at %d uses %d\n", - s, buffer, v, frameIndex, r); - } - - source = s; - it.remove(c); - } else { - if (DebugRegisters) { - char buffer[256]; s->toString(c, buffer, 256); - fprintf(stderr, "%p (%s) in %p at %d does not use %d\n", - s, buffer, v, frameIndex, r); - } - } - } - - if (not hasSite(v)) { - move(c, c->stack, c->locals, sizeInBytes, v, source, - frameSite(c, frameIndex)); - } - - if (DebugRegisters) { - char buffer[256]; toString(c, v->sites, buffer, 256); - fprintf(stderr, "%p is left with %s\n", v, buffer); - } -} - -unsigned -footprintSizeInBytes(unsigned footprint) -{ - if (BytesPerWord == 8) { - return 8; - } else { - return footprint * 4; - } -} - -void -releaseRegister(Context* c, int r) -{ - for (FrameIterator it(c, c->stack, c->locals); it.hasMore();) { - FrameIterator::Element e = it.next(c); - releaseRegister(c, e.value, frameIndex(c, &e), - footprintSizeInBytes(e.footprint), r); - } -} - bool find(Value* needle, Value* haystack) { @@ -1852,6 +1796,68 @@ usedExclusively(Context* c, Register* r) return used(c, r) and not hasMoreThanOneSite(r->value); } +void +releaseRegister(Context* c, Value* v, unsigned frameIndex, + unsigned sizeInBytes, int r) +{ + Site* source = 0; + for (SiteIterator it(v); it.hasMore();) { + Site* s = it.next(); + if (s->usesRegister(c, r)) { + if (DebugRegisters) { + char buffer[256]; s->toString(c, buffer, 256); + fprintf(stderr, "%p (%s) in %p at %d uses %d\n", + s, buffer, v, frameIndex, r); + } + + source = s; + it.remove(c); + } else { + if (DebugRegisters) { + char buffer[256]; s->toString(c, buffer, 256); + fprintf(stderr, "%p (%s) in %p at %d does not use %d\n", + s, buffer, v, frameIndex, r); + } + } + } + + if (not hasSite(v)) { + move(c, c->stack, c->locals, sizeInBytes, v, source, + frameSite(c, frameIndex)); + } + + if (DebugRegisters) { + char buffer[256]; toString(c, v->sites, buffer, 256); + fprintf(stderr, "%p is left with %s\n", v, buffer); + } +} + +unsigned +footprintSizeInBytes(unsigned footprint) +{ + if (BytesPerWord == 8) { + return 8; + } else { + return footprint * 4; + } +} + +void +releaseRegister(Context* c, int r) +{ + Register* reg = c->registers[r]; + if (used(c, reg) and not usedExclusively(c, reg)) { + removeSite(c, reg->value, reg->site); + if (reg->refCount == 0) return; + } + + for (FrameIterator it(c, c->stack, c->locals); it.hasMore();) { + FrameIterator::Element e = it.next(c); + releaseRegister(c, e.value, frameIndex(c, &e), + footprintSizeInBytes(e.footprint), r); + } +} + unsigned registerCost(Context* c, Register* r) {