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

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

Issue 2435713003: [stubs] KeyedStoreIC: Use BuildFastLoop() helper (Closed)
Patch Set: StringIndexOfChar too Created 4 years, 2 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 | « no previous file | no next file » | 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 f23b82829ecc3d8dbc81cf1a7622977a6a67bdca..9d5e8a9a361793a6addf88d0b070248d25bef104 100644
--- a/src/code-stub-assembler.cc
+++ b/src/code-stub-assembler.cc
@@ -3213,33 +3213,24 @@ Node* CodeStubAssembler::StringIndexOfChar(Node* context, Node* string,
Node* const cursor = IntPtrAdd(begin, SmiUntag(from));
Node* const end = IntPtrAdd(cursor, search_range_length);
- Variable var_cursor(this, MachineType::PointerRepresentation());
- Variable* vars[] = {&var_cursor};
- Label loop(this, 1, vars), loop_tail(this);
-
- var_cursor.Bind(cursor);
var_result.Bind(SmiConstant(Smi::FromInt(-1)));
- Goto(&loop);
- Bind(&loop);
- {
- Node* const cursor = var_cursor.value();
+ BuildFastLoop(MachineType::PointerRepresentation(), cursor, end,
+ [string, needle_char, begin, &var_result, &out](
+ CodeStubAssembler* csa, Node* cursor) {
+ Label next(csa);
+ Node* value = csa->Load(MachineType::Uint8(), string, cursor);
+ csa->GotoUnless(csa->WordEqual(value, needle_char), &next);
- Node* value = Load(MachineType::Uint8(), string, cursor);
- GotoUnless(WordEqual(value, needle_char), &loop_tail);
+ // Found a match.
+ Node* index = csa->SmiTag(csa->IntPtrSub(cursor, begin));
+ var_result.Bind(index);
+ csa->Goto(&out);
- // Found a match.
- Node* index = SmiTag(IntPtrSub(cursor, begin));
- var_result.Bind(index);
- Goto(&out);
-
- Bind(&loop_tail);
- {
- Node* const new_cursor = IntPtrAdd(cursor, IntPtrConstant(1));
- var_cursor.Bind(new_cursor);
- Branch(IntPtrLessThan(new_cursor, end), &loop, &out);
- }
- }
+ csa->Bind(&next);
+ },
+ 1, IndexAdvanceMode::kPost);
+ Goto(&out);
Bind(&runtime);
{
@@ -3247,7 +3238,6 @@ Node* CodeStubAssembler::StringIndexOfChar(Node* context, Node* string,
Node* const result =
CallRuntime(Runtime::kStringIndexOf, context, string, pattern, from);
var_result.Bind(result);
- var_cursor.Bind(IntPtrConstant(0));
Goto(&out);
}
@@ -4814,34 +4804,31 @@ void CodeStubAssembler::HandlePolymorphicCase(
Bind(&next_entry);
}
- Node* length = LoadAndUntagFixedArrayBaseLength(feedback);
// Loop from {unroll_count}*kEntrySize to {length}.
- Variable var_index(this, MachineType::PointerRepresentation());
- Label loop(this, &var_index);
- var_index.Bind(IntPtrConstant(unroll_count * kEntrySize));
- Goto(&loop);
- Bind(&loop);
- {
- Node* index = var_index.value();
- GotoIf(UintPtrGreaterThanOrEqual(index, length), if_miss);
-
- Node* cached_map = LoadWeakCellValue(
- LoadFixedArrayElement(feedback, index, 0, INTPTR_PARAMETERS));
-
- Label next_entry(this);
- GotoIf(WordNotEqual(receiver_map, cached_map), &next_entry);
-
- // Found, now call handler.
- Node* handler =
- LoadFixedArrayElement(feedback, index, kPointerSize, INTPTR_PARAMETERS);
- var_handler->Bind(handler);
- Goto(if_handler);
-
- Bind(&next_entry);
- var_index.Bind(IntPtrAdd(index, IntPtrConstant(kEntrySize)));
- Goto(&loop);
- }
+ Node* init = IntPtrConstant(unroll_count * kEntrySize);
+ Node* length = LoadAndUntagFixedArrayBaseLength(feedback);
+ BuildFastLoop(
+ MachineType::PointerRepresentation(), init, length,
+ [receiver_map, feedback, if_handler, var_handler](CodeStubAssembler* csa,
+ Node* index) {
+ Node* cached_map = csa->LoadWeakCellValue(
+ csa->LoadFixedArrayElement(feedback, index, 0, INTPTR_PARAMETERS));
+
+ Label next_entry(csa);
+ csa->GotoIf(csa->WordNotEqual(receiver_map, cached_map), &next_entry);
+
+ // Found, now call handler.
+ Node* handler = csa->LoadFixedArrayElement(
+ feedback, index, kPointerSize, INTPTR_PARAMETERS);
+ var_handler->Bind(handler);
+ csa->Goto(if_handler);
+
+ csa->Bind(&next_entry);
+ },
+ kEntrySize, IndexAdvanceMode::kPost);
+ // The loop falls through if no handler was found.
+ Goto(if_miss);
}
void CodeStubAssembler::HandleKeyedStorePolymorphicCase(
@@ -4853,37 +4840,34 @@ void CodeStubAssembler::HandleKeyedStorePolymorphicCase(
const int kEntrySize = 3;
- Variable var_index(this, MachineType::PointerRepresentation());
- Label loop(this, &var_index);
- var_index.Bind(IntPtrConstant(0));
+ Node* init = IntPtrConstant(0);
Node* length = LoadAndUntagFixedArrayBaseLength(feedback);
- Goto(&loop);
- Bind(&loop);
- {
- Node* index = var_index.value();
- GotoIf(UintPtrGreaterThanOrEqual(index, length), if_miss);
-
- Node* cached_map = LoadWeakCellValue(
- LoadFixedArrayElement(feedback, index, 0, INTPTR_PARAMETERS));
-
- Label next_entry(this);
- GotoIf(WordNotEqual(receiver_map, cached_map), &next_entry);
-
- Node* maybe_transition_map_cell =
- LoadFixedArrayElement(feedback, index, kPointerSize, INTPTR_PARAMETERS);
-
- var_handler->Bind(LoadFixedArrayElement(feedback, index, 2 * kPointerSize,
- INTPTR_PARAMETERS));
- GotoIf(WordEqual(maybe_transition_map_cell,
- LoadRoot(Heap::kUndefinedValueRootIndex)),
- if_handler);
- var_transition_map_cell->Bind(maybe_transition_map_cell);
- Goto(if_transition_handler);
-
- Bind(&next_entry);
- var_index.Bind(IntPtrAdd(index, IntPtrConstant(kEntrySize)));
- Goto(&loop);
- }
+ BuildFastLoop(
+ MachineType::PointerRepresentation(), init, length,
+ [receiver_map, feedback, if_handler, var_handler, if_transition_handler,
+ var_transition_map_cell](CodeStubAssembler* csa, Node* index) {
+ Node* cached_map = csa->LoadWeakCellValue(
+ csa->LoadFixedArrayElement(feedback, index, 0, INTPTR_PARAMETERS));
+ Label next_entry(csa);
+ csa->GotoIf(csa->WordNotEqual(receiver_map, cached_map), &next_entry);
+
+ Node* maybe_transition_map_cell = csa->LoadFixedArrayElement(
+ feedback, index, kPointerSize, INTPTR_PARAMETERS);
+
+ var_handler->Bind(csa->LoadFixedArrayElement(
+ feedback, index, 2 * kPointerSize, INTPTR_PARAMETERS));
+ csa->GotoIf(
+ csa->WordEqual(maybe_transition_map_cell,
+ csa->LoadRoot(Heap::kUndefinedValueRootIndex)),
+ if_handler);
+ var_transition_map_cell->Bind(maybe_transition_map_cell);
+ csa->Goto(if_transition_handler);
+
+ csa->Bind(&next_entry);
+ },
+ kEntrySize, IndexAdvanceMode::kPost);
+ // The loop falls through if no handler was found.
+ Goto(if_miss);
}
compiler::Node* CodeStubAssembler::StubCachePrimaryOffset(compiler::Node* name,
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698