fix moves involving sign or zero extension

This commit is contained in:
Joel Dice 2008-11-08 13:47:26 -07:00
parent f01f4441d9
commit 312539af64
3 changed files with 51 additions and 24 deletions

View File

@ -31,7 +31,7 @@ const bool Verbose = true;
const bool DebugNatives = false; const bool DebugNatives = false;
const bool DebugCallTable = false; const bool DebugCallTable = false;
const bool DebugMethodTree = false; const bool DebugMethodTree = false;
const bool DebugFrameMaps = false; const bool DebugFrameMaps = true;
const bool CheckArrayBounds = true; const bool CheckArrayBounds = true;

View File

@ -15,13 +15,14 @@ using namespace vm;
namespace { namespace {
const bool DebugAppend = true; const bool DebugAppend = false;
const bool DebugCompile = true; const bool DebugCompile = false;
const bool DebugStack = false; const bool DebugStack = false;
const bool DebugRegisters = false; const bool DebugRegisters = false;
const bool DebugFrameIndexes = true; const bool DebugFrameIndexes = false;
const bool DebugFrame = false; const bool DebugFrame = false;
const bool DebugControl = true; const bool DebugControl = false;
const bool DebugReads = false;
const int AnyFrameIndex = -2; const int AnyFrameIndex = -2;
const int NoFrameIndex = -1; const int NoFrameIndex = -1;
@ -824,8 +825,10 @@ nextRead(Context* c, Event* e, Value* v)
{ {
assert(c, e == v->reads->event); assert(c, e == v->reads->event);
fprintf(stderr, "pop read %p from %p next %p event %p (%s)\n", if (DebugReads) {
v->reads, v, v->reads->next(c), e, (e ? e->name() : 0)); fprintf(stderr, "pop read %p from %p next %p event %p (%s)\n",
v->reads, v, v->reads->next(c), e, (e ? e->name() : 0));
}
v->reads = v->reads->next(c); v->reads = v->reads->next(c);
if (not live(v)) { if (not live(v)) {
@ -2134,7 +2137,9 @@ apply(Context* c, TernaryOperation op,
void void
addRead(Context* c, Event* e, Value* v, Read* r) addRead(Context* c, Event* e, Value* v, Read* r)
{ {
fprintf(stderr, "add read %p to %p last %p event %p (%s)\n", r, v, v->lastRead, e, (e ? e->name() : 0)); if (DebugReads) {
fprintf(stderr, "add read %p to %p last %p event %p (%s)\n", r, v, v->lastRead, e, (e ? e->name() : 0));
}
r->value = v; r->value = v;
if (e) { if (e) {
@ -2145,7 +2150,10 @@ addRead(Context* c, Event* e, Value* v, Read* r)
} }
if (v->lastRead) { if (v->lastRead) {
fprintf(stderr, "append %p to %p for %p\n", r, v->lastRead, v); if (DebugReads) {
fprintf(stderr, "append %p to %p for %p\n", r, v->lastRead, v);
}
v->lastRead->append(c, r); v->lastRead->append(c, r);
} else { } else {
v->reads = r; v->reads = r;
@ -2224,11 +2232,18 @@ class CallEvent: public Event {
Read* target; Read* target;
if (index < c->arch->argumentRegisterCount()) { if (index < c->arch->argumentRegisterCount()) {
int r = c->arch->argumentRegister(index); int r = c->arch->argumentRegister(index);
fprintf(stderr, "reg %d arg read %p\n", r, s->value);
if (DebugReads) {
fprintf(stderr, "reg %d arg read %p\n", r, s->value);
}
target = fixedRegisterRead(c, footprintSizeInBytes(s->footprint), r); target = fixedRegisterRead(c, footprintSizeInBytes(s->footprint), r);
mask &= ~(1 << r); mask &= ~(1 << r);
} else { } else {
fprintf(stderr, "stack %d arg read %p\n", frameIndex, s->value); if (DebugReads) {
fprintf(stderr, "stack %d arg read %p\n", frameIndex, s->value);
}
target = read(c, footprintSizeInBytes(s->footprint), target = read(c, footprintSizeInBytes(s->footprint),
1 << MemoryOperand, 0, frameIndex); 1 << MemoryOperand, 0, frameIndex);
frameIndex += s->footprint; frameIndex += s->footprint;
@ -2238,7 +2253,10 @@ class CallEvent: public Event {
s = s->next; s = s->next;
} }
fprintf(stderr, "address read %p\n", address); if (DebugReads) {
fprintf(stderr, "address read %p\n", address);
}
addRead(c, this, address, read addRead(c, this, address, read
(c, BytesPerWord, ~0, (static_cast<uint64_t>(mask) << 32) | mask, (c, BytesPerWord, ~0, (static_cast<uint64_t>(mask) << 32) | mask,
AnyFrameIndex)); AnyFrameIndex));
@ -2246,7 +2264,10 @@ class CallEvent: public Event {
int footprint = stackArgumentFootprint; int footprint = stackArgumentFootprint;
for (Stack* s = stackBefore; s; s = s->next) { for (Stack* s = stackBefore; s; s = s->next) {
if (footprint > 0) { if (footprint > 0) {
fprintf(stderr, "stack arg read %p of footprint %d at %d of %d\n", s->value, s->footprint, frameIndex, c->alignedFrameSize + c->parameterFootprint); if (DebugReads) {
fprintf(stderr, "stack arg read %p of footprint %d at %d of %d\n", s->value, s->footprint, frameIndex, c->alignedFrameSize + c->parameterFootprint);
}
addRead(c, this, s->value, read addRead(c, this, s->value, read
(c, footprintSizeInBytes(s->footprint), (c, footprintSizeInBytes(s->footprint),
1 << MemoryOperand, 0, frameIndex)); 1 << MemoryOperand, 0, frameIndex));
@ -2258,7 +2279,11 @@ class CallEvent: public Event {
s->paddingInWords = index - frameIndex; s->paddingInWords = index - frameIndex;
popIndex = index; popIndex = index;
} }
fprintf(stderr, "stack save read %p of footprint %d at %d of %d\n", s->value, s->footprint, index, c->alignedFrameSize + c->parameterFootprint);
if (DebugReads) {
fprintf(stderr, "stack save read %p of footprint %d at %d of %d\n", s->value, s->footprint, index, c->alignedFrameSize + c->parameterFootprint);
}
addRead(c, this, s->value, read addRead(c, this, s->value, read
(c, footprintSizeInBytes(s->footprint), 1 << MemoryOperand, 0, (c, footprintSizeInBytes(s->footprint), 1 << MemoryOperand, 0,
index)); index));
@ -2409,17 +2434,19 @@ class MoveEvent: public Event {
addSite(c, stackBefore, localsBefore, dstSize, dst, target); addSite(c, stackBefore, localsBefore, dstSize, dst, target);
} }
if (cost or type != Move) { if (cost or srcSize != dstSize) {
uint8_t typeMask = ~static_cast<uint8_t>(0); uint8_t typeMask = ~static_cast<uint8_t>(0);
uint64_t registerMask = ~static_cast<uint64_t>(0); uint64_t registerMask = ~static_cast<uint64_t>(0);
int frameIndex = AnyFrameIndex; int frameIndex = AnyFrameIndex;
dstRead->intersect(&typeMask, &registerMask, &frameIndex); dstRead->intersect(&typeMask, &registerMask, &frameIndex);
bool memoryToMemory = (target->type(c) == MemoryOperand bool useTemporary = ((target->type(c) == MemoryOperand
and src->source->type(c) == MemoryOperand); and src->source->type(c) == MemoryOperand)
or (srcSize != dstSize
and target->type(c) != RegisterOperand));
if (target->match(c, typeMask, registerMask, frameIndex) if (target->match(c, typeMask, registerMask, frameIndex)
and not memoryToMemory) and not useTemporary)
{ {
// char srcb[256]; src->source->toString(c, srcb, 256); // char srcb[256]; src->source->toString(c, srcb, 256);
// char dstb[256]; target->toString(c, dstb, 256); // char dstb[256]; target->toString(c, dstb, 256);
@ -2443,7 +2470,7 @@ class MoveEvent: public Event {
removeSite(c, dst, tmpTarget); removeSite(c, dst, tmpTarget);
} }
if (memoryToMemory or isStore) { if (useTemporary or isStore) {
// char srcb[256]; tmpTarget->toString(c, srcb, 256); // char srcb[256]; tmpTarget->toString(c, srcb, 256);
// char dstb[256]; target->toString(c, dstb, 256); // char dstb[256]; target->toString(c, dstb, 256);
// fprintf(stderr, "move %s to %s for %p to %p\n", srcb, dstb, src, dst); // fprintf(stderr, "move %s to %s for %p to %p\n", srcb, dstb, src, dst);
@ -3736,7 +3763,7 @@ compile(Context* c)
} }
block->nextInstruction = nextInstruction; block->nextInstruction = nextInstruction;
block->assemblerBlock = a->endBlock(e->next != 0); block->assemblerBlock = a->endBlock(e->next != 0);
fprintf(stderr, "end block %p at %d\n", block->assemblerBlock, e->logicalInstruction->index); // fprintf(stderr, "end block %p at %d\n", block->assemblerBlock, e->logicalInstruction->index);
if (e->next) { if (e->next) {
block = ::block(c, e->next); block = ::block(c, e->next);
@ -3751,7 +3778,7 @@ compile(Context* c)
: block->nextInstruction->firstEvent->block; : block->nextInstruction->firstEvent->block;
next->start = block->assemblerBlock->resolve next->start = block->assemblerBlock->resolve
(block->start, next->assemblerBlock); (block->start, next->assemblerBlock);
fprintf(stderr, "resolve block %p\n", block->assemblerBlock); // fprintf(stderr, "resolve block %p\n", block->assemblerBlock);
block = next; block = next;
} }
@ -4281,13 +4308,13 @@ class MyCompiler: public Compiler {
virtual Operand* load(unsigned size, Operand* src) { virtual Operand* load(unsigned size, Operand* src) {
Value* dst = value(&c); Value* dst = value(&c);
appendMove(&c, Move, size, static_cast<Value*>(src), size, dst); appendMove(&c, Move, size, static_cast<Value*>(src), BytesPerWord, dst);
return dst; return dst;
} }
virtual Operand* loadz(unsigned size, Operand* src) { virtual Operand* loadz(unsigned size, Operand* src) {
Value* dst = value(&c); Value* dst = value(&c);
appendMove(&c, MoveZ, size, static_cast<Value*>(src), size, dst); appendMove(&c, MoveZ, size, static_cast<Value*>(src), BytesPerWord, dst);
return dst; return dst;
} }

View File

@ -933,7 +933,7 @@ void
moveZMR(Context* c, unsigned aSize UNUSED, Assembler::Memory* a, moveZMR(Context* c, unsigned aSize UNUSED, Assembler::Memory* a,
unsigned bSize UNUSED, Assembler::Register* b) unsigned bSize UNUSED, Assembler::Register* b)
{ {
assert(c, aSize == bSize); assert(c, bSize == BytesPerWord);
assert(c, aSize == 2); assert(c, aSize == 2);
encode2(c, 0x0fb7, b->low, a, true); encode2(c, 0x0fb7, b->low, a, true);