memoize padding calculations in x86.cpp

These calculations were appearing high on profiles of apps which force
a lot of methods to be compiled at startup.
This commit is contained in:
Joel Dice 2011-07-16 19:12:45 -06:00
parent 67cbc79613
commit f6d489ff88

View File

@ -238,7 +238,7 @@ codePromise(Context* c, unsigned offset)
class Offset: public Promise { class Offset: public Promise {
public: public:
Offset(Context* c, MyBlock* block, unsigned offset, AlignmentPadding* limit): Offset(Context* c, MyBlock* block, unsigned offset, AlignmentPadding* limit):
c(c), block(block), offset(offset), limit(limit) c(c), block(block), offset(offset), limit(limit), value_(-1)
{ } { }
virtual bool resolved() { virtual bool resolved() {
@ -248,14 +248,19 @@ class Offset: public Promise {
virtual int64_t value() { virtual int64_t value() {
assert(c, resolved()); assert(c, resolved());
return block->start + (offset - block->offset) if (value_ == -1) {
+ padding(block->firstPadding, block->start, block->offset, limit); value_ = block->start + (offset - block->offset)
+ padding(block->firstPadding, block->start, block->offset, limit);
}
return value_;
} }
Context* c; Context* c;
MyBlock* block; MyBlock* block;
unsigned offset; unsigned offset;
AlignmentPadding* limit; AlignmentPadding* limit;
int value_;
}; };
Promise* Promise*
@ -419,7 +424,8 @@ class AlignmentPadding {
offset(c->code.length()), offset(c->code.length()),
instructionOffset(instructionOffset), instructionOffset(instructionOffset),
alignment(alignment), alignment(alignment),
next(0) next(0),
padding(-1)
{ {
if (c->lastBlock->firstPadding) { if (c->lastBlock->firstPadding) {
c->lastBlock->lastPadding->next = this; c->lastBlock->lastPadding->next = this;
@ -433,6 +439,7 @@ class AlignmentPadding {
unsigned instructionOffset; unsigned instructionOffset;
unsigned alignment; unsigned alignment;
AlignmentPadding* next; AlignmentPadding* next;
int padding;
}; };
unsigned unsigned
@ -441,14 +448,25 @@ padding(AlignmentPadding* p, unsigned start, unsigned offset,
{ {
unsigned padding = 0; unsigned padding = 0;
if (limit) { if (limit) {
unsigned index = 0; if (limit->padding == -1) {
for (; p; p = p->next) { for (; p; p = p->next) {
index = p->offset - offset; if (p->padding == -1) {
while ((start + index + padding + p->instructionOffset) % p->alignment) { unsigned index = p->offset - offset;
++ padding; while ((start + index + padding + p->instructionOffset)
} % p->alignment)
{
++ padding;
}
if (p == limit) break; p->padding = padding;
if (p == limit) break;
} else {
padding = p->padding;
}
}
} else {
padding = limit->padding;
} }
} }
return padding; return padding;