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 2152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2163 // different ranges. While the Assembler will fail to assemble a branch | 2163 // different ranges. While the Assembler will fail to assemble a branch |
2164 // exceeding its range, the MacroAssembler offers a mechanism to resolve | 2164 // exceeding its range, the MacroAssembler offers a mechanism to resolve |
2165 // branches to too distant targets, either by tweaking the generated code to | 2165 // branches to too distant targets, either by tweaking the generated code to |
2166 // use branch instructions with wider ranges or generating veneers. | 2166 // use branch instructions with wider ranges or generating veneers. |
2167 // | 2167 // |
2168 // Currently branches to distant targets are resolved using unconditional | 2168 // Currently branches to distant targets are resolved using unconditional |
2169 // branch isntructions with a range of +-128MB. If that becomes too little | 2169 // branch isntructions with a range of +-128MB. If that becomes too little |
2170 // (!), the mechanism can be extended to generate special veneers for really | 2170 // (!), the mechanism can be extended to generate special veneers for really |
2171 // far targets. | 2171 // far targets. |
2172 | 2172 |
2173 // Returns true if we should emit a veneer as soon as possible for a branch | |
2174 // which can at most reach to specified pc. | |
2175 bool ShouldEmitVeneer(int max_reachable_pc, | |
2176 int margin = kVeneerDistanceMargin); | |
2177 | |
2178 // The maximum code size generated for a veneer. Currently one branch | |
2179 // instruction. This is for code size checking purposes, and can be extended | |
2180 // in the future for example if we decide to add nops between the veneers. | |
2181 static const int kMaxVeneerCodeSize = 1 * kInstructionSize; | |
2182 | |
2183 // Emits veneers for branches that are approaching their maximum range. | |
2184 // If need_protection is true, the veneers are protected by a branch jumping | |
2185 // over the code. | |
2186 void EmitVeneers(bool need_protection); | |
2187 void EmitVeneersGuard(); | |
2188 // Checks wether veneers need to be emitted at this point. | |
2189 void CheckVeneers(bool need_protection); | |
2190 | |
2191 // Helps resolve branching to labels potentially out of range. | 2173 // Helps resolve branching to labels potentially out of range. |
2192 // If the label is not bound, it registers the information necessary to later | 2174 // If the label is not bound, it registers the information necessary to later |
2193 // be able to emit a veneer for this branch if necessary. | 2175 // be able to emit a veneer for this branch if necessary. |
2194 // If the label is bound, it returns true if the label (or the previous link | 2176 // If the label is bound, it returns true if the label (or the previous link |
2195 // in the label chain) is out of range. In that case the caller is responsible | 2177 // in the label chain) is out of range. In that case the caller is responsible |
2196 // for generating appropriate code. | 2178 // for generating appropriate code. |
2197 // Otherwise it returns false. | 2179 // Otherwise it returns false. |
2198 // This function also checks wether veneers need to be emitted. | 2180 // This function also checks wether veneers need to be emitted. |
2199 bool NeedExtraInstructionsOrRegisterBranch(Label *label, | 2181 bool NeedExtraInstructionsOrRegisterBranch(Label *label, |
2200 ImmBranchType branch_type); | 2182 ImmBranchType branch_type); |
2201 | |
2202 private: | |
2203 // We generate a veneer for a branch if we reach within this distance of the | |
2204 // limit of the range. | |
2205 static const int kVeneerDistanceMargin = 4 * KB; | |
2206 int unresolved_branches_first_limit() const { | |
2207 ASSERT(!unresolved_branches_.empty()); | |
2208 return unresolved_branches_.begin()->first; | |
2209 } | |
2210 }; | 2183 }; |
2211 | 2184 |
2212 | 2185 |
2213 // Use this scope when you need a one-to-one mapping bewteen methods and | 2186 // Use this scope when you need a one-to-one mapping bewteen methods and |
2214 // instructions. This scope prevents the MacroAssembler from being called and | 2187 // instructions. This scope prevents the MacroAssembler from being called and |
2215 // literal pools from being emitted. It also asserts the number of instructions | 2188 // literal pools from being emitted. It also asserts the number of instructions |
2216 // emitted is what you specified when creating the scope. | 2189 // emitted is what you specified when creating the scope. |
2217 class InstructionAccurateScope BASE_EMBEDDED { | 2190 class InstructionAccurateScope BASE_EMBEDDED { |
2218 public: | 2191 public: |
2219 InstructionAccurateScope(MacroAssembler* masm, size_t count = 0) | 2192 InstructionAccurateScope(MacroAssembler* masm, size_t count = 0) |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2319 #error "Unsupported option" | 2292 #error "Unsupported option" |
2320 #define CODE_COVERAGE_STRINGIFY(x) #x | 2293 #define CODE_COVERAGE_STRINGIFY(x) #x |
2321 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x) | 2294 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x) |
2322 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) | 2295 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) |
2323 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm-> | 2296 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm-> |
2324 #else | 2297 #else |
2325 #define ACCESS_MASM(masm) masm-> | 2298 #define ACCESS_MASM(masm) masm-> |
2326 #endif | 2299 #endif |
2327 | 2300 |
2328 #endif // V8_A64_MACRO_ASSEMBLER_A64_H_ | 2301 #endif // V8_A64_MACRO_ASSEMBLER_A64_H_ |
OLD | NEW |