| 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 #include <limits.h> // For LONG_MIN, LONG_MAX. | 5 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_ARM | 7 #if V8_TARGET_ARCH_ARM |
| 8 | 8 |
| 9 #include "src/assembler-inl.h" | 9 #include "src/assembler-inl.h" |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 CallStub(&store_buffer_overflow); | 763 CallStub(&store_buffer_overflow); |
| 764 pop(lr); | 764 pop(lr); |
| 765 bind(&done); | 765 bind(&done); |
| 766 if (and_then == kReturnAtEnd) { | 766 if (and_then == kReturnAtEnd) { |
| 767 Ret(); | 767 Ret(); |
| 768 } | 768 } |
| 769 } | 769 } |
| 770 | 770 |
| 771 void MacroAssembler::PushCommonFrame(Register marker_reg) { | 771 void MacroAssembler::PushCommonFrame(Register marker_reg) { |
| 772 if (marker_reg.is_valid()) { | 772 if (marker_reg.is_valid()) { |
| 773 if (FLAG_enable_embedded_constant_pool) { | 773 if (marker_reg.code() > fp.code()) { |
| 774 if (marker_reg.code() > pp.code()) { | 774 stm(db_w, sp, fp.bit() | lr.bit()); |
| 775 stm(db_w, sp, pp.bit() | fp.bit() | lr.bit()); | 775 mov(fp, Operand(sp)); |
| 776 add(fp, sp, Operand(kPointerSize)); | 776 Push(marker_reg); |
| 777 Push(marker_reg); | |
| 778 } else { | |
| 779 stm(db_w, sp, marker_reg.bit() | pp.bit() | fp.bit() | lr.bit()); | |
| 780 add(fp, sp, Operand(2 * kPointerSize)); | |
| 781 } | |
| 782 } else { | 777 } else { |
| 783 if (marker_reg.code() > fp.code()) { | 778 stm(db_w, sp, marker_reg.bit() | fp.bit() | lr.bit()); |
| 784 stm(db_w, sp, fp.bit() | lr.bit()); | 779 add(fp, sp, Operand(kPointerSize)); |
| 785 mov(fp, Operand(sp)); | |
| 786 Push(marker_reg); | |
| 787 } else { | |
| 788 stm(db_w, sp, marker_reg.bit() | fp.bit() | lr.bit()); | |
| 789 add(fp, sp, Operand(kPointerSize)); | |
| 790 } | |
| 791 } | 780 } |
| 792 } else { | 781 } else { |
| 793 stm(db_w, sp, (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) | | 782 stm(db_w, sp, fp.bit() | lr.bit()); |
| 794 fp.bit() | lr.bit()); | 783 mov(fp, sp); |
| 795 add(fp, sp, Operand(FLAG_enable_embedded_constant_pool ? kPointerSize : 0)); | |
| 796 } | 784 } |
| 797 } | 785 } |
| 798 | 786 |
| 799 void MacroAssembler::PopCommonFrame(Register marker_reg) { | 787 void MacroAssembler::PopCommonFrame(Register marker_reg) { |
| 800 if (marker_reg.is_valid()) { | 788 if (marker_reg.is_valid()) { |
| 801 if (FLAG_enable_embedded_constant_pool) { | 789 if (marker_reg.code() > fp.code()) { |
| 802 if (marker_reg.code() > pp.code()) { | 790 pop(marker_reg); |
| 803 pop(marker_reg); | 791 ldm(ia_w, sp, fp.bit() | lr.bit()); |
| 804 ldm(ia_w, sp, pp.bit() | fp.bit() | lr.bit()); | |
| 805 } else { | |
| 806 ldm(ia_w, sp, marker_reg.bit() | pp.bit() | fp.bit() | lr.bit()); | |
| 807 } | |
| 808 } else { | 792 } else { |
| 809 if (marker_reg.code() > fp.code()) { | 793 ldm(ia_w, sp, marker_reg.bit() | fp.bit() | lr.bit()); |
| 810 pop(marker_reg); | |
| 811 ldm(ia_w, sp, fp.bit() | lr.bit()); | |
| 812 } else { | |
| 813 ldm(ia_w, sp, marker_reg.bit() | fp.bit() | lr.bit()); | |
| 814 } | |
| 815 } | 794 } |
| 816 } else { | 795 } else { |
| 817 ldm(ia_w, sp, (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) | | 796 ldm(ia_w, sp, fp.bit() | lr.bit()); |
| 818 fp.bit() | lr.bit()); | |
| 819 } | 797 } |
| 820 } | 798 } |
| 821 | 799 |
| 822 void MacroAssembler::PushStandardFrame(Register function_reg) { | 800 void MacroAssembler::PushStandardFrame(Register function_reg) { |
| 823 DCHECK(!function_reg.is_valid() || function_reg.code() < cp.code()); | 801 DCHECK(!function_reg.is_valid() || function_reg.code() < cp.code()); |
| 824 stm(db_w, sp, (function_reg.is_valid() ? function_reg.bit() : 0) | cp.bit() | | 802 stm(db_w, sp, (function_reg.is_valid() ? function_reg.bit() : 0) | cp.bit() | |
| 825 (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) | | |
| 826 fp.bit() | lr.bit()); | 803 fp.bit() | lr.bit()); |
| 827 int offset = -StandardFrameConstants::kContextOffset; | 804 int offset = -StandardFrameConstants::kContextOffset; |
| 828 offset += function_reg.is_valid() ? kPointerSize : 0; | 805 offset += function_reg.is_valid() ? kPointerSize : 0; |
| 829 add(fp, sp, Operand(offset)); | 806 add(fp, sp, Operand(offset)); |
| 830 } | 807 } |
| 831 | 808 |
| 832 | 809 |
| 833 // Push and pop all registers that can hold pointers. | 810 // Push and pop all registers that can hold pointers. |
| 834 void MacroAssembler::PushSafepointRegisters() { | 811 void MacroAssembler::PushSafepointRegisters() { |
| 835 // Safepoints expect a block of contiguous register values starting with r0. | 812 // Safepoints expect a block of contiguous register values starting with r0. |
| 836 // except when FLAG_enable_embedded_constant_pool, which omits pp. | 813 DCHECK(kSafepointSavedRegisters == (1 << kNumSafepointSavedRegisters) - 1); |
| 837 DCHECK(kSafepointSavedRegisters == | |
| 838 (FLAG_enable_embedded_constant_pool | |
| 839 ? ((1 << (kNumSafepointSavedRegisters + 1)) - 1) & ~pp.bit() | |
| 840 : (1 << kNumSafepointSavedRegisters) - 1)); | |
| 841 // Safepoints expect a block of kNumSafepointRegisters values on the | 814 // Safepoints expect a block of kNumSafepointRegisters values on the |
| 842 // stack, so adjust the stack for unsaved registers. | 815 // stack, so adjust the stack for unsaved registers. |
| 843 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; | 816 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; |
| 844 DCHECK(num_unsaved >= 0); | 817 DCHECK(num_unsaved >= 0); |
| 845 sub(sp, sp, Operand(num_unsaved * kPointerSize)); | 818 sub(sp, sp, Operand(num_unsaved * kPointerSize)); |
| 846 stm(db_w, sp, kSafepointSavedRegisters); | 819 stm(db_w, sp, kSafepointSavedRegisters); |
| 847 } | 820 } |
| 848 | 821 |
| 849 | 822 |
| 850 void MacroAssembler::PopSafepointRegisters() { | 823 void MacroAssembler::PopSafepointRegisters() { |
| 851 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; | 824 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; |
| 852 ldm(ia_w, sp, kSafepointSavedRegisters); | 825 ldm(ia_w, sp, kSafepointSavedRegisters); |
| 853 add(sp, sp, Operand(num_unsaved * kPointerSize)); | 826 add(sp, sp, Operand(num_unsaved * kPointerSize)); |
| 854 } | 827 } |
| 855 | 828 |
| 856 | 829 |
| 857 void MacroAssembler::StoreToSafepointRegisterSlot(Register src, Register dst) { | 830 void MacroAssembler::StoreToSafepointRegisterSlot(Register src, Register dst) { |
| 858 str(src, SafepointRegisterSlot(dst)); | 831 str(src, SafepointRegisterSlot(dst)); |
| 859 } | 832 } |
| 860 | 833 |
| 861 | 834 |
| 862 void MacroAssembler::LoadFromSafepointRegisterSlot(Register dst, Register src) { | 835 void MacroAssembler::LoadFromSafepointRegisterSlot(Register dst, Register src) { |
| 863 ldr(dst, SafepointRegisterSlot(src)); | 836 ldr(dst, SafepointRegisterSlot(src)); |
| 864 } | 837 } |
| 865 | 838 |
| 866 | 839 |
| 867 int MacroAssembler::SafepointRegisterStackIndex(int reg_code) { | 840 int MacroAssembler::SafepointRegisterStackIndex(int reg_code) { |
| 868 // The registers are pushed starting with the highest encoding, | 841 // The registers are pushed starting with the highest encoding, |
| 869 // which means that lowest encodings are closest to the stack pointer. | 842 // which means that lowest encodings are closest to the stack pointer. |
| 870 if (FLAG_enable_embedded_constant_pool && reg_code > pp.code()) { | |
| 871 // RegList omits pp. | |
| 872 reg_code -= 1; | |
| 873 } | |
| 874 DCHECK(reg_code >= 0 && reg_code < kNumSafepointRegisters); | 843 DCHECK(reg_code >= 0 && reg_code < kNumSafepointRegisters); |
| 875 return reg_code; | 844 return reg_code; |
| 876 } | 845 } |
| 877 | 846 |
| 878 | 847 |
| 879 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { | 848 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { |
| 880 return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); | 849 return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); |
| 881 } | 850 } |
| 882 | 851 |
| 883 | 852 |
| (...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1392 } else if (shift == 0) { | 1361 } else if (shift == 0) { |
| 1393 Move(dst_low, src_low); | 1362 Move(dst_low, src_low); |
| 1394 Move(dst_high, src_high); | 1363 Move(dst_high, src_high); |
| 1395 } else { | 1364 } else { |
| 1396 lsr(dst_low, src_low, Operand(shift)); | 1365 lsr(dst_low, src_low, Operand(shift)); |
| 1397 orr(dst_low, dst_low, Operand(src_high, LSL, 32 - shift)); | 1366 orr(dst_low, dst_low, Operand(src_high, LSL, 32 - shift)); |
| 1398 asr(dst_high, src_high, Operand(shift)); | 1367 asr(dst_high, src_high, Operand(shift)); |
| 1399 } | 1368 } |
| 1400 } | 1369 } |
| 1401 | 1370 |
| 1402 void MacroAssembler::LoadConstantPoolPointerRegisterFromCodeTargetAddress( | |
| 1403 Register code_target_address) { | |
| 1404 DCHECK(FLAG_enable_embedded_constant_pool); | |
| 1405 ldr(pp, MemOperand(code_target_address, | |
| 1406 Code::kConstantPoolOffset - Code::kHeaderSize)); | |
| 1407 add(pp, pp, code_target_address); | |
| 1408 } | |
| 1409 | |
| 1410 | |
| 1411 void MacroAssembler::LoadConstantPoolPointerRegister() { | |
| 1412 DCHECK(FLAG_enable_embedded_constant_pool); | |
| 1413 int entry_offset = pc_offset() + Instruction::kPCReadOffset; | |
| 1414 sub(ip, pc, Operand(entry_offset)); | |
| 1415 LoadConstantPoolPointerRegisterFromCodeTargetAddress(ip); | |
| 1416 } | |
| 1417 | |
| 1418 void MacroAssembler::StubPrologue(StackFrame::Type type) { | 1371 void MacroAssembler::StubPrologue(StackFrame::Type type) { |
| 1419 mov(ip, Operand(StackFrame::TypeToMarker(type))); | 1372 mov(ip, Operand(StackFrame::TypeToMarker(type))); |
| 1420 PushCommonFrame(ip); | 1373 PushCommonFrame(ip); |
| 1421 if (FLAG_enable_embedded_constant_pool) { | |
| 1422 LoadConstantPoolPointerRegister(); | |
| 1423 set_constant_pool_available(true); | |
| 1424 } | |
| 1425 } | 1374 } |
| 1426 | 1375 |
| 1427 void MacroAssembler::Prologue(bool code_pre_aging) { | 1376 void MacroAssembler::Prologue(bool code_pre_aging) { |
| 1428 { PredictableCodeSizeScope predictible_code_size_scope( | 1377 { PredictableCodeSizeScope predictible_code_size_scope( |
| 1429 this, kNoCodeAgeSequenceLength); | 1378 this, kNoCodeAgeSequenceLength); |
| 1430 // The following three instructions must remain together and unmodified | 1379 // The following three instructions must remain together and unmodified |
| 1431 // for code aging to work properly. | 1380 // for code aging to work properly. |
| 1432 if (code_pre_aging) { | 1381 if (code_pre_aging) { |
| 1433 // Pre-age the code. | 1382 // Pre-age the code. |
| 1434 Code* stub = Code::GetPreAgedCodeAgeStub(isolate()); | 1383 Code* stub = Code::GetPreAgedCodeAgeStub(isolate()); |
| 1435 add(r0, pc, Operand(-8)); | 1384 add(r0, pc, Operand(-8)); |
| 1436 ldr(pc, MemOperand(pc, -4)); | 1385 ldr(pc, MemOperand(pc, -4)); |
| 1437 emit_code_stub_address(stub); | 1386 emit_code_stub_address(stub); |
| 1438 } else { | 1387 } else { |
| 1439 PushStandardFrame(r1); | 1388 PushStandardFrame(r1); |
| 1440 nop(ip.code()); | 1389 nop(ip.code()); |
| 1441 } | 1390 } |
| 1442 } | 1391 } |
| 1443 if (FLAG_enable_embedded_constant_pool) { | |
| 1444 LoadConstantPoolPointerRegister(); | |
| 1445 set_constant_pool_available(true); | |
| 1446 } | |
| 1447 } | 1392 } |
| 1448 | 1393 |
| 1449 void MacroAssembler::EmitLoadFeedbackVector(Register vector) { | 1394 void MacroAssembler::EmitLoadFeedbackVector(Register vector) { |
| 1450 ldr(vector, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | 1395 ldr(vector, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
| 1451 ldr(vector, FieldMemOperand(vector, JSFunction::kFeedbackVectorOffset)); | 1396 ldr(vector, FieldMemOperand(vector, JSFunction::kFeedbackVectorOffset)); |
| 1452 ldr(vector, FieldMemOperand(vector, Cell::kValueOffset)); | 1397 ldr(vector, FieldMemOperand(vector, Cell::kValueOffset)); |
| 1453 } | 1398 } |
| 1454 | 1399 |
| 1455 | 1400 |
| 1456 void MacroAssembler::EnterFrame(StackFrame::Type type, | 1401 void MacroAssembler::EnterFrame(StackFrame::Type type, |
| 1457 bool load_constant_pool_pointer_reg) { | 1402 bool load_constant_pool_pointer_reg) { |
| 1458 // r0-r3: preserved | 1403 // r0-r3: preserved |
| 1459 mov(ip, Operand(StackFrame::TypeToMarker(type))); | 1404 mov(ip, Operand(StackFrame::TypeToMarker(type))); |
| 1460 PushCommonFrame(ip); | 1405 PushCommonFrame(ip); |
| 1461 if (FLAG_enable_embedded_constant_pool && load_constant_pool_pointer_reg) { | |
| 1462 LoadConstantPoolPointerRegister(); | |
| 1463 } | |
| 1464 if (type == StackFrame::INTERNAL) { | 1406 if (type == StackFrame::INTERNAL) { |
| 1465 mov(ip, Operand(CodeObject())); | 1407 mov(ip, Operand(CodeObject())); |
| 1466 push(ip); | 1408 push(ip); |
| 1467 } | 1409 } |
| 1468 } | 1410 } |
| 1469 | 1411 |
| 1470 | 1412 |
| 1471 int MacroAssembler::LeaveFrame(StackFrame::Type type) { | 1413 int MacroAssembler::LeaveFrame(StackFrame::Type type) { |
| 1472 // r0: preserved | 1414 // r0: preserved |
| 1473 // r1: preserved | 1415 // r1: preserved |
| 1474 // r2: preserved | 1416 // r2: preserved |
| 1475 | 1417 |
| 1476 // Drop the execution stack down to the frame pointer and restore | 1418 // Drop the execution stack down to the frame pointer and restore |
| 1477 // the caller frame pointer, return address and constant pool pointer | 1419 // the caller frame pointer and return address. |
| 1478 // (if FLAG_enable_embedded_constant_pool). | 1420 mov(sp, fp); |
| 1479 int frame_ends; | 1421 int frame_ends = pc_offset(); |
| 1480 if (FLAG_enable_embedded_constant_pool) { | 1422 ldm(ia_w, sp, fp.bit() | lr.bit()); |
| 1481 add(sp, fp, Operand(StandardFrameConstants::kConstantPoolOffset)); | |
| 1482 frame_ends = pc_offset(); | |
| 1483 ldm(ia_w, sp, pp.bit() | fp.bit() | lr.bit()); | |
| 1484 } else { | |
| 1485 mov(sp, fp); | |
| 1486 frame_ends = pc_offset(); | |
| 1487 ldm(ia_w, sp, fp.bit() | lr.bit()); | |
| 1488 } | |
| 1489 return frame_ends; | 1423 return frame_ends; |
| 1490 } | 1424 } |
| 1491 | 1425 |
| 1492 void MacroAssembler::EnterBuiltinFrame(Register context, Register target, | 1426 void MacroAssembler::EnterBuiltinFrame(Register context, Register target, |
| 1493 Register argc) { | 1427 Register argc) { |
| 1494 Push(lr, fp, context, target); | 1428 Push(lr, fp, context, target); |
| 1495 add(fp, sp, Operand(2 * kPointerSize)); | 1429 add(fp, sp, Operand(2 * kPointerSize)); |
| 1496 Push(argc); | 1430 Push(argc); |
| 1497 } | 1431 } |
| 1498 | 1432 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1512 DCHECK_EQ(1 * kPointerSize, ExitFrameConstants::kCallerPCOffset); | 1446 DCHECK_EQ(1 * kPointerSize, ExitFrameConstants::kCallerPCOffset); |
| 1513 DCHECK_EQ(0 * kPointerSize, ExitFrameConstants::kCallerFPOffset); | 1447 DCHECK_EQ(0 * kPointerSize, ExitFrameConstants::kCallerFPOffset); |
| 1514 mov(ip, Operand(StackFrame::TypeToMarker(frame_type))); | 1448 mov(ip, Operand(StackFrame::TypeToMarker(frame_type))); |
| 1515 PushCommonFrame(ip); | 1449 PushCommonFrame(ip); |
| 1516 // Reserve room for saved entry sp and code object. | 1450 // Reserve room for saved entry sp and code object. |
| 1517 sub(sp, fp, Operand(ExitFrameConstants::kFixedFrameSizeFromFp)); | 1451 sub(sp, fp, Operand(ExitFrameConstants::kFixedFrameSizeFromFp)); |
| 1518 if (emit_debug_code()) { | 1452 if (emit_debug_code()) { |
| 1519 mov(ip, Operand::Zero()); | 1453 mov(ip, Operand::Zero()); |
| 1520 str(ip, MemOperand(fp, ExitFrameConstants::kSPOffset)); | 1454 str(ip, MemOperand(fp, ExitFrameConstants::kSPOffset)); |
| 1521 } | 1455 } |
| 1522 if (FLAG_enable_embedded_constant_pool) { | |
| 1523 str(pp, MemOperand(fp, ExitFrameConstants::kConstantPoolOffset)); | |
| 1524 } | |
| 1525 mov(ip, Operand(CodeObject())); | 1456 mov(ip, Operand(CodeObject())); |
| 1526 str(ip, MemOperand(fp, ExitFrameConstants::kCodeOffset)); | 1457 str(ip, MemOperand(fp, ExitFrameConstants::kCodeOffset)); |
| 1527 | 1458 |
| 1528 // Save the frame pointer and the context in top. | 1459 // Save the frame pointer and the context in top. |
| 1529 mov(ip, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); | 1460 mov(ip, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); |
| 1530 str(fp, MemOperand(ip)); | 1461 str(fp, MemOperand(ip)); |
| 1531 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); | 1462 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); |
| 1532 str(cp, MemOperand(ip)); | 1463 str(cp, MemOperand(ip)); |
| 1533 | 1464 |
| 1534 // Optionally save all double registers. | 1465 // Optionally save all double registers. |
| 1535 if (save_doubles) { | 1466 if (save_doubles) { |
| 1536 SaveFPRegs(sp, ip); | 1467 SaveFPRegs(sp, ip); |
| 1537 // Note that d0 will be accessible at | 1468 // Note that d0 will be accessible at |
| 1538 // fp - ExitFrameConstants::kFrameSize - | 1469 // fp - ExitFrameConstants::kFrameSize - |
| 1539 // DwVfpRegister::kMaxNumRegisters * kDoubleSize, | 1470 // DwVfpRegister::kMaxNumRegisters * kDoubleSize, |
| 1540 // since the sp slot, code slot and constant pool slot (if | 1471 // since the sp slot and code slot were pushed after the fp. |
| 1541 // FLAG_enable_embedded_constant_pool) were pushed after the fp. | |
| 1542 } | 1472 } |
| 1543 | 1473 |
| 1544 // Reserve place for the return address and stack space and align the frame | 1474 // Reserve place for the return address and stack space and align the frame |
| 1545 // preparing for calling the runtime function. | 1475 // preparing for calling the runtime function. |
| 1546 const int frame_alignment = MacroAssembler::ActivationFrameAlignment(); | 1476 const int frame_alignment = MacroAssembler::ActivationFrameAlignment(); |
| 1547 sub(sp, sp, Operand((stack_space + 1) * kPointerSize)); | 1477 sub(sp, sp, Operand((stack_space + 1) * kPointerSize)); |
| 1548 if (frame_alignment > 0) { | 1478 if (frame_alignment > 0) { |
| 1549 DCHECK(base::bits::IsPowerOfTwo32(frame_alignment)); | 1479 DCHECK(base::bits::IsPowerOfTwo32(frame_alignment)); |
| 1550 and_(sp, sp, Operand(-frame_alignment)); | 1480 and_(sp, sp, Operand(-frame_alignment)); |
| 1551 } | 1481 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1596 if (restore_context) { | 1526 if (restore_context) { |
| 1597 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); | 1527 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); |
| 1598 ldr(cp, MemOperand(ip)); | 1528 ldr(cp, MemOperand(ip)); |
| 1599 } | 1529 } |
| 1600 #ifdef DEBUG | 1530 #ifdef DEBUG |
| 1601 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); | 1531 mov(ip, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); |
| 1602 str(r3, MemOperand(ip)); | 1532 str(r3, MemOperand(ip)); |
| 1603 #endif | 1533 #endif |
| 1604 | 1534 |
| 1605 // Tear down the exit frame, pop the arguments, and return. | 1535 // Tear down the exit frame, pop the arguments, and return. |
| 1606 if (FLAG_enable_embedded_constant_pool) { | |
| 1607 ldr(pp, MemOperand(fp, ExitFrameConstants::kConstantPoolOffset)); | |
| 1608 } | |
| 1609 mov(sp, Operand(fp)); | 1536 mov(sp, Operand(fp)); |
| 1610 ldm(ia_w, sp, fp.bit() | lr.bit()); | 1537 ldm(ia_w, sp, fp.bit() | lr.bit()); |
| 1611 if (argument_count.is_valid()) { | 1538 if (argument_count.is_valid()) { |
| 1612 if (argument_count_is_length) { | 1539 if (argument_count_is_length) { |
| 1613 add(sp, sp, argument_count); | 1540 add(sp, sp, argument_count); |
| 1614 } else { | 1541 } else { |
| 1615 add(sp, sp, Operand(argument_count, LSL, kPointerSizeLog2)); | 1542 add(sp, sp, Operand(argument_count, LSL, kPointerSizeLog2)); |
| 1616 } | 1543 } |
| 1617 } | 1544 } |
| 1618 } | 1545 } |
| (...skipping 2188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3807 } | 3734 } |
| 3808 } | 3735 } |
| 3809 if (mag.shift > 0) mov(result, Operand(result, ASR, mag.shift)); | 3736 if (mag.shift > 0) mov(result, Operand(result, ASR, mag.shift)); |
| 3810 add(result, result, Operand(dividend, LSR, 31)); | 3737 add(result, result, Operand(dividend, LSR, 31)); |
| 3811 } | 3738 } |
| 3812 | 3739 |
| 3813 } // namespace internal | 3740 } // namespace internal |
| 3814 } // namespace v8 | 3741 } // namespace v8 |
| 3815 | 3742 |
| 3816 #endif // V8_TARGET_ARCH_ARM | 3743 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |