| OLD | NEW | 
|     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  Loading... | 
|    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  Loading... | 
|   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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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_ | 
| OLD | NEW |