mirror of
https://github.com/corda/corda.git
synced 2025-02-08 03:50:34 +00:00
snapshot
This commit is contained in:
parent
3bafbf08bb
commit
9b08fe083c
@ -302,11 +302,7 @@ AbsoluteOperand*
|
|||||||
absolute(Context* c, MyPromise* v);
|
absolute(Context* c, MyPromise* v);
|
||||||
|
|
||||||
RegisterOperand*
|
RegisterOperand*
|
||||||
register_(Context* c, Register v, SelectionType = DefaultSelection);
|
register_(Context* c, RegisterReference*, SelectionType = DefaultSelection);
|
||||||
|
|
||||||
RegisterOperand*
|
|
||||||
register_(Context* c, Register v, Register high,
|
|
||||||
SelectionType = DefaultSelection);
|
|
||||||
|
|
||||||
MemoryOperand*
|
MemoryOperand*
|
||||||
memory(Context* c, MyOperand* base, int displacement,
|
memory(Context* c, MyOperand* base, int displacement,
|
||||||
@ -413,18 +409,43 @@ release(Context* c, Register v)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class RegisterReference {
|
||||||
|
public:
|
||||||
|
RegisterReference(Register v = NoRegister): value_(v) { }
|
||||||
|
|
||||||
|
void acquire(Context* c) {
|
||||||
|
value_ = ::acquire(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void release(Context* c) {
|
||||||
|
::release(c, value_);
|
||||||
|
value_ = NoRegister;
|
||||||
|
}
|
||||||
|
|
||||||
|
Register value(Context* c UNUSED) {
|
||||||
|
assert(c, value_ != NoRegister);
|
||||||
|
return value_;
|
||||||
|
}
|
||||||
|
|
||||||
|
Register value_;
|
||||||
|
};
|
||||||
|
|
||||||
class RegisterOperand: public MyOperand {
|
class RegisterOperand: public MyOperand {
|
||||||
public:
|
public:
|
||||||
RegisterOperand(Register value, SelectionType selection):
|
RegisterOperand(RegisterReference* reference, SelectionType selection):
|
||||||
value(value), selection(selection)
|
reference(reference), selection(selection)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
Register value(Context* c) {
|
||||||
|
return reference->value(c);
|
||||||
|
}
|
||||||
|
|
||||||
virtual unsigned footprint(Context*) {
|
virtual unsigned footprint(Context*) {
|
||||||
return (selection == S8Selection ? 8 : BytesPerWord);
|
return (selection == S8Selection ? 8 : BytesPerWord);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Register asRegister(Context*) {
|
virtual Register asRegister(Context* c) {
|
||||||
return value;
|
return value(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual MyOperand* select(Context* c, SelectionType selection) {
|
virtual MyOperand* select(Context* c, SelectionType selection) {
|
||||||
@ -432,25 +453,21 @@ class RegisterOperand: public MyOperand {
|
|||||||
return this;
|
return this;
|
||||||
} else {
|
} else {
|
||||||
if (selection == S8Selection and BytesPerWord == 4
|
if (selection == S8Selection and BytesPerWord == 4
|
||||||
and c->registers[value].high == NoRegister)
|
and c->registers[value(c)].high == NoRegister)
|
||||||
{
|
{
|
||||||
c->registers[value].high = ::acquire(c);
|
c->registers[value(c)].high = ::acquire(c);
|
||||||
}
|
}
|
||||||
return register_(c, value, selection);
|
return register_(c, value(c), selection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual RegisterNode* dependencies(Context* c, RegisterNode* next) {
|
virtual RegisterNode* dependencies(Context* c, RegisterNode* next) {
|
||||||
return new (c->zone.allocate(sizeof(RegisterNode)))
|
return new (c->zone.allocate(sizeof(RegisterNode)))
|
||||||
RegisterNode(value, next);
|
RegisterNode(value(c), next);
|
||||||
}
|
|
||||||
|
|
||||||
void acquire(Context* c) {
|
|
||||||
value = ::acquire(c);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void release(Context* c) {
|
virtual void release(Context* c) {
|
||||||
::release(c, value);
|
reference->release(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(Context*, Operation);
|
virtual void apply(Context*, Operation);
|
||||||
@ -465,7 +482,7 @@ class RegisterOperand: public MyOperand {
|
|||||||
virtual void accept(Context*, Operation, AbsoluteOperand*);
|
virtual void accept(Context*, Operation, AbsoluteOperand*);
|
||||||
virtual void accept(Context*, Operation, MemoryOperand*);
|
virtual void accept(Context*, Operation, MemoryOperand*);
|
||||||
|
|
||||||
Register value;
|
RegisterReference* reference;
|
||||||
SelectionType selection;
|
SelectionType selection;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -618,8 +635,10 @@ RegisterOperand*
|
|||||||
register_(Context* c, Register v, SelectionType selection)
|
register_(Context* c, Register v, SelectionType selection)
|
||||||
{
|
{
|
||||||
assert(c, BytesPerWord != 4 or selection != S8Selection);
|
assert(c, BytesPerWord != 4 or selection != S8Selection);
|
||||||
|
RegisterReference* r = new (c->zone.allocate(sizeof(RegisterReference)))
|
||||||
|
RegisterReference(v);
|
||||||
return new (c->zone.allocate(sizeof(RegisterOperand)))
|
return new (c->zone.allocate(sizeof(RegisterOperand)))
|
||||||
RegisterOperand(v, selection);
|
RegisterOperand(r, selection);
|
||||||
}
|
}
|
||||||
|
|
||||||
MemoryOperand*
|
MemoryOperand*
|
||||||
@ -724,7 +743,7 @@ class AcquireEvent: public Event {
|
|||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual void run(Context* c) {
|
virtual void run(Context* c) {
|
||||||
operand->acquire(c);
|
operand->reference->acquire(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
RegisterOperand* operand;
|
RegisterOperand* operand;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user