Index: src/ia32/lithium-codegen-ia32.cc |
=================================================================== |
--- src/ia32/lithium-codegen-ia32.cc (revision 10127) |
+++ src/ia32/lithium-codegen-ia32.cc (working copy) |
@@ -341,6 +341,13 @@ |
} |
+Handle<Object> LCodeGen::ToHandle(LConstantOperand* op) const { |
+ Handle<Object> literal = chunk_->LookupLiteral(op); |
+ ASSERT(chunk_->LookupLiteralRepresentation(op).IsTagged()); |
+ return literal; |
+} |
+ |
+ |
double LCodeGen::ToDouble(LConstantOperand* op) const { |
Handle<Object> value = chunk_->LookupLiteral(op); |
return value->Number(); |
@@ -518,7 +525,7 @@ |
} else if (context->IsConstantOperand()) { |
Handle<Object> literal = |
chunk_->LookupLiteral(LConstantOperand::cast(context)); |
- LoadHeapObject(esi, Handle<Context>::cast(literal)); |
+ __ LoadHeapObject(esi, Handle<Context>::cast(literal)); |
} else { |
UNREACHABLE(); |
} |
@@ -1219,7 +1226,7 @@ |
Register reg = ToRegister(instr->result()); |
Handle<Object> handle = instr->value(); |
if (handle->IsHeapObject()) { |
- LoadHeapObject(reg, Handle<HeapObject>::cast(handle)); |
+ __ LoadHeapObject(reg, Handle<HeapObject>::cast(handle)); |
} else { |
__ Set(reg, Immediate(handle)); |
} |
@@ -2030,7 +2037,7 @@ |
// the stub. |
Register temp = ToRegister(instr->TempAt(0)); |
ASSERT(MacroAssembler::SafepointRegisterStackIndex(temp) == 0); |
- __ mov(InstanceofStub::right(), Immediate(instr->function())); |
+ __ LoadHeapObject(InstanceofStub::right(), instr->function()); |
static const int kAdditionalDelta = 13; |
int delta = masm_->SizeOfCodeGeneratedSince(map_check) + kAdditionalDelta; |
__ mov(temp, Immediate(delta)); |
@@ -2229,11 +2236,28 @@ |
} |
} else { |
Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*type)); |
- LoadHeapObject(result, Handle<HeapObject>::cast(function)); |
+ __ LoadHeapObject(result, function); |
} |
} |
+void LCodeGen::EmitPushTaggedOperand(LOperand* operand) { |
+ ASSERT(!operand->IsDoubleRegister()); |
+ if (operand->IsConstantOperand()) { |
+ 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 { |
+ __ push(ToOperand(operand)); |
+ } |
+} |
+ |
+ |
void LCodeGen::DoLoadNamedFieldPolymorphic(LLoadNamedFieldPolymorphic* instr) { |
Register object = ToRegister(instr->object()); |
Register result = ToRegister(instr->result()); |
@@ -2639,17 +2663,13 @@ |
void LCodeGen::DoPushArgument(LPushArgument* instr) { |
LOperand* argument = instr->InputAt(0); |
- if (argument->IsConstantOperand()) { |
- __ push(ToImmediate(argument)); |
- } else { |
- __ push(ToOperand(argument)); |
- } |
+ EmitPushTaggedOperand(argument); |
} |
void LCodeGen::DoThisFunction(LThisFunction* instr) { |
Register result = ToRegister(instr->result()); |
- LoadHeapObject(result, instr->hydrogen()->closure()); |
+ __ LoadHeapObject(result, instr->hydrogen()->closure()); |
} |
@@ -2719,7 +2739,7 @@ |
void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) { |
ASSERT(ToRegister(instr->result()).is(eax)); |
- __ mov(edi, instr->function()); |
+ __ LoadHeapObject(edi, instr->function()); |
CallKnownFunction(instr->function(), |
instr->arity(), |
instr, |
@@ -3159,7 +3179,7 @@ |
void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) { |
ASSERT(ToRegister(instr->result()).is(eax)); |
- __ mov(edi, instr->target()); |
+ __ LoadHeapObject(edi, instr->target()); |
CallKnownFunction(instr->target(), instr->arity(), instr, CALL_AS_FUNCTION); |
} |
@@ -3524,16 +3544,8 @@ |
void LCodeGen::DoStringAdd(LStringAdd* instr) { |
- if (instr->left()->IsConstantOperand()) { |
- __ push(ToImmediate(instr->left())); |
- } else { |
- __ push(ToOperand(instr->left())); |
- } |
- if (instr->right()->IsConstantOperand()) { |
- __ push(ToImmediate(instr->right())); |
- } else { |
- __ push(ToOperand(instr->right())); |
- } |
+ EmitPushTaggedOperand(instr->left()); |
+ EmitPushTaggedOperand(instr->right()); |
StringAddStub stub(NO_STRING_CHECK_IN_STUB); |
CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
} |
@@ -4032,7 +4044,7 @@ |
__ cmp(reg, Operand::Cell(cell)); |
} else { |
Operand operand = ToOperand(instr->value()); |
- __ cmp(operand, instr->hydrogen()->target()); |
+ __ cmp(operand, target); |
} |
DeoptimizeIf(not_equal, instr->environment()); |
} |
@@ -4096,17 +4108,6 @@ |
} |
-void LCodeGen::LoadHeapObject(Register result, Handle<HeapObject> object) { |
- if (isolate()->heap()->InNewSpace(*object)) { |
- Handle<JSGlobalPropertyCell> cell = |
- isolate()->factory()->NewJSGlobalPropertyCell(object); |
- __ mov(result, Operand::Cell(cell)); |
- } else { |
- __ mov(result, object); |
- } |
-} |
- |
- |
void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) { |
Register reg = ToRegister(instr->TempAt(0)); |
@@ -4114,7 +4115,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)) { |
@@ -4124,7 +4125,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. |
@@ -4179,7 +4180,7 @@ |
ASSERT(!result.is(ecx)); |
if (FLAG_debug_code) { |
- LoadHeapObject(ecx, object); |
+ __ LoadHeapObject(ecx, object); |
__ cmp(source, ecx); |
__ Assert(equal, "Unexpected object literal boilerplate"); |
} |
@@ -4209,10 +4210,10 @@ |
Handle<JSObject> value_object = Handle<JSObject>::cast(value); |
__ lea(ecx, Operand(result, *offset)); |
__ mov(FieldOperand(result, total_offset), ecx); |
- LoadHeapObject(source, value_object); |
+ __ LoadHeapObject(source, value_object); |
EmitDeepCopy(value_object, result, source, offset); |
} else if (value->IsHeapObject()) { |
- LoadHeapObject(ecx, Handle<HeapObject>::cast(value)); |
+ __ LoadHeapObject(ecx, Handle<HeapObject>::cast(value)); |
__ mov(FieldOperand(result, total_offset), ecx); |
} else { |
__ mov(FieldOperand(result, total_offset), Immediate(value)); |
@@ -4237,7 +4238,7 @@ |
__ bind(&allocated); |
int offset = 0; |
- LoadHeapObject(ebx, instr->hydrogen()->boilerplate()); |
+ __ LoadHeapObject(ebx, instr->hydrogen()->boilerplate()); |
EmitDeepCopy(instr->hydrogen()->boilerplate(), eax, ebx, &offset); |
ASSERT_EQ(size, offset); |
} |
@@ -4359,11 +4360,7 @@ |
void LCodeGen::DoTypeof(LTypeof* instr) { |
LOperand* input = instr->InputAt(1); |
- if (input->IsConstantOperand()) { |
- __ push(ToImmediate(input)); |
- } else { |
- __ push(ToOperand(input)); |
- } |
+ EmitPushTaggedOperand(input); |
CallRuntime(Runtime::kTypeof, 1, instr); |
} |
@@ -4513,11 +4510,7 @@ |
LOperand* obj = instr->object(); |
LOperand* key = instr->key(); |
__ push(ToOperand(obj)); |
- if (key->IsConstantOperand()) { |
- __ push(ToImmediate(key)); |
- } else { |
- __ push(ToOperand(key)); |
- } |
+ EmitPushTaggedOperand(key); |
ASSERT(instr->HasPointerMap() && instr->HasDeoptimizationEnvironment()); |
LPointerMap* pointers = instr->pointer_map(); |
RecordPosition(pointers->position()); |
@@ -4594,16 +4587,8 @@ |
void LCodeGen::DoIn(LIn* instr) { |
LOperand* obj = instr->object(); |
LOperand* key = instr->key(); |
- if (key->IsConstantOperand()) { |
- __ push(ToImmediate(key)); |
- } else { |
- __ push(ToOperand(key)); |
- } |
- if (obj->IsConstantOperand()) { |
- __ push(ToImmediate(obj)); |
- } else { |
- __ push(ToOperand(obj)); |
- } |
+ EmitPushTaggedOperand(key); |
+ EmitPushTaggedOperand(obj); |
ASSERT(instr->HasPointerMap() && instr->HasDeoptimizationEnvironment()); |
LPointerMap* pointers = instr->pointer_map(); |
RecordPosition(pointers->position()); |