Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Unified Diff: src/code-stub-assembler.cc

Issue 2183923003: [stubs,interpreter] Optimise SMI loading for 64-bit targets. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Optimizing SMI loads at code stub assembler level. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/compiler/arm64/code-generator-arm64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/code-stub-assembler.cc
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
index 0e09499f0a221d474e68068acd51b4f0a4160e7f..08236a18420bbb11bf849b2b121e424ed2b0a739 100644
--- a/src/code-stub-assembler.cc
+++ b/src/code-stub-assembler.cc
@@ -74,7 +74,7 @@ Node* CodeStubAssembler::TheHoleConstant() {
}
Node* CodeStubAssembler::HashSeed() {
- return SmiToWord32(LoadRoot(Heap::kHashSeedRootIndex));
+ return LoadAndUntagToWord32Root(Heap::kHashSeedRootIndex);
}
Node* CodeStubAssembler::StaleRegisterConstant() {
@@ -914,6 +914,60 @@ Node* CodeStubAssembler::LoadObjectField(Node* object, Node* offset,
return Load(rep, object, IntPtrSub(offset, IntPtrConstant(kHeapObjectTag)));
}
+Node* CodeStubAssembler::LoadAndUntagObjectField(Node* object, int offset) {
+ if (Is64()) {
+#if V8_TARGET_LITTLE_ENDIAN
+ offset += kPointerSize / 2;
+#endif
+ return ChangeInt32ToInt64(
+ LoadObjectField(object, offset, MachineType::Int32()));
+ } else {
+ return SmiToWord(LoadObjectField(object, offset, MachineType::AnyTagged()));
+ }
+}
+
+Node* CodeStubAssembler::LoadAndUntagToWord32ObjectField(Node* object,
+ int offset) {
+ if (Is64()) {
+#if V8_TARGET_LITTLE_ENDIAN
+ offset += kPointerSize / 2;
+#endif
+ return LoadObjectField(object, offset, MachineType::Int32());
+ } else {
+ return SmiToWord32(
+ LoadObjectField(object, offset, MachineType::AnyTagged()));
+ }
+}
+
+Node* CodeStubAssembler::LoadAndUntagSmi(Node* base, int index) {
+ if (Is64()) {
+#if V8_TARGET_LITTLE_ENDIAN
+ index += kPointerSize / 2;
+#endif
+ return ChangeInt32ToInt64(
+ Load(MachineType::Int32(), base, IntPtrConstant(index)));
+ } else {
+ return SmiToWord(
+ Load(MachineType::AnyTagged(), base, IntPtrConstant(index)));
+ }
+}
+
+Node* CodeStubAssembler::LoadAndUntagToWord32Root(
+ Heap::RootListIndex root_index) {
+ Node* roots_array_start =
+ ExternalConstant(ExternalReference::roots_array_start(isolate()));
+ int index = root_index * kPointerSize;
+ if (Is64()) {
+#if V8_TARGET_LITTLE_ENDIAN
+ index += kPointerSize / 2;
+#endif
+ return Load(MachineType::Int32(), roots_array_start, IntPtrConstant(index));
+ } else {
+ return SmiToWord32(Load(MachineType::AnyTagged(), roots_array_start,
+ IntPtrConstant(index)));
+ }
+}
+
Node* CodeStubAssembler::LoadHeapNumberValue(Node* object) {
return LoadObjectField(object, HeapNumber::kValueOffset,
MachineType::Float64());
@@ -940,8 +994,8 @@ Node* CodeStubAssembler::LoadElements(Node* object) {
return LoadObjectField(object, JSObject::kElementsOffset);
}
-Node* CodeStubAssembler::LoadFixedArrayBaseLength(Node* array) {
- return LoadObjectField(array, FixedArrayBase::kLengthOffset);
+Node* CodeStubAssembler::LoadAndUntagFixedArrayBaseLength(Node* array) {
+ return LoadAndUntagObjectField(array, FixedArrayBase::kLengthOffset);
}
Node* CodeStubAssembler::LoadMapBitField(Node* map) {
@@ -1056,6 +1110,25 @@ Node* CodeStubAssembler::LoadFixedArrayElement(Node* object, Node* index_node,
return Load(MachineType::AnyTagged(), object, offset);
}
+Node* CodeStubAssembler::LoadAndUntagToWord32FixedArrayElement(
+ Node* object, Node* index_node, int additional_offset,
+ ParameterMode parameter_mode) {
+ int32_t header_size =
+ FixedArray::kHeaderSize + additional_offset - kHeapObjectTag;
+#if V8_TARGET_LITTLE_ENDIAN
+ if (Is64()) {
+ header_size += kPointerSize / 2;
+ }
+#endif
+ Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_ELEMENTS,
+ parameter_mode, header_size);
+ if (Is64()) {
+ return Load(MachineType::Int32(), object, offset);
+ } else {
+ return SmiToWord32(Load(MachineType::AnyTagged(), object, offset));
+ }
+}
+
Node* CodeStubAssembler::LoadFixedDoubleArrayElement(
Node* object, Node* index_node, MachineType machine_type,
int additional_offset, ParameterMode parameter_mode) {
@@ -1915,7 +1988,7 @@ Node* CodeStubAssembler::StringCharCodeAt(Node* string, Node* index) {
{
// The {string} is a SlicedString, continue with its parent.
Node* string_offset =
- SmiToWord(LoadObjectField(string, SlicedString::kOffsetOffset));
+ LoadAndUntagObjectField(string, SlicedString::kOffsetOffset);
Node* string_parent =
LoadObjectField(string, SlicedString::kParentOffset);
var_index.Bind(IntPtrAdd(index, string_offset));
@@ -2086,8 +2159,8 @@ void CodeStubAssembler::NameDictionaryLookup(Node* dictionary,
DCHECK_EQ(MachineRepresentation::kWord32, var_name_index->rep());
Comment("NameDictionaryLookup");
- Node* capacity = SmiToWord32(LoadFixedArrayElement(
- dictionary, Int32Constant(Dictionary::kCapacityIndex)));
+ Node* capacity = LoadAndUntagToWord32FixedArrayElement(
+ dictionary, Int32Constant(Dictionary::kCapacityIndex));
Node* mask = Int32Sub(capacity, Int32Constant(1));
Node* hash = LoadNameHash(unique_name);
@@ -2166,8 +2239,8 @@ void CodeStubAssembler::NumberDictionaryLookup(Node* dictionary, Node* key,
DCHECK_EQ(MachineRepresentation::kWord32, var_entry->rep());
Comment("NumberDictionaryLookup");
- Node* capacity = SmiToWord32(LoadFixedArrayElement(
- dictionary, Int32Constant(Dictionary::kCapacityIndex)));
+ Node* capacity = LoadAndUntagToWord32FixedArrayElement(
+ dictionary, Int32Constant(Dictionary::kCapacityIndex));
Node* mask = Int32Sub(capacity, Int32Constant(1));
Node* seed;
@@ -2358,8 +2431,8 @@ void CodeStubAssembler::LoadPropertyFromFastObject(Node* object, Node* map,
(DescriptorArray::kDescriptorValue - DescriptorArray::kDescriptorKey) *
kPointerSize;
- Node* details = SmiToWord32(
- LoadFixedArrayElement(descriptors, name_index, name_to_details_offset));
+ Node* details = LoadAndUntagToWord32FixedArrayElement(descriptors, name_index,
+ name_to_details_offset);
var_details->Bind(details);
Node* location = BitFieldDecode<PropertyDetails::LocationField>(details);
@@ -2465,8 +2538,8 @@ void CodeStubAssembler::LoadPropertyFromNameDictionary(Node* dictionary,
(NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) *
kPointerSize;
- Node* details = SmiToWord32(
- LoadFixedArrayElement(dictionary, name_index, name_to_details_offset));
+ Node* details = LoadAndUntagToWord32FixedArrayElement(dictionary, name_index,
+ name_to_details_offset);
var_details->Bind(details);
var_value->Bind(
@@ -2494,8 +2567,8 @@ void CodeStubAssembler::LoadPropertyFromGlobalDictionary(Node* dictionary,
var_value->Bind(value);
- Node* details =
- SmiToWord32(LoadObjectField(property_cell, PropertyCell::kDetailsOffset));
+ Node* details = LoadAndUntagToWord32ObjectField(property_cell,
+ PropertyCell::kDetailsOffset);
var_details->Bind(details);
Comment("] LoadPropertyFromGlobalDictionary");
@@ -2633,9 +2706,9 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map,
Bind(&if_isobjectorsmi);
{
Node* elements = LoadElements(object);
- Node* length = LoadFixedArrayBaseLength(elements);
+ Node* length = LoadAndUntagFixedArrayBaseLength(elements);
- GotoUnless(Uint32LessThan(index, SmiToWord32(length)), if_not_found);
+ GotoUnless(Uint32LessThan(index, length), if_not_found);
Node* element = LoadFixedArrayElement(elements, index);
Node* the_hole = TheHoleConstant();
@@ -2644,9 +2717,9 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map,
Bind(&if_isdouble);
{
Node* elements = LoadElements(object);
- Node* length = LoadFixedArrayBaseLength(elements);
+ Node* length = LoadAndUntagFixedArrayBaseLength(elements);
- GotoUnless(Uint32LessThan(index, SmiToWord32(length)), if_not_found);
+ GotoUnless(Uint32LessThan(index, length), if_not_found);
if (kPointerSize == kDoubleSize) {
Node* element =
@@ -3053,7 +3126,7 @@ void CodeStubAssembler::HandlePolymorphicCase(
Bind(&next_entry);
}
- Node* length = SmiToWord32(LoadFixedArrayBaseLength(feedback));
+ Node* length = LoadAndUntagFixedArrayBaseLength(feedback);
// Loop from {unroll_count}*kEntrySize to {length}.
Variable var_index(this, MachineRepresentation::kWord32);
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/compiler/arm64/code-generator-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698