| Index: src/mips64/code-stubs-mips64.cc
|
| diff --git a/src/mips64/code-stubs-mips64.cc b/src/mips64/code-stubs-mips64.cc
|
| index 643ff5cd01e55af03e694f0e39d431438f5fbd77..74477b557bff04bb9cee26c9f98a1be43ea6b605 100644
|
| --- a/src/mips64/code-stubs-mips64.cc
|
| +++ b/src/mips64/code-stubs-mips64.cc
|
| @@ -1380,12 +1380,8 @@ void LoadIndexedStringStub::Generate(MacroAssembler* masm) {
|
| Register result = v0;
|
| DCHECK(!scratch.is(receiver) && !scratch.is(index));
|
| DCHECK(!FLAG_vector_ics ||
|
| - (!scratch.is(VectorLoadICDescriptor::VectorRegister()) &&
|
| - result.is(VectorLoadICDescriptor::SlotRegister())));
|
| + !scratch.is(VectorLoadICDescriptor::VectorRegister()));
|
|
|
| - // StringCharAtGenerator doesn't use the result register until it's passed
|
| - // the different miss possibilities. If it did, we would have a conflict
|
| - // when FLAG_vector_ics is true.
|
| StringCharAtGenerator char_at_generator(receiver, index, scratch, result,
|
| &miss, // When not a string.
|
| &miss, // When not a number.
|
| @@ -1396,7 +1392,7 @@ void LoadIndexedStringStub::Generate(MacroAssembler* masm) {
|
| __ Ret();
|
|
|
| StubRuntimeCallHelper call_helper;
|
| - char_at_generator.GenerateSlow(masm, call_helper);
|
| + char_at_generator.GenerateSlow(masm, PART_OF_IC_HANDLER, call_helper);
|
|
|
| __ bind(&miss);
|
| PropertyAccessCompiler::TailCallBuiltin(
|
| @@ -3089,7 +3085,7 @@ void CallICStub::GenerateMiss(MacroAssembler* masm) {
|
|
|
|
|
| void StringCharCodeAtGenerator::GenerateSlow(
|
| - MacroAssembler* masm,
|
| + MacroAssembler* masm, EmbedMode embed_mode,
|
| const RuntimeCallHelper& call_helper) {
|
| __ Abort(kUnexpectedFallthroughToCharCodeAtSlowCase);
|
|
|
| @@ -3103,7 +3099,12 @@ void StringCharCodeAtGenerator::GenerateSlow(
|
| DONT_DO_SMI_CHECK);
|
| call_helper.BeforeCall(masm);
|
| // Consumed by runtime conversion function:
|
| - __ Push(object_, index_);
|
| + if (FLAG_vector_ics && embed_mode == PART_OF_IC_HANDLER) {
|
| + __ Push(VectorLoadICDescriptor::VectorRegister(),
|
| + VectorLoadICDescriptor::SlotRegister(), object_, index_);
|
| + } else {
|
| + __ Push(object_, index_);
|
| + }
|
| if (index_flags_ == STRING_INDEX_IS_NUMBER) {
|
| __ CallRuntime(Runtime::kNumberToIntegerMapMinusZero, 1);
|
| } else {
|
| @@ -3116,7 +3117,12 @@ void StringCharCodeAtGenerator::GenerateSlow(
|
| // have a chance to overwrite it.
|
|
|
| __ Move(index_, v0);
|
| - __ pop(object_);
|
| + if (FLAG_vector_ics && embed_mode == PART_OF_IC_HANDLER) {
|
| + __ Pop(VectorLoadICDescriptor::SlotRegister(),
|
| + VectorLoadICDescriptor::VectorRegister(), object_);
|
| + } else {
|
| + __ pop(object_);
|
| + }
|
| // Reload the instance type.
|
| __ ld(result_, FieldMemOperand(object_, HeapObject::kMapOffset));
|
| __ lbu(result_, FieldMemOperand(result_, Map::kInstanceTypeOffset));
|
|
|