Fix context register allocation in LTransitionElementsKind.
R=yangguo@chromium.org BUG=chromium:324306 LOG=N Review URL: https://codereview.chromium.org/95293003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18150 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
c7053c8a37
commit
c8bfa60c0f
@ -1522,6 +1522,7 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
||||
output_frame->SetRegister(context_reg.code(), value);
|
||||
output_frame_offset -= kPointerSize;
|
||||
output_frame->SetFrameSlot(output_frame_offset, value);
|
||||
ASSERT(reinterpret_cast<Object*>(value)->IsContext());
|
||||
if (trace_scope_ != NULL) {
|
||||
PrintF(trace_scope_->file(),
|
||||
" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
||||
|
@ -4845,13 +4845,10 @@ void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) {
|
||||
ToRegister(instr->temp()),
|
||||
kDontSaveFPRegs);
|
||||
} else {
|
||||
ASSERT(ToRegister(instr->context()).is(esi));
|
||||
PushSafepointRegistersScope scope(this);
|
||||
if (!object_reg.is(eax)) {
|
||||
__ push(object_reg);
|
||||
}
|
||||
LoadContextFromDeferred(instr->context());
|
||||
if (!object_reg.is(eax)) {
|
||||
__ pop(eax);
|
||||
__ mov(eax, object_reg);
|
||||
}
|
||||
__ mov(ebx, to_map);
|
||||
TransitionElementsKindStub stub(from_kind, to_kind);
|
||||
|
@ -2420,7 +2420,7 @@ LInstruction* LChunkBuilder::DoTransitionElementsKind(
|
||||
new_map_reg, temp_reg);
|
||||
return result;
|
||||
} else {
|
||||
LOperand* context = UseRegister(instr->context());
|
||||
LOperand* context = UseFixed(instr->context(), esi);
|
||||
LTransitionElementsKind* result =
|
||||
new(zone()) LTransitionElementsKind(object, context, NULL, NULL);
|
||||
return AssignPointerMap(result);
|
||||
|
@ -1107,10 +1107,8 @@ void MacroAssembler::EnterExitFramePrologue() {
|
||||
push(Immediate(CodeObject())); // Accessed from ExitFrame::code_slot.
|
||||
|
||||
// Save the frame pointer and the context in top.
|
||||
ExternalReference c_entry_fp_address(Isolate::kCEntryFPAddress,
|
||||
isolate());
|
||||
ExternalReference context_address(Isolate::kContextAddress,
|
||||
isolate());
|
||||
ExternalReference c_entry_fp_address(Isolate::kCEntryFPAddress, isolate());
|
||||
ExternalReference context_address(Isolate::kContextAddress, isolate());
|
||||
mov(Operand::StaticVariable(c_entry_fp_address), ebp);
|
||||
mov(Operand::StaticVariable(context_address), esi);
|
||||
}
|
||||
|
@ -4363,11 +4363,11 @@ void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) {
|
||||
__ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg,
|
||||
ToRegister(instr->temp()), kDontSaveFPRegs);
|
||||
} else {
|
||||
ASSERT(ToRegister(instr->context()).is(rsi));
|
||||
PushSafepointRegistersScope scope(this);
|
||||
if (!object_reg.is(rax)) {
|
||||
__ movq(rax, object_reg);
|
||||
}
|
||||
LoadContextFromDeferred(instr->context());
|
||||
__ Move(rbx, to_map);
|
||||
TransitionElementsKindStub stub(from_kind, to_kind);
|
||||
__ CallStub(&stub);
|
||||
|
@ -2266,7 +2266,7 @@ LInstruction* LChunkBuilder::DoTransitionElementsKind(
|
||||
object, NULL, new_map_reg, temp_reg);
|
||||
return result;
|
||||
} else {
|
||||
LOperand* context = UseAny(instr->context());
|
||||
LOperand* context = UseFixed(instr->context(), rsi);
|
||||
LTransitionElementsKind* result =
|
||||
new(zone()) LTransitionElementsKind(object, context, NULL, NULL);
|
||||
return AssignPointerMap(result);
|
||||
|
Loading…
Reference in New Issue
Block a user