diff --git a/src/compiler.cpp b/src/compiler.cpp index 65e8218922..d3aa2751cf 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -1592,11 +1592,12 @@ appendMove(Context* c, BinaryOperation type, unsigned size, Value* src, class CompareEvent: public Event { public: - CompareEvent(Context* c, unsigned size, Value* first, Value* second): + CompareEvent(Context* c, unsigned size, Value* first, Value* second, + Site* firstTarget, Site* secondTarget): Event(c), size(size), first(first), second(second) { - addRead(c, first, size, 0); - addRead(c, second, size, 0); + addRead(c, first, size, firstTarget); + addRead(c, second, size, secondTarget); } virtual void compile(Context* c) { @@ -1618,12 +1619,23 @@ class CompareEvent: public Event { void appendCompare(Context* c, unsigned size, Value* first, Value* second) { + VirtualSite* firstTarget = virtualSite(c); + VirtualSite* secondTarget = virtualSite(c); + uintptr_t procedure; + + c->assembler->plan(Compare, size, + &(firstTarget->typeMask), &(firstTarget->registerMask), + &(secondTarget->typeMask), &(secondTarget->registerMask), + &procedure); + + assert(c, procedure == 0); // todo + if (DebugAppend) { fprintf(stderr, "appendCompare\n"); } new (c->zone->allocate(sizeof(CompareEvent))) - CompareEvent(c, size, first, second); + CompareEvent(c, size, first, second, firstTarget, secondTarget); } void diff --git a/src/x86.cpp b/src/x86.cpp index c45ef7ea44..efa90b52a7 100644 --- a/src/x86.cpp +++ b/src/x86.cpp @@ -1928,7 +1928,7 @@ class MyAssembler: public Assembler { uint64_t* aRegisterMask, uint8_t* bTypeMask, uint64_t* bRegisterMask, uintptr_t* procedure) { - *aTypeMask = ~static_cast(0); + *aTypeMask = ~0; *aRegisterMask = ~static_cast(0); *bTypeMask = (1 << RegisterOperand) | (1 << MemoryOperand); @@ -1937,6 +1937,15 @@ class MyAssembler: public Assembler { *procedure = 0; switch (op) { + case Compare: + if (BytesPerWord == 8 and size != 8) { + *aTypeMask = ~(1 << MemoryOperand); + *bTypeMask = ~(1 << MemoryOperand); + } else { + *bTypeMask = ~0; + } + break; + case Move: if (BytesPerWord == 4 and size == 1) { const uint32_t mask @@ -1965,7 +1974,7 @@ class MyAssembler: public Assembler { case Divide: if (BytesPerWord == 4 and size == 8) { - *bTypeMask = ~static_cast(0); + *bTypeMask = ~0; *procedure = reinterpret_cast(divideLong); } else { *aRegisterMask = ~((1 << rax) | (1 << rdx)); @@ -1975,7 +1984,7 @@ class MyAssembler: public Assembler { case Remainder: if (BytesPerWord == 4 and size == 8) { - *bTypeMask = ~static_cast(0); + *bTypeMask = ~0; *procedure = reinterpret_cast(moduloLong); } else { *aRegisterMask = ~((1 << rax) | (1 << rdx));