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 |