OLD | NEW |
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 #if V8_TARGET_ARCH_MIPS | 7 #if V8_TARGET_ARCH_MIPS |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/base/division-by-constant.h" | 10 #include "src/base/division-by-constant.h" |
(...skipping 5861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5872 // Check that neither is a smi. | 5872 // Check that neither is a smi. |
5873 STATIC_ASSERT(kSmiTag == 0); | 5873 STATIC_ASSERT(kSmiTag == 0); |
5874 And(scratch1, first, Operand(second)); | 5874 And(scratch1, first, Operand(second)); |
5875 JumpIfSmi(scratch1, failure); | 5875 JumpIfSmi(scratch1, failure); |
5876 JumpIfNonSmisNotBothSequentialOneByteStrings(first, second, scratch1, | 5876 JumpIfNonSmisNotBothSequentialOneByteStrings(first, second, scratch1, |
5877 scratch2, failure); | 5877 scratch2, failure); |
5878 } | 5878 } |
5879 | 5879 |
5880 void MacroAssembler::Float32Max(FPURegister dst, FPURegister src1, | 5880 void MacroAssembler::Float32Max(FPURegister dst, FPURegister src1, |
5881 FPURegister src2, Label* out_of_line) { | 5881 FPURegister src2, Label* out_of_line) { |
5882 DCHECK(!src1.is(src2)); | 5882 if (src1.is(src2)) { |
| 5883 Move_s(dst, src1); |
| 5884 return; |
| 5885 } |
5883 | 5886 |
5884 // Check if one of operands is NaN. | 5887 // Check if one of operands is NaN. |
5885 BranchF32(nullptr, out_of_line, eq, src1, src2); | 5888 BranchF32(nullptr, out_of_line, eq, src1, src2); |
5886 | 5889 |
5887 if (IsMipsArchVariant(kMips32r6)) { | 5890 if (IsMipsArchVariant(kMips32r6)) { |
5888 max_s(dst, src1, src2); | 5891 max_s(dst, src1, src2); |
5889 } else { | 5892 } else { |
5890 Label return_left, return_right, done; | 5893 Label return_left, return_right, done; |
5891 | 5894 |
5892 c(OLT, S, src1, src2); | 5895 BranchF32(&return_right, nullptr, lt, src1, src2); |
5893 bc1t(&return_right); | 5896 BranchF32(&return_left, nullptr, lt, src2, src1); |
5894 nop(); | |
5895 | |
5896 c(OLT, S, src2, src1); | |
5897 bc1t(&return_left); | |
5898 nop(); | |
5899 | 5897 |
5900 // Operands are equal, but check for +/-0. | 5898 // Operands are equal, but check for +/-0. |
5901 mfc1(t8, src1); | 5899 mfc1(t8, src1); |
5902 beq(t8, zero_reg, &return_left); | 5900 Branch(&return_left, eq, t8, Operand(zero_reg)); |
5903 nop(); | 5901 Branch(&return_right); |
5904 b(&return_right); | |
5905 nop(); | |
5906 | 5902 |
5907 bind(&return_right); | 5903 bind(&return_right); |
5908 if (!src2.is(dst)) { | 5904 if (!src2.is(dst)) { |
5909 Move_s(dst, src2); | 5905 Move_s(dst, src2); |
5910 } | 5906 } |
5911 b(&done); | 5907 Branch(&done); |
5912 nop(); | |
5913 | 5908 |
5914 bind(&return_left); | 5909 bind(&return_left); |
5915 if (!src1.is(dst)) { | 5910 if (!src1.is(dst)) { |
5916 Move_s(dst, src1); | 5911 Move_s(dst, src1); |
5917 } | 5912 } |
5918 | 5913 |
5919 bind(&done); | 5914 bind(&done); |
5920 } | 5915 } |
5921 } | 5916 } |
5922 | 5917 |
5923 void MacroAssembler::Float32MaxOutOfLine(FPURegister dst, FPURegister src1, | 5918 void MacroAssembler::Float32MaxOutOfLine(FPURegister dst, FPURegister src1, |
5924 FPURegister src2) { | 5919 FPURegister src2) { |
5925 DCHECK(!src1.is(src2)); | |
5926 add_s(dst, src1, src2); | 5920 add_s(dst, src1, src2); |
5927 } | 5921 } |
5928 | 5922 |
5929 void MacroAssembler::Float32Min(FPURegister dst, FPURegister src1, | 5923 void MacroAssembler::Float32Min(FPURegister dst, FPURegister src1, |
5930 FPURegister src2, Label* out_of_line) { | 5924 FPURegister src2, Label* out_of_line) { |
5931 DCHECK(!src1.is(src2)); | 5925 if (src1.is(src2)) { |
| 5926 Move_s(dst, src1); |
| 5927 return; |
| 5928 } |
5932 | 5929 |
5933 // Check if one of operands is NaN. | 5930 // Check if one of operands is NaN. |
5934 BranchF32(nullptr, out_of_line, eq, src1, src2); | 5931 BranchF32(nullptr, out_of_line, eq, src1, src2); |
5935 | 5932 |
5936 if (IsMipsArchVariant(kMips32r6)) { | 5933 if (IsMipsArchVariant(kMips32r6)) { |
5937 min_s(dst, src1, src2); | 5934 min_s(dst, src1, src2); |
5938 } else { | 5935 } else { |
5939 Label return_left, return_right, done; | 5936 Label return_left, return_right, done; |
5940 | 5937 |
5941 c(OLT, S, src1, src2); | 5938 BranchF32(&return_left, nullptr, lt, src1, src2); |
5942 bc1t(&return_left); | 5939 BranchF32(&return_right, nullptr, lt, src2, src1); |
5943 nop(); | |
5944 | |
5945 c(OLT, S, src2, src1); | |
5946 bc1t(&return_right); | |
5947 nop(); | |
5948 | 5940 |
5949 // Left equals right => check for -0. | 5941 // Left equals right => check for -0. |
5950 mfc1(t8, src1); | 5942 mfc1(t8, src1); |
5951 beq(t8, zero_reg, &return_right); | 5943 Branch(&return_right, eq, t8, Operand(zero_reg)); |
5952 nop(); | 5944 Branch(&return_left); |
5953 b(&return_left); | |
5954 nop(); | |
5955 | 5945 |
5956 bind(&return_right); | 5946 bind(&return_right); |
5957 if (!src2.is(dst)) { | 5947 if (!src2.is(dst)) { |
5958 Move_s(dst, src2); | 5948 Move_s(dst, src2); |
5959 } | 5949 } |
5960 b(&done); | 5950 Branch(&done); |
5961 nop(); | |
5962 | 5951 |
5963 bind(&return_left); | 5952 bind(&return_left); |
5964 if (!src1.is(dst)) { | 5953 if (!src1.is(dst)) { |
5965 Move_s(dst, src1); | 5954 Move_s(dst, src1); |
5966 } | 5955 } |
5967 | 5956 |
5968 bind(&done); | 5957 bind(&done); |
5969 } | 5958 } |
5970 } | 5959 } |
5971 | 5960 |
5972 void MacroAssembler::Float32MinOutOfLine(FPURegister dst, FPURegister src1, | 5961 void MacroAssembler::Float32MinOutOfLine(FPURegister dst, FPURegister src1, |
5973 FPURegister src2) { | 5962 FPURegister src2) { |
5974 DCHECK(!src1.is(src2)); | |
5975 add_s(dst, src1, src2); | 5963 add_s(dst, src1, src2); |
5976 } | 5964 } |
5977 | 5965 |
5978 void MacroAssembler::Float64Max(DoubleRegister dst, DoubleRegister src1, | 5966 void MacroAssembler::Float64Max(DoubleRegister dst, DoubleRegister src1, |
5979 DoubleRegister src2, Label* out_of_line) { | 5967 DoubleRegister src2, Label* out_of_line) { |
5980 DCHECK(!src1.is(src2)); | 5968 if (src1.is(src2)) { |
| 5969 Move_d(dst, src1); |
| 5970 return; |
| 5971 } |
5981 | 5972 |
5982 // Check if one of operands is NaN. | 5973 // Check if one of operands is NaN. |
5983 BranchF64(nullptr, out_of_line, eq, src1, src2); | 5974 BranchF64(nullptr, out_of_line, eq, src1, src2); |
5984 | 5975 |
5985 if (IsMipsArchVariant(kMips32r6)) { | 5976 if (IsMipsArchVariant(kMips32r6)) { |
5986 max_d(dst, src1, src2); | 5977 max_d(dst, src1, src2); |
5987 } else { | 5978 } else { |
5988 Label return_left, return_right, done; | 5979 Label return_left, return_right, done; |
5989 | 5980 |
5990 c(OLT, D, src1, src2); | 5981 BranchF64(&return_right, nullptr, lt, src1, src2); |
5991 bc1t(&return_right); | 5982 BranchF64(&return_left, nullptr, lt, src2, src1); |
5992 nop(); | |
5993 | |
5994 c(OLT, D, src2, src1); | |
5995 bc1t(&return_left); | |
5996 nop(); | |
5997 | 5983 |
5998 // Left equals right => check for -0. | 5984 // Left equals right => check for -0. |
5999 Mfhc1(t8, src1); | 5985 Mfhc1(t8, src1); |
6000 beq(t8, zero_reg, &return_left); | 5986 Branch(&return_left, eq, t8, Operand(zero_reg)); |
6001 nop(); | 5987 Branch(&return_right); |
6002 b(&return_right); | |
6003 nop(); | |
6004 | 5988 |
6005 bind(&return_right); | 5989 bind(&return_right); |
6006 if (!src2.is(dst)) { | 5990 if (!src2.is(dst)) { |
6007 Move_d(dst, src2); | 5991 Move_d(dst, src2); |
6008 } | 5992 } |
6009 b(&done); | 5993 Branch(&done); |
6010 nop(); | |
6011 | 5994 |
6012 bind(&return_left); | 5995 bind(&return_left); |
6013 if (!src1.is(dst)) { | 5996 if (!src1.is(dst)) { |
6014 Move_d(dst, src1); | 5997 Move_d(dst, src1); |
6015 } | 5998 } |
6016 | 5999 |
6017 bind(&done); | 6000 bind(&done); |
6018 } | 6001 } |
6019 } | 6002 } |
6020 | 6003 |
6021 void MacroAssembler::Float64MaxOutOfLine(DoubleRegister dst, | 6004 void MacroAssembler::Float64MaxOutOfLine(DoubleRegister dst, |
6022 DoubleRegister src1, | 6005 DoubleRegister src1, |
6023 DoubleRegister src2) { | 6006 DoubleRegister src2) { |
6024 DCHECK(!src1.is(src2)); | |
6025 add_d(dst, src1, src2); | 6007 add_d(dst, src1, src2); |
6026 } | 6008 } |
6027 | 6009 |
6028 void MacroAssembler::Float64Min(DoubleRegister dst, DoubleRegister src1, | 6010 void MacroAssembler::Float64Min(DoubleRegister dst, DoubleRegister src1, |
6029 DoubleRegister src2, Label* out_of_line) { | 6011 DoubleRegister src2, Label* out_of_line) { |
6030 DCHECK(!src1.is(src2)); | 6012 if (src1.is(src2)) { |
| 6013 Move_d(dst, src1); |
| 6014 return; |
| 6015 } |
6031 | 6016 |
6032 // Check if one of operands is NaN. | 6017 // Check if one of operands is NaN. |
6033 BranchF64(nullptr, out_of_line, eq, src1, src2); | 6018 BranchF64(nullptr, out_of_line, eq, src1, src2); |
6034 | 6019 |
6035 if (IsMipsArchVariant(kMips32r6)) { | 6020 if (IsMipsArchVariant(kMips32r6)) { |
6036 min_d(dst, src1, src2); | 6021 min_d(dst, src1, src2); |
6037 } else { | 6022 } else { |
6038 Label return_left, return_right, done; | 6023 Label return_left, return_right, done; |
6039 | 6024 |
6040 c(OLT, D, src1, src2); | 6025 BranchF64(&return_left, nullptr, lt, src1, src2); |
6041 bc1t(&return_left); | 6026 BranchF64(&return_right, nullptr, lt, src2, src1); |
6042 nop(); | |
6043 | |
6044 c(OLT, D, src2, src1); | |
6045 bc1t(&return_right); | |
6046 nop(); | |
6047 | 6027 |
6048 // Left equals right => check for -0. | 6028 // Left equals right => check for -0. |
6049 Mfhc1(t8, src1); | 6029 Mfhc1(t8, src1); |
6050 beq(t8, zero_reg, &return_right); | 6030 Branch(&return_right, eq, t8, Operand(zero_reg)); |
6051 nop(); | 6031 Branch(&return_left); |
6052 b(&return_left); | |
6053 nop(); | |
6054 | 6032 |
6055 bind(&return_right); | 6033 bind(&return_right); |
6056 if (!src2.is(dst)) { | 6034 if (!src2.is(dst)) { |
6057 Move_d(dst, src2); | 6035 Move_d(dst, src2); |
6058 } | 6036 } |
6059 b(&done); | 6037 Branch(&done); |
6060 nop(); | |
6061 | 6038 |
6062 bind(&return_left); | 6039 bind(&return_left); |
6063 if (!src1.is(dst)) { | 6040 if (!src1.is(dst)) { |
6064 Move_d(dst, src1); | 6041 Move_d(dst, src1); |
6065 } | 6042 } |
6066 | 6043 |
6067 bind(&done); | 6044 bind(&done); |
6068 } | 6045 } |
6069 } | 6046 } |
6070 | 6047 |
6071 void MacroAssembler::Float64MinOutOfLine(DoubleRegister dst, | 6048 void MacroAssembler::Float64MinOutOfLine(DoubleRegister dst, |
6072 DoubleRegister src1, | 6049 DoubleRegister src1, |
6073 DoubleRegister src2) { | 6050 DoubleRegister src2) { |
6074 DCHECK(!src1.is(src2)); | |
6075 add_d(dst, src1, src2); | 6051 add_d(dst, src1, src2); |
6076 } | 6052 } |
6077 | 6053 |
6078 void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialOneByte( | 6054 void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialOneByte( |
6079 Register first, Register second, Register scratch1, Register scratch2, | 6055 Register first, Register second, Register scratch1, Register scratch2, |
6080 Label* failure) { | 6056 Label* failure) { |
6081 const int kFlatOneByteStringMask = | 6057 const int kFlatOneByteStringMask = |
6082 kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask; | 6058 kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask; |
6083 const int kFlatOneByteStringTag = | 6059 const int kFlatOneByteStringTag = |
6084 kStringTag | kOneByteStringTag | kSeqStringTag; | 6060 kStringTag | kOneByteStringTag | kSeqStringTag; |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6626 if (mag.shift > 0) sra(result, result, mag.shift); | 6602 if (mag.shift > 0) sra(result, result, mag.shift); |
6627 srl(at, dividend, 31); | 6603 srl(at, dividend, 31); |
6628 Addu(result, result, Operand(at)); | 6604 Addu(result, result, Operand(at)); |
6629 } | 6605 } |
6630 | 6606 |
6631 | 6607 |
6632 } // namespace internal | 6608 } // namespace internal |
6633 } // namespace v8 | 6609 } // namespace v8 |
6634 | 6610 |
6635 #endif // V8_TARGET_ARCH_MIPS | 6611 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |