Revision: 3823
Author: [email protected]
Date: Tue Feb 9 06:19:23 2010
Log: Fix error introduced in version 3820. Add optimization suggested by
the error.
Review URL: http://codereview.chromium.org/597006
http://code.google.com/p/v8/source/detail?r=3823
Modified:
/branches/bleeding_edge/src/arm/stub-cache-arm.cc
/branches/bleeding_edge/src/ia32/stub-cache-ia32.cc
/branches/bleeding_edge/src/stub-cache.h
/branches/bleeding_edge/src/x64/stub-cache-x64.cc
=======================================
--- /branches/bleeding_edge/src/arm/stub-cache-arm.cc Tue Feb 9 05:06:37
2010
+++ /branches/bleeding_edge/src/arm/stub-cache-arm.cc Tue Feb 9 06:19:23
2010
@@ -189,8 +189,9 @@
}
-// Generate code to check if an object is a string. If the object is
-// a string, the map's instance type is left in the scratch1 register.
+// Generate code to check if an object is a string. If the object is a
+// heap object, its map's instance type is left in the scratch1 register.
+// If this is not needed, scratch1 and scratch2 may be the same register.
static void GenerateStringCheck(MacroAssembler* masm,
Register receiver,
Register scratch1,
@@ -220,13 +221,11 @@
Register scratch1,
Register scratch2,
Label* miss) {
- Label check_string, check_wrapper;
-
- __ bind(&check_string);
+ Label check_wrapper;
+
// Check if the object is a string leaving the instance type in the
// scratch1 register.
- GenerateStringCheck(masm, receiver, scratch1, scratch2,
- miss, &check_wrapper);
+ GenerateStringCheck(masm, receiver, scratch1, scratch2, miss,
&check_wrapper);
// Load length directly from the string.
__ ldr(r0, FieldMemOperand(receiver, String::kLengthOffset));
@@ -238,9 +237,12 @@
__ cmp(scratch1, Operand(JS_VALUE_TYPE));
__ b(ne, miss);
- // Unwrap the value in place and check if the wrapped value is a string.
- __ ldr(receiver, FieldMemOperand(receiver, JSValue::kValueOffset));
- __ b(&check_string);
+ // Unwrap the value and check if the wrapped value is a string.
+ __ ldr(scratch1, FieldMemOperand(receiver, JSValue::kValueOffset));
+ GenerateStringCheck(masm, scratch1, scratch2, scratch2, miss, miss);
+ __ ldr(r0, FieldMemOperand(scratch1, String::kLengthOffset));
+ __ mov(r0, Operand(r0, LSL, kSmiTagSize));
+ __ Ret();
}
=======================================
--- /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Tue Feb 9 05:06:37
2010
+++ /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Tue Feb 9 06:19:23
2010
@@ -229,14 +229,13 @@
Register scratch1,
Register scratch2,
Label* miss) {
- Label load_length, check_wrapper;
+ Label check_wrapper;
// Check if the object is a string leaving the instance type in the
// scratch register.
GenerateStringCheck(masm, receiver, scratch1, miss, &check_wrapper);
// Load length from the string and convert to a smi.
- __ bind(&load_length);
__ mov(eax, FieldOperand(receiver, String::kLengthOffset));
__ SmiTag(eax);
__ ret(0);
@@ -250,7 +249,9 @@
// directly if it is.
__ mov(scratch2, FieldOperand(receiver, JSValue::kValueOffset));
GenerateStringCheck(masm, scratch2, scratch1, miss, miss);
- __ jmp(&load_length);
+ __ mov(eax, FieldOperand(scratch2, String::kLengthOffset));
+ __ SmiTag(eax);
+ __ ret(0);
}
=======================================
--- /branches/bleeding_edge/src/stub-cache.h Tue Feb 9 05:06:37 2010
+++ /branches/bleeding_edge/src/stub-cache.h Tue Feb 9 06:19:23 2010
@@ -346,6 +346,7 @@
static void GenerateLoadGlobalFunctionPrototype(MacroAssembler* masm,
int index,
Register prototype);
+
static void GenerateFastPropertyLoad(MacroAssembler* masm,
Register dst, Register src,
JSObject* holder, int index);
@@ -354,16 +355,19 @@
Register receiver,
Register scratch,
Label* miss_label);
+
static void GenerateLoadStringLength(MacroAssembler* masm,
- Register receiver,
- Register scratch1,
- Register scratch2,
- Label* miss_label);
+ Register receiver,
+ Register scratch1,
+ Register scratch2,
+ Label* miss_label);
+
static void GenerateLoadFunctionPrototype(MacroAssembler* masm,
Register receiver,
Register scratch1,
Register scratch2,
Label* miss_label);
+
static void GenerateStoreField(MacroAssembler* masm,
Builtins::Name storage_extend,
JSObject* object,
@@ -373,6 +377,7 @@
Register name_reg,
Register scratch,
Label* miss_label);
+
static void GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind);
// Check the integrity of the prototype chain to make sure that the
=======================================
--- /branches/bleeding_edge/src/x64/stub-cache-x64.cc Tue Feb 9 05:06:37
2010
+++ /branches/bleeding_edge/src/x64/stub-cache-x64.cc Tue Feb 9 06:19:23
2010
@@ -317,14 +317,13 @@
Register scratch1,
Register scratch2,
Label* miss) {
- Label load_length, check_wrapper;
+ Label check_wrapper;
// Check if the object is a string leaving the instance type in the
// scratch register.
GenerateStringCheck(masm, receiver, scratch1, miss, &check_wrapper);
// Load length directly from the string.
- __ bind(&load_length);
__ movl(rax, FieldOperand(receiver, String::kLengthOffset));
__ Integer32ToSmi(rax, rax);
__ ret(0);
@@ -338,8 +337,9 @@
// directly if it is.
__ movq(scratch2, FieldOperand(receiver, JSValue::kValueOffset));
GenerateStringCheck(masm, scratch2, scratch1, miss, miss);
- __ movq(receiver, scratch2);
- __ jmp(&load_length);
+ __ movl(rax, FieldOperand(scratch2, String::kLengthOffset));
+ __ Integer32ToSmi(rax, rax);
+ __ ret(0);
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev