OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1790 // If length is not zero, "tos_" contains a non-zero value ==> true. | 1790 // If length is not zero, "tos_" contains a non-zero value ==> true. |
1791 __ Ret(); | 1791 __ Ret(); |
1792 | 1792 |
1793 // Return 0 in "tos_" for false. | 1793 // Return 0 in "tos_" for false. |
1794 __ bind(&false_result); | 1794 __ bind(&false_result); |
1795 __ mov(tos_, zero_reg); | 1795 __ mov(tos_, zero_reg); |
1796 __ Ret(); | 1796 __ Ret(); |
1797 } | 1797 } |
1798 | 1798 |
1799 | 1799 |
1800 const char* UnaryOpStub::GetName() { | 1800 void UnaryOpStub::PrintName(StringStream* stream) { |
1801 if (name_ != NULL) return name_; | |
1802 const int kMaxNameLength = 100; | |
1803 name_ = Isolate::Current()->bootstrapper()->AllocateAutoDeletedArray( | |
1804 kMaxNameLength); | |
1805 if (name_ == NULL) return "OOM"; | |
1806 const char* op_name = Token::Name(op_); | 1801 const char* op_name = Token::Name(op_); |
1807 const char* overwrite_name = NULL; // Make g++ happy. | 1802 const char* overwrite_name = NULL; // Make g++ happy. |
1808 switch (mode_) { | 1803 switch (mode_) { |
1809 case UNARY_NO_OVERWRITE: overwrite_name = "Alloc"; break; | 1804 case UNARY_NO_OVERWRITE: overwrite_name = "Alloc"; break; |
1810 case UNARY_OVERWRITE: overwrite_name = "Overwrite"; break; | 1805 case UNARY_OVERWRITE: overwrite_name = "Overwrite"; break; |
1811 } | 1806 } |
1812 | 1807 stream->Add("UnaryOpStub_%s_%s_%s", |
1813 OS::SNPrintF(Vector<char>(name_, kMaxNameLength), | 1808 op_name, |
1814 "UnaryOpStub_%s_%s_%s", | 1809 overwrite_name, |
1815 op_name, | 1810 UnaryOpIC::GetName(operand_type_)); |
1816 overwrite_name, | |
1817 UnaryOpIC::GetName(operand_type_)); | |
1818 return name_; | |
1819 } | 1811 } |
1820 | 1812 |
1821 | 1813 |
1822 // TODO(svenpanne): Use virtual functions instead of switch. | 1814 // TODO(svenpanne): Use virtual functions instead of switch. |
1823 void UnaryOpStub::Generate(MacroAssembler* masm) { | 1815 void UnaryOpStub::Generate(MacroAssembler* masm) { |
1824 switch (operand_type_) { | 1816 switch (operand_type_) { |
1825 case UnaryOpIC::UNINITIALIZED: | 1817 case UnaryOpIC::UNINITIALIZED: |
1826 GenerateTypeTransition(masm); | 1818 GenerateTypeTransition(masm); |
1827 break; | 1819 break; |
1828 case UnaryOpIC::SMI: | 1820 case UnaryOpIC::SMI: |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2147 break; | 2139 break; |
2148 case BinaryOpIC::GENERIC: | 2140 case BinaryOpIC::GENERIC: |
2149 GenerateGeneric(masm); | 2141 GenerateGeneric(masm); |
2150 break; | 2142 break; |
2151 default: | 2143 default: |
2152 UNREACHABLE(); | 2144 UNREACHABLE(); |
2153 } | 2145 } |
2154 } | 2146 } |
2155 | 2147 |
2156 | 2148 |
2157 const char* BinaryOpStub::GetName() { | 2149 void BinaryOpStub::PrintName(StringStream* stream) { |
2158 if (name_ != NULL) return name_; | |
2159 const int kMaxNameLength = 100; | |
2160 name_ = Isolate::Current()->bootstrapper()->AllocateAutoDeletedArray( | |
2161 kMaxNameLength); | |
2162 if (name_ == NULL) return "OOM"; | |
2163 const char* op_name = Token::Name(op_); | 2150 const char* op_name = Token::Name(op_); |
2164 const char* overwrite_name; | 2151 const char* overwrite_name; |
2165 switch (mode_) { | 2152 switch (mode_) { |
2166 case NO_OVERWRITE: overwrite_name = "Alloc"; break; | 2153 case NO_OVERWRITE: overwrite_name = "Alloc"; break; |
2167 case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break; | 2154 case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break; |
2168 case OVERWRITE_LEFT: overwrite_name = "OverwriteLeft"; break; | 2155 case OVERWRITE_LEFT: overwrite_name = "OverwriteLeft"; break; |
2169 default: overwrite_name = "UnknownOverwrite"; break; | 2156 default: overwrite_name = "UnknownOverwrite"; break; |
2170 } | 2157 } |
2171 | 2158 stream->Add("BinaryOpStub_%s_%s_%s", |
2172 OS::SNPrintF(Vector<char>(name_, kMaxNameLength), | 2159 op_name, |
2173 "BinaryOpStub_%s_%s_%s", | 2160 overwrite_name, |
2174 op_name, | 2161 BinaryOpIC::GetName(operands_type_)); |
2175 overwrite_name, | |
2176 BinaryOpIC::GetName(operands_type_)); | |
2177 return name_; | |
2178 } | 2162 } |
2179 | 2163 |
2180 | 2164 |
2181 | 2165 |
2182 void BinaryOpStub::GenerateSmiSmiOperation(MacroAssembler* masm) { | 2166 void BinaryOpStub::GenerateSmiSmiOperation(MacroAssembler* masm) { |
2183 Register left = a1; | 2167 Register left = a1; |
2184 Register right = a0; | 2168 Register right = a0; |
2185 | 2169 |
2186 Register scratch1 = t0; | 2170 Register scratch1 = t0; |
2187 Register scratch2 = t1; | 2171 Register scratch2 = t1; |
(...skipping 2741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4929 __ li(a0, Operand(argc_)); // Setup the number of arguments. | 4913 __ li(a0, Operand(argc_)); // Setup the number of arguments. |
4930 __ mov(a2, zero_reg); | 4914 __ mov(a2, zero_reg); |
4931 __ GetBuiltinEntry(a3, Builtins::CALL_NON_FUNCTION); | 4915 __ GetBuiltinEntry(a3, Builtins::CALL_NON_FUNCTION); |
4932 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), | 4916 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), |
4933 RelocInfo::CODE_TARGET); | 4917 RelocInfo::CODE_TARGET); |
4934 } | 4918 } |
4935 | 4919 |
4936 | 4920 |
4937 // Unfortunately you have to run without snapshots to see most of these | 4921 // Unfortunately you have to run without snapshots to see most of these |
4938 // names in the profile since most compare stubs end up in the snapshot. | 4922 // names in the profile since most compare stubs end up in the snapshot. |
4939 const char* CompareStub::GetName() { | 4923 void CompareStub::PrintName(StringStream* stream) { |
4940 ASSERT((lhs_.is(a0) && rhs_.is(a1)) || | 4924 ASSERT((lhs_.is(a0) && rhs_.is(a1)) || |
4941 (lhs_.is(a1) && rhs_.is(a0))); | 4925 (lhs_.is(a1) && rhs_.is(a0))); |
4942 | |
4943 if (name_ != NULL) return name_; | |
4944 const int kMaxNameLength = 100; | |
4945 name_ = Isolate::Current()->bootstrapper()->AllocateAutoDeletedArray( | |
4946 kMaxNameLength); | |
4947 if (name_ == NULL) return "OOM"; | |
4948 | |
4949 const char* cc_name; | 4926 const char* cc_name; |
4950 switch (cc_) { | 4927 switch (cc_) { |
4951 case lt: cc_name = "LT"; break; | 4928 case lt: cc_name = "LT"; break; |
4952 case gt: cc_name = "GT"; break; | 4929 case gt: cc_name = "GT"; break; |
4953 case le: cc_name = "LE"; break; | 4930 case le: cc_name = "LE"; break; |
4954 case ge: cc_name = "GE"; break; | 4931 case ge: cc_name = "GE"; break; |
4955 case eq: cc_name = "EQ"; break; | 4932 case eq: cc_name = "EQ"; break; |
4956 case ne: cc_name = "NE"; break; | 4933 case ne: cc_name = "NE"; break; |
4957 default: cc_name = "UnknownCondition"; break; | 4934 default: cc_name = "UnknownCondition"; break; |
4958 } | 4935 } |
4959 | 4936 bool is_equality = cc_ == eq || cc_ == ne; |
4960 const char* lhs_name = lhs_.is(a0) ? "_a0" : "_a1"; | 4937 stream->Add("CompareStub_%s", cc_name); |
4961 const char* rhs_name = rhs_.is(a0) ? "_a0" : "_a1"; | 4938 stream->Add(lhs_.is(a0) ? "_a0" : "_a1"); |
4962 | 4939 stream->Add(rhs_.is(a0) ? "_a0" : "_a1"); |
4963 const char* strict_name = ""; | 4940 if (strict_ && is_equality) stream->Add("_STRICT"); |
4964 if (strict_ && (cc_ == eq || cc_ == ne)) { | 4941 if (never_nan_nan_ && is_equality) stream->Add("_NO_NAN"); |
4965 strict_name = "_STRICT"; | 4942 if (!include_number_compare_) stream->Add("_NO_NUMBER"); |
4966 } | 4943 if (!include_smi_compare_) stream->Add("_NO_SMI"); |
4967 | |
4968 const char* never_nan_nan_name = ""; | |
4969 if (never_nan_nan_ && (cc_ == eq || cc_ == ne)) { | |
4970 never_nan_nan_name = "_NO_NAN"; | |
4971 } | |
4972 | |
4973 const char* include_number_compare_name = ""; | |
4974 if (!include_number_compare_) { | |
4975 include_number_compare_name = "_NO_NUMBER"; | |
4976 } | |
4977 | |
4978 const char* include_smi_compare_name = ""; | |
4979 if (!include_smi_compare_) { | |
4980 include_smi_compare_name = "_NO_SMI"; | |
4981 } | |
4982 | |
4983 OS::SNPrintF(Vector<char>(name_, kMaxNameLength), | |
4984 "CompareStub_%s%s%s%s%s%s", | |
4985 cc_name, | |
4986 lhs_name, | |
4987 rhs_name, | |
4988 strict_name, | |
4989 never_nan_nan_name, | |
4990 include_number_compare_name, | |
4991 include_smi_compare_name); | |
4992 return name_; | |
4993 } | 4944 } |
4994 | 4945 |
4995 | 4946 |
4996 int CompareStub::MinorKey() { | 4947 int CompareStub::MinorKey() { |
4997 // Encode the two parameters in a unique 16 bit value. | 4948 // Encode the two parameters in a unique 16 bit value. |
4998 ASSERT(static_cast<unsigned>(cc_) < (1 << 14)); | 4949 ASSERT(static_cast<unsigned>(cc_) < (1 << 14)); |
4999 ASSERT((lhs_.is(a0) && rhs_.is(a1)) || | 4950 ASSERT((lhs_.is(a0) && rhs_.is(a1)) || |
5000 (lhs_.is(a1) && rhs_.is(a0))); | 4951 (lhs_.is(a1) && rhs_.is(a0))); |
5001 return ConditionField::encode(static_cast<unsigned>(cc_)) | 4952 return ConditionField::encode(static_cast<unsigned>(cc_)) |
5002 | RegisterField::encode(lhs_.is(a0)) | 4953 | RegisterField::encode(lhs_.is(a0)) |
(...skipping 1866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6869 __ mov(result, zero_reg); | 6820 __ mov(result, zero_reg); |
6870 __ Ret(); | 6821 __ Ret(); |
6871 } | 6822 } |
6872 | 6823 |
6873 | 6824 |
6874 #undef __ | 6825 #undef __ |
6875 | 6826 |
6876 } } // namespace v8::internal | 6827 } } // namespace v8::internal |
6877 | 6828 |
6878 #endif // V8_TARGET_ARCH_MIPS | 6829 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |