Chromium Code Reviews| Index: src/ia32/lithium-codegen-ia32.cc |
| =================================================================== |
| --- src/ia32/lithium-codegen-ia32.cc (revision 11535) |
| +++ src/ia32/lithium-codegen-ia32.cc (working copy) |
| @@ -2275,8 +2275,7 @@ |
| int map_count = instr->hydrogen()->types()->length(); |
| Handle<String> name = instr->hydrogen()->name(); |
| - if (map_count == 0) { |
| - ASSERT(instr->hydrogen()->need_generic()); |
| + if (map_count == 0 && instr->hydrogen()->need_generic()) { |
| __ mov(ecx, name); |
| Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize(); |
| CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| @@ -2291,20 +2290,28 @@ |
| __ jmp(&done, Label::kNear); |
| __ bind(&next); |
| } |
| - Handle<Map> map = instr->hydrogen()->types()->last(); |
| - __ cmp(FieldOperand(object, HeapObject::kMapOffset), map); |
| if (instr->hydrogen()->need_generic()) { |
| - Label generic; |
| - __ j(not_equal, &generic, Label::kNear); |
| - EmitLoadFieldOrConstantFunction(result, object, map, name); |
| - __ jmp(&done, Label::kNear); |
| - __ bind(&generic); |
| + if (map_count != 0) { |
|
Michael Starzinger
2012/05/10 13:06:01
It seems as if this condition always holds, otherw
Erik Corry
2012/05/10 20:28:36
No, there are two conditions to get into the IC ca
|
| + Handle<Map> map = instr->hydrogen()->types()->last(); |
| + __ cmp(FieldOperand(object, HeapObject::kMapOffset), map); |
| + Label generic; |
| + __ j(not_equal, &generic, Label::kNear); |
| + EmitLoadFieldOrConstantFunction(result, object, map, name); |
| + __ jmp(&done, Label::kNear); |
| + __ bind(&generic); |
| + } |
| __ mov(ecx, name); |
| Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize(); |
| CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| } else { |
| - DeoptimizeIf(not_equal, instr->environment()); |
| - EmitLoadFieldOrConstantFunction(result, object, map, name); |
| + if (map_count != 0) { |
|
Michael Starzinger
2012/05/10 13:06:01
Then it makes sense to turn this into an "else if"
Erik Corry
2012/05/10 20:28:36
Same objection.
|
| + Handle<Map> map = instr->hydrogen()->types()->last(); |
| + __ cmp(FieldOperand(object, HeapObject::kMapOffset), map); |
| + DeoptimizeIf(not_equal, instr->environment()); |
| + EmitLoadFieldOrConstantFunction(result, object, map, name); |
| + } else { |
| + DeoptimizeIf(no_condition, instr->environment()); |
| + } |
| } |
| __ bind(&done); |
| } |