OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
8 | 8 |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
11 #include "src/regexp-macro-assembler.h" | 11 #include "src/regexp-macro-assembler.h" |
12 #include "src/stub-cache.h" | 12 #include "src/stub-cache.h" |
13 | 13 |
14 namespace v8 { | 14 namespace v8 { |
15 namespace internal { | 15 namespace internal { |
16 | 16 |
17 | 17 |
18 void FastNewClosureStub::InitializeInterfaceDescriptor( | 18 void FastNewClosureStub::InitializeInterfaceDescriptor( |
19 CodeStubInterfaceDescriptor* descriptor) { | 19 CodeStubInterfaceDescriptor* descriptor) { |
20 // x2: function info | 20 // x2: function info |
21 static Register registers[] = { x2 }; | 21 static Register registers[] = { x2 }; |
22 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); | 22 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); |
23 descriptor->register_params_ = registers; | 23 descriptor->register_params_ = registers; |
24 descriptor->deoptimization_handler_ = | 24 descriptor->deoptimization_handler_ = |
25 Runtime::FunctionForId(Runtime::kHiddenNewClosureFromStubFailure)->entry; | 25 Runtime::FunctionForId(Runtime::kNewClosureFromStubFailure)->entry; |
26 } | 26 } |
27 | 27 |
28 | 28 |
29 void FastNewContextStub::InitializeInterfaceDescriptor( | 29 void FastNewContextStub::InitializeInterfaceDescriptor( |
30 CodeStubInterfaceDescriptor* descriptor) { | 30 CodeStubInterfaceDescriptor* descriptor) { |
31 // x1: function | 31 // x1: function |
32 static Register registers[] = { x1 }; | 32 static Register registers[] = { x1 }; |
33 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); | 33 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); |
34 descriptor->register_params_ = registers; | 34 descriptor->register_params_ = registers; |
35 descriptor->deoptimization_handler_ = NULL; | 35 descriptor->deoptimization_handler_ = NULL; |
(...skipping 10 matching lines...) Expand all Loading... |
46 } | 46 } |
47 | 47 |
48 | 48 |
49 void NumberToStringStub::InitializeInterfaceDescriptor( | 49 void NumberToStringStub::InitializeInterfaceDescriptor( |
50 CodeStubInterfaceDescriptor* descriptor) { | 50 CodeStubInterfaceDescriptor* descriptor) { |
51 // x0: value | 51 // x0: value |
52 static Register registers[] = { x0 }; | 52 static Register registers[] = { x0 }; |
53 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); | 53 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); |
54 descriptor->register_params_ = registers; | 54 descriptor->register_params_ = registers; |
55 descriptor->deoptimization_handler_ = | 55 descriptor->deoptimization_handler_ = |
56 Runtime::FunctionForId(Runtime::kHiddenNumberToString)->entry; | 56 Runtime::FunctionForId(Runtime::kNumberToStringRT)->entry; |
57 } | 57 } |
58 | 58 |
59 | 59 |
60 void FastCloneShallowArrayStub::InitializeInterfaceDescriptor( | 60 void FastCloneShallowArrayStub::InitializeInterfaceDescriptor( |
61 CodeStubInterfaceDescriptor* descriptor) { | 61 CodeStubInterfaceDescriptor* descriptor) { |
62 // x3: array literals array | 62 // x3: array literals array |
63 // x2: array literal index | 63 // x2: array literal index |
64 // x1: constant elements | 64 // x1: constant elements |
65 static Register registers[] = { x3, x2, x1 }; | 65 static Register registers[] = { x3, x2, x1 }; |
66 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); | 66 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); |
67 descriptor->register_params_ = registers; | 67 descriptor->register_params_ = registers; |
68 static Representation representations[] = { | 68 static Representation representations[] = { |
69 Representation::Tagged(), | 69 Representation::Tagged(), |
70 Representation::Smi(), | 70 Representation::Smi(), |
71 Representation::Tagged() }; | 71 Representation::Tagged() }; |
72 descriptor->register_param_representations_ = representations; | 72 descriptor->register_param_representations_ = representations; |
73 descriptor->deoptimization_handler_ = | 73 descriptor->deoptimization_handler_ = |
74 Runtime::FunctionForId( | 74 Runtime::FunctionForId(Runtime::kCreateArrayLiteralStubBailout)->entry; |
75 Runtime::kHiddenCreateArrayLiteralStubBailout)->entry; | |
76 } | 75 } |
77 | 76 |
78 | 77 |
79 void FastCloneShallowObjectStub::InitializeInterfaceDescriptor( | 78 void FastCloneShallowObjectStub::InitializeInterfaceDescriptor( |
80 CodeStubInterfaceDescriptor* descriptor) { | 79 CodeStubInterfaceDescriptor* descriptor) { |
81 // x3: object literals array | 80 // x3: object literals array |
82 // x2: object literal index | 81 // x2: object literal index |
83 // x1: constant properties | 82 // x1: constant properties |
84 // x0: object literal flags | 83 // x0: object literal flags |
85 static Register registers[] = { x3, x2, x1, x0 }; | 84 static Register registers[] = { x3, x2, x1, x0 }; |
86 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); | 85 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); |
87 descriptor->register_params_ = registers; | 86 descriptor->register_params_ = registers; |
88 descriptor->deoptimization_handler_ = | 87 descriptor->deoptimization_handler_ = |
89 Runtime::FunctionForId(Runtime::kHiddenCreateObjectLiteral)->entry; | 88 Runtime::FunctionForId(Runtime::kCreateObjectLiteral)->entry; |
90 } | 89 } |
91 | 90 |
92 | 91 |
93 void CreateAllocationSiteStub::InitializeInterfaceDescriptor( | 92 void CreateAllocationSiteStub::InitializeInterfaceDescriptor( |
94 CodeStubInterfaceDescriptor* descriptor) { | 93 CodeStubInterfaceDescriptor* descriptor) { |
95 // x2: feedback vector | 94 // x2: feedback vector |
96 // x3: call feedback slot | 95 // x3: call feedback slot |
97 static Register registers[] = { x2, x3 }; | 96 static Register registers[] = { x2, x3 }; |
98 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); | 97 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); |
99 descriptor->register_params_ = registers; | 98 descriptor->register_params_ = registers; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 | 136 |
138 void RegExpConstructResultStub::InitializeInterfaceDescriptor( | 137 void RegExpConstructResultStub::InitializeInterfaceDescriptor( |
139 CodeStubInterfaceDescriptor* descriptor) { | 138 CodeStubInterfaceDescriptor* descriptor) { |
140 // x2: length | 139 // x2: length |
141 // x1: index (of last match) | 140 // x1: index (of last match) |
142 // x0: string | 141 // x0: string |
143 static Register registers[] = { x2, x1, x0 }; | 142 static Register registers[] = { x2, x1, x0 }; |
144 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); | 143 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); |
145 descriptor->register_params_ = registers; | 144 descriptor->register_params_ = registers; |
146 descriptor->deoptimization_handler_ = | 145 descriptor->deoptimization_handler_ = |
147 Runtime::FunctionForId(Runtime::kHiddenRegExpConstructResult)->entry; | 146 Runtime::FunctionForId(Runtime::kRegExpConstructResult)->entry; |
148 } | 147 } |
149 | 148 |
150 | 149 |
151 void LoadFieldStub::InitializeInterfaceDescriptor( | 150 void LoadFieldStub::InitializeInterfaceDescriptor( |
152 CodeStubInterfaceDescriptor* descriptor) { | 151 CodeStubInterfaceDescriptor* descriptor) { |
153 // x0: receiver | 152 // x0: receiver |
154 static Register registers[] = { x0 }; | 153 static Register registers[] = { x0 }; |
155 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); | 154 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); |
156 descriptor->register_params_ = registers; | 155 descriptor->register_params_ = registers; |
157 descriptor->deoptimization_handler_ = NULL; | 156 descriptor->deoptimization_handler_ = NULL; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 static Representation representations[] = { | 247 static Representation representations[] = { |
249 Representation::Tagged(), | 248 Representation::Tagged(), |
250 Representation::Tagged(), | 249 Representation::Tagged(), |
251 Representation::Integer32() }; | 250 Representation::Integer32() }; |
252 descriptor->register_param_representations_ = representations; | 251 descriptor->register_param_representations_ = representations; |
253 } | 252 } |
254 | 253 |
255 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; | 254 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; |
256 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; | 255 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; |
257 descriptor->deoptimization_handler_ = | 256 descriptor->deoptimization_handler_ = |
258 Runtime::FunctionForId(Runtime::kHiddenArrayConstructor)->entry; | 257 Runtime::FunctionForId(Runtime::kArrayConstructor)->entry; |
259 } | 258 } |
260 | 259 |
261 | 260 |
262 void ArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( | 261 void ArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( |
263 CodeStubInterfaceDescriptor* descriptor) { | 262 CodeStubInterfaceDescriptor* descriptor) { |
264 InitializeArrayConstructorDescriptor(descriptor, 0); | 263 InitializeArrayConstructorDescriptor(descriptor, 0); |
265 } | 264 } |
266 | 265 |
267 | 266 |
268 void ArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( | 267 void ArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( |
(...skipping 29 matching lines...) Expand all Loading... |
298 descriptor->register_params_ = registers_variable_args; | 297 descriptor->register_params_ = registers_variable_args; |
299 static Representation representations[] = { | 298 static Representation representations[] = { |
300 Representation::Tagged(), | 299 Representation::Tagged(), |
301 Representation::Integer32() }; | 300 Representation::Integer32() }; |
302 descriptor->register_param_representations_ = representations; | 301 descriptor->register_param_representations_ = representations; |
303 } | 302 } |
304 | 303 |
305 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; | 304 descriptor->hint_stack_parameter_count_ = constant_stack_parameter_count; |
306 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; | 305 descriptor->function_mode_ = JS_FUNCTION_STUB_MODE; |
307 descriptor->deoptimization_handler_ = | 306 descriptor->deoptimization_handler_ = |
308 Runtime::FunctionForId(Runtime::kHiddenInternalArrayConstructor)->entry; | 307 Runtime::FunctionForId(Runtime::kInternalArrayConstructor)->entry; |
309 } | 308 } |
310 | 309 |
311 | 310 |
312 void InternalArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( | 311 void InternalArrayNoArgumentConstructorStub::InitializeInterfaceDescriptor( |
313 CodeStubInterfaceDescriptor* descriptor) { | 312 CodeStubInterfaceDescriptor* descriptor) { |
314 InitializeInternalArrayConstructorDescriptor(descriptor, 0); | 313 InitializeInternalArrayConstructorDescriptor(descriptor, 0); |
315 } | 314 } |
316 | 315 |
317 | 316 |
318 void InternalArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( | 317 void InternalArraySingleArgumentConstructorStub::InitializeInterfaceDescriptor( |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 | 392 |
394 | 393 |
395 void StringAddStub::InitializeInterfaceDescriptor( | 394 void StringAddStub::InitializeInterfaceDescriptor( |
396 CodeStubInterfaceDescriptor* descriptor) { | 395 CodeStubInterfaceDescriptor* descriptor) { |
397 // x1: left operand | 396 // x1: left operand |
398 // x0: right operand | 397 // x0: right operand |
399 static Register registers[] = { x1, x0 }; | 398 static Register registers[] = { x1, x0 }; |
400 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); | 399 descriptor->register_param_count_ = sizeof(registers) / sizeof(registers[0]); |
401 descriptor->register_params_ = registers; | 400 descriptor->register_params_ = registers; |
402 descriptor->deoptimization_handler_ = | 401 descriptor->deoptimization_handler_ = |
403 Runtime::FunctionForId(Runtime::kHiddenStringAdd)->entry; | 402 Runtime::FunctionForId(Runtime::kStringAdd)->entry; |
404 } | 403 } |
405 | 404 |
406 | 405 |
407 void CallDescriptors::InitializeForIsolate(Isolate* isolate) { | 406 void CallDescriptors::InitializeForIsolate(Isolate* isolate) { |
408 static PlatformCallInterfaceDescriptor default_descriptor = | 407 static PlatformCallInterfaceDescriptor default_descriptor = |
409 PlatformCallInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS); | 408 PlatformCallInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS); |
410 | 409 |
411 static PlatformCallInterfaceDescriptor noInlineDescriptor = | 410 static PlatformCallInterfaceDescriptor noInlineDescriptor = |
412 PlatformCallInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS); | 411 PlatformCallInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS); |
413 | 412 |
(...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1349 // catch this corner-case, we bail out if the result was 0. (This can only | 1348 // catch this corner-case, we bail out if the result was 0. (This can only |
1350 // occur if the divisor is infinity or the base is zero.) | 1349 // occur if the divisor is infinity or the base is zero.) |
1351 __ Fcmp(result_double, 0.0); | 1350 __ Fcmp(result_double, 0.0); |
1352 __ B(&done, ne); | 1351 __ B(&done, ne); |
1353 | 1352 |
1354 if (exponent_type_ == ON_STACK) { | 1353 if (exponent_type_ == ON_STACK) { |
1355 // Bail out to runtime code. | 1354 // Bail out to runtime code. |
1356 __ Bind(&call_runtime); | 1355 __ Bind(&call_runtime); |
1357 // Put the arguments back on the stack. | 1356 // Put the arguments back on the stack. |
1358 __ Push(base_tagged, exponent_tagged); | 1357 __ Push(base_tagged, exponent_tagged); |
1359 __ TailCallRuntime(Runtime::kHiddenMathPow, 2, 1); | 1358 __ TailCallRuntime(Runtime::kMathPowRT, 2, 1); |
1360 | 1359 |
1361 // Return. | 1360 // Return. |
1362 __ Bind(&done); | 1361 __ Bind(&done); |
1363 __ AllocateHeapNumber(result_tagged, &call_runtime, scratch0, scratch1, | 1362 __ AllocateHeapNumber(result_tagged, &call_runtime, scratch0, scratch1, |
1364 result_double); | 1363 result_double); |
1365 ASSERT(result_tagged.is(x0)); | 1364 ASSERT(result_tagged.is(x0)); |
1366 __ IncrementCounter( | 1365 __ IncrementCounter( |
1367 isolate()->counters()->math_pow(), 1, scratch0, scratch1); | 1366 isolate()->counters()->math_pow(), 1, scratch0, scratch1); |
1368 __ Ret(); | 1367 __ Ret(); |
1369 } else { | 1368 } else { |
(...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2114 | 2113 |
2115 // Patch the arguments.length and parameters pointer in the current frame. | 2114 // Patch the arguments.length and parameters pointer in the current frame. |
2116 __ Ldr(x11, MemOperand(caller_fp, | 2115 __ Ldr(x11, MemOperand(caller_fp, |
2117 ArgumentsAdaptorFrameConstants::kLengthOffset)); | 2116 ArgumentsAdaptorFrameConstants::kLengthOffset)); |
2118 __ Poke(x11, 0 * kXRegSize); | 2117 __ Poke(x11, 0 * kXRegSize); |
2119 __ Add(x10, caller_fp, Operand::UntagSmiAndScale(x11, kPointerSizeLog2)); | 2118 __ Add(x10, caller_fp, Operand::UntagSmiAndScale(x11, kPointerSizeLog2)); |
2120 __ Add(x10, x10, StandardFrameConstants::kCallerSPOffset); | 2119 __ Add(x10, x10, StandardFrameConstants::kCallerSPOffset); |
2121 __ Poke(x10, 1 * kXRegSize); | 2120 __ Poke(x10, 1 * kXRegSize); |
2122 | 2121 |
2123 __ Bind(&runtime); | 2122 __ Bind(&runtime); |
2124 __ TailCallRuntime(Runtime::kHiddenNewSloppyArguments, 3, 1); | 2123 __ TailCallRuntime(Runtime::kNewSloppyArguments, 3, 1); |
2125 } | 2124 } |
2126 | 2125 |
2127 | 2126 |
2128 void ArgumentsAccessStub::GenerateNewSloppyFast(MacroAssembler* masm) { | 2127 void ArgumentsAccessStub::GenerateNewSloppyFast(MacroAssembler* masm) { |
2129 // Stack layout on entry. | 2128 // Stack layout on entry. |
2130 // jssp[0]: number of parameters (tagged) | 2129 // jssp[0]: number of parameters (tagged) |
2131 // jssp[8]: address of receiver argument | 2130 // jssp[8]: address of receiver argument |
2132 // jssp[16]: function | 2131 // jssp[16]: function |
2133 // | 2132 // |
2134 // Returns pointer to result object in x0. | 2133 // Returns pointer to result object in x0. |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2386 | 2385 |
2387 __ Bind(&arguments_test); | 2386 __ Bind(&arguments_test); |
2388 __ Cmp(x10, arg_count); | 2387 __ Cmp(x10, arg_count); |
2389 __ B(lt, &arguments_loop); | 2388 __ B(lt, &arguments_loop); |
2390 | 2389 |
2391 __ Ret(); | 2390 __ Ret(); |
2392 | 2391 |
2393 // Do the runtime call to allocate the arguments object. | 2392 // Do the runtime call to allocate the arguments object. |
2394 __ Bind(&runtime); | 2393 __ Bind(&runtime); |
2395 __ Push(function, recv_arg, arg_count_smi); | 2394 __ Push(function, recv_arg, arg_count_smi); |
2396 __ TailCallRuntime(Runtime::kHiddenNewSloppyArguments, 3, 1); | 2395 __ TailCallRuntime(Runtime::kNewSloppyArguments, 3, 1); |
2397 } | 2396 } |
2398 | 2397 |
2399 | 2398 |
2400 void ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) { | 2399 void ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) { |
2401 // Stack layout on entry. | 2400 // Stack layout on entry. |
2402 // jssp[0]: number of parameters (tagged) | 2401 // jssp[0]: number of parameters (tagged) |
2403 // jssp[8]: address of receiver argument | 2402 // jssp[8]: address of receiver argument |
2404 // jssp[16]: function | 2403 // jssp[16]: function |
2405 // | 2404 // |
2406 // Returns pointer to result object in x0. | 2405 // Returns pointer to result object in x0. |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2519 __ Sub(param_count, param_count, 1); | 2518 __ Sub(param_count, param_count, 1); |
2520 __ Cbnz(param_count, &loop); | 2519 __ Cbnz(param_count, &loop); |
2521 | 2520 |
2522 // Return from stub. | 2521 // Return from stub. |
2523 __ Bind(&done); | 2522 __ Bind(&done); |
2524 __ Ret(); | 2523 __ Ret(); |
2525 | 2524 |
2526 // Do the runtime call to allocate the arguments object. | 2525 // Do the runtime call to allocate the arguments object. |
2527 __ Bind(&runtime); | 2526 __ Bind(&runtime); |
2528 __ Push(function, params, param_count_smi); | 2527 __ Push(function, params, param_count_smi); |
2529 __ TailCallRuntime(Runtime::kHiddenNewStrictArguments, 3, 1); | 2528 __ TailCallRuntime(Runtime::kNewStrictArguments, 3, 1); |
2530 } | 2529 } |
2531 | 2530 |
2532 | 2531 |
2533 void RegExpExecStub::Generate(MacroAssembler* masm) { | 2532 void RegExpExecStub::Generate(MacroAssembler* masm) { |
2534 #ifdef V8_INTERPRETED_REGEXP | 2533 #ifdef V8_INTERPRETED_REGEXP |
2535 __ TailCallRuntime(Runtime::kHiddenRegExpExec, 4, 1); | 2534 __ TailCallRuntime(Runtime::kRegExpExec, 4, 1); |
2536 #else // V8_INTERPRETED_REGEXP | 2535 #else // V8_INTERPRETED_REGEXP |
2537 | 2536 |
2538 // Stack frame on entry. | 2537 // Stack frame on entry. |
2539 // jssp[0]: last_match_info (expected JSArray) | 2538 // jssp[0]: last_match_info (expected JSArray) |
2540 // jssp[8]: previous index | 2539 // jssp[8]: previous index |
2541 // jssp[16]: subject string | 2540 // jssp[16]: subject string |
2542 // jssp[24]: JSRegExp object | 2541 // jssp[24]: JSRegExp object |
2543 Label runtime; | 2542 Label runtime; |
2544 | 2543 |
2545 // Use of registers for this function. | 2544 // Use of registers for this function. |
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2999 | 2998 |
3000 __ Bind(&failure); | 2999 __ Bind(&failure); |
3001 __ Mov(x0, Operand(isolate()->factory()->null_value())); | 3000 __ Mov(x0, Operand(isolate()->factory()->null_value())); |
3002 __ PopCPURegList(used_callee_saved_registers); | 3001 __ PopCPURegList(used_callee_saved_registers); |
3003 // Drop the 4 arguments of the stub from the stack. | 3002 // Drop the 4 arguments of the stub from the stack. |
3004 __ Drop(4); | 3003 __ Drop(4); |
3005 __ Ret(); | 3004 __ Ret(); |
3006 | 3005 |
3007 __ Bind(&runtime); | 3006 __ Bind(&runtime); |
3008 __ PopCPURegList(used_callee_saved_registers); | 3007 __ PopCPURegList(used_callee_saved_registers); |
3009 __ TailCallRuntime(Runtime::kHiddenRegExpExec, 4, 1); | 3008 __ TailCallRuntime(Runtime::kRegExpExecRT, 4, 1); |
3010 | 3009 |
3011 // Deferred code for string handling. | 3010 // Deferred code for string handling. |
3012 // (6) Not a long external string? If yes, go to (8). | 3011 // (6) Not a long external string? If yes, go to (8). |
3013 __ Bind(¬_seq_nor_cons); | 3012 __ Bind(¬_seq_nor_cons); |
3014 // Compare flags are still set. | 3013 // Compare flags are still set. |
3015 __ B(ne, ¬_long_external); // Go to (8). | 3014 __ B(ne, ¬_long_external); // Go to (8). |
3016 | 3015 |
3017 // (7) External string. Make it, offset-wise, look like a sequential string. | 3016 // (7) External string. Make it, offset-wise, look like a sequential string. |
3018 __ Bind(&external_string); | 3017 __ Bind(&external_string); |
3019 if (masm->emit_debug_code()) { | 3018 if (masm->emit_debug_code()) { |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3550 index_not_number_, | 3549 index_not_number_, |
3551 DONT_DO_SMI_CHECK); | 3550 DONT_DO_SMI_CHECK); |
3552 call_helper.BeforeCall(masm); | 3551 call_helper.BeforeCall(masm); |
3553 // Save object_ on the stack and pass index_ as argument for runtime call. | 3552 // Save object_ on the stack and pass index_ as argument for runtime call. |
3554 __ Push(object_, index_); | 3553 __ Push(object_, index_); |
3555 if (index_flags_ == STRING_INDEX_IS_NUMBER) { | 3554 if (index_flags_ == STRING_INDEX_IS_NUMBER) { |
3556 __ CallRuntime(Runtime::kNumberToIntegerMapMinusZero, 1); | 3555 __ CallRuntime(Runtime::kNumberToIntegerMapMinusZero, 1); |
3557 } else { | 3556 } else { |
3558 ASSERT(index_flags_ == STRING_INDEX_IS_ARRAY_INDEX); | 3557 ASSERT(index_flags_ == STRING_INDEX_IS_ARRAY_INDEX); |
3559 // NumberToSmi discards numbers that are not exact integers. | 3558 // NumberToSmi discards numbers that are not exact integers. |
3560 __ CallRuntime(Runtime::kHiddenNumberToSmi, 1); | 3559 __ CallRuntime(Runtime::kNumberToSmi, 1); |
3561 } | 3560 } |
3562 // Save the conversion result before the pop instructions below | 3561 // Save the conversion result before the pop instructions below |
3563 // have a chance to overwrite it. | 3562 // have a chance to overwrite it. |
3564 __ Mov(index_, x0); | 3563 __ Mov(index_, x0); |
3565 __ Pop(object_); | 3564 __ Pop(object_); |
3566 // Reload the instance type. | 3565 // Reload the instance type. |
3567 __ Ldr(result_, FieldMemOperand(object_, HeapObject::kMapOffset)); | 3566 __ Ldr(result_, FieldMemOperand(object_, HeapObject::kMapOffset)); |
3568 __ Ldrb(result_, FieldMemOperand(result_, Map::kInstanceTypeOffset)); | 3567 __ Ldrb(result_, FieldMemOperand(result_, Map::kInstanceTypeOffset)); |
3569 call_helper.AfterCall(masm); | 3568 call_helper.AfterCall(masm); |
3570 | 3569 |
3571 // If index is still not a smi, it must be out of range. | 3570 // If index is still not a smi, it must be out of range. |
3572 __ JumpIfNotSmi(index_, index_out_of_range_); | 3571 __ JumpIfNotSmi(index_, index_out_of_range_); |
3573 // Otherwise, return to the fast path. | 3572 // Otherwise, return to the fast path. |
3574 __ B(&got_smi_index_); | 3573 __ B(&got_smi_index_); |
3575 | 3574 |
3576 // Call runtime. We get here when the receiver is a string and the | 3575 // Call runtime. We get here when the receiver is a string and the |
3577 // index is a number, but the code of getting the actual character | 3576 // index is a number, but the code of getting the actual character |
3578 // is too complex (e.g., when the string needs to be flattened). | 3577 // is too complex (e.g., when the string needs to be flattened). |
3579 __ Bind(&call_runtime_); | 3578 __ Bind(&call_runtime_); |
3580 call_helper.BeforeCall(masm); | 3579 call_helper.BeforeCall(masm); |
3581 __ SmiTag(index_); | 3580 __ SmiTag(index_); |
3582 __ Push(object_, index_); | 3581 __ Push(object_, index_); |
3583 __ CallRuntime(Runtime::kHiddenStringCharCodeAt, 2); | 3582 __ CallRuntime(Runtime::kStringCharCodeAtRT, 2); |
3584 __ Mov(result_, x0); | 3583 __ Mov(result_, x0); |
3585 call_helper.AfterCall(masm); | 3584 call_helper.AfterCall(masm); |
3586 __ B(&exit_); | 3585 __ B(&exit_); |
3587 | 3586 |
3588 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase); | 3587 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase); |
3589 } | 3588 } |
3590 | 3589 |
3591 | 3590 |
3592 void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) { | 3591 void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) { |
3593 __ JumpIfNotSmi(code_, &slow_case_); | 3592 __ JumpIfNotSmi(code_, &slow_case_); |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3855 StringCompareStub::GenerateCompareFlatAsciiStrings( | 3854 StringCompareStub::GenerateCompareFlatAsciiStrings( |
3856 masm, lhs, rhs, x10, x11, x12, x13); | 3855 masm, lhs, rhs, x10, x11, x12, x13); |
3857 } | 3856 } |
3858 | 3857 |
3859 // Handle more complex cases in runtime. | 3858 // Handle more complex cases in runtime. |
3860 __ Bind(&runtime); | 3859 __ Bind(&runtime); |
3861 __ Push(lhs, rhs); | 3860 __ Push(lhs, rhs); |
3862 if (equality) { | 3861 if (equality) { |
3863 __ TailCallRuntime(Runtime::kStringEquals, 2, 1); | 3862 __ TailCallRuntime(Runtime::kStringEquals, 2, 1); |
3864 } else { | 3863 } else { |
3865 __ TailCallRuntime(Runtime::kHiddenStringCompare, 2, 1); | 3864 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
3866 } | 3865 } |
3867 | 3866 |
3868 __ Bind(&miss); | 3867 __ Bind(&miss); |
3869 GenerateMiss(masm); | 3868 GenerateMiss(masm); |
3870 } | 3869 } |
3871 | 3870 |
3872 | 3871 |
3873 void ICCompareStub::GenerateObjects(MacroAssembler* masm) { | 3872 void ICCompareStub::GenerateObjects(MacroAssembler* masm) { |
3874 ASSERT(state_ == CompareIC::OBJECT); | 3873 ASSERT(state_ == CompareIC::OBJECT); |
3875 ASM_LOCATION("ICCompareStub[Objects]"); | 3874 ASM_LOCATION("ICCompareStub[Objects]"); |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4245 __ Add(result_length, result_length, result_length); | 4244 __ Add(result_length, result_length, result_length); |
4246 __ CopyBytes(result_char0, substring_char0, result_length, x3, kCopyLong); | 4245 __ CopyBytes(result_char0, substring_char0, result_length, x3, kCopyLong); |
4247 | 4246 |
4248 __ Bind(&return_x0); | 4247 __ Bind(&return_x0); |
4249 Counters* counters = isolate()->counters(); | 4248 Counters* counters = isolate()->counters(); |
4250 __ IncrementCounter(counters->sub_string_native(), 1, x3, x4); | 4249 __ IncrementCounter(counters->sub_string_native(), 1, x3, x4); |
4251 __ Drop(3); | 4250 __ Drop(3); |
4252 __ Ret(); | 4251 __ Ret(); |
4253 | 4252 |
4254 __ Bind(&runtime); | 4253 __ Bind(&runtime); |
4255 __ TailCallRuntime(Runtime::kHiddenSubString, 3, 1); | 4254 __ TailCallRuntime(Runtime::kSubString, 3, 1); |
4256 | 4255 |
4257 __ bind(&single_char); | 4256 __ bind(&single_char); |
4258 // x1: result_length | 4257 // x1: result_length |
4259 // x10: input_string | 4258 // x10: input_string |
4260 // x12: input_type | 4259 // x12: input_type |
4261 // x15: from (untagged) | 4260 // x15: from (untagged) |
4262 __ SmiTag(from); | 4261 __ SmiTag(from); |
4263 StringCharAtGenerator generator( | 4262 StringCharAtGenerator generator( |
4264 input_string, from, result_length, x0, | 4263 input_string, from, result_length, x0, |
4265 &runtime, &runtime, &runtime, STRING_INDEX_IS_NUMBER); | 4264 &runtime, &runtime, &runtime, STRING_INDEX_IS_NUMBER); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4422 | 4421 |
4423 __ Bind(&runtime); | 4422 __ Bind(&runtime); |
4424 | 4423 |
4425 // Push arguments back on to the stack. | 4424 // Push arguments back on to the stack. |
4426 // sp[0] = right string | 4425 // sp[0] = right string |
4427 // sp[8] = left string. | 4426 // sp[8] = left string. |
4428 __ Push(left, right); | 4427 __ Push(left, right); |
4429 | 4428 |
4430 // Call the runtime. | 4429 // Call the runtime. |
4431 // Returns -1 (less), 0 (equal), or 1 (greater) tagged as a small integer. | 4430 // Returns -1 (less), 0 (equal), or 1 (greater) tagged as a small integer. |
4432 __ TailCallRuntime(Runtime::kHiddenStringCompare, 2, 1); | 4431 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
4433 } | 4432 } |
4434 | 4433 |
4435 | 4434 |
4436 void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) { | 4435 void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) { |
4437 // ----------- S t a t e ------------- | 4436 // ----------- S t a t e ------------- |
4438 // -- x1 : left | 4437 // -- x1 : left |
4439 // -- x0 : right | 4438 // -- x0 : right |
4440 // -- lr : return address | 4439 // -- lr : return address |
4441 // ----------------------------------- | 4440 // ----------------------------------- |
4442 | 4441 |
(...skipping 1103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5546 MemOperand(fp, 6 * kPointerSize), | 5545 MemOperand(fp, 6 * kPointerSize), |
5547 NULL); | 5546 NULL); |
5548 } | 5547 } |
5549 | 5548 |
5550 | 5549 |
5551 #undef __ | 5550 #undef __ |
5552 | 5551 |
5553 } } // namespace v8::internal | 5552 } } // namespace v8::internal |
5554 | 5553 |
5555 #endif // V8_TARGET_ARCH_ARM64 | 5554 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |