| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 ICacheFlushMode icache_flush_mode = | 549 ICacheFlushMode icache_flush_mode = |
| 550 FLUSH_ICACHE_IF_NEEDED) { | 550 FLUSH_ICACHE_IF_NEEDED) { |
| 551 Address constant_pool = code ? code->constant_pool() : NULL; | 551 Address constant_pool = code ? code->constant_pool() : NULL; |
| 552 set_target_address_at(pc, constant_pool, target, icache_flush_mode); | 552 set_target_address_at(pc, constant_pool, target, icache_flush_mode); |
| 553 } | 553 } |
| 554 | 554 |
| 555 // Return the code target address at a call site from the return address | 555 // Return the code target address at a call site from the return address |
| 556 // of that call in the instruction stream. | 556 // of that call in the instruction stream. |
| 557 static inline Address target_address_from_return_address(Address pc); | 557 static inline Address target_address_from_return_address(Address pc); |
| 558 | 558 |
| 559 // Return the code target address of the patch debug break slot | |
| 560 inline static Address break_address_from_return_address(Address pc); | |
| 561 | |
| 562 // This sets the branch destination (which is in the instruction on x64). | 559 // This sets the branch destination (which is in the instruction on x64). |
| 563 // This is for calls and branches within generated code. | 560 // This is for calls and branches within generated code. |
| 564 inline static void deserialization_set_special_target_at( | 561 inline static void deserialization_set_special_target_at( |
| 565 Address instruction_payload, Code* code, Address target) { | 562 Address instruction_payload, Code* code, Address target) { |
| 566 set_target_address_at(instruction_payload, code, target); | 563 set_target_address_at(instruction_payload, code, target); |
| 567 } | 564 } |
| 568 | 565 |
| 569 // This sets the internal reference at the pc. | 566 // This sets the internal reference at the pc. |
| 570 inline static void deserialization_set_target_internal_reference_at( | 567 inline static void deserialization_set_target_internal_reference_at( |
| 571 Address pc, Address target, | 568 Address pc, Address target, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 592 // The length of call(Immediate32). | 589 // The length of call(Immediate32). |
| 593 static const int kShortCallInstructionLength = 5; | 590 static const int kShortCallInstructionLength = 5; |
| 594 // The length of movq(kScratchRegister, address). | 591 // The length of movq(kScratchRegister, address). |
| 595 static const int kMoveAddressIntoScratchRegisterInstructionLength = | 592 static const int kMoveAddressIntoScratchRegisterInstructionLength = |
| 596 2 + kPointerSize; | 593 2 + kPointerSize; |
| 597 // The length of movq(kScratchRegister, address) and call(kScratchRegister). | 594 // The length of movq(kScratchRegister, address) and call(kScratchRegister). |
| 598 static const int kCallSequenceLength = | 595 static const int kCallSequenceLength = |
| 599 kMoveAddressIntoScratchRegisterInstructionLength + | 596 kMoveAddressIntoScratchRegisterInstructionLength + |
| 600 kCallScratchRegisterInstructionLength; | 597 kCallScratchRegisterInstructionLength; |
| 601 | 598 |
| 602 // The js return and debug break slot must be able to contain an indirect | 599 // The debug break slot must be able to contain an indirect call sequence. |
| 603 // call sequence, some x64 JS code is padded with int3 to make it large | |
| 604 // enough to hold an instruction when the debugger patches it. | |
| 605 static const int kJSReturnSequenceLength = kCallSequenceLength; | |
| 606 static const int kDebugBreakSlotLength = kCallSequenceLength; | 600 static const int kDebugBreakSlotLength = kCallSequenceLength; |
| 607 static const int kPatchDebugBreakSlotReturnOffset = kCallTargetAddressOffset; | 601 // Distance between start of patched debug break slot and the emitted address |
| 608 // Distance between the start of the JS return sequence and where the | 602 // to jump to. |
| 609 // 32-bit displacement of a short call would be. The short call is from | |
| 610 // SetDebugBreakAtIC from debug-x64.cc. | |
| 611 static const int kPatchReturnSequenceAddressOffset = | |
| 612 kJSReturnSequenceLength - kPatchDebugBreakSlotReturnOffset; | |
| 613 // Distance between the start of the JS return sequence and where the | |
| 614 // 32-bit displacement of a short call would be. The short call is from | |
| 615 // SetDebugBreakAtIC from debug-x64.cc. | |
| 616 static const int kPatchDebugBreakSlotAddressOffset = | 603 static const int kPatchDebugBreakSlotAddressOffset = |
| 617 kDebugBreakSlotLength - kPatchDebugBreakSlotReturnOffset; | |
| 618 static const int kRealPatchReturnSequenceAddressOffset = | |
| 619 kMoveAddressIntoScratchRegisterInstructionLength - kPointerSize; | 604 kMoveAddressIntoScratchRegisterInstructionLength - kPointerSize; |
| 620 | 605 |
| 621 // One byte opcode for test eax,0xXXXXXXXX. | 606 // One byte opcode for test eax,0xXXXXXXXX. |
| 622 static const byte kTestEaxByte = 0xA9; | 607 static const byte kTestEaxByte = 0xA9; |
| 623 // One byte opcode for test al, 0xXX. | 608 // One byte opcode for test al, 0xXX. |
| 624 static const byte kTestAlByte = 0xA8; | 609 static const byte kTestAlByte = 0xA8; |
| 625 // One byte opcode for nop. | 610 // One byte opcode for nop. |
| 626 static const byte kNopByte = 0x90; | 611 static const byte kNopByte = 0x90; |
| 627 | 612 |
| 628 // One byte prefix for a short conditional jump. | 613 // One byte prefix for a short conditional jump. |
| (...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1607 void vpd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); | 1592 void vpd(byte op, XMMRegister dst, XMMRegister src1, const Operand& src2); |
| 1608 | 1593 |
| 1609 // Debugging | 1594 // Debugging |
| 1610 void Print(); | 1595 void Print(); |
| 1611 | 1596 |
| 1612 // Check the code size generated from label to here. | 1597 // Check the code size generated from label to here. |
| 1613 int SizeOfCodeGeneratedSince(Label* label) { | 1598 int SizeOfCodeGeneratedSince(Label* label) { |
| 1614 return pc_offset() - label->pos(); | 1599 return pc_offset() - label->pos(); |
| 1615 } | 1600 } |
| 1616 | 1601 |
| 1617 // Mark address of the ExitJSFrame code. | |
| 1618 void RecordJSReturn(); | |
| 1619 | |
| 1620 // Mark generator continuation. | 1602 // Mark generator continuation. |
| 1621 void RecordGeneratorContinuation(); | 1603 void RecordGeneratorContinuation(); |
| 1622 | 1604 |
| 1623 // Mark address of a debug break slot. | 1605 // Mark address of a debug break slot. |
| 1624 void RecordDebugBreakSlot(); | 1606 void RecordDebugBreakSlot(RelocInfo::Mode mode, int argc = 0); |
| 1625 void RecordDebugBreakSlotForCall(int argc); | |
| 1626 void RecordDebugBreakSlotForConstructCall(); | |
| 1627 | 1607 |
| 1628 // Record a comment relocation entry that can be used by a disassembler. | 1608 // Record a comment relocation entry that can be used by a disassembler. |
| 1629 // Use --code-comments to enable. | 1609 // Use --code-comments to enable. |
| 1630 void RecordComment(const char* msg); | 1610 void RecordComment(const char* msg); |
| 1631 | 1611 |
| 1632 // Record a deoptimization reason that can be used by a log or cpu profiler. | 1612 // Record a deoptimization reason that can be used by a log or cpu profiler. |
| 1633 // Use --trace-deopt to enable. | 1613 // Use --trace-deopt to enable. |
| 1634 void RecordDeoptReason(const int reason, const SourcePosition position); | 1614 void RecordDeoptReason(const int reason, const SourcePosition position); |
| 1635 | 1615 |
| 1636 void PatchConstantPoolAccessInstruction(int pc_offset, int offset, | 1616 void PatchConstantPoolAccessInstruction(int pc_offset, int offset, |
| (...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2164 private: | 2144 private: |
| 2165 Assembler* assembler_; | 2145 Assembler* assembler_; |
| 2166 #ifdef DEBUG | 2146 #ifdef DEBUG |
| 2167 int space_before_; | 2147 int space_before_; |
| 2168 #endif | 2148 #endif |
| 2169 }; | 2149 }; |
| 2170 | 2150 |
| 2171 } } // namespace v8::internal | 2151 } } // namespace v8::internal |
| 2172 | 2152 |
| 2173 #endif // V8_X64_ASSEMBLER_X64_H_ | 2153 #endif // V8_X64_ASSEMBLER_X64_H_ |
| OLD | NEW |