| 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 | 5 |
| 6 #include "src/v8.h" | 6 #include "src/v8.h" |
| 7 | 7 |
| 8 #if V8_TARGET_ARCH_MIPS64 | 8 #if V8_TARGET_ARCH_MIPS64 |
| 9 | 9 |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| 11 #include "src/ic/ic.h" | 11 #include "src/ic/ic.h" |
| 12 #include "src/ic/ic-compiler.h" |
| 12 #include "src/ic/stub-cache.h" | 13 #include "src/ic/stub-cache.h" |
| 13 | 14 |
| 14 namespace v8 { | 15 namespace v8 { |
| 15 namespace internal { | 16 namespace internal { |
| 16 | 17 |
| 17 | 18 |
| 18 // ---------------------------------------------------------------------------- | 19 // ---------------------------------------------------------------------------- |
| 19 // Static IC stub generators. | 20 // Static IC stub generators. |
| 20 // | 21 // |
| 21 | 22 |
| (...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 __ Ret(); | 686 __ Ret(); |
| 686 | 687 |
| 687 StubRuntimeCallHelper call_helper; | 688 StubRuntimeCallHelper call_helper; |
| 688 char_at_generator.GenerateSlow(masm, call_helper); | 689 char_at_generator.GenerateSlow(masm, call_helper); |
| 689 | 690 |
| 690 __ bind(&miss); | 691 __ bind(&miss); |
| 691 GenerateMiss(masm); | 692 GenerateMiss(masm); |
| 692 } | 693 } |
| 693 | 694 |
| 694 | 695 |
| 695 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, | |
| 696 StrictMode strict_mode) { | |
| 697 // Push receiver, key and value for runtime call. | |
| 698 __ Push(ReceiverRegister(), NameRegister(), ValueRegister()); | |
| 699 | |
| 700 __ li(a0, Operand(Smi::FromInt(strict_mode))); // Strict mode. | |
| 701 __ Push(a0); | |
| 702 | |
| 703 __ TailCallRuntime(Runtime::kSetProperty, 4, 1); | |
| 704 } | |
| 705 | |
| 706 | |
| 707 static void KeyedStoreGenerateGenericHelper( | 696 static void KeyedStoreGenerateGenericHelper( |
| 708 MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow, | 697 MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow, |
| 709 KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length, | 698 KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length, |
| 710 Register value, Register key, Register receiver, Register receiver_map, | 699 Register value, Register key, Register receiver, Register receiver_map, |
| 711 Register elements_map, Register elements) { | 700 Register elements_map, Register elements) { |
| 712 Label transition_smi_elements; | 701 Label transition_smi_elements; |
| 713 Label finish_object_store, non_double_value, transition_double_elements; | 702 Label finish_object_store, non_double_value, transition_double_elements; |
| 714 Label fast_double_without_map_check; | 703 Label fast_double_without_map_check; |
| 715 | 704 |
| 716 // Fast case: Do the store, could be either Object or double. | 705 // Fast case: Do the store, could be either Object or double. |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 // Check array bounds. Both the key and the length of FixedArray are smis. | 888 // Check array bounds. Both the key and the length of FixedArray are smis. |
| 900 __ ld(a4, FieldMemOperand(elements, FixedArray::kLengthOffset)); | 889 __ ld(a4, FieldMemOperand(elements, FixedArray::kLengthOffset)); |
| 901 __ Branch(&fast_object, lo, key, Operand(a4)); | 890 __ Branch(&fast_object, lo, key, Operand(a4)); |
| 902 | 891 |
| 903 // Slow case, handle jump to runtime. | 892 // Slow case, handle jump to runtime. |
| 904 __ bind(&slow); | 893 __ bind(&slow); |
| 905 // Entry registers are intact. | 894 // Entry registers are intact. |
| 906 // a0: value. | 895 // a0: value. |
| 907 // a1: key. | 896 // a1: key. |
| 908 // a2: receiver. | 897 // a2: receiver. |
| 909 GenerateRuntimeSetProperty(masm, strict_mode); | 898 PropertyICCompiler::GenerateRuntimeSetProperty(masm, strict_mode); |
| 910 | 899 |
| 911 // Extra capacity case: Check if there is extra capacity to | 900 // Extra capacity case: Check if there is extra capacity to |
| 912 // perform the store and update the length. Used for adding one | 901 // perform the store and update the length. Used for adding one |
| 913 // element to the array by writing to array[array.length]. | 902 // element to the array by writing to array[array.length]. |
| 914 __ bind(&extra); | 903 __ bind(&extra); |
| 915 // Condition code from comparing key and array length is still available. | 904 // Condition code from comparing key and array length is still available. |
| 916 // Only support writing to array[array.length]. | 905 // Only support writing to array[array.length]. |
| 917 __ Branch(&slow, ne, key, Operand(a4)); | 906 __ Branch(&slow, ne, key, Operand(a4)); |
| 918 // Check for room in the elements backing store. | 907 // Check for room in the elements backing store. |
| 919 // Both the key and the length of FixedArray are smis. | 908 // Both the key and the length of FixedArray are smis. |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1065 Counters* counters = masm->isolate()->counters(); | 1054 Counters* counters = masm->isolate()->counters(); |
| 1066 __ IncrementCounter(counters->store_normal_hit(), 1, a4, a5); | 1055 __ IncrementCounter(counters->store_normal_hit(), 1, a4, a5); |
| 1067 __ Ret(); | 1056 __ Ret(); |
| 1068 | 1057 |
| 1069 __ bind(&miss); | 1058 __ bind(&miss); |
| 1070 __ IncrementCounter(counters->store_normal_miss(), 1, a4, a5); | 1059 __ IncrementCounter(counters->store_normal_miss(), 1, a4, a5); |
| 1071 GenerateMiss(masm); | 1060 GenerateMiss(masm); |
| 1072 } | 1061 } |
| 1073 | 1062 |
| 1074 | 1063 |
| 1075 void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, | |
| 1076 StrictMode strict_mode) { | |
| 1077 __ Push(ReceiverRegister(), NameRegister(), ValueRegister()); | |
| 1078 | |
| 1079 __ li(a0, Operand(Smi::FromInt(strict_mode))); | |
| 1080 __ Push(a0); | |
| 1081 | |
| 1082 // Do tail-call to runtime routine. | |
| 1083 __ TailCallRuntime(Runtime::kSetProperty, 4, 1); | |
| 1084 } | |
| 1085 | |
| 1086 | |
| 1087 #undef __ | 1064 #undef __ |
| 1088 | 1065 |
| 1089 | 1066 |
| 1090 Condition CompareIC::ComputeCondition(Token::Value op) { | 1067 Condition CompareIC::ComputeCondition(Token::Value op) { |
| 1091 switch (op) { | 1068 switch (op) { |
| 1092 case Token::EQ_STRICT: | 1069 case Token::EQ_STRICT: |
| 1093 case Token::EQ: | 1070 case Token::EQ: |
| 1094 return eq; | 1071 return eq; |
| 1095 case Token::LT: | 1072 case Token::LT: |
| 1096 return lt; | 1073 return lt; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1176 patcher.ChangeBranchCondition(ne); | 1153 patcher.ChangeBranchCondition(ne); |
| 1177 } else { | 1154 } else { |
| 1178 DCHECK(Assembler::IsBne(branch_instr)); | 1155 DCHECK(Assembler::IsBne(branch_instr)); |
| 1179 patcher.ChangeBranchCondition(eq); | 1156 patcher.ChangeBranchCondition(eq); |
| 1180 } | 1157 } |
| 1181 } | 1158 } |
| 1182 } | 1159 } |
| 1183 } // namespace v8::internal | 1160 } // namespace v8::internal |
| 1184 | 1161 |
| 1185 #endif // V8_TARGET_ARCH_MIPS64 | 1162 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |