| 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,
|
|
|