disallow memory operands in 32-bit comparisons on amd64

This commit is contained in:
Joel Dice 2008-05-19 07:27:05 -06:00
parent 3c30e815ec
commit b52cefa86e
2 changed files with 28 additions and 7 deletions

View File

@ -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

View File

@ -1928,7 +1928,7 @@ class MyAssembler: public Assembler {
uint64_t* aRegisterMask, uint8_t* bTypeMask,
uint64_t* bRegisterMask, uintptr_t* procedure)
{
*aTypeMask = ~static_cast<uint8_t>(0);
*aTypeMask = ~0;
*aRegisterMask = ~static_cast<uint64_t>(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<uint8_t>(0);
*bTypeMask = ~0;
*procedure = reinterpret_cast<uintptr_t>(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<uint8_t>(0);
*bTypeMask = ~0;
*procedure = reinterpret_cast<uintptr_t>(moduloLong);
} else {
*aRegisterMask = ~((1 << rax) | (1 << rdx));