Chromium Code Reviews| Index: src/codegen-ia32.cc |
| =================================================================== |
| --- src/codegen-ia32.cc (revision 1607) |
| +++ src/codegen-ia32.cc (working copy) |
| @@ -3235,17 +3235,12 @@ |
| // All extension objects were empty and it is safe to use a global |
| // load IC call. |
| - Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); |
| - // Load the global object. |
| LoadGlobal(); |
| - // Setup the name register. All non-reserved registers are available. |
| - Result name = allocator_->Allocate(ecx); |
| - ASSERT(name.is_valid()); |
| - __ mov(name.reg(), slot->var()->name()); |
| - RelocInfo::Mode rmode = (typeof_state == INSIDE_TYPEOF) |
| - ? RelocInfo::CODE_TARGET |
| - : RelocInfo::CODE_TARGET_CONTEXT; |
| - Result answer = frame_->CallCodeObject(ic, rmode, &name, 0); |
| + frame_->Push(slot->var()->name()); |
| + RelocInfo::Mode mode = (typeof_state == INSIDE_TYPEOF) |
| + ? RelocInfo::CODE_TARGET |
| + : RelocInfo::CODE_TARGET_CONTEXT; |
| + Result answer = frame_->CallLoadIC(mode); |
| // Discard the global object. The result is in answer. |
| frame_->Drop(); |
| @@ -3552,20 +3547,12 @@ |
| // else fall through. |
| case ObjectLiteral::Property::COMPUTED: { |
| Handle<Object> key(property->key()->handle()); |
| - Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
| if (key->IsSymbol()) { |
| // Duplicate the object as the IC receiver. |
| frame_->Dup(); |
| Load(property->value()); |
| - Result value = frame_->Pop(); |
| - value.ToRegister(eax); |
| - |
| - Result name = allocator_->Allocate(ecx); |
| - ASSERT(name.is_valid()); |
| - __ Set(name.reg(), Immediate(key)); |
| - Result ignored = |
| - frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET, |
| - &value, &name, 0); |
| + frame_->Push(key); |
| + Result ignored = frame_->CallStoreIC(); |
| // Drop the duplicated receiver and ignore the result. |
| frame_->Drop(); |
| break; |
| @@ -5187,7 +5174,6 @@ |
| void DeferredReferenceGetKeyedValue::Generate() { |
| CodeGenerator* cgen = generator(); |
| - Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); |
| Result receiver(cgen); |
| Result key(cgen); |
| enter()->Bind(&receiver, &key); |
| @@ -5200,14 +5186,10 @@ |
| // it in the IC initialization code and patch the cmp instruction. |
| // This means that we cannot allow test instructions after calls to |
| // KeyedLoadIC stubs in other places. |
| - Result value(cgen); |
| - if (is_global_) { |
| - value = cgen->frame()->CallCodeObject(ic, |
| - RelocInfo::CODE_TARGET_CONTEXT, |
| - 0); |
| - } else { |
| - value = cgen->frame()->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0); |
| - } |
| + RelocInfo::Mode mode = is_global_ |
| + ? RelocInfo::CODE_TARGET_CONTEXT |
|
Kasper Lund
2009/03/25 13:25:34
4 space indent here?
|
| + : RelocInfo::CODE_TARGET; |
| + Result value = cgen->frame()->CallKeyedLoadIC(mode); |
| // The result needs to be specifically the eax register because the |
| // offset to the patch site will be expected in a test eax |
| // instruction. |
| @@ -5269,21 +5251,16 @@ |
| // thrown below, we must distinguish between the two kinds of |
| // loads (typeof expression loads must not throw a reference |
| // error). |
| - VirtualFrame* frame = cgen_->frame(); |
| Comment cmnt(masm, "[ Load from named Property"); |
| - Handle<String> name(GetName()); |
| + cgen_->frame()->Push(GetName()); |
| + |
| Variable* var = expression_->AsVariableProxy()->AsVariable(); |
| - Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); |
| - // Setup the name register. |
| - Result name_reg = cgen_->allocator()->Allocate(ecx); |
| - ASSERT(name_reg.is_valid()); |
| - __ mov(name_reg.reg(), name); |
| ASSERT(var == NULL || var->is_global()); |
| - RelocInfo::Mode rmode = (var == NULL) |
| - ? RelocInfo::CODE_TARGET |
| - : RelocInfo::CODE_TARGET_CONTEXT; |
| - Result answer = frame->CallCodeObject(ic, rmode, &name_reg, 0); |
| - frame->Push(&answer); |
| + RelocInfo::Mode mode = (var == NULL) |
| + ? RelocInfo::CODE_TARGET |
| + : RelocInfo::CODE_TARGET_CONTEXT; |
| + Result answer = cgen_->frame()->CallLoadIC(mode); |
| + cgen_->frame()->Push(&answer); |
| break; |
| } |
| @@ -5373,20 +5350,18 @@ |
| cgen_->frame()->Push(&value); |
| } else { |
| - VirtualFrame* frame = cgen_->frame(); |
| Comment cmnt(masm, "[ Load from keyed Property"); |
| - Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); |
| - RelocInfo::Mode rmode = is_global |
| - ? RelocInfo::CODE_TARGET_CONTEXT |
| - : RelocInfo::CODE_TARGET; |
| - Result answer = frame->CallCodeObject(ic, rmode, 0); |
| + RelocInfo::Mode mode = is_global |
| + ? RelocInfo::CODE_TARGET_CONTEXT |
| + : RelocInfo::CODE_TARGET; |
| + Result answer = cgen_->frame()->CallKeyedLoadIC(mode); |
| // Make sure that we do not have a test instruction after the |
| // call. A test instruction after the call is used to |
| // indicate that we have generated an inline version of the |
| // keyed load. The explicit nop instruction is here because |
| // the push that follows might be peep-hole optimized away. |
| __ nop(); |
| - frame->Push(&answer); |
| + cgen_->frame()->Push(&answer); |
| } |
| break; |
| } |
| @@ -5430,11 +5405,9 @@ |
| void Reference::SetValue(InitState init_state) { |
| ASSERT(cgen_->HasValidEntryRegisters()); |
| ASSERT(!is_illegal()); |
| - MacroAssembler* masm = cgen_->masm(); |
| - VirtualFrame* frame = cgen_->frame(); |
| switch (type_) { |
| case SLOT: { |
| - Comment cmnt(masm, "[ Store to Slot"); |
| + Comment cmnt(cgen_->masm(), "[ Store to Slot"); |
| Slot* slot = expression_->AsVariableProxy()->AsVariable()->slot(); |
| ASSERT(slot != NULL); |
| cgen_->StoreToSlot(slot, init_state); |
| @@ -5442,35 +5415,17 @@ |
| } |
| case NAMED: { |
| - Comment cmnt(masm, "[ Store to named Property"); |
| - // Call the appropriate IC code. |
| - Handle<String> name(GetName()); |
| - Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); |
| - // TODO(1222589): Make the IC grab the values from the stack. |
| - Result argument = frame->Pop(); |
| - argument.ToRegister(eax); |
| - ASSERT(argument.is_valid()); |
| - Result property_name = cgen_->allocator()->Allocate(ecx); |
| - ASSERT(property_name.is_valid()); |
| - // Setup the name register. |
| - __ mov(property_name.reg(), name); |
| - Result answer = frame->CallCodeObject(ic, RelocInfo::CODE_TARGET, |
| - &argument, &property_name, 0); |
| - frame->Push(&answer); |
| + Comment cmnt(cgen_->masm(), "[ Store to named Property"); |
| + cgen_->frame()->Push(GetName()); |
| + Result answer = cgen_->frame()->CallStoreIC(); |
| + cgen_->frame()->Push(&answer); |
| break; |
| } |
| case KEYED: { |
| - Comment cmnt(masm, "[ Store to keyed Property"); |
| - // Call IC code. |
| - Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); |
| - // TODO(1222589): Make the IC grab the values from the stack. |
| - Result arg = frame->Pop(); |
| - arg.ToRegister(eax); |
| - ASSERT(arg.is_valid()); |
| - Result answer = frame->CallCodeObject(ic, RelocInfo::CODE_TARGET, |
| - &arg, 0); |
| - frame->Push(&answer); |
| + Comment cmnt(cgen_->masm(), "[ Store to keyed Property"); |
| + Result answer = cgen_->frame()->CallKeyedStoreIC(); |
| + cgen_->frame()->Push(&answer); |
| break; |
| } |