mirror of
https://github.com/corda/corda.git
synced 2025-01-08 14:03:06 +00:00
avoid running out of eligable source registers for writing a single byte to memory on x86
This commit is contained in:
parent
9abc25e134
commit
073b829c79
@ -1013,8 +1013,6 @@ freezeResource(Context* c, Resource* r, Value* v)
|
|||||||
fprintf(stderr, "%p freeze %s to %d\n", v, buffer, r->freezeCount + 1);
|
fprintf(stderr, "%p freeze %s to %d\n", v, buffer, r->freezeCount + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(c, r->value == 0 or buddies(r->value, v));
|
|
||||||
|
|
||||||
++ r->freezeCount;
|
++ r->freezeCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1046,7 +1044,6 @@ thawResource(Context* c, Resource* r, Value* v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert(c, r->freezeCount);
|
assert(c, r->freezeCount);
|
||||||
assert(c, r->value == 0 or buddies(r->value, v));
|
|
||||||
|
|
||||||
-- r->freezeCount;
|
-- r->freezeCount;
|
||||||
}
|
}
|
||||||
@ -2455,16 +2452,20 @@ maybeMove(Context* c, BinaryOperation type, unsigned srcSize,
|
|||||||
|
|
||||||
unsigned cost = src->source->copyCost(c, target);
|
unsigned cost = src->source->copyCost(c, target);
|
||||||
|
|
||||||
if (srcSelectSize != dstSize) cost = 1;
|
if (srcSelectSize < dstSize) cost = 1;
|
||||||
|
|
||||||
if (cost) {
|
if (cost) {
|
||||||
bool useTemporary = ((target->type(c) == MemoryOperand
|
bool useTemporary = ((target->type(c) == MemoryOperand
|
||||||
and src->source->type(c) == MemoryOperand)
|
and src->source->type(c) == MemoryOperand)
|
||||||
or (srcSelectSize != dstSize
|
or (srcSelectSize < dstSize
|
||||||
and target->type(c) != RegisterOperand));
|
and target->type(c) != RegisterOperand));
|
||||||
|
|
||||||
|
src->source->freeze(c, src);
|
||||||
|
|
||||||
addSite(c, dst, target);
|
addSite(c, dst, target);
|
||||||
|
|
||||||
|
src->source->thaw(c, src);
|
||||||
|
|
||||||
bool addOffset = srcSize != srcSelectSize
|
bool addOffset = srcSize != srcSelectSize
|
||||||
and c->arch->bigEndian()
|
and c->arch->bigEndian()
|
||||||
and src->source->type(c) == MemoryOperand;
|
and src->source->type(c) == MemoryOperand;
|
||||||
@ -2486,7 +2487,8 @@ maybeMove(Context* c, BinaryOperation type, unsigned srcSize,
|
|||||||
|
|
||||||
src->source->freeze(c, src);
|
src->source->freeze(c, src);
|
||||||
|
|
||||||
apply(c, type, srcSelectSize, src->source, 0, dstSize, target, 0);
|
apply(c, type, min(srcSelectSize, dstSize), src->source, 0,
|
||||||
|
dstSize, target, 0);
|
||||||
|
|
||||||
src->source->thaw(c, src);
|
src->source->thaw(c, src);
|
||||||
} else {
|
} else {
|
||||||
|
@ -2173,7 +2173,7 @@ class MyArchitecture: public Assembler::Architecture {
|
|||||||
*aRegisterMask = (static_cast<uint64_t>(mask) << 32) | mask;
|
*aRegisterMask = (static_cast<uint64_t>(mask) << 32) | mask;
|
||||||
*bRegisterMask = (static_cast<uint64_t>(1) << (rdx + 32))
|
*bRegisterMask = (static_cast<uint64_t>(1) << (rdx + 32))
|
||||||
| (static_cast<uint64_t>(1) << rax);
|
| (static_cast<uint64_t>(1) << rax);
|
||||||
} else if (aSize == 1) {
|
} else if (aSize == 1 or bSize == 1) {
|
||||||
const uint32_t mask
|
const uint32_t mask
|
||||||
= (1 << rax) | (1 << rcx) | (1 << rdx) | (1 << rbx);
|
= (1 << rax) | (1 << rcx) | (1 << rdx) | (1 << rbx);
|
||||||
*aRegisterMask = (static_cast<uint64_t>(mask) << 32) | mask;
|
*aRegisterMask = (static_cast<uint64_t>(mask) << 32) | mask;
|
||||||
|
Loading…
Reference in New Issue
Block a user