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 #if V8_TARGET_ARCH_ARM64 | 5 #if V8_TARGET_ARCH_ARM64 |
6 | 6 |
7 #include "src/arm64/frames-arm64.h" | 7 #include "src/arm64/frames-arm64.h" |
8 #include "src/codegen.h" | 8 #include "src/codegen.h" |
9 #include "src/debug/debug.h" | 9 #include "src/debug/debug.h" |
10 #include "src/deoptimizer.h" | 10 #include "src/deoptimizer.h" |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 // Try to allocate the object without transitioning into C code. If any of | 383 // Try to allocate the object without transitioning into C code. If any of |
384 // the preconditions is not met, the code bails out to the runtime call. | 384 // the preconditions is not met, the code bails out to the runtime call. |
385 Label rt_call, allocated; | 385 Label rt_call, allocated; |
386 if (FLAG_inline_new) { | 386 if (FLAG_inline_new) { |
387 ExternalReference debug_step_in_fp = | 387 ExternalReference debug_step_in_fp = |
388 ExternalReference::debug_step_in_fp_address(isolate); | 388 ExternalReference::debug_step_in_fp_address(isolate); |
389 __ Mov(x2, Operand(debug_step_in_fp)); | 389 __ Mov(x2, Operand(debug_step_in_fp)); |
390 __ Ldr(x2, MemOperand(x2)); | 390 __ Ldr(x2, MemOperand(x2)); |
391 __ Cbnz(x2, &rt_call); | 391 __ Cbnz(x2, &rt_call); |
392 | 392 |
393 // Fall back to runtime if the original constructor and function differ. | 393 // Verify that the original constructor is a JSFunction. |
394 __ Cmp(constructor, original_constructor); | 394 __ JumpIfNotObjectType(original_constructor, x10, x11, JS_FUNCTION_TYPE, |
395 __ B(ne, &rt_call); | 395 &rt_call); |
396 | 396 |
397 // Load the initial map and verify that it is in fact a map. | 397 // Load the initial map and verify that it is in fact a map. |
398 Register init_map = x2; | 398 Register init_map = x2; |
399 __ Ldr(init_map, | 399 __ Ldr(init_map, |
400 FieldMemOperand(constructor, | 400 FieldMemOperand(original_constructor, |
401 JSFunction::kPrototypeOrInitialMapOffset)); | 401 JSFunction::kPrototypeOrInitialMapOffset)); |
402 __ JumpIfSmi(init_map, &rt_call); | 402 __ JumpIfSmi(init_map, &rt_call); |
403 __ JumpIfNotObjectType(init_map, x10, x11, MAP_TYPE, &rt_call); | 403 __ JumpIfNotObjectType(init_map, x10, x11, MAP_TYPE, &rt_call); |
404 | 404 |
| 405 // Fall back to runtime if the expected base constructor and base |
| 406 // constructor differ. |
| 407 __ Ldr(x10, |
| 408 FieldMemOperand(init_map, Map::kConstructorOrBackPointerOffset)); |
| 409 __ Cmp(constructor, x10); |
| 410 __ B(ne, &rt_call); |
| 411 |
405 // Check that the constructor is not constructing a JSFunction (see | 412 // Check that the constructor is not constructing a JSFunction (see |
406 // comments in Runtime_NewObject in runtime.cc). In which case the initial | 413 // comments in Runtime_NewObject in runtime.cc). In which case the initial |
407 // map's instance type would be JS_FUNCTION_TYPE. | 414 // map's instance type would be JS_FUNCTION_TYPE. |
408 __ CompareInstanceType(init_map, x10, JS_FUNCTION_TYPE); | 415 __ CompareInstanceType(init_map, x10, JS_FUNCTION_TYPE); |
409 __ B(eq, &rt_call); | 416 __ B(eq, &rt_call); |
410 | 417 |
411 Register constructon_count = x14; | 418 Register constructon_count = x14; |
412 if (!is_api_function) { | 419 if (!is_api_function) { |
413 Label allocate; | 420 Label allocate; |
414 MemOperand bit_field3 = | 421 MemOperand bit_field3 = |
415 FieldMemOperand(init_map, Map::kBitField3Offset); | 422 FieldMemOperand(init_map, Map::kBitField3Offset); |
416 // Check if slack tracking is enabled. | 423 // Check if slack tracking is enabled. |
417 __ Ldr(x4, bit_field3); | 424 __ Ldr(x4, bit_field3); |
418 __ DecodeField<Map::Counter>(constructon_count, x4); | 425 __ DecodeField<Map::Counter>(constructon_count, x4); |
419 __ Cmp(constructon_count, Operand(Map::kSlackTrackingCounterEnd)); | 426 __ Cmp(constructon_count, Operand(Map::kSlackTrackingCounterEnd)); |
420 __ B(lt, &allocate); | 427 __ B(lt, &allocate); |
421 // Decrease generous allocation count. | 428 // Decrease generous allocation count. |
422 __ Subs(x4, x4, Operand(1 << Map::Counter::kShift)); | 429 __ Subs(x4, x4, Operand(1 << Map::Counter::kShift)); |
423 __ Str(x4, bit_field3); | 430 __ Str(x4, bit_field3); |
424 __ Cmp(constructon_count, Operand(Map::kSlackTrackingCounterEnd)); | 431 __ Cmp(constructon_count, Operand(Map::kSlackTrackingCounterEnd)); |
425 __ B(ne, &allocate); | 432 __ B(ne, &allocate); |
426 | 433 |
427 // Push the constructor and map to the stack, and the constructor again | 434 // Push the constructor and map to the stack, and the map again |
428 // as argument to the runtime call. | 435 // as argument to the runtime call. |
429 __ Push(constructor, init_map, constructor); | 436 __ Push(constructor, init_map, init_map); |
430 __ CallRuntime(Runtime::kFinalizeInstanceSize, 1); | 437 __ CallRuntime(Runtime::kFinalizeInstanceSize, 1); |
431 __ Pop(init_map, constructor); | 438 __ Pop(init_map, constructor); |
432 __ Mov(constructon_count, Operand(Map::kSlackTrackingCounterEnd - 1)); | 439 __ Mov(constructon_count, Operand(Map::kSlackTrackingCounterEnd - 1)); |
433 __ Bind(&allocate); | 440 __ Bind(&allocate); |
434 } | 441 } |
435 | 442 |
436 // Now allocate the JSObject on the heap. | 443 // Now allocate the JSObject on the heap. |
437 Label rt_call_reload_new_target; | 444 Label rt_call_reload_new_target; |
438 Register obj_size = x3; | 445 Register obj_size = x3; |
439 Register new_obj = x4; | 446 Register new_obj = x4; |
(...skipping 1585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2025 } | 2032 } |
2026 } | 2033 } |
2027 | 2034 |
2028 | 2035 |
2029 #undef __ | 2036 #undef __ |
2030 | 2037 |
2031 } // namespace internal | 2038 } // namespace internal |
2032 } // namespace v8 | 2039 } // namespace v8 |
2033 | 2040 |
2034 #endif // V8_TARGET_ARCH_ARM | 2041 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |