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

Side by Side Diff: src/full-codegen/arm64/full-codegen-arm64.cc

Issue 2151773002: Avoid jumping to the runtime for ForInFilter (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: remove double label Created 4 years, 5 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 unified diff | Download patch
« no previous file with comments | « src/full-codegen/arm/full-codegen-arm.cc ('k') | src/full-codegen/ia32/full-codegen-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if V8_TARGET_ARCH_ARM64 5 #if V8_TARGET_ARCH_ARM64
6 6
7 #include "src/ast/scopes.h" 7 #include "src/ast/scopes.h"
8 #include "src/code-factory.h" 8 #include "src/code-factory.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 1055 matching lines...) Expand 10 before | Expand all | Expand 10 after
1066 1066
1067 // Generate code for doing the condition check. 1067 // Generate code for doing the condition check.
1068 __ Bind(&loop); 1068 __ Bind(&loop);
1069 SetExpressionAsStatementPosition(stmt->each()); 1069 SetExpressionAsStatementPosition(stmt->each());
1070 1070
1071 // Load the current count to x0, load the length to x1. 1071 // Load the current count to x0, load the length to x1.
1072 __ PeekPair(x0, x1, 0); 1072 __ PeekPair(x0, x1, 0);
1073 __ Cmp(x0, x1); // Compare to the array length. 1073 __ Cmp(x0, x1); // Compare to the array length.
1074 __ B(hs, loop_statement.break_label()); 1074 __ B(hs, loop_statement.break_label());
1075 1075
1076 // Get the current entry of the array into register r3. 1076 // Get the current entry of the array into register x0.
1077 __ Peek(x10, 2 * kXRegSize); 1077 __ Peek(x10, 2 * kXRegSize);
1078 __ Add(x10, x10, Operand::UntagSmiAndScale(x0, kPointerSizeLog2)); 1078 __ Add(x10, x10, Operand::UntagSmiAndScale(x0, kPointerSizeLog2));
1079 __ Ldr(x3, MemOperand(x10, FixedArray::kHeaderSize - kHeapObjectTag)); 1079 __ Ldr(x0, MemOperand(x10, FixedArray::kHeaderSize - kHeapObjectTag));
1080 1080
1081 // Get the expected map from the stack or a smi in the 1081 // Get the expected map from the stack or a smi in the
1082 // permanent slow case into register x10. 1082 // permanent slow case into register x2.
1083 __ Peek(x2, 3 * kXRegSize); 1083 __ Peek(x2, 3 * kXRegSize);
1084 1084
1085 // Check if the expected map still matches that of the enumerable. 1085 // Check if the expected map still matches that of the enumerable.
1086 // If not, we may have to filter the key. 1086 // If not, we may have to filter the key.
1087 Label update_each; 1087 Label update_each;
1088 __ Peek(x1, 4 * kXRegSize); 1088 __ Peek(x1, 4 * kXRegSize);
1089 __ Ldr(x11, FieldMemOperand(x1, HeapObject::kMapOffset)); 1089 __ Ldr(x11, FieldMemOperand(x1, HeapObject::kMapOffset));
1090 __ Cmp(x11, x2); 1090 __ Cmp(x11, x2);
1091 __ B(eq, &update_each); 1091 __ B(eq, &update_each);
1092 1092
1093 // We need to filter the key, record slow-path here. 1093 // We need to filter the key, record slow-path here.
1094 int const vector_index = SmiFromSlot(slot)->value(); 1094 int const vector_index = SmiFromSlot(slot)->value();
1095 __ EmitLoadTypeFeedbackVector(x0); 1095 __ EmitLoadTypeFeedbackVector(x3);
1096 __ Mov(x10, Operand(TypeFeedbackVector::MegamorphicSentinel(isolate()))); 1096 __ Mov(x10, Operand(TypeFeedbackVector::MegamorphicSentinel(isolate())));
1097 __ Str(x10, FieldMemOperand(x0, FixedArray::OffsetOfElementAt(vector_index))); 1097 __ Str(x10, FieldMemOperand(x3, FixedArray::OffsetOfElementAt(vector_index)));
1098 1098
1099 // Convert the entry to a string or (smi) 0 if it isn't a property 1099 // x0 contains the key. The receiver in x1 is the second argument to the
1100 // any more. If the property has been removed while iterating, we 1100 // ForInFilterStub. ForInFilter returns undefined if the receiver doesn't
1101 // just skip it. 1101 // have the key or returns the name-converted key.
1102 __ Push(x1, x3); 1102 ForInFilterStub filter_stub(isolate());
1103 __ CallRuntime(Runtime::kForInFilter); 1103 __ CallStub(&filter_stub);
1104 RestoreContext();
1104 PrepareForBailoutForId(stmt->FilterId(), BailoutState::TOS_REGISTER); 1105 PrepareForBailoutForId(stmt->FilterId(), BailoutState::TOS_REGISTER);
1105 __ Mov(x3, x0); 1106 __ CompareRoot(result_register(), Heap::kUndefinedValueRootIndex);
1106 __ JumpIfRoot(x0, Heap::kUndefinedValueRootIndex, 1107 __ B(eq, loop_statement.continue_label());
1107 loop_statement.continue_label());
1108 1108
1109 // Update the 'each' property or variable from the possibly filtered 1109 // Update the 'each' property or variable from the possibly filtered
1110 // entry in register x3. 1110 // entry in register x0.
1111 __ Bind(&update_each); 1111 __ Bind(&update_each);
1112 __ Mov(result_register(), x3);
1113 // Perform the assignment as if via '='. 1112 // Perform the assignment as if via '='.
1114 { EffectContext context(this); 1113 { EffectContext context(this);
1115 EmitAssignment(stmt->each(), stmt->EachFeedbackSlot()); 1114 EmitAssignment(stmt->each(), stmt->EachFeedbackSlot());
1116 PrepareForBailoutForId(stmt->AssignmentId(), BailoutState::NO_REGISTERS); 1115 PrepareForBailoutForId(stmt->AssignmentId(), BailoutState::NO_REGISTERS);
1117 } 1116 }
1118 1117
1119 // Both Crankshaft and Turbofan expect BodyId to be right before stmt->body(). 1118 // Both Crankshaft and Turbofan expect BodyId to be right before stmt->body().
1120 PrepareForBailoutForId(stmt->BodyId(), BailoutState::NO_REGISTERS); 1119 PrepareForBailoutForId(stmt->BodyId(), BailoutState::NO_REGISTERS);
1121 // Generate code for the body of the loop. 1120 // Generate code for the body of the loop.
1122 Visit(stmt->body()); 1121 Visit(stmt->body());
(...skipping 2730 matching lines...) Expand 10 before | Expand all | Expand 10 after
3853 } 3852 }
3854 3853
3855 return INTERRUPT; 3854 return INTERRUPT;
3856 } 3855 }
3857 3856
3858 3857
3859 } // namespace internal 3858 } // namespace internal
3860 } // namespace v8 3859 } // namespace v8
3861 3860
3862 #endif // V8_TARGET_ARCH_ARM64 3861 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « src/full-codegen/arm/full-codegen-arm.cc ('k') | src/full-codegen/ia32/full-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698