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 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 ICacheFlushMode icache_flush_mode = | 518 ICacheFlushMode icache_flush_mode = |
519 FLUSH_ICACHE_IF_NEEDED)) { | 519 FLUSH_ICACHE_IF_NEEDED)) { |
520 Address constant_pool = code ? code->constant_pool() : NULL; | 520 Address constant_pool = code ? code->constant_pool() : NULL; |
521 set_target_address_at(pc, constant_pool, target, icache_flush_mode); | 521 set_target_address_at(pc, constant_pool, target, icache_flush_mode); |
522 } | 522 } |
523 | 523 |
524 // Return the code target address at a call site from the return address | 524 // Return the code target address at a call site from the return address |
525 // of that call in the instruction stream. | 525 // of that call in the instruction stream. |
526 inline static Address target_address_from_return_address(Address pc); | 526 inline static Address target_address_from_return_address(Address pc); |
527 | 527 |
528 // Return the code target address of the patch debug break slot | |
529 inline static Address break_address_from_return_address(Address pc); | |
530 | |
531 static void JumpToJumpRegister(Address pc); | 528 static void JumpToJumpRegister(Address pc); |
532 | 529 |
533 static void QuietNaN(HeapObject* nan); | 530 static void QuietNaN(HeapObject* nan); |
534 | 531 |
535 // This sets the branch destination (which gets loaded at the call address). | 532 // This sets the branch destination (which gets loaded at the call address). |
536 // This is for calls and branches within generated code. The serializer | 533 // This is for calls and branches within generated code. The serializer |
537 // has already deserialized the lui/ori instructions etc. | 534 // has already deserialized the lui/ori instructions etc. |
538 inline static void deserialization_set_special_target_at( | 535 inline static void deserialization_set_special_target_at( |
539 Address instruction_payload, Code* code, Address target) { | 536 Address instruction_payload, Code* code, Address target) { |
540 set_target_address_at( | 537 set_target_address_at( |
(...skipping 27 matching lines...) Expand all Loading... |
568 // the instruction that follows LUI/ORI instruction pair. Now, with new jump | 565 // the instruction that follows LUI/ORI instruction pair. Now, with new jump |
569 // optimization, where jump-through-register instruction that usually | 566 // optimization, where jump-through-register instruction that usually |
570 // follows LUI/ORI pair is substituted with J/JAL, this constant equals | 567 // follows LUI/ORI pair is substituted with J/JAL, this constant equals |
571 // to 3 instructions (LUI+ORI+J/JAL/JR/JALR). | 568 // to 3 instructions (LUI+ORI+J/JAL/JR/JALR). |
572 static const int kInstructionsFor32BitConstant = 3; | 569 static const int kInstructionsFor32BitConstant = 3; |
573 | 570 |
574 // Distance between the instruction referring to the address of the call | 571 // Distance between the instruction referring to the address of the call |
575 // target and the return address. | 572 // target and the return address. |
576 static const int kCallTargetAddressOffset = 4 * kInstrSize; | 573 static const int kCallTargetAddressOffset = 4 * kInstrSize; |
577 | 574 |
578 // Distance between start of patched return sequence and the emitted address | |
579 // to jump to. | |
580 static const int kPatchReturnSequenceAddressOffset = 0; | |
581 | |
582 // Distance between start of patched debug break slot and the emitted address | 575 // Distance between start of patched debug break slot and the emitted address |
583 // to jump to. | 576 // to jump to. |
584 static const int kPatchDebugBreakSlotAddressOffset = 0 * kInstrSize; | 577 static const int kPatchDebugBreakSlotAddressOffset = 4 * kInstrSize; |
585 | 578 |
586 // Difference between address of current opcode and value read from pc | 579 // Difference between address of current opcode and value read from pc |
587 // register. | 580 // register. |
588 static const int kPcLoadDelta = 4; | 581 static const int kPcLoadDelta = 4; |
589 | 582 |
590 static const int kPatchDebugBreakSlotReturnOffset = 4 * kInstrSize; | |
591 | |
592 // Number of instructions used for the JS return sequence. The constant is | |
593 // used by the debugger to patch the JS return sequence. | |
594 static const int kJSReturnSequenceInstructions = 7; | |
595 static const int kJSReturnSequenceLength = | |
596 kJSReturnSequenceInstructions * kInstrSize; | |
597 static const int kDebugBreakSlotInstructions = 4; | 583 static const int kDebugBreakSlotInstructions = 4; |
598 static const int kDebugBreakSlotLength = | 584 static const int kDebugBreakSlotLength = |
599 kDebugBreakSlotInstructions * kInstrSize; | 585 kDebugBreakSlotInstructions * kInstrSize; |
600 | 586 |
601 | 587 |
602 // --------------------------------------------------------------------------- | 588 // --------------------------------------------------------------------------- |
603 // Code generation. | 589 // Code generation. |
604 | 590 |
605 // Insert the smallest number of nop instructions | 591 // Insert the smallest number of nop instructions |
606 // possible to align the pc offset to a multiple | 592 // possible to align the pc offset to a multiple |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1051 } | 1037 } |
1052 | 1038 |
1053 private: | 1039 private: |
1054 Assembler* assem_; | 1040 Assembler* assem_; |
1055 | 1041 |
1056 DISALLOW_IMPLICIT_CONSTRUCTORS(BlockGrowBufferScope); | 1042 DISALLOW_IMPLICIT_CONSTRUCTORS(BlockGrowBufferScope); |
1057 }; | 1043 }; |
1058 | 1044 |
1059 // Debugging. | 1045 // Debugging. |
1060 | 1046 |
1061 // Mark address of the ExitJSFrame code. | |
1062 void RecordJSReturn(); | |
1063 | |
1064 // Mark generator continuation. | 1047 // Mark generator continuation. |
1065 void RecordGeneratorContinuation(); | 1048 void RecordGeneratorContinuation(); |
1066 | 1049 |
1067 // Mark address of a debug break slot. | 1050 // Mark address of a debug break slot. |
1068 void RecordDebugBreakSlot(); | 1051 void RecordDebugBreakSlot(RelocInfo::Mode mode, int argc = 0); |
1069 void RecordDebugBreakSlotForCall(int argc); | |
1070 void RecordDebugBreakSlotForConstructCall(); | |
1071 | 1052 |
1072 // Record the AST id of the CallIC being compiled, so that it can be placed | 1053 // Record the AST id of the CallIC being compiled, so that it can be placed |
1073 // in the relocation information. | 1054 // in the relocation information. |
1074 void SetRecordedAstId(TypeFeedbackId ast_id) { | 1055 void SetRecordedAstId(TypeFeedbackId ast_id) { |
1075 DCHECK(recorded_ast_id_.IsNone()); | 1056 DCHECK(recorded_ast_id_.IsNone()); |
1076 recorded_ast_id_ = ast_id; | 1057 recorded_ast_id_ = ast_id; |
1077 } | 1058 } |
1078 | 1059 |
1079 TypeFeedbackId RecordedAstId() { | 1060 TypeFeedbackId RecordedAstId() { |
1080 DCHECK(!recorded_ast_id_.IsNone()); | 1061 DCHECK(!recorded_ast_id_.IsNone()); |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1464 class EnsureSpace BASE_EMBEDDED { | 1445 class EnsureSpace BASE_EMBEDDED { |
1465 public: | 1446 public: |
1466 explicit EnsureSpace(Assembler* assembler) { | 1447 explicit EnsureSpace(Assembler* assembler) { |
1467 assembler->CheckBuffer(); | 1448 assembler->CheckBuffer(); |
1468 } | 1449 } |
1469 }; | 1450 }; |
1470 | 1451 |
1471 } } // namespace v8::internal | 1452 } } // namespace v8::internal |
1472 | 1453 |
1473 #endif // V8_ARM_ASSEMBLER_MIPS_H_ | 1454 #endif // V8_ARM_ASSEMBLER_MIPS_H_ |
OLD | NEW |