This commit is contained in:
Joel Dice 2007-12-18 18:28:55 -07:00
parent 3bafbf08bb
commit 9b08fe083c

View File

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