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.