reorder code in CallEvent ctor to ensure we don't clobber argument registers when it comes time to marshal values for reading

This commit is contained in:
Joel Dice 2008-05-14 18:04:25 -06:00
parent 8434abaa0e
commit 505d6df7ae

View File

@ -476,6 +476,26 @@ addressSite(Context* c, Promise* address)
return new (c->zone->allocate(sizeof(AddressSite))) AddressSite(address); return new (c->zone->allocate(sizeof(AddressSite))) AddressSite(address);
} }
void
freeze(Register* r)
{
if (DebugRegisters) {
fprintf(stderr, "freeze %d to %d\n", r->number, r->freezeCount + 1);
}
++ r->freezeCount;
}
void
thaw(Register* r)
{
if (DebugRegisters) {
fprintf(stderr, "thaw %d to %d\n", r->number, r->freezeCount - 1);
}
-- r->freezeCount;
}
Register* Register*
acquire(Context* c, uint32_t mask, Stack* stack, unsigned newSize, acquire(Context* c, uint32_t mask, Stack* stack, unsigned newSize,
Value* newValue, Site* newSite); Value* newValue, Site* newSite);
@ -517,9 +537,9 @@ class RegisterSite: public Site {
virtual void acquire(Context* c, Stack* stack, unsigned size, Value* v) { virtual void acquire(Context* c, Stack* stack, unsigned size, Value* v) {
low = ::acquire(c, mask, stack, size, v, this); low = ::acquire(c, mask, stack, size, v, this);
if (size > BytesPerWord) { if (size > BytesPerWord) {
++ low->freezeCount; ::freeze(low);
high = ::acquire(c, mask >> 32, stack, size, v, this); high = ::acquire(c, mask >> 32, stack, size, v, this);
-- low->freezeCount; ::thaw(low);
mask = (static_cast<uint64_t>(1) << (high->number + 32)) | mask = (static_cast<uint64_t>(1) << (high->number + 32)) |
(static_cast<uint64_t>(1) << low->number); (static_cast<uint64_t>(1) << low->number);
@ -542,18 +562,18 @@ class RegisterSite: public Site {
virtual void freeze(Context* c UNUSED) { virtual void freeze(Context* c UNUSED) {
assert(c, low); assert(c, low);
++ low->freezeCount; ::freeze(low);
if (high) { if (high) {
++ high->freezeCount; ::freeze(high);
} }
} }
virtual void thaw(Context* c UNUSED) { virtual void thaw(Context* c UNUSED) {
assert(c, low); assert(c, low);
-- low->freezeCount; ::thaw(low);
if (high) { if (high) {
-- high->freezeCount; ::thaw(high);
} }
} }
@ -621,8 +641,7 @@ decrement(Context* c UNUSED, Register* r)
assert(c, r->refCount > 0); assert(c, r->refCount > 0);
if (DebugRegisters) { if (DebugRegisters) {
fprintf(stderr, "decrement %d to %d\n", fprintf(stderr, "decrement %d to %d\n", r->number, r->refCount - 1);
r->number, r->refCount - 1);
} }
-- r->refCount; -- r->refCount;
@ -1012,9 +1031,9 @@ swap(Context* c, Register* a, Register* b)
Register* Register*
replace(Context* c, Stack* stack, Register* r) replace(Context* c, Stack* stack, Register* r)
{ {
++ r->freezeCount; freeze(r);
Register* s = acquire(c, ~0, stack, r->size, r->value, r->site); Register* s = acquire(c, ~0, stack, r->size, r->value, r->site);
-- r->freezeCount; thaw(r);
swap(c, r, s); swap(c, r, s);
return s; return s;
} }
@ -1185,6 +1204,10 @@ class CallEvent: public Event {
resultSize(resultSize), resultSize(resultSize),
argumentFootprint(0) argumentFootprint(0)
{ {
for (Stack* s = stack; s; s = s->next) {
addRead(c, s->value, s->size * BytesPerWord, 0);
}
Stack* s = argumentStack; Stack* s = argumentStack;
unsigned index = 0; unsigned index = 0;
for (unsigned i = 0; i < argumentCount; ++i) { for (unsigned i = 0; i < argumentCount; ++i) {
@ -1202,10 +1225,6 @@ class CallEvent: public Event {
s = s->next; s = s->next;
} }
for (Stack* s = stack; s; s = s->next) {
addRead(c, s->value, s->size * BytesPerWord, 0);
}
addRead(c, address, BytesPerWord, addRead(c, address, BytesPerWord,
((flags & Compiler::Indirect) ? ((flags & Compiler::Indirect) ?
registerSite(c, c->assembler->returnLow()) : 0)); registerSite(c, c->assembler->returnLow()) : 0));