Revision: 11543
Author:   [email protected]
Date:     Fri May 11 02:13:02 2012
Log:      Simplify DoLoadNamedFieldPolymorphic
Review URL: https://chromiumcodereview.appspot.com/10386089
http://code.google.com/p/v8/source/detail?r=11543

Modified:
 /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc
 /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc
 /branches/bleeding_edge/src/mips/lithium-codegen-mips.cc
 /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc

=======================================
--- /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc Thu May 10 14:25:49 2012 +++ /branches/bleeding_edge/src/arm/lithium-codegen-arm.cc Fri May 11 02:13:02 2012
@@ -2587,49 +2587,38 @@
   Register object = ToRegister(instr->object());
   Register result = ToRegister(instr->result());
   Register scratch = scratch0();
+
   int map_count = instr->hydrogen()->types()->length();
+  bool need_generic = instr->hydrogen()->need_generic();
+
+  if (map_count == 0 && !need_generic) {
+    DeoptimizeIf(al, instr->environment());
+    return;
+  }
   Handle<String> name = instr->hydrogen()->name();
-  if (map_count == 0 && instr->hydrogen()->need_generic()) {
-    __ mov(r2, Operand(name));
-    Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
-    CallCode(ic, RelocInfo::CODE_TARGET, instr);
-  } else {
-    Label done;
-    __ ldr(scratch, FieldMemOperand(object, HeapObject::kMapOffset));
-    for (int i = 0; i < map_count - 1; ++i) {
-      Handle<Map> map = instr->hydrogen()->types()->at(i);
+  Label done;
+  __ ldr(scratch, FieldMemOperand(object, HeapObject::kMapOffset));
+  for (int i = 0; i < map_count; ++i) {
+    bool last = (i == map_count - 1);
+    Handle<Map> map = instr->hydrogen()->types()->at(i);
+    __ cmp(scratch, Operand(map));
+    if (last && !need_generic) {
+      DeoptimizeIf(ne, instr->environment());
+      EmitLoadFieldOrConstantFunction(result, object, map, name);
+    } else {
       Label next;
-      __ cmp(scratch, Operand(map));
       __ b(ne, &next);
       EmitLoadFieldOrConstantFunction(result, object, map, name);
       __ b(&done);
       __ bind(&next);
     }
-    if (instr->hydrogen()->need_generic()) {
-      if (map_count != 0) {
-        Handle<Map> map = instr->hydrogen()->types()->last();
-        __ cmp(scratch, Operand(map));
-        Label generic;
-        __ b(ne, &generic);
-        EmitLoadFieldOrConstantFunction(result, object, map, name);
-        __ b(&done);
-        __ bind(&generic);
-      }
-      __ mov(r2, Operand(name));
-      Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
-      CallCode(ic, RelocInfo::CODE_TARGET, instr);
-    } else {
-      if (map_count != 0) {
-        Handle<Map> map = instr->hydrogen()->types()->last();
-        __ cmp(scratch, Operand(map));
-        DeoptimizeIf(ne, instr->environment());
-        EmitLoadFieldOrConstantFunction(result, object, map, name);
-      } else {
-        DeoptimizeIf(al, instr->environment());
-      }
-    }
-    __ bind(&done);
-  }
+  }
+  if (need_generic) {
+    __ mov(r2, Operand(name));
+    Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
+    CallCode(ic, RelocInfo::CODE_TARGET, instr);
+  }
+  __ bind(&done);
 }


=======================================
--- /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Thu May 10 13:34:06 2012 +++ /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Fri May 11 02:13:02 2012
@@ -2274,47 +2274,35 @@
   Register result = ToRegister(instr->result());

   int map_count = instr->hydrogen()->types()->length();
+  bool need_generic = instr->hydrogen()->need_generic();
+
+  if (map_count == 0 && !need_generic) {
+    DeoptimizeIf(no_condition, instr->environment());
+    return;
+  }
   Handle<String> name = instr->hydrogen()->name();
-  if (map_count == 0 && instr->hydrogen()->need_generic()) {
-    __ mov(ecx, name);
-    Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
-    CallCode(ic, RelocInfo::CODE_TARGET, instr);
-  } else {
-    Label done;
-    for (int i = 0; i < map_count - 1; ++i) {
-      Handle<Map> map = instr->hydrogen()->types()->at(i);
+  Label done;
+  for (int i = 0; i < map_count; ++i) {
+    bool last = (i == map_count - 1);
+    Handle<Map> map = instr->hydrogen()->types()->at(i);
+    __ cmp(FieldOperand(object, HeapObject::kMapOffset), map);
+    if (last && !need_generic) {
+      DeoptimizeIf(not_equal, instr->environment());
+      EmitLoadFieldOrConstantFunction(result, object, map, name);
+    } else {
       Label next;
-      __ cmp(FieldOperand(object, HeapObject::kMapOffset), map);
       __ j(not_equal, &next, Label::kNear);
       EmitLoadFieldOrConstantFunction(result, object, map, name);
       __ jmp(&done, Label::kNear);
       __ bind(&next);
     }
-    if (instr->hydrogen()->need_generic()) {
-      if (map_count != 0) {
-        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 {
-      if (map_count != 0) {
-        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);
-  }
+  }
+  if (need_generic) {
+    __ mov(ecx, name);
+    Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
+    CallCode(ic, RelocInfo::CODE_TARGET, instr);
+  }
+  __ bind(&done);
 }


=======================================
--- /branches/bleeding_edge/src/mips/lithium-codegen-mips.cc Thu May 10 14:25:49 2012 +++ /branches/bleeding_edge/src/mips/lithium-codegen-mips.cc Fri May 11 02:13:02 2012
@@ -2344,45 +2344,35 @@
   Register result = ToRegister(instr->result());
   Register scratch = scratch0();
   int map_count = instr->hydrogen()->types()->length();
+  bool need_generic = instr->hydrogen()->need_generic();
+
+  if (map_count == 0 && !need_generic) {
+    DeoptimizeIf(al, instr->environment());
+    return;
+  }
   Handle<String> name = instr->hydrogen()->name();
-  if (map_count == 0 && instr->hydrogen()->need_generic()) {
-    __ li(a2, Operand(name));
-    Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
-    CallCode(ic, RelocInfo::CODE_TARGET, instr);
-  } else {
-    Label done;
-    __ lw(scratch, FieldMemOperand(object, HeapObject::kMapOffset));
-    for (int i = 0; i < map_count - 1; ++i) {
-      Handle<Map> map = instr->hydrogen()->types()->at(i);
+  Label done;
+  __ lw(scratch, FieldMemOperand(object, HeapObject::kMapOffset));
+  for (int i = 0; i < map_count; ++i) {
+    bool last = (i == map_count - 1);
+    Handle<Map> map = instr->hydrogen()->types()->at(i);
+    if (last && !need_generic) {
+      Handle<Map> map = instr->hydrogen()->types()->last();
+      DeoptimizeIf(ne, instr->environment(), scratch, Operand(map));
+    } else {
       Label next;
       __ Branch(&next, ne, scratch, Operand(map));
       EmitLoadFieldOrConstantFunction(result, object, map, name);
       __ Branch(&done);
       __ bind(&next);
     }
-    if (instr->hydrogen()->need_generic()) {
-      if (map_count != 0) {
-        Handle<Map> map = instr->hydrogen()->types()->last();
-        Label generic;
-        __ Branch(&generic, ne, scratch, Operand(map));
-        EmitLoadFieldOrConstantFunction(result, object, map, name);
-        __ Branch(&done);
-        __ bind(&generic);
-      }
-      __ li(a2, Operand(name));
-      Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
-      CallCode(ic, RelocInfo::CODE_TARGET, instr);
-    } else {
-      if (map_count != 0) {
-        Handle<Map> map = instr->hydrogen()->types()->last();
-        DeoptimizeIf(ne, instr->environment(), scratch, Operand(map));
-        EmitLoadFieldOrConstantFunction(result, object, map, name);
-      } else {
- DeoptimizeIf(al, instr->environment(), zero_reg, Operand(zero_reg));
-      }
-    }
-    __ bind(&done);
-  }
+  }
+  if (need_generic) {
+    __ li(a2, Operand(name));
+    Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
+    CallCode(ic, RelocInfo::CODE_TARGET, instr);
+  }
+  __ bind(&done);
 }


=======================================
--- /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc Thu May 10 14:25:49 2012 +++ /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc Fri May 11 02:13:02 2012
@@ -2223,48 +2223,35 @@
   Register result = ToRegister(instr->result());

   int map_count = instr->hydrogen()->types()->length();
-  Handle<String> name = instr->hydrogen()->name();
-
-  if (map_count == 0 && instr->hydrogen()->need_generic()) {
-    __ Move(rcx, instr->hydrogen()->name());
-    Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
-    CallCode(ic, RelocInfo::CODE_TARGET, instr);
-  } else {
-    Label done;
-    for (int i = 0; i < map_count - 1; ++i) {
-      Handle<Map> map = instr->hydrogen()->types()->at(i);
+  bool need_generic = instr->hydrogen()->need_generic();
+
+  if (map_count == 0 && !need_generic) {
+    DeoptimizeIf(no_condition, instr->environment());
+    return;
+  }
+  Handle<String> name = instr->hydrogen()->name();
+  Label done;
+  for (int i = 0; i < map_count; ++i) {
+    bool last = (i == map_count - 1);
+    Handle<Map> map = instr->hydrogen()->types()->at(i);
+    __ Cmp(FieldOperand(object, HeapObject::kMapOffset), map);
+    if (last && !need_generic) {
+      DeoptimizeIf(not_equal, instr->environment());
+      EmitLoadFieldOrConstantFunction(result, object, map, name);
+    } else {
       Label next;
-      __ Cmp(FieldOperand(object, HeapObject::kMapOffset), map);
       __ j(not_equal, &next, Label::kNear);
       EmitLoadFieldOrConstantFunction(result, object, map, name);
       __ jmp(&done, Label::kNear);
       __ bind(&next);
     }
-    if (instr->hydrogen()->need_generic()) {
-      if (map_count != 0) {
-        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);
-      }
-      __ Move(rcx, instr->hydrogen()->name());
-      Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
-      CallCode(ic, RelocInfo::CODE_TARGET, instr);
-    } else {
-      if (map_count != 0) {
-        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);
-  }
+  }
+  if (need_generic) {
+    __ Move(rcx, name);
+    Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
+    CallCode(ic, RelocInfo::CODE_TARGET, instr);
+  }
+  __ bind(&done);
 }


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to