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

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

Issue 945823002: MIPS64: Implement optimization utilizing signaling NaN for holes in double arrays. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 10 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/mips64/macro-assembler-mips64.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 <limits.h> // For LONG_MIN, LONG_MAX. 5 #include <limits.h> // For LONG_MIN, LONG_MAX.
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #if V8_TARGET_ARCH_MIPS64 9 #if V8_TARGET_ARCH_MIPS64
10 10
(...skipping 3847 matching lines...) Expand 10 before | Expand all | Expand 10 after
3858 Branch(fail, hi, scratch, 3858 Branch(fail, hi, scratch,
3859 Operand(Map::kMaximumBitField2FastHoleySmiElementValue)); 3859 Operand(Map::kMaximumBitField2FastHoleySmiElementValue));
3860 } 3860 }
3861 3861
3862 3862
3863 void MacroAssembler::StoreNumberToDoubleElements(Register value_reg, 3863 void MacroAssembler::StoreNumberToDoubleElements(Register value_reg,
3864 Register key_reg, 3864 Register key_reg,
3865 Register elements_reg, 3865 Register elements_reg,
3866 Register scratch1, 3866 Register scratch1,
3867 Register scratch2, 3867 Register scratch2,
3868 Register scratch3,
3869 Label* fail, 3868 Label* fail,
3870 int elements_offset) { 3869 int elements_offset) {
3871 Label smi_value, maybe_nan, have_double_value, is_nan, done; 3870 Label smi_value, done;
3872 Register mantissa_reg = scratch2;
3873 Register exponent_reg = scratch3;
3874 3871
3875 // Handle smi values specially. 3872 // Handle smi values specially.
3876 JumpIfSmi(value_reg, &smi_value); 3873 JumpIfSmi(value_reg, &smi_value);
3877 3874
3878 // Ensure that the object is a heap number 3875 // Ensure that the object is a heap number.
3879 CheckMap(value_reg, 3876 CheckMap(value_reg,
3880 scratch1, 3877 scratch1,
3881 Heap::kHeapNumberMapRootIndex, 3878 Heap::kHeapNumberMapRootIndex,
3882 fail, 3879 fail,
3883 DONT_DO_SMI_CHECK); 3880 DONT_DO_SMI_CHECK);
3884 3881
3885 // Check for nan: all NaN values have a value greater (signed) than 0x7ff00000 3882 // Double value, turn potential sNaN into qNan.
3886 // in the exponent. 3883 DoubleRegister double_result = f0;
3887 li(scratch1, Operand(kHoleNanUpper32 & HeapNumber::kExponentMask)); 3884 DoubleRegister double_scratch = f2;
3888 lw(exponent_reg, FieldMemOperand(value_reg, HeapNumber::kExponentOffset));
3889 Branch(&maybe_nan, ge, exponent_reg, Operand(scratch1));
3890 3885
3891 lwu(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset)); 3886 ldc1(double_result, FieldMemOperand(value_reg, HeapNumber::kValueOffset));
3892 3887 FPUCanonicalizeNaN(double_result, double_result);
3893 bind(&have_double_value); 3888 Branch(&done);
3894 // dsll(scratch1, key_reg, kDoubleSizeLog2 - kSmiTagSize);
3895 dsra(scratch1, key_reg, 32 - kDoubleSizeLog2);
3896 Daddu(scratch1, scratch1, elements_reg);
3897 sw(mantissa_reg, FieldMemOperand(
3898 scratch1, FixedDoubleArray::kHeaderSize - elements_offset));
3899 uint32_t offset = FixedDoubleArray::kHeaderSize - elements_offset +
3900 sizeof(kHoleNanLower32);
3901 sw(exponent_reg, FieldMemOperand(scratch1, offset));
3902 jmp(&done);
3903
3904 bind(&maybe_nan);
3905 // Could be NaN, Infinity or -Infinity. If fraction is not zero, it's NaN,
3906 // otherwise it's Infinity or -Infinity, and the non-NaN code path applies.
3907 lw(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset));
3908 Branch(&have_double_value, eq, mantissa_reg, Operand(zero_reg));
3909 bind(&is_nan);
3910 // Load canonical NaN for storing into the double array.
3911 LoadRoot(at, Heap::kNanValueRootIndex);
3912 lw(mantissa_reg, FieldMemOperand(at, HeapNumber::kMantissaOffset));
3913 lw(exponent_reg, FieldMemOperand(at, HeapNumber::kExponentOffset));
3914 jmp(&have_double_value);
3915 3889
3916 bind(&smi_value); 3890 bind(&smi_value);
3891 // scratch1 is now effective address of the double element.
3892 // Untag and transfer.
3893 mthc1(value_reg, double_scratch);
3894 cvt_d_w(double_result, double_scratch);
3895
3896 bind(&done);
3917 Daddu(scratch1, elements_reg, 3897 Daddu(scratch1, elements_reg,
3918 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag - 3898 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag -
3919 elements_offset)); 3899 elements_offset));
3920 // dsll(scratch2, key_reg, kDoubleSizeLog2 - kSmiTagSize);
3921 dsra(scratch2, key_reg, 32 - kDoubleSizeLog2); 3900 dsra(scratch2, key_reg, 32 - kDoubleSizeLog2);
3922 Daddu(scratch1, scratch1, scratch2); 3901 Daddu(scratch1, scratch1, scratch2);
3923 // scratch1 is now effective address of the double element 3902 sdc1(double_result, MemOperand(scratch1, 0));
3924
3925 Register untagged_value = elements_reg;
3926 SmiUntag(untagged_value, value_reg);
3927 mtc1(untagged_value, f2);
3928 cvt_d_w(f0, f2);
3929 sdc1(f0, MemOperand(scratch1, 0));
3930 bind(&done);
3931 } 3903 }
3932 3904
3933 3905
3934 void MacroAssembler::CompareMapAndBranch(Register obj, 3906 void MacroAssembler::CompareMapAndBranch(Register obj,
3935 Register scratch, 3907 Register scratch,
3936 Handle<Map> map, 3908 Handle<Map> map,
3937 Label* early_success, 3909 Label* early_success,
3938 Condition cond, 3910 Condition cond,
3939 Label* branch_to) { 3911 Label* branch_to) {
3940 ld(scratch, FieldMemOperand(obj, HeapObject::kMapOffset)); 3912 ld(scratch, FieldMemOperand(obj, HeapObject::kMapOffset));
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3992 LoadRoot(at, index); 3964 LoadRoot(at, index);
3993 Branch(fail, ne, scratch, Operand(at)); 3965 Branch(fail, ne, scratch, Operand(at));
3994 } 3966 }
3995 3967
3996 3968
3997 void MacroAssembler::GetWeakValue(Register value, Handle<WeakCell> cell) { 3969 void MacroAssembler::GetWeakValue(Register value, Handle<WeakCell> cell) {
3998 li(value, Operand(cell)); 3970 li(value, Operand(cell));
3999 ld(value, FieldMemOperand(value, WeakCell::kValueOffset)); 3971 ld(value, FieldMemOperand(value, WeakCell::kValueOffset));
4000 } 3972 }
4001 3973
3974 void MacroAssembler::FPUCanonicalizeNaN(const DoubleRegister dst,
3975 const DoubleRegister src) {
3976 sub_d(dst, src, kDoubleRegZero);
3977 }
4002 3978
4003 void MacroAssembler::LoadWeakValue(Register value, Handle<WeakCell> cell, 3979 void MacroAssembler::LoadWeakValue(Register value, Handle<WeakCell> cell,
4004 Label* miss) { 3980 Label* miss) {
4005 GetWeakValue(value, cell); 3981 GetWeakValue(value, cell);
4006 JumpIfSmi(value, miss); 3982 JumpIfSmi(value, miss);
4007 } 3983 }
4008 3984
4009 3985
4010 void MacroAssembler::MovFromFloatResult(const DoubleRegister dst) { 3986 void MacroAssembler::MovFromFloatResult(const DoubleRegister dst) {
4011 if (IsMipsSoftFloatABI) { 3987 if (IsMipsSoftFloatABI) {
(...skipping 2189 matching lines...) Expand 10 before | Expand all | Expand 10 after
6201 } 6177 }
6202 if (mag.shift > 0) sra(result, result, mag.shift); 6178 if (mag.shift > 0) sra(result, result, mag.shift);
6203 srl(at, dividend, 31); 6179 srl(at, dividend, 31);
6204 Addu(result, result, Operand(at)); 6180 Addu(result, result, Operand(at));
6205 } 6181 }
6206 6182
6207 6183
6208 } } // namespace v8::internal 6184 } } // namespace v8::internal
6209 6185
6210 #endif // V8_TARGET_ARCH_MIPS64 6186 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/mips64/macro-assembler-mips64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698