Revision: 14380
Author:   [email protected]
Date:     Mon Apr 22 08:35:23 2013
Log: Fixed issue in StoreNamedField codegen where integer32 constants were not converted to a smi.

BUG=

Review URL: https://codereview.chromium.org/14075014
http://code.google.com/p/v8/source/detail?r=14380

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

=======================================
--- /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Mon Apr 22 02:48:35 2013 +++ /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Mon Apr 22 08:35:23 2013
@@ -4253,15 +4253,15 @@
   if (instr->value()->IsConstantOperand()) {
LConstantOperand* operand_value = LConstantOperand::cast(instr->value());
     if (IsInteger32(operand_value)) {
-      int const_value = ToInteger32(operand_value);
-      __ mov(FieldOperand(write_register, offset), Immediate(const_value));
+ // In lithium register preparation, we made sure that the constant integer
+      // operand fits into smi range.
+      Smi* smi_value = Smi::FromInt(ToInteger32(operand_value));
+      __ mov(FieldOperand(write_register, offset), Immediate(smi_value));
+    } else if (operand_value->IsRegister()) {
+ __ mov(FieldOperand(write_register, offset), ToRegister(operand_value));
     } else {
-      if (operand_value->IsRegister()) {
- __ mov(FieldOperand(write_register, offset), ToRegister(operand_value));
-      } else {
-        Handle<Object> handle_value = ToHandle(operand_value);
-        __ mov(FieldOperand(write_register, offset), handle_value);
-      }
+      Handle<Object> handle_value = ToHandle(operand_value);
+      __ mov(FieldOperand(write_register, offset), handle_value);
     }
   } else {
__ mov(FieldOperand(write_register, offset), ToRegister(instr->value()));
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.cc Mon Apr 22 02:48:35 2013 +++ /branches/bleeding_edge/src/ia32/lithium-ia32.cc Mon Apr 22 08:35:23 2013
@@ -2285,6 +2285,19 @@

   return UseRegister(instr->value());
 }
+
+
+// DoStoreKeyed and DoStoreNamedField have special considerations for allowing
+// use of a constant instead of a register.
+static bool StoreConstantValueAllowed(HValue* value) {
+  if (value->IsConstant()) {
+    HConstant* constant_value = HConstant::cast(value);
+    return constant_value->HasSmiValue()
+        || constant_value->HasDoubleValue()
+        || constant_value->ImmortalImmovable();
+  }
+  return false;
+}


 LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
@@ -2314,8 +2327,17 @@
         val = UseTempRegister(instr->value());
         key = UseTempRegister(instr->key());
       } else {
-        val = UseRegisterOrConstantAtStart(instr->value());
-        key = UseRegisterOrConstantAtStart(instr->key());
+        if (StoreConstantValueAllowed(instr->value())) {
+          val = UseRegisterOrConstantAtStart(instr->value());
+        } else {
+          val = UseRegisterAtStart(instr->value());
+        }
+
+        if (StoreConstantValueAllowed(instr->key())) {
+          key = UseRegisterOrConstantAtStart(instr->key());
+        } else {
+          key = UseRegisterAtStart(instr->key());
+        }
       }
       return new(zone()) LStoreKeyed(obj, key, val);
     }
@@ -2415,19 +2437,11 @@
         ? UseRegister(instr->object())
         : UseRegisterAtStart(instr->object());
   }
-
-  bool register_or_constant = false;
-  if (instr->value()->IsConstant()) {
-    HConstant* constant_value = HConstant::cast(instr->value());
-    register_or_constant = constant_value->HasInteger32Value()
-        || constant_value->HasDoubleValue()
-        || constant_value->ImmortalImmovable();
-  }

   LOperand* val;
   if (needs_write_barrier) {
     val = UseTempRegister(instr->value());
-  } else if (register_or_constant) {
+  } else if (StoreConstantValueAllowed(instr->value())) {
     val = UseRegisterOrConstant(instr->value());
   } else {
     val = UseRegister(instr->value());
=======================================
--- /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc Mon Apr 22 02:48:35 2013 +++ /branches/bleeding_edge/src/x64/lithium-codegen-x64.cc Mon Apr 22 08:35:23 2013
@@ -3954,16 +3954,16 @@
   if (instr->value()->IsConstantOperand()) {
LConstantOperand* operand_value = LConstantOperand::cast(instr->value());
     if (IsInteger32Constant(operand_value)) {
-      int const_value = ToInteger32(operand_value);
- __ movq(FieldOperand(write_register, offset), Immediate(const_value)); + // In lithium register preparation, we made sure that the constant integer
+      // operand fits into smi range.
+      Smi* smi_value = Smi::FromInt(ToInteger32(operand_value));
+      __ Move(FieldOperand(write_register, offset), smi_value);
+    } else if (operand_value->IsRegister()) {
+      __ movq(FieldOperand(write_register, offset),
+              ToRegister(operand_value));
     } else {
-      if (operand_value->IsRegister()) {
-        __ movq(FieldOperand(write_register, offset),
-                ToRegister(operand_value));
-      } else {
-        Handle<Object> handle_value = ToHandle(operand_value);
-        __ Move(FieldOperand(write_register, offset), handle_value);
-      }
+      Handle<Object> handle_value = ToHandle(operand_value);
+      __ Move(FieldOperand(write_register, offset), handle_value);
     }
   } else {
__ movq(FieldOperand(write_register, offset), ToRegister(instr->value()));
=======================================
--- /branches/bleeding_edge/src/x64/lithium-x64.cc      Mon Apr 22 02:48:35 2013
+++ /branches/bleeding_edge/src/x64/lithium-x64.cc      Mon Apr 22 08:35:23 2013
@@ -2122,6 +2122,19 @@
   LLoadKeyedGeneric* result = new(zone()) LLoadKeyedGeneric(object, key);
   return MarkAsCall(DefineFixed(result, rax), instr);
 }
+
+
+// DoStoreKeyed and DoStoreNamedField have special considerations for allowing
+// use of a constant instead of a register.
+static bool StoreConstantValueAllowed(HValue* value) {
+  if (value->IsConstant()) {
+    HConstant* constant_value = HConstant::cast(value);
+    return constant_value->HasSmiValue()
+        || constant_value->HasDoubleValue()
+        || constant_value->ImmortalImmovable();
+  }
+  return false;
+}


 LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
@@ -2143,11 +2156,24 @@
     } else {
       ASSERT(instr->value()->representation().IsTagged());
       object = UseTempRegister(instr->elements());
-      val = needs_write_barrier ? UseTempRegister(instr->value())
-          : UseRegisterOrConstantAtStart(instr->value());
-      key = (clobbers_key || needs_write_barrier)
-          ? UseTempRegister(instr->key())
-          : UseRegisterOrConstantAtStart(instr->key());
+      if (needs_write_barrier) {
+        val = UseTempRegister(instr->value());
+        key = UseTempRegister(instr->key());
+      } else {
+        if (StoreConstantValueAllowed(instr->value())) {
+          val = UseRegisterOrConstantAtStart(instr->value());
+        } else {
+          val = UseRegisterAtStart(instr->value());
+        }
+
+        if (clobbers_key) {
+          key = UseTempRegister(instr->key());
+        } else if (StoreConstantValueAllowed(instr->key())) {
+          key = UseRegisterOrConstantAtStart(instr->key());
+        } else {
+          key = UseRegisterAtStart(instr->key());
+        }
+      }
     }

     return new(zone()) LStoreKeyed(object, key, val);
@@ -2240,19 +2266,11 @@
         ? UseRegister(instr->object())
         : UseRegisterAtStart(instr->object());
   }
-
-  bool register_or_constant = false;
-  if (instr->value()->IsConstant()) {
-    HConstant* constant_value = HConstant::cast(instr->value());
-    register_or_constant = constant_value->HasInteger32Value()
-        || constant_value->HasDoubleValue()
-        || constant_value->ImmortalImmovable();
-  }

   LOperand* val;
   if (needs_write_barrier) {
     val = UseTempRegister(instr->value());
-  } else if (register_or_constant) {
+  } else if (StoreConstantValueAllowed(instr->value())) {
     val = UseRegisterOrConstant(instr->value());
   } else {
     val = UseRegister(instr->value());

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to