x64: Implement context stores and loads, unknown osr value, and osr
entry in lithium backend. Review URL: http://codereview.chromium.org/6566002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6906 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
ae328e61b0
commit
bfb1cb4288
@ -1906,7 +1906,20 @@ void LCodeGen::DoStoreGlobal(LStoreGlobal* instr) {
|
||||
|
||||
|
||||
void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) {
|
||||
Abort("Unimplemented: %s", "DoLoadContextSlot");
|
||||
Register context = ToRegister(instr->context());
|
||||
Register result = ToRegister(instr->result());
|
||||
__ movq(result, ContextOperand(context, instr->slot_index()));
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) {
|
||||
Register context = ToRegister(instr->context());
|
||||
Register value = ToRegister(instr->value());
|
||||
__ movq(ContextOperand(context, instr->slot_index()), value);
|
||||
if (instr->needs_write_barrier()) {
|
||||
int offset = Context::SlotOffset(instr->slot_index());
|
||||
__ RecordWrite(context, offset, value, kScratchRegister);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -296,6 +296,13 @@ void LLoadContextSlot::PrintDataTo(StringStream* stream) {
|
||||
}
|
||||
|
||||
|
||||
void LStoreContextSlot::PrintDataTo(StringStream* stream) {
|
||||
InputAt(0)->PrintTo(stream);
|
||||
stream->Add("[%d] <- ", slot_index());
|
||||
InputAt(1)->PrintTo(stream);
|
||||
}
|
||||
|
||||
|
||||
void LCallKeyed::PrintDataTo(StringStream* stream) {
|
||||
stream->Add("[rcx] #%d / ", arity());
|
||||
}
|
||||
@ -1679,14 +1686,22 @@ LInstruction* LChunkBuilder::DoStoreGlobal(HStoreGlobal* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoLoadContextSlot(HLoadContextSlot* instr) {
|
||||
Abort("Unimplemented: %s", "DoLoadContextSlot");
|
||||
return NULL;
|
||||
LOperand* context = UseRegisterAtStart(instr->value());
|
||||
return DefineAsRegister(new LLoadContextSlot(context));
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoStoreContextSlot(HStoreContextSlot* instr) {
|
||||
Abort("Unimplemented: DoStoreContextSlot");
|
||||
return NULL;
|
||||
LOperand* context;
|
||||
LOperand* value;
|
||||
if (instr->NeedsWriteBarrier()) {
|
||||
context = UseTempRegister(instr->context());
|
||||
value = UseTempRegister(instr->value());
|
||||
} else {
|
||||
context = UseRegister(instr->context());
|
||||
value = UseRegister(instr->value());
|
||||
}
|
||||
return new LStoreContextSlot(context, value);
|
||||
}
|
||||
|
||||
|
||||
@ -1874,8 +1889,9 @@ LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) {
|
||||
Abort("Unimplemented: %s", "DoOsrEntry");
|
||||
return NULL;
|
||||
allocator_->MarkAsOsrEntry();
|
||||
current_block_->last_environment()->set_ast_id(instr->ast_id());
|
||||
return AssignEnvironment(new LOsrEntry);
|
||||
}
|
||||
|
||||
|
||||
@ -1886,8 +1902,8 @@ LInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
|
||||
Abort("Unimplemented: %s", "DoUnknownOSRValue");
|
||||
return NULL;
|
||||
int spill_index = chunk()->GetNextSpillIndex(false); // Not double-width.
|
||||
return DefineAsSpilled(new LUnknownOSRValue, spill_index);
|
||||
}
|
||||
|
||||
|
||||
|
@ -141,6 +141,7 @@ class LCodeGen;
|
||||
V(SmiTag) \
|
||||
V(SmiUntag) \
|
||||
V(StackCheck) \
|
||||
V(StoreContextSlot) \
|
||||
V(StoreGlobal) \
|
||||
V(StoreKeyedFastElement) \
|
||||
V(StoreKeyedGeneric) \
|
||||
@ -1246,6 +1247,25 @@ class LLoadContextSlot: public LTemplateInstruction<1, 1, 0> {
|
||||
};
|
||||
|
||||
|
||||
class LStoreContextSlot: public LTemplateInstruction<0, 2, 0> {
|
||||
public:
|
||||
LStoreContextSlot(LOperand* context, LOperand* value) {
|
||||
inputs_[0] = context;
|
||||
inputs_[1] = value;
|
||||
}
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot")
|
||||
DECLARE_HYDROGEN_ACCESSOR(StoreContextSlot)
|
||||
|
||||
LOperand* context() { return InputAt(0); }
|
||||
LOperand* value() { return InputAt(1); }
|
||||
int slot_index() { return hydrogen()->slot_index(); }
|
||||
int needs_write_barrier() { return hydrogen()->NeedsWriteBarrier(); }
|
||||
|
||||
virtual void PrintDataTo(StringStream* stream);
|
||||
};
|
||||
|
||||
|
||||
class LPushArgument: public LTemplateInstruction<0, 1, 0> {
|
||||
public:
|
||||
explicit LPushArgument(LOperand* value) {
|
||||
|
Loading…
Reference in New Issue
Block a user