mirror of
https://github.com/corda/corda.git
synced 2025-02-11 21:26:23 +00:00
disallow memory operands in 32-bit comparisons on amd64
This commit is contained in:
parent
3c30e815ec
commit
b52cefa86e
@ -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
|
||||
|
15
src/x86.cpp
15
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<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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user