OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 } | 70 } |
71 | 71 |
72 | 72 |
73 void NumberToStringStub::InitializeInterfaceDescriptor( | 73 void NumberToStringStub::InitializeInterfaceDescriptor( |
74 Isolate* isolate, | 74 Isolate* isolate, |
75 CodeStubInterfaceDescriptor* descriptor) { | 75 CodeStubInterfaceDescriptor* descriptor) { |
76 static Register registers[] = { a0 }; | 76 static Register registers[] = { a0 }; |
77 descriptor->register_param_count_ = 1; | 77 descriptor->register_param_count_ = 1; |
78 descriptor->register_params_ = registers; | 78 descriptor->register_params_ = registers; |
79 descriptor->deoptimization_handler_ = | 79 descriptor->deoptimization_handler_ = |
80 Runtime::FunctionForId(Runtime::kNumberToString)->entry; | 80 Runtime::FunctionForId(Runtime::kHiddenNumberToString)->entry; |
81 } | 81 } |
82 | 82 |
83 | 83 |
84 void FastCloneShallowArrayStub::InitializeInterfaceDescriptor( | 84 void FastCloneShallowArrayStub::InitializeInterfaceDescriptor( |
85 Isolate* isolate, | 85 Isolate* isolate, |
86 CodeStubInterfaceDescriptor* descriptor) { | 86 CodeStubInterfaceDescriptor* descriptor) { |
87 static Register registers[] = { a3, a2, a1 }; | 87 static Register registers[] = { a3, a2, a1 }; |
88 descriptor->register_param_count_ = 3; | 88 descriptor->register_param_count_ = 3; |
89 descriptor->register_params_ = registers; | 89 descriptor->register_params_ = registers; |
90 descriptor->deoptimization_handler_ = | 90 descriptor->deoptimization_handler_ = |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 } | 135 } |
136 | 136 |
137 | 137 |
138 void RegExpConstructResultStub::InitializeInterfaceDescriptor( | 138 void RegExpConstructResultStub::InitializeInterfaceDescriptor( |
139 Isolate* isolate, | 139 Isolate* isolate, |
140 CodeStubInterfaceDescriptor* descriptor) { | 140 CodeStubInterfaceDescriptor* descriptor) { |
141 static Register registers[] = { a2, a1, a0 }; | 141 static Register registers[] = { a2, a1, a0 }; |
142 descriptor->register_param_count_ = 3; | 142 descriptor->register_param_count_ = 3; |
143 descriptor->register_params_ = registers; | 143 descriptor->register_params_ = registers; |
144 descriptor->deoptimization_handler_ = | 144 descriptor->deoptimization_handler_ = |
145 Runtime::FunctionForId(Runtime::kRegExpConstructResult)->entry; | 145 Runtime::FunctionForId(Runtime::kHiddenRegExpConstructResult)->entry; |
146 } | 146 } |
147 | 147 |
148 | 148 |
149 void LoadFieldStub::InitializeInterfaceDescriptor( | 149 void LoadFieldStub::InitializeInterfaceDescriptor( |
150 Isolate* isolate, | 150 Isolate* isolate, |
151 CodeStubInterfaceDescriptor* descriptor) { | 151 CodeStubInterfaceDescriptor* descriptor) { |
152 static Register registers[] = { a0 }; | 152 static Register registers[] = { a0 }; |
153 descriptor->register_param_count_ = 1; | 153 descriptor->register_param_count_ = 1; |
154 descriptor->register_params_ = registers; | 154 descriptor->register_params_ = registers; |
155 descriptor->deoptimization_handler_ = NULL; | 155 descriptor->deoptimization_handler_ = NULL; |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 } | 379 } |
380 | 380 |
381 | 381 |
382 void StringAddStub::InitializeInterfaceDescriptor( | 382 void StringAddStub::InitializeInterfaceDescriptor( |
383 Isolate* isolate, | 383 Isolate* isolate, |
384 CodeStubInterfaceDescriptor* descriptor) { | 384 CodeStubInterfaceDescriptor* descriptor) { |
385 static Register registers[] = { a1, a0 }; | 385 static Register registers[] = { a1, a0 }; |
386 descriptor->register_param_count_ = 2; | 386 descriptor->register_param_count_ = 2; |
387 descriptor->register_params_ = registers; | 387 descriptor->register_params_ = registers; |
388 descriptor->deoptimization_handler_ = | 388 descriptor->deoptimization_handler_ = |
389 Runtime::FunctionForId(Runtime::kStringAdd)->entry; | 389 Runtime::FunctionForId(Runtime::kHiddenStringAdd)->entry; |
390 } | 390 } |
391 | 391 |
392 | 392 |
393 void CallDescriptors::InitializeForIsolate(Isolate* isolate) { | 393 void CallDescriptors::InitializeForIsolate(Isolate* isolate) { |
394 { | 394 { |
395 CallInterfaceDescriptor* descriptor = | 395 CallInterfaceDescriptor* descriptor = |
396 isolate->call_descriptor(Isolate::ArgumentAdaptorCall); | 396 isolate->call_descriptor(Isolate::ArgumentAdaptorCall); |
397 static Register registers[] = { a1, // JSFunction | 397 static Register registers[] = { a1, // JSFunction |
398 cp, // context | 398 cp, // context |
399 a0, // actual number of arguments | 399 a0, // actual number of arguments |
(...skipping 2182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2582 __ bind(&runtime); | 2582 __ bind(&runtime); |
2583 __ TailCallRuntime(Runtime::kNewStrictArgumentsFast, 3, 1); | 2583 __ TailCallRuntime(Runtime::kNewStrictArgumentsFast, 3, 1); |
2584 } | 2584 } |
2585 | 2585 |
2586 | 2586 |
2587 void RegExpExecStub::Generate(MacroAssembler* masm) { | 2587 void RegExpExecStub::Generate(MacroAssembler* masm) { |
2588 // Just jump directly to runtime if native RegExp is not selected at compile | 2588 // Just jump directly to runtime if native RegExp is not selected at compile |
2589 // time or if regexp entry in generated code is turned off runtime switch or | 2589 // time or if regexp entry in generated code is turned off runtime switch or |
2590 // at compilation. | 2590 // at compilation. |
2591 #ifdef V8_INTERPRETED_REGEXP | 2591 #ifdef V8_INTERPRETED_REGEXP |
2592 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); | 2592 __ TailCallRuntime(Runtime::kHiddenRegExpExec, 4, 1); |
2593 #else // V8_INTERPRETED_REGEXP | 2593 #else // V8_INTERPRETED_REGEXP |
2594 | 2594 |
2595 // Stack frame on entry. | 2595 // Stack frame on entry. |
2596 // sp[0]: last_match_info (expected JSArray) | 2596 // sp[0]: last_match_info (expected JSArray) |
2597 // sp[4]: previous index | 2597 // sp[4]: previous index |
2598 // sp[8]: subject string | 2598 // sp[8]: subject string |
2599 // sp[12]: JSRegExp object | 2599 // sp[12]: JSRegExp object |
2600 | 2600 |
2601 const int kLastMatchInfoOffset = 0 * kPointerSize; | 2601 const int kLastMatchInfoOffset = 0 * kPointerSize; |
2602 const int kPreviousIndexOffset = 1 * kPointerSize; | 2602 const int kPreviousIndexOffset = 1 * kPointerSize; |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2974 __ addiu(a0, a0, kPointerSize); // In branch delay slot. | 2974 __ addiu(a0, a0, kPointerSize); // In branch delay slot. |
2975 | 2975 |
2976 __ bind(&done); | 2976 __ bind(&done); |
2977 | 2977 |
2978 // Return last match info. | 2978 // Return last match info. |
2979 __ lw(v0, MemOperand(sp, kLastMatchInfoOffset)); | 2979 __ lw(v0, MemOperand(sp, kLastMatchInfoOffset)); |
2980 __ DropAndRet(4); | 2980 __ DropAndRet(4); |
2981 | 2981 |
2982 // Do the runtime call to execute the regexp. | 2982 // Do the runtime call to execute the regexp. |
2983 __ bind(&runtime); | 2983 __ bind(&runtime); |
2984 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); | 2984 __ TailCallRuntime(Runtime::kHiddenRegExpExec, 4, 1); |
2985 | 2985 |
2986 // Deferred code for string handling. | 2986 // Deferred code for string handling. |
2987 // (6) Not a long external string? If yes, go to (8). | 2987 // (6) Not a long external string? If yes, go to (8). |
2988 __ bind(¬_seq_nor_cons); | 2988 __ bind(¬_seq_nor_cons); |
2989 // Go to (8). | 2989 // Go to (8). |
2990 __ Branch(¬_long_external, gt, a1, Operand(kExternalStringTag)); | 2990 __ Branch(¬_long_external, gt, a1, Operand(kExternalStringTag)); |
2991 | 2991 |
2992 // (7) External string. Make it, offset-wise, look like a sequential string. | 2992 // (7) External string. Make it, offset-wise, look like a sequential string. |
2993 __ bind(&external_string); | 2993 __ bind(&external_string); |
2994 __ lw(a0, FieldMemOperand(subject, HeapObject::kMapOffset)); | 2994 __ lw(a0, FieldMemOperand(subject, HeapObject::kMapOffset)); |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3381 // Otherwise, return to the fast path. | 3381 // Otherwise, return to the fast path. |
3382 __ Branch(&got_smi_index_); | 3382 __ Branch(&got_smi_index_); |
3383 | 3383 |
3384 // Call runtime. We get here when the receiver is a string and the | 3384 // Call runtime. We get here when the receiver is a string and the |
3385 // index is a number, but the code of getting the actual character | 3385 // index is a number, but the code of getting the actual character |
3386 // is too complex (e.g., when the string needs to be flattened). | 3386 // is too complex (e.g., when the string needs to be flattened). |
3387 __ bind(&call_runtime_); | 3387 __ bind(&call_runtime_); |
3388 call_helper.BeforeCall(masm); | 3388 call_helper.BeforeCall(masm); |
3389 __ sll(index_, index_, kSmiTagSize); | 3389 __ sll(index_, index_, kSmiTagSize); |
3390 __ Push(object_, index_); | 3390 __ Push(object_, index_); |
3391 __ CallRuntime(Runtime::kStringCharCodeAt, 2); | 3391 __ CallRuntime(Runtime::kHiddenStringCharCodeAt, 2); |
3392 | 3392 |
3393 __ Move(result_, v0); | 3393 __ Move(result_, v0); |
3394 | 3394 |
3395 call_helper.AfterCall(masm); | 3395 call_helper.AfterCall(masm); |
3396 __ jmp(&exit_); | 3396 __ jmp(&exit_); |
3397 | 3397 |
3398 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase); | 3398 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase); |
3399 } | 3399 } |
3400 | 3400 |
3401 | 3401 |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3816 StringHelper::GenerateCopyCharactersLong( | 3816 StringHelper::GenerateCopyCharactersLong( |
3817 masm, a1, t1, a2, a3, t0, t2, t3, t4, DEST_ALWAYS_ALIGNED); | 3817 masm, a1, t1, a2, a3, t0, t2, t3, t4, DEST_ALWAYS_ALIGNED); |
3818 | 3818 |
3819 __ bind(&return_v0); | 3819 __ bind(&return_v0); |
3820 Counters* counters = masm->isolate()->counters(); | 3820 Counters* counters = masm->isolate()->counters(); |
3821 __ IncrementCounter(counters->sub_string_native(), 1, a3, t0); | 3821 __ IncrementCounter(counters->sub_string_native(), 1, a3, t0); |
3822 __ DropAndRet(3); | 3822 __ DropAndRet(3); |
3823 | 3823 |
3824 // Just jump to runtime to create the sub string. | 3824 // Just jump to runtime to create the sub string. |
3825 __ bind(&runtime); | 3825 __ bind(&runtime); |
3826 __ TailCallRuntime(Runtime::kSubString, 3, 1); | 3826 __ TailCallRuntime(Runtime::kHiddenSubString, 3, 1); |
3827 | 3827 |
3828 __ bind(&single_char); | 3828 __ bind(&single_char); |
3829 // v0: original string | 3829 // v0: original string |
3830 // a1: instance type | 3830 // a1: instance type |
3831 // a2: length | 3831 // a2: length |
3832 // a3: from index (untagged) | 3832 // a3: from index (untagged) |
3833 __ SmiTag(a3, a3); | 3833 __ SmiTag(a3, a3); |
3834 StringCharAtGenerator generator( | 3834 StringCharAtGenerator generator( |
3835 v0, a3, a2, v0, &runtime, &runtime, &runtime, STRING_INDEX_IS_NUMBER); | 3835 v0, a3, a2, v0, &runtime, &runtime, &runtime, STRING_INDEX_IS_NUMBER); |
3836 generator.GenerateFast(masm); | 3836 generator.GenerateFast(masm); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3981 | 3981 |
3982 // Check that both objects are sequential ASCII strings. | 3982 // Check that both objects are sequential ASCII strings. |
3983 __ JumpIfNotBothSequentialAsciiStrings(a1, a0, a2, a3, &runtime); | 3983 __ JumpIfNotBothSequentialAsciiStrings(a1, a0, a2, a3, &runtime); |
3984 | 3984 |
3985 // Compare flat ASCII strings natively. Remove arguments from stack first. | 3985 // Compare flat ASCII strings natively. Remove arguments from stack first. |
3986 __ IncrementCounter(counters->string_compare_native(), 1, a2, a3); | 3986 __ IncrementCounter(counters->string_compare_native(), 1, a2, a3); |
3987 __ Addu(sp, sp, Operand(2 * kPointerSize)); | 3987 __ Addu(sp, sp, Operand(2 * kPointerSize)); |
3988 GenerateCompareFlatAsciiStrings(masm, a1, a0, a2, a3, t0, t1); | 3988 GenerateCompareFlatAsciiStrings(masm, a1, a0, a2, a3, t0, t1); |
3989 | 3989 |
3990 __ bind(&runtime); | 3990 __ bind(&runtime); |
3991 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 3991 __ TailCallRuntime(Runtime::kHiddenStringCompare, 2, 1); |
3992 } | 3992 } |
3993 | 3993 |
3994 | 3994 |
3995 void ArrayPushStub::Generate(MacroAssembler* masm) { | 3995 void ArrayPushStub::Generate(MacroAssembler* masm) { |
3996 Register receiver = a0; | 3996 Register receiver = a0; |
3997 Register scratch = a1; | 3997 Register scratch = a1; |
3998 | 3998 |
3999 int argc = arguments_count(); | 3999 int argc = arguments_count(); |
4000 | 4000 |
4001 if (argc == 0) { | 4001 if (argc == 0) { |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4492 StringCompareStub::GenerateCompareFlatAsciiStrings( | 4492 StringCompareStub::GenerateCompareFlatAsciiStrings( |
4493 masm, left, right, tmp1, tmp2, tmp3, tmp4); | 4493 masm, left, right, tmp1, tmp2, tmp3, tmp4); |
4494 } | 4494 } |
4495 | 4495 |
4496 // Handle more complex cases in runtime. | 4496 // Handle more complex cases in runtime. |
4497 __ bind(&runtime); | 4497 __ bind(&runtime); |
4498 __ Push(left, right); | 4498 __ Push(left, right); |
4499 if (equality) { | 4499 if (equality) { |
4500 __ TailCallRuntime(Runtime::kStringEquals, 2, 1); | 4500 __ TailCallRuntime(Runtime::kStringEquals, 2, 1); |
4501 } else { | 4501 } else { |
4502 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 4502 __ TailCallRuntime(Runtime::kHiddenStringCompare, 2, 1); |
4503 } | 4503 } |
4504 | 4504 |
4505 __ bind(&miss); | 4505 __ bind(&miss); |
4506 GenerateMiss(masm); | 4506 GenerateMiss(masm); |
4507 } | 4507 } |
4508 | 4508 |
4509 | 4509 |
4510 void ICCompareStub::GenerateObjects(MacroAssembler* masm) { | 4510 void ICCompareStub::GenerateObjects(MacroAssembler* masm) { |
4511 ASSERT(state_ == CompareIC::OBJECT); | 4511 ASSERT(state_ == CompareIC::OBJECT); |
4512 Label miss; | 4512 Label miss; |
(...skipping 1124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5637 MemOperand(fp, 6 * kPointerSize), | 5637 MemOperand(fp, 6 * kPointerSize), |
5638 NULL); | 5638 NULL); |
5639 } | 5639 } |
5640 | 5640 |
5641 | 5641 |
5642 #undef __ | 5642 #undef __ |
5643 | 5643 |
5644 } } // namespace v8::internal | 5644 } } // namespace v8::internal |
5645 | 5645 |
5646 #endif // V8_TARGET_ARCH_MIPS | 5646 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |