| 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());
|
|
|