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 1363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1374 } | 1374 } |
1375 | 1375 |
1376 void Builtins::Generate_CompileLazy(MacroAssembler* masm) { | 1376 void Builtins::Generate_CompileLazy(MacroAssembler* masm) { |
1377 // ----------- S t a t e ------------- | 1377 // ----------- S t a t e ------------- |
1378 // -- x0 : argument count (preserved for callee) | 1378 // -- x0 : argument count (preserved for callee) |
1379 // -- x3 : new target (preserved for callee) | 1379 // -- x3 : new target (preserved for callee) |
1380 // -- x1 : target function (preserved for callee) | 1380 // -- x1 : target function (preserved for callee) |
1381 // ----------------------------------- | 1381 // ----------------------------------- |
1382 // First lookup code, maybe we don't need to compile! | 1382 // First lookup code, maybe we don't need to compile! |
1383 Label gotta_call_runtime; | 1383 Label gotta_call_runtime; |
1384 Label maybe_call_runtime; | |
1385 Label try_shared; | 1384 Label try_shared; |
1386 Label loop_top, loop_bottom; | 1385 Label loop_top, loop_bottom; |
1387 | 1386 |
1388 Register closure = x1; | 1387 Register closure = x1; |
1389 Register map = x13; | 1388 Register map = x13; |
1390 Register index = x2; | 1389 Register index = x2; |
1391 __ Ldr(map, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); | 1390 __ Ldr(map, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); |
1392 __ Ldr(map, | 1391 __ Ldr(map, |
1393 FieldMemOperand(map, SharedFunctionInfo::kOptimizedCodeMapOffset)); | 1392 FieldMemOperand(map, SharedFunctionInfo::kOptimizedCodeMapOffset)); |
1394 __ Ldrsw(index, UntagSmiFieldMemOperand(map, FixedArray::kLengthOffset)); | 1393 __ Ldrsw(index, UntagSmiFieldMemOperand(map, FixedArray::kLengthOffset)); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1432 __ RecordWriteField(closure, JSFunction::kLiteralsOffset, temp, x7, | 1431 __ RecordWriteField(closure, JSFunction::kLiteralsOffset, temp, x7, |
1433 kLRHasNotBeenSaved, kDontSaveFPRegs, EMIT_REMEMBERED_SET, | 1432 kLRHasNotBeenSaved, kDontSaveFPRegs, EMIT_REMEMBERED_SET, |
1434 OMIT_SMI_CHECK); | 1433 OMIT_SMI_CHECK); |
1435 | 1434 |
1436 // Code available? | 1435 // Code available? |
1437 Register entry = x7; | 1436 Register entry = x7; |
1438 __ Ldr(entry, | 1437 __ Ldr(entry, |
1439 FieldMemOperand(array_pointer, | 1438 FieldMemOperand(array_pointer, |
1440 SharedFunctionInfo::kOffsetToPreviousCachedCode)); | 1439 SharedFunctionInfo::kOffsetToPreviousCachedCode)); |
1441 __ Ldr(entry, FieldMemOperand(entry, WeakCell::kValueOffset)); | 1440 __ Ldr(entry, FieldMemOperand(entry, WeakCell::kValueOffset)); |
1442 __ JumpIfSmi(entry, &maybe_call_runtime); | 1441 __ JumpIfSmi(entry, &try_shared); |
1443 | 1442 |
1444 // Found literals and code. Get them into the closure and return. | 1443 // Found literals and code. Get them into the closure and return. |
1445 __ Add(entry, entry, Operand(Code::kHeaderSize - kHeapObjectTag)); | 1444 __ Add(entry, entry, Operand(Code::kHeaderSize - kHeapObjectTag)); |
1446 | |
1447 Label install_optimized_code_and_tailcall; | |
1448 __ Bind(&install_optimized_code_and_tailcall); | |
1449 __ Str(entry, FieldMemOperand(closure, JSFunction::kCodeEntryOffset)); | 1445 __ Str(entry, FieldMemOperand(closure, JSFunction::kCodeEntryOffset)); |
1450 __ RecordWriteCodeEntryField(closure, entry, x5); | 1446 __ RecordWriteCodeEntryField(closure, entry, x5); |
1451 | 1447 |
1452 // Link the closure into the optimized function list. | 1448 // Link the closure into the optimized function list. |
1453 // x7 : code entry | 1449 // x7 : code entry |
1454 // x4 : native context | 1450 // x4 : native context |
1455 // x1 : closure | 1451 // x1 : closure |
1456 __ Ldr(x8, | 1452 __ Ldr(x8, |
1457 ContextMemOperand(native_context, Context::OPTIMIZED_FUNCTIONS_LIST)); | 1453 ContextMemOperand(native_context, Context::OPTIMIZED_FUNCTIONS_LIST)); |
1458 __ Str(x8, FieldMemOperand(closure, JSFunction::kNextFunctionLinkOffset)); | 1454 __ Str(x8, FieldMemOperand(closure, JSFunction::kNextFunctionLinkOffset)); |
(...skipping 10 matching lines...) Expand all Loading... |
1469 __ Jump(entry); | 1465 __ Jump(entry); |
1470 | 1466 |
1471 __ Bind(&loop_bottom); | 1467 __ Bind(&loop_bottom); |
1472 __ Sub(index, index, Operand(SharedFunctionInfo::kEntryLength)); | 1468 __ Sub(index, index, Operand(SharedFunctionInfo::kEntryLength)); |
1473 __ Cmp(index, Operand(1)); | 1469 __ Cmp(index, Operand(1)); |
1474 __ B(gt, &loop_top); | 1470 __ B(gt, &loop_top); |
1475 | 1471 |
1476 // We found neither literals nor code. | 1472 // We found neither literals nor code. |
1477 __ B(&gotta_call_runtime); | 1473 __ B(&gotta_call_runtime); |
1478 | 1474 |
1479 __ Bind(&maybe_call_runtime); | |
1480 | |
1481 // Last possibility. Check the context free optimized code map entry. | |
1482 __ Ldr(entry, FieldMemOperand(map, FixedArray::kHeaderSize + | |
1483 SharedFunctionInfo::kSharedCodeIndex)); | |
1484 __ Ldr(entry, FieldMemOperand(entry, WeakCell::kValueOffset)); | |
1485 __ JumpIfSmi(entry, &try_shared); | |
1486 | |
1487 // Store code entry in the closure. | |
1488 __ Add(entry, entry, Operand(Code::kHeaderSize - kHeapObjectTag)); | |
1489 __ B(&install_optimized_code_and_tailcall); | |
1490 | |
1491 __ Bind(&try_shared); | 1475 __ Bind(&try_shared); |
1492 // Is the full code valid? | 1476 // Is the full code valid? |
1493 __ Ldr(entry, | 1477 __ Ldr(entry, |
1494 FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); | 1478 FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); |
1495 __ Ldr(entry, FieldMemOperand(entry, SharedFunctionInfo::kCodeOffset)); | 1479 __ Ldr(entry, FieldMemOperand(entry, SharedFunctionInfo::kCodeOffset)); |
1496 __ Ldr(x5, FieldMemOperand(entry, Code::kFlagsOffset)); | 1480 __ Ldr(x5, FieldMemOperand(entry, Code::kFlagsOffset)); |
1497 __ and_(x5, x5, Operand(Code::KindField::kMask)); | 1481 __ and_(x5, x5, Operand(Code::KindField::kMask)); |
1498 __ Mov(x5, Operand(x5, LSR, Code::KindField::kShift)); | 1482 __ Mov(x5, Operand(x5, LSR, Code::KindField::kShift)); |
1499 __ Cmp(x5, Operand(Code::BUILTIN)); | 1483 __ Cmp(x5, Operand(Code::BUILTIN)); |
1500 __ B(eq, &gotta_call_runtime); | 1484 __ B(eq, &gotta_call_runtime); |
(...skipping 1521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3022 __ Unreachable(); | 3006 __ Unreachable(); |
3023 } | 3007 } |
3024 } | 3008 } |
3025 | 3009 |
3026 #undef __ | 3010 #undef __ |
3027 | 3011 |
3028 } // namespace internal | 3012 } // namespace internal |
3029 } // namespace v8 | 3013 } // namespace v8 |
3030 | 3014 |
3031 #endif // V8_TARGET_ARCH_ARM | 3015 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |