Revision: 19166
Author: [email protected]
Date: Thu Feb 6 16:16:30 2014 UTC
Log: A64: Port LSeqStringSetChar optimizations from r16707 and r17521.
BUG=
TEST=mjsunit/lithium/SeqStringSetChar
[email protected]
Review URL: https://codereview.chromium.org/141713009
http://code.google.com/p/v8/source/detail?r=19166
Modified:
/branches/experimental/a64/src/a64/full-codegen-a64.cc
/branches/experimental/a64/src/a64/lithium-codegen-a64.cc
/branches/experimental/a64/src/a64/macro-assembler-a64.cc
/branches/experimental/a64/src/a64/macro-assembler-a64.h
=======================================
--- /branches/experimental/a64/src/a64/full-codegen-a64.cc Thu Feb 6
14:30:18 2014 UTC
+++ /branches/experimental/a64/src/a64/full-codegen-a64.cc Thu Feb 6
16:16:30 2014 UTC
@@ -3224,9 +3224,9 @@
__ Throw(kNonSmiValue);
__ Throw(kNonSmiIndex);
__ Bind(&both_smis);
-
static const uint32_t one_byte_seq_type = kSeqStringTag |
kOneByteStringTag;
- __ EmitSeqStringSetCharCheck(string, index, one_byte_seq_type);
+ __ EmitSeqStringSetCharCheck(string, index, kIndexIsSmi, scratch,
+ one_byte_seq_type);
}
__ Add(scratch, string, SeqOneByteString::kHeaderSize - kHeapObjectTag);
@@ -3257,9 +3257,9 @@
__ Throw(kNonSmiValue);
__ Throw(kNonSmiIndex);
__ Bind(&both_smis);
-
static const uint32_t two_byte_seq_type = kSeqStringTag |
kTwoByteStringTag;
- __ EmitSeqStringSetCharCheck(string, index, two_byte_seq_type);
+ __ EmitSeqStringSetCharCheck(string, index, kIndexIsSmi, scratch,
+ two_byte_seq_type);
}
__ Add(scratch, string, SeqTwoByteString::kHeaderSize - kHeapObjectTag);
=======================================
--- /branches/experimental/a64/src/a64/lithium-codegen-a64.cc Thu Feb 6
14:40:59 2014 UTC
+++ /branches/experimental/a64/src/a64/lithium-codegen-a64.cc Thu Feb 6
16:16:30 2014 UTC
@@ -4522,30 +4522,27 @@
void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
- // TODO(all): Port ARM optimizations from r16707.
-
String::Encoding encoding = instr->encoding();
Register string = ToRegister(instr->string());
- Register index = ToRegister(instr->index());
Register value = ToRegister(instr->value());
Register temp = ToRegister(instr->temp());
if (FLAG_debug_code) {
- if (encoding == String::ONE_BYTE_ENCODING) {
- __ EmitSeqStringSetCharCheck(
- string, index, kSeqStringTag | kOneByteStringTag);
- } else {
- ASSERT(encoding == String::TWO_BYTE_ENCODING);
- __ EmitSeqStringSetCharCheck(
- string, index, kSeqStringTag | kTwoByteStringTag);
- }
+ Register index = ToRegister(instr->index());
+ static const uint32_t one_byte_seq_type = kSeqStringTag |
kOneByteStringTag;
+ static const uint32_t two_byte_seq_type = kSeqStringTag |
kTwoByteStringTag;
+ int encoding_mask =
+ instr->hydrogen()->encoding() == String::ONE_BYTE_ENCODING
+ ? one_byte_seq_type : two_byte_seq_type;
+ __ EmitSeqStringSetCharCheck(string, index, kIndexIsInteger32, temp,
+ encoding_mask);
}
-
- __ Add(temp, string, SeqString::kHeaderSize - kHeapObjectTag);
+ MemOperand operand =
+ BuildSeqStringOperand(string, temp, instr->index(), encoding);
if (encoding == String::ONE_BYTE_ENCODING) {
- __ Strb(value, MemOperand(temp, index));
+ __ Strb(value, operand);
} else {
- __ Strh(value, MemOperand(temp, index, LSL, 1));
+ __ Strh(value, operand);
}
}
=======================================
--- /branches/experimental/a64/src/a64/macro-assembler-a64.cc Thu Feb 6
15:38:09 2014 UTC
+++ /branches/experimental/a64/src/a64/macro-assembler-a64.cc Thu Feb 6
16:16:30 2014 UTC
@@ -3628,13 +3628,17 @@
}
-void MacroAssembler::EmitSeqStringSetCharCheck(Register string,
- Register index,
- uint32_t encoding_mask) {
- Register scratch = __ Tmp1();
+void MacroAssembler::EmitSeqStringSetCharCheck(
+ Register string,
+ Register index,
+ SeqStringSetCharCheckIndexType index_type,
+ Register scratch,
+ uint32_t encoding_mask) {
ASSERT(!AreAliased(string, index, scratch));
- AssertSmi(index);
+ if (index_type == kIndexIsSmi) {
+ AssertSmi(index);
+ }
// Check that string is an object.
ThrowIfSmi(string, kNonObject);
@@ -3642,16 +3646,17 @@
// Check that string has an appropriate map.
Ldr(scratch, FieldMemOperand(string, HeapObject::kMapOffset));
Ldrb(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset));
+
And(scratch, scratch, kStringRepresentationMask | kStringEncodingMask);
Cmp(scratch, encoding_mask);
ThrowIf(ne, kUnexpectedStringType);
- // Check that the index points inside the string.
Ldr(scratch, FieldMemOperand(string, String::kLengthOffset));
- Cmp(index, scratch);
+ Cmp(index, index_type == kIndexIsSmi ? scratch :
Operand::UntagSmi(scratch));
ThrowIf(ge, kIndexIsTooLarge);
- Cmp(index, Operand(Smi::FromInt(0)));
+ ASSERT_EQ(0, Smi::FromInt(0));
+ Cmp(index, 0);
ThrowIf(lt, kIndexIsNegative);
}
=======================================
--- /branches/experimental/a64/src/a64/macro-assembler-a64.h Thu Feb 6
14:30:18 2014 UTC
+++ /branches/experimental/a64/src/a64/macro-assembler-a64.h Thu Feb 6
16:16:30 2014 UTC
@@ -74,6 +74,7 @@
enum ArrayHasHoles { kArrayCantHaveHoles, kArrayCanHaveHoles };
enum CopyHint { kCopyUnknown, kCopyShort, kCopyLong };
enum DiscardMoveMode { kDontDiscardForSameWReg, kDiscardForSameWReg };
+enum SeqStringSetCharCheckIndexType { kIndexIsSmi, kIndexIsInteger32 };
class MacroAssembler : public Assembler {
public:
@@ -1475,7 +1476,9 @@
// Inline caching support.
void EmitSeqStringSetCharCheck(Register string,
- Register index, // Smi
+ Register index,
+ SeqStringSetCharCheckIndexType index_type,
+ Register scratch,
uint32_t encoding_mask);
// Generate code for checking access rights - used for security checks
--
--
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.