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

Side by Side Diff: src/ppc/code-stubs-ppc.cc

Issue 1029413002: PPC: VectorICs: keyed element loads were kicking out non-smi keys unnecessarily (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 9 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 | « no previous file | src/ppc/full-codegen-ppc.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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_PPC 7 #if V8_TARGET_ARCH_PPC
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 1576 matching lines...) Expand 10 before | Expand all | Expand 10 after
1587 StringCharAtGenerator char_at_generator(receiver, index, scratch, result, 1587 StringCharAtGenerator char_at_generator(receiver, index, scratch, result,
1588 &miss, // When not a string. 1588 &miss, // When not a string.
1589 &miss, // When not a number. 1589 &miss, // When not a number.
1590 &miss, // When index out of range. 1590 &miss, // When index out of range.
1591 STRING_INDEX_IS_ARRAY_INDEX, 1591 STRING_INDEX_IS_ARRAY_INDEX,
1592 RECEIVER_IS_STRING); 1592 RECEIVER_IS_STRING);
1593 char_at_generator.GenerateFast(masm); 1593 char_at_generator.GenerateFast(masm);
1594 __ Ret(); 1594 __ Ret();
1595 1595
1596 StubRuntimeCallHelper call_helper; 1596 StubRuntimeCallHelper call_helper;
1597 char_at_generator.GenerateSlow(masm, call_helper); 1597 char_at_generator.GenerateSlow(masm, PART_OF_IC_HANDLER, call_helper);
1598 1598
1599 __ bind(&miss); 1599 __ bind(&miss);
1600 PropertyAccessCompiler::TailCallBuiltin( 1600 PropertyAccessCompiler::TailCallBuiltin(
1601 masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC)); 1601 masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC));
1602 } 1602 }
1603 1603
1604 1604
1605 void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { 1605 void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) {
1606 CHECK(!has_new_target()); 1606 CHECK(!has_new_target());
1607 // The displacement is the offset of the last parameter (if any) 1607 // The displacement is the offset of the last parameter (if any)
(...skipping 1464 matching lines...) Expand 10 before | Expand all | Expand 10 after
3072 3072
3073 StringCharLoadGenerator::Generate(masm, object_, index_, result_, 3073 StringCharLoadGenerator::Generate(masm, object_, index_, result_,
3074 &call_runtime_); 3074 &call_runtime_);
3075 3075
3076 __ SmiTag(result_); 3076 __ SmiTag(result_);
3077 __ bind(&exit_); 3077 __ bind(&exit_);
3078 } 3078 }
3079 3079
3080 3080
3081 void StringCharCodeAtGenerator::GenerateSlow( 3081 void StringCharCodeAtGenerator::GenerateSlow(
3082 MacroAssembler* masm, const RuntimeCallHelper& call_helper) { 3082 MacroAssembler* masm, EmbedMode embed_mode,
3083 const RuntimeCallHelper& call_helper) {
3083 __ Abort(kUnexpectedFallthroughToCharCodeAtSlowCase); 3084 __ Abort(kUnexpectedFallthroughToCharCodeAtSlowCase);
3084 3085
3085 // Index is not a smi. 3086 // Index is not a smi.
3086 __ bind(&index_not_smi_); 3087 __ bind(&index_not_smi_);
3087 // If index is a heap number, try converting it to an integer. 3088 // If index is a heap number, try converting it to an integer.
3088 __ CheckMap(index_, result_, Heap::kHeapNumberMapRootIndex, index_not_number_, 3089 __ CheckMap(index_, result_, Heap::kHeapNumberMapRootIndex, index_not_number_,
3089 DONT_DO_SMI_CHECK); 3090 DONT_DO_SMI_CHECK);
3090 call_helper.BeforeCall(masm); 3091 call_helper.BeforeCall(masm);
3091 __ push(object_); 3092 if (FLAG_vector_ics && embed_mode == PART_OF_IC_HANDLER) {
3092 __ push(index_); // Consumed by runtime conversion function. 3093 __ Push(VectorLoadICDescriptor::VectorRegister(),
3094 VectorLoadICDescriptor::SlotRegister(), object_, index_);
3095 } else {
3096 // index_ is consumed by runtime conversion function.
3097 __ Push(object_, index_);
3098 }
3093 if (index_flags_ == STRING_INDEX_IS_NUMBER) { 3099 if (index_flags_ == STRING_INDEX_IS_NUMBER) {
3094 __ CallRuntime(Runtime::kNumberToIntegerMapMinusZero, 1); 3100 __ CallRuntime(Runtime::kNumberToIntegerMapMinusZero, 1);
3095 } else { 3101 } else {
3096 DCHECK(index_flags_ == STRING_INDEX_IS_ARRAY_INDEX); 3102 DCHECK(index_flags_ == STRING_INDEX_IS_ARRAY_INDEX);
3097 // NumberToSmi discards numbers that are not exact integers. 3103 // NumberToSmi discards numbers that are not exact integers.
3098 __ CallRuntime(Runtime::kNumberToSmi, 1); 3104 __ CallRuntime(Runtime::kNumberToSmi, 1);
3099 } 3105 }
3100 // Save the conversion result before the pop instructions below 3106 // Save the conversion result before the pop instructions below
3101 // have a chance to overwrite it. 3107 // have a chance to overwrite it.
3102 __ Move(index_, r3); 3108 __ Move(index_, r3);
3103 __ pop(object_); 3109 if (FLAG_vector_ics && embed_mode == PART_OF_IC_HANDLER) {
3110 __ Pop(VectorLoadICDescriptor::VectorRegister(),
3111 VectorLoadICDescriptor::SlotRegister(), object_);
3112 } else {
3113 __ pop(object_);
3114 }
3104 // Reload the instance type. 3115 // Reload the instance type.
3105 __ LoadP(result_, FieldMemOperand(object_, HeapObject::kMapOffset)); 3116 __ LoadP(result_, FieldMemOperand(object_, HeapObject::kMapOffset));
3106 __ lbz(result_, FieldMemOperand(result_, Map::kInstanceTypeOffset)); 3117 __ lbz(result_, FieldMemOperand(result_, Map::kInstanceTypeOffset));
3107 call_helper.AfterCall(masm); 3118 call_helper.AfterCall(masm);
3108 // If index is still not a smi, it must be out of range. 3119 // If index is still not a smi, it must be out of range.
3109 __ JumpIfNotSmi(index_, index_out_of_range_); 3120 __ JumpIfNotSmi(index_, index_out_of_range_);
3110 // Otherwise, return to the fast path. 3121 // Otherwise, return to the fast path.
3111 __ b(&got_smi_index_); 3122 __ b(&got_smi_index_);
3112 3123
3113 // Call runtime. We get here when the receiver is a string and the 3124 // Call runtime. We get here when the receiver is a string and the
(...skipping 1657 matching lines...) Expand 10 before | Expand all | Expand 10 after
4771 __ SmiToPtrArrayOffset(r0, slot); 4782 __ SmiToPtrArrayOffset(r0, slot);
4772 __ add(feedback, vector, r0); 4783 __ add(feedback, vector, r0);
4773 __ LoadP(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize)); 4784 __ LoadP(feedback, FieldMemOperand(feedback, FixedArray::kHeaderSize));
4774 4785
4775 // Is it a weak cell? 4786 // Is it a weak cell?
4776 Label try_array; 4787 Label try_array;
4777 Label not_array, smi_key, key_okay, miss; 4788 Label not_array, smi_key, key_okay, miss;
4778 __ LoadP(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset)); 4789 __ LoadP(scratch1, FieldMemOperand(feedback, HeapObject::kMapOffset));
4779 __ CompareRoot(scratch1, Heap::kWeakCellMapRootIndex); 4790 __ CompareRoot(scratch1, Heap::kWeakCellMapRootIndex);
4780 __ bne(&try_array); 4791 __ bne(&try_array);
4781 __ JumpIfNotSmi(key, &miss);
4782 HandleMonomorphicCase(masm, receiver, key, vector, slot, feedback, scratch1, 4792 HandleMonomorphicCase(masm, receiver, key, vector, slot, feedback, scratch1,
4783 &miss); 4793 &miss);
4784 4794
4785 __ bind(&try_array); 4795 __ bind(&try_array);
4786 // Is it a fixed array? 4796 // Is it a fixed array?
4787 __ CompareRoot(scratch1, Heap::kFixedArrayMapRootIndex); 4797 __ CompareRoot(scratch1, Heap::kFixedArrayMapRootIndex);
4788 __ bne(&not_array); 4798 __ bne(&not_array);
4799
4789 // We have a polymorphic element handler. 4800 // We have a polymorphic element handler.
4790 __ JumpIfNotSmi(key, &miss);
4791
4792 Label polymorphic, try_poly_name; 4801 Label polymorphic, try_poly_name;
4793 __ bind(&polymorphic); 4802 __ bind(&polymorphic);
4794 HandleArrayCases(masm, receiver, key, vector, slot, feedback, scratch1, r9, 4803 HandleArrayCases(masm, receiver, key, vector, slot, feedback, scratch1, r9,
4795 r10, true, &miss); 4804 r10, true, &miss);
4796 4805
4797 __ bind(&not_array); 4806 __ bind(&not_array);
4798 // Is it generic? 4807 // Is it generic?
4799 __ CompareRoot(feedback, Heap::kmegamorphic_symbolRootIndex); 4808 __ CompareRoot(feedback, Heap::kmegamorphic_symbolRootIndex);
4800 __ bne(&try_poly_name); 4809 __ bne(&try_poly_name);
4801 Handle<Code> megamorphic_stub = 4810 Handle<Code> megamorphic_stub =
(...skipping 777 matching lines...) Expand 10 before | Expand all | Expand 10 after
5579 kStackUnwindSpace, NULL, 5588 kStackUnwindSpace, NULL,
5580 MemOperand(fp, 6 * kPointerSize), NULL); 5589 MemOperand(fp, 6 * kPointerSize), NULL);
5581 } 5590 }
5582 5591
5583 5592
5584 #undef __ 5593 #undef __
5585 } 5594 }
5586 } // namespace v8::internal 5595 } // namespace v8::internal
5587 5596
5588 #endif // V8_TARGET_ARCH_PPC 5597 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « no previous file | src/ppc/full-codegen-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698