Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: src/a64/assembler-a64.h

Issue 169893002: A64: Let the MacroAssembler resolve branches to distant targets. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed Ulan's comments. Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/a64/assembler-a64.cc » ('j') | test/mjsunit/mjsunit.status » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 11 matching lines...) Expand all
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 #ifndef V8_A64_ASSEMBLER_A64_H_ 28 #ifndef V8_A64_ASSEMBLER_A64_H_
29 #define V8_A64_ASSEMBLER_A64_H_ 29 #define V8_A64_ASSEMBLER_A64_H_
30 30
31 #include <list> 31 #include <list>
32 #include <map>
32 33
33 #include "globals.h" 34 #include "globals.h"
34 #include "utils.h" 35 #include "utils.h"
35 #include "assembler.h" 36 #include "assembler.h"
36 #include "serialize.h" 37 #include "serialize.h"
37 #include "a64/instructions-a64.h" 38 #include "a64/instructions-a64.h"
38 #include "a64/cpu-a64.h" 39 #include "a64/cpu-a64.h"
39 40
40 41
41 namespace v8 { 42 namespace v8 {
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 // 723 //
723 // The descriptor (desc) can be NULL. In that case, the code is finalized as 724 // The descriptor (desc) can be NULL. In that case, the code is finalized as
724 // usual, but the descriptor is not populated. 725 // usual, but the descriptor is not populated.
725 void GetCode(CodeDesc* desc); 726 void GetCode(CodeDesc* desc);
726 727
727 // Insert the smallest number of nop instructions 728 // Insert the smallest number of nop instructions
728 // possible to align the pc offset to a multiple 729 // possible to align the pc offset to a multiple
729 // of m. m must be a power of 2 (>= 4). 730 // of m. m must be a power of 2 (>= 4).
730 void Align(int m); 731 void Align(int m);
731 732
733 inline void Unreachable();
734
732 // Label -------------------------------------------------------------------- 735 // Label --------------------------------------------------------------------
733 // Bind a label to the current pc. Note that labels can only be bound once, 736 // Bind a label to the current pc. Note that labels can only be bound once,
734 // and if labels are linked to other instructions, they _must_ be bound 737 // and if labels are linked to other instructions, they _must_ be bound
735 // before they go out of scope. 738 // before they go out of scope.
736 void bind(Label* label); 739 void bind(Label* label);
737 740
738 741
739 // RelocInfo and constant pool ---------------------------------------------- 742 // RelocInfo and constant pool ----------------------------------------------
740 743
741 // Record relocation information for current pc_. 744 // Record relocation information for current pc_.
(...skipping 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after
1794 static inline LoadStorePairOp LoadPairOpFor(const CPURegister& rt, 1797 static inline LoadStorePairOp LoadPairOpFor(const CPURegister& rt,
1795 const CPURegister& rt2); 1798 const CPURegister& rt2);
1796 static inline LoadStoreOp StoreOpFor(const CPURegister& rt); 1799 static inline LoadStoreOp StoreOpFor(const CPURegister& rt);
1797 static inline LoadStorePairOp StorePairOpFor(const CPURegister& rt, 1800 static inline LoadStorePairOp StorePairOpFor(const CPURegister& rt,
1798 const CPURegister& rt2); 1801 const CPURegister& rt2);
1799 static inline LoadStorePairNonTemporalOp LoadPairNonTemporalOpFor( 1802 static inline LoadStorePairNonTemporalOp LoadPairNonTemporalOpFor(
1800 const CPURegister& rt, const CPURegister& rt2); 1803 const CPURegister& rt, const CPURegister& rt2);
1801 static inline LoadStorePairNonTemporalOp StorePairNonTemporalOpFor( 1804 static inline LoadStorePairNonTemporalOp StorePairNonTemporalOpFor(
1802 const CPURegister& rt, const CPURegister& rt2); 1805 const CPURegister& rt, const CPURegister& rt2);
1803 1806
1807 // Remove the specified branch from the unbound label link chain.
1808 // If available, a veneer for this label can be used for other branches in the
1809 // chain if the link chain cannot be fixed up without this branch.
1810 void RemoveBranchFromLabelLinkChain(Instruction* branch,
1811 Label* label,
1812 Instruction* label_veneer = NULL);
1804 1813
1805 private: 1814 private:
1806 // Instruction helpers. 1815 // Instruction helpers.
1807 void MoveWide(const Register& rd, 1816 void MoveWide(const Register& rd,
1808 uint64_t imm, 1817 uint64_t imm,
1809 int shift, 1818 int shift,
1810 MoveWideImmediateOp mov_op); 1819 MoveWideImmediateOp mov_op);
1811 void DataProcShiftedRegister(const Register& rd, 1820 void DataProcShiftedRegister(const Register& rd,
1812 const Register& rn, 1821 const Register& rn,
1813 const Operand& operand, 1822 const Operand& operand,
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
1980 } 1989 }
1981 1990
1982 // Code generation 1991 // Code generation
1983 // The relocation writer's position is at least kGap bytes below the end of 1992 // The relocation writer's position is at least kGap bytes below the end of
1984 // the generated instructions. This is so that multi-instruction sequences do 1993 // the generated instructions. This is so that multi-instruction sequences do
1985 // not have to check for overflow. The same is true for writes of large 1994 // not have to check for overflow. The same is true for writes of large
1986 // relocation info entries, and debug strings encoded in the instruction 1995 // relocation info entries, and debug strings encoded in the instruction
1987 // stream. 1996 // stream.
1988 static const int kGap = 128; 1997 static const int kGap = 128;
1989 1998
1999 public:
2000 class FarBranchInfo {
2001 public:
2002 FarBranchInfo(int offset, Label* label)
2003 : pc_offset_(offset), label_(label) {}
2004 // Offset of the branch in the code generation buffer.
2005 int pc_offset_;
2006 // The label branched to.
2007 Label* label_;
2008 };
2009
2010 protected:
2011 // Information about unresolved (forward) branches.
2012 // The Assembler is only allowed to delete out-of-date information from here
2013 // after a label is bound. The MacroAssembler uses this information to
2014 // generate veneers.
2015 //
2016 // The second member gives information about the unresolved branch. The first
2017 // member of the pair is the maximum offset that the branch can reach in the
2018 // buffer. The map is sorted according to this reachable offset, allowing to
2019 // easily check when veneers need to be emitted.
2020 // Note that the maximum reachable offset (first member of the pairs) should
2021 // always be positive but has the same type as the return value for
2022 // pc_offset() for convenience.
2023 std::multimap<int, FarBranchInfo> unresolved_branches_;
2024
2025 private:
2026 // If a veneer is emitted for a branch instruction, that instruction must be
2027 // removed from the associated label's link chain so that the assembler does
2028 // not later attempt (likely unsuccessfully) to patch it to branch directly to
2029 // the label.
2030 void DeleteUnresolvedBranchInfoForLabel(Label* label);
2031
1990 private: 2032 private:
1991 // TODO(jbramley): VIXL uses next_literal_pool_check_ and 2033 // TODO(jbramley): VIXL uses next_literal_pool_check_ and
1992 // literal_pool_monitor_ to determine when to consider emitting a literal 2034 // literal_pool_monitor_ to determine when to consider emitting a literal
1993 // pool. V8 doesn't use them, so they should either not be here at all, or 2035 // pool. V8 doesn't use them, so they should either not be here at all, or
1994 // should replace or be merged with next_buffer_check_ and 2036 // should replace or be merged with next_buffer_check_ and
1995 // const_pool_blocked_nesting_. 2037 // const_pool_blocked_nesting_.
1996 Instruction* next_literal_pool_check_; 2038 Instruction* next_literal_pool_check_;
1997 unsigned literal_pool_monitor_; 2039 unsigned literal_pool_monitor_;
1998 2040
1999 PositionsRecorder positions_recorder_; 2041 PositionsRecorder positions_recorder_;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2043 class EnsureSpace BASE_EMBEDDED { 2085 class EnsureSpace BASE_EMBEDDED {
2044 public: 2086 public:
2045 explicit EnsureSpace(Assembler* assembler) { 2087 explicit EnsureSpace(Assembler* assembler) {
2046 assembler->CheckBuffer(); 2088 assembler->CheckBuffer();
2047 } 2089 }
2048 }; 2090 };
2049 2091
2050 } } // namespace v8::internal 2092 } } // namespace v8::internal
2051 2093
2052 #endif // V8_A64_ASSEMBLER_A64_H_ 2094 #endif // V8_A64_ASSEMBLER_A64_H_
OLDNEW
« no previous file with comments | « no previous file | src/a64/assembler-a64.cc » ('j') | test/mjsunit/mjsunit.status » ('J')

Powered by Google App Engine
This is Rietveld 408576698