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

Side by Side Diff: src/mips/macro-assembler-mips.cc

Issue 1546323002: [ic] Fixed receiver_map register trashing in KeyedStoreIC megamorphic. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 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/mips/macro-assembler-mips.h ('k') | src/mips64/macro-assembler-mips64.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 // Copyright 2012 the V8 project authors. All rights reserved. 2 // Copyright 2012 the V8 project authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be 3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file. 4 // found in the LICENSE file.
5 5
6 #include <limits.h> // For LONG_MIN, LONG_MAX. 6 #include <limits.h> // For LONG_MIN, LONG_MAX.
7 7
8 #if V8_TARGET_ARCH_MIPS 8 #if V8_TARGET_ARCH_MIPS
9 9
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
(...skipping 3696 matching lines...) Expand 10 before | Expand all | Expand 10 after
3707 3707
3708 3708
3709 void MacroAssembler::StoreNumberToDoubleElements(Register value_reg, 3709 void MacroAssembler::StoreNumberToDoubleElements(Register value_reg,
3710 Register key_reg, 3710 Register key_reg,
3711 Register elements_reg, 3711 Register elements_reg,
3712 Register scratch1, 3712 Register scratch1,
3713 Register scratch2, 3713 Register scratch2,
3714 Register scratch3, 3714 Register scratch3,
3715 Label* fail, 3715 Label* fail,
3716 int elements_offset) { 3716 int elements_offset) {
3717 DCHECK(!AreAliased(value_reg, key_reg, elements_reg, scratch1, scratch2,
3718 scratch3));
3717 Label smi_value, maybe_nan, have_double_value, is_nan, done; 3719 Label smi_value, maybe_nan, have_double_value, is_nan, done;
3718 Register mantissa_reg = scratch2; 3720 Register mantissa_reg = scratch2;
3719 Register exponent_reg = scratch3; 3721 Register exponent_reg = scratch3;
3720 3722
3721 // Handle smi values specially. 3723 // Handle smi values specially.
3722 JumpIfSmi(value_reg, &smi_value); 3724 JumpIfSmi(value_reg, &smi_value);
3723 3725
3724 // Ensure that the object is a heap number 3726 // Ensure that the object is a heap number
3725 CheckMap(value_reg, 3727 CheckMap(value_reg,
3726 scratch1, 3728 scratch1,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
3761 jmp(&have_double_value); 3763 jmp(&have_double_value);
3762 3764
3763 bind(&smi_value); 3765 bind(&smi_value);
3764 Addu(scratch1, elements_reg, 3766 Addu(scratch1, elements_reg,
3765 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag - 3767 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag -
3766 elements_offset)); 3768 elements_offset));
3767 sll(scratch2, key_reg, kDoubleSizeLog2 - kSmiTagSize); 3769 sll(scratch2, key_reg, kDoubleSizeLog2 - kSmiTagSize);
3768 Addu(scratch1, scratch1, scratch2); 3770 Addu(scratch1, scratch1, scratch2);
3769 // scratch1 is now effective address of the double element 3771 // scratch1 is now effective address of the double element
3770 3772
3771 Register untagged_value = elements_reg; 3773 Register untagged_value = scratch2;
3772 SmiUntag(untagged_value, value_reg); 3774 SmiUntag(untagged_value, value_reg);
3773 mtc1(untagged_value, f2); 3775 mtc1(untagged_value, f2);
3774 cvt_d_w(f0, f2); 3776 cvt_d_w(f0, f2);
3775 sdc1(f0, MemOperand(scratch1, 0)); 3777 sdc1(f0, MemOperand(scratch1, 0));
3776 bind(&done); 3778 bind(&done);
3777 } 3779 }
3778 3780
3779 3781
3780 void MacroAssembler::CompareMapAndBranch(Register obj, 3782 void MacroAssembler::CompareMapAndBranch(Register obj,
3781 Register scratch, 3783 Register scratch,
(...skipping 1985 matching lines...) Expand 10 before | Expand all | Expand 10 after
5767 lb(scratch1, FieldMemOperand(current, Map::kBitField2Offset)); 5769 lb(scratch1, FieldMemOperand(current, Map::kBitField2Offset));
5768 DecodeField<Map::ElementsKindBits>(scratch1); 5770 DecodeField<Map::ElementsKindBits>(scratch1);
5769 Branch(found, eq, scratch1, Operand(DICTIONARY_ELEMENTS)); 5771 Branch(found, eq, scratch1, Operand(DICTIONARY_ELEMENTS));
5770 lw(current, FieldMemOperand(current, Map::kPrototypeOffset)); 5772 lw(current, FieldMemOperand(current, Map::kPrototypeOffset));
5771 Branch(&loop_again, ne, current, Operand(factory->null_value())); 5773 Branch(&loop_again, ne, current, Operand(factory->null_value()));
5772 5774
5773 bind(&end); 5775 bind(&end);
5774 } 5776 }
5775 5777
5776 5778
5777 bool AreAliased(Register reg1, 5779 bool AreAliased(Register reg1, Register reg2, Register reg3, Register reg4,
5778 Register reg2, 5780 Register reg5, Register reg6, Register reg7, Register reg8,
5779 Register reg3, 5781 Register reg9, Register reg10) {
5780 Register reg4, 5782 int n_of_valid_regs = reg1.is_valid() + reg2.is_valid() + reg3.is_valid() +
5781 Register reg5, 5783 reg4.is_valid() + reg5.is_valid() + reg6.is_valid() +
5782 Register reg6, 5784 reg7.is_valid() + reg8.is_valid() + reg9.is_valid() +
5783 Register reg7, 5785 reg10.is_valid();
5784 Register reg8) {
5785 int n_of_valid_regs = reg1.is_valid() + reg2.is_valid() +
5786 reg3.is_valid() + reg4.is_valid() + reg5.is_valid() + reg6.is_valid() +
5787 reg7.is_valid() + reg8.is_valid();
5788 5786
5789 RegList regs = 0; 5787 RegList regs = 0;
5790 if (reg1.is_valid()) regs |= reg1.bit(); 5788 if (reg1.is_valid()) regs |= reg1.bit();
5791 if (reg2.is_valid()) regs |= reg2.bit(); 5789 if (reg2.is_valid()) regs |= reg2.bit();
5792 if (reg3.is_valid()) regs |= reg3.bit(); 5790 if (reg3.is_valid()) regs |= reg3.bit();
5793 if (reg4.is_valid()) regs |= reg4.bit(); 5791 if (reg4.is_valid()) regs |= reg4.bit();
5794 if (reg5.is_valid()) regs |= reg5.bit(); 5792 if (reg5.is_valid()) regs |= reg5.bit();
5795 if (reg6.is_valid()) regs |= reg6.bit(); 5793 if (reg6.is_valid()) regs |= reg6.bit();
5796 if (reg7.is_valid()) regs |= reg7.bit(); 5794 if (reg7.is_valid()) regs |= reg7.bit();
5797 if (reg8.is_valid()) regs |= reg8.bit(); 5795 if (reg8.is_valid()) regs |= reg8.bit();
5796 if (reg9.is_valid()) regs |= reg9.bit();
5797 if (reg10.is_valid()) regs |= reg10.bit();
5798 int n_of_non_aliasing_regs = NumRegs(regs); 5798 int n_of_non_aliasing_regs = NumRegs(regs);
5799 5799
5800 return n_of_valid_regs != n_of_non_aliasing_regs; 5800 return n_of_valid_regs != n_of_non_aliasing_regs;
5801 } 5801 }
5802 5802
5803 5803
5804 CodePatcher::CodePatcher(Isolate* isolate, byte* address, int instructions, 5804 CodePatcher::CodePatcher(Isolate* isolate, byte* address, int instructions,
5805 FlushICache flush_cache) 5805 FlushICache flush_cache)
5806 : address_(address), 5806 : address_(address),
5807 size_(instructions * Assembler::kInstrSize), 5807 size_(instructions * Assembler::kInstrSize),
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
5863 if (mag.shift > 0) sra(result, result, mag.shift); 5863 if (mag.shift > 0) sra(result, result, mag.shift);
5864 srl(at, dividend, 31); 5864 srl(at, dividend, 31);
5865 Addu(result, result, Operand(at)); 5865 Addu(result, result, Operand(at));
5866 } 5866 }
5867 5867
5868 5868
5869 } // namespace internal 5869 } // namespace internal
5870 } // namespace v8 5870 } // namespace v8
5871 5871
5872 #endif // V8_TARGET_ARCH_MIPS 5872 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « src/mips/macro-assembler-mips.h ('k') | src/mips64/macro-assembler-mips64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698