Chromium Code Reviews| Index: src/x64/lithium-codegen-x64.cc |
| =================================================================== |
| --- src/x64/lithium-codegen-x64.cc (revision 10127) |
| +++ src/x64/lithium-codegen-x64.cc (working copy) |
| @@ -1154,8 +1154,13 @@ |
| void LCodeGen::DoConstantT(LConstantT* instr) { |
| - ASSERT(instr->result()->IsRegister()); |
| - __ Move(ToRegister(instr->result()), instr->value()); |
| + Handle<Object> value = instr->value(); |
| + if (value->IsSmi()) { |
| + __ Move(ToRegister(instr->result()), value); |
| + } else { |
| + __ LoadHeapObject(ToRegister(instr->result()), |
| + Handle<HeapObject>::cast(value)); |
| + } |
| } |
| @@ -1932,7 +1937,7 @@ |
| InstanceofStub stub(flags); |
| __ push(ToRegister(instr->InputAt(0))); |
| - __ Push(instr->function()); |
| + __ PushHeapObject(instr->function()); |
|
fschneider
2011/12/01 14:33:17
Fixed missing PushHeapObject here.
|
| static const int kAdditionalDelta = 10; |
| int delta = |
| @@ -2002,13 +2007,7 @@ |
| void LCodeGen::DoLoadGlobalCell(LLoadGlobalCell* instr) { |
| Register result = ToRegister(instr->result()); |
| - if (result.is(rax)) { |
| - __ load_rax(instr->hydrogen()->cell().location(), |
| - RelocInfo::GLOBAL_PROPERTY_CELL); |
| - } else { |
| - __ movq(result, instr->hydrogen()->cell(), RelocInfo::GLOBAL_PROPERTY_CELL); |
| - __ movq(result, Operand(result, 0)); |
| - } |
| + __ LoadGlobalCell(result, instr->hydrogen()->cell()); |
| if (instr->hydrogen()->RequiresHoleCheck()) { |
| __ CompareRoot(result, Heap::kTheHoleValueRootIndex); |
| DeoptimizeIf(equal, instr->environment()); |
| @@ -2144,7 +2143,7 @@ |
| } |
| } else { |
| Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*type)); |
| - LoadHeapObject(result, Handle<HeapObject>::cast(function)); |
| + __ LoadHeapObject(result, function); |
| } |
| } |
| @@ -2566,7 +2565,7 @@ |
| void LCodeGen::DoThisFunction(LThisFunction* instr) { |
| Register result = ToRegister(instr->result()); |
| - LoadHeapObject(result, instr->hydrogen()->closure()); |
| + __ LoadHeapObject(result, instr->hydrogen()->closure()); |
| } |
| @@ -2637,7 +2636,7 @@ |
| void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) { |
| ASSERT(ToRegister(instr->result()).is(rax)); |
| - __ Move(rdi, instr->function()); |
| + __ LoadHeapObject(rdi, instr->function()); |
| CallKnownFunction(instr->function(), |
| instr->arity(), |
| instr, |
| @@ -3045,7 +3044,7 @@ |
| void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) { |
| ASSERT(ToRegister(instr->result()).is(rax)); |
| - __ Move(rdi, instr->target()); |
| + __ LoadHeapObject(rdi, instr->target()); |
| CallKnownFunction(instr->target(), instr->arity(), instr, CALL_AS_FUNCTION); |
| } |
| @@ -3728,9 +3727,16 @@ |
| void LCodeGen::DoCheckFunction(LCheckFunction* instr) { |
| - ASSERT(instr->InputAt(0)->IsRegister()); |
| - Register reg = ToRegister(instr->InputAt(0)); |
| - __ Cmp(reg, instr->hydrogen()->target()); |
| + Register reg = ToRegister(instr->value()); |
| + Handle<JSFunction> target = instr->hydrogen()->target(); |
| + if (isolate()->heap()->InNewSpace(*target)) { |
| + Handle<JSGlobalPropertyCell> cell = |
| + isolate()->factory()->NewJSGlobalPropertyCell(target); |
| + __ movq(kScratchRegister, cell, RelocInfo::GLOBAL_PROPERTY_CELL); |
| + __ cmpq(reg, Operand(kScratchRegister, 0)); |
| + } else { |
| + __ Cmp(reg, target); |
| + } |
| DeoptimizeIf(not_equal, instr->environment()); |
| } |
| @@ -3796,18 +3802,6 @@ |
| } |
| -void LCodeGen::LoadHeapObject(Register result, Handle<HeapObject> object) { |
| - if (heap()->InNewSpace(*object)) { |
| - Handle<JSGlobalPropertyCell> cell = |
| - factory()->NewJSGlobalPropertyCell(object); |
| - __ movq(result, cell, RelocInfo::GLOBAL_PROPERTY_CELL); |
| - __ movq(result, Operand(result, 0)); |
| - } else { |
| - __ Move(result, object); |
| - } |
| -} |
| - |
| - |
| void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) { |
| Register reg = ToRegister(instr->TempAt(0)); |
| @@ -3815,7 +3809,7 @@ |
| Handle<JSObject> current_prototype = instr->prototype(); |
| // Load prototype object. |
| - LoadHeapObject(reg, current_prototype); |
| + __ LoadHeapObject(reg, current_prototype); |
| // Check prototype maps up to the holder. |
| while (!current_prototype.is_identical_to(holder)) { |
| @@ -3825,7 +3819,7 @@ |
| current_prototype = |
| Handle<JSObject>(JSObject::cast(current_prototype->GetPrototype())); |
| // Load next prototype object. |
| - LoadHeapObject(reg, current_prototype); |
| + __ LoadHeapObject(reg, current_prototype); |
| } |
| // Check the holder map. |
| @@ -3902,10 +3896,10 @@ |
| Handle<JSObject> value_object = Handle<JSObject>::cast(value); |
| __ lea(rcx, Operand(result, *offset)); |
| __ movq(FieldOperand(result, total_offset), rcx); |
| - LoadHeapObject(source, value_object); |
| + __ LoadHeapObject(source, value_object); |
| EmitDeepCopy(value_object, result, source, offset); |
| } else if (value->IsHeapObject()) { |
| - LoadHeapObject(rcx, Handle<HeapObject>::cast(value)); |
| + __ LoadHeapObject(rcx, Handle<HeapObject>::cast(value)); |
| __ movq(FieldOperand(result, total_offset), rcx); |
| } else { |
| __ movq(rcx, value, RelocInfo::NONE); |
| @@ -3930,7 +3924,7 @@ |
| __ bind(&allocated); |
| int offset = 0; |
| - LoadHeapObject(rbx, instr->hydrogen()->boilerplate()); |
| + __ LoadHeapObject(rbx, instr->hydrogen()->boilerplate()); |
| EmitDeepCopy(instr->hydrogen()->boilerplate(), rax, rbx, &offset); |
| ASSERT_EQ(size, offset); |
| } |
| @@ -4056,7 +4050,12 @@ |
| void LCodeGen::EmitPushTaggedOperand(LOperand* operand) { |
| ASSERT(!operand->IsDoubleRegister()); |
| if (operand->IsConstantOperand()) { |
| - __ Push(ToHandle(LConstantOperand::cast(operand))); |
| + Handle<Object> object = ToHandle(LConstantOperand::cast(operand)); |
| + if (object->IsSmi()) { |
| + __ Push(Handle<Smi>::cast(object)); |
| + } else { |
| + __ PushHeapObject(Handle<HeapObject>::cast(object)); |
| + } |
| } else if (operand->IsRegister()) { |
| __ push(ToRegister(operand)); |
| } else { |