| OLD | NEW | 
|---|
| 1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 #ifndef RUNTIME_VM_ASSEMBLER_ARM_H_ | 5 #ifndef RUNTIME_VM_ASSEMBLER_ARM_H_ | 
| 6 #define RUNTIME_VM_ASSEMBLER_ARM_H_ | 6 #define RUNTIME_VM_ASSEMBLER_ARM_H_ | 
| 7 | 7 | 
| 8 #ifndef RUNTIME_VM_ASSEMBLER_H_ | 8 #ifndef RUNTIME_VM_ASSEMBLER_H_ | 
| 9 #error Do not include assembler_arm.h directly; use assembler.h instead. | 9 #error Do not include assembler_arm.h directly; use assembler.h instead. | 
| 10 #endif | 10 #endif | 
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 359     return *this; | 359     return *this; | 
| 360   } | 360   } | 
| 361 }; | 361 }; | 
| 362 | 362 | 
| 363 | 363 | 
| 364 class Assembler : public ValueObject { | 364 class Assembler : public ValueObject { | 
| 365  public: | 365  public: | 
| 366   explicit Assembler(bool use_far_branches = false) | 366   explicit Assembler(bool use_far_branches = false) | 
| 367       : buffer_(), | 367       : buffer_(), | 
| 368         prologue_offset_(-1), | 368         prologue_offset_(-1), | 
|  | 369         has_single_entry_point_(true), | 
| 369         use_far_branches_(use_far_branches), | 370         use_far_branches_(use_far_branches), | 
| 370         comments_(), | 371         comments_(), | 
| 371         constant_pool_allowed_(false) { | 372         constant_pool_allowed_(false) { | 
| 372     MonomorphicCheckedEntry(); |  | 
| 373   } | 373   } | 
| 374 | 374 | 
| 375   ~Assembler() { } | 375   ~Assembler() { } | 
| 376 | 376 | 
| 377   void PopRegister(Register r) { Pop(r); } | 377   void PopRegister(Register r) { Pop(r); } | 
| 378 | 378 | 
| 379   void Bind(Label* label); | 379   void Bind(Label* label); | 
| 380   void Jump(Label* label) { b(label); } | 380   void Jump(Label* label) { b(label); } | 
| 381 | 381 | 
| 382   // Misc. functionality | 382   // Misc. functionality | 
| 383   intptr_t CodeSize() const { return buffer_.Size(); } | 383   intptr_t CodeSize() const { return buffer_.Size(); } | 
| 384   intptr_t prologue_offset() const { return prologue_offset_; } | 384   intptr_t prologue_offset() const { return prologue_offset_; } | 
|  | 385   bool has_single_entry_point() const { return has_single_entry_point_; } | 
| 385 | 386 | 
| 386   // Count the fixups that produce a pointer offset, without processing | 387   // Count the fixups that produce a pointer offset, without processing | 
| 387   // the fixups.  On ARM there are no pointers in code. | 388   // the fixups.  On ARM there are no pointers in code. | 
| 388   intptr_t CountPointerOffsets() const { return 0; } | 389   intptr_t CountPointerOffsets() const { return 0; } | 
| 389 | 390 | 
| 390   const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const { | 391   const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const { | 
| 391     ASSERT(buffer_.pointer_offsets().length() == 0);  // No pointers in code. | 392     ASSERT(buffer_.pointer_offsets().length() == 0);  // No pointers in code. | 
| 392     return buffer_.pointer_offsets(); | 393     return buffer_.pointer_offsets(); | 
| 393   } | 394   } | 
| 394 | 395 | 
| (...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 939   // Set up a Dart frame for a function compiled for on-stack replacement. | 940   // Set up a Dart frame for a function compiled for on-stack replacement. | 
| 940   // The frame layout is a normal Dart frame, but the frame is partially set | 941   // The frame layout is a normal Dart frame, but the frame is partially set | 
| 941   // up on entry (it is the frame of the unoptimized code). | 942   // up on entry (it is the frame of the unoptimized code). | 
| 942   void EnterOsrFrame(intptr_t extra_size); | 943   void EnterOsrFrame(intptr_t extra_size); | 
| 943 | 944 | 
| 944   // Set up a stub frame so that the stack traversal code can easily identify | 945   // Set up a stub frame so that the stack traversal code can easily identify | 
| 945   // a stub frame. | 946   // a stub frame. | 
| 946   void EnterStubFrame(); | 947   void EnterStubFrame(); | 
| 947   void LeaveStubFrame(); | 948   void LeaveStubFrame(); | 
| 948 | 949 | 
| 949   void NoMonomorphicCheckedEntry(); |  | 
| 950   void MonomorphicCheckedEntry(); | 950   void MonomorphicCheckedEntry(); | 
| 951 | 951 | 
| 952   // The register into which the allocation stats table is loaded with | 952   // The register into which the allocation stats table is loaded with | 
| 953   // LoadAllocationStatsAddress should be passed to | 953   // LoadAllocationStatsAddress should be passed to | 
| 954   // IncrementAllocationStats(WithSize) as stats_addr_reg to update the | 954   // IncrementAllocationStats(WithSize) as stats_addr_reg to update the | 
| 955   // allocation stats. These are separate assembler macros so we can | 955   // allocation stats. These are separate assembler macros so we can | 
| 956   // avoid a dependent load too nearby the load of the table address. | 956   // avoid a dependent load too nearby the load of the table address. | 
| 957   void LoadAllocationStatsAddress(Register dest, | 957   void LoadAllocationStatsAddress(Register dest, | 
| 958                                   intptr_t cid); | 958                                   intptr_t cid); | 
| 959   void IncrementAllocationStats(Register stats_addr, | 959   void IncrementAllocationStats(Register stats_addr, | 
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1034   bool constant_pool_allowed() const { | 1034   bool constant_pool_allowed() const { | 
| 1035     return constant_pool_allowed_; | 1035     return constant_pool_allowed_; | 
| 1036   } | 1036   } | 
| 1037   void set_constant_pool_allowed(bool b) { | 1037   void set_constant_pool_allowed(bool b) { | 
| 1038     constant_pool_allowed_ = b; | 1038     constant_pool_allowed_ = b; | 
| 1039   } | 1039   } | 
| 1040 | 1040 | 
| 1041  private: | 1041  private: | 
| 1042   AssemblerBuffer buffer_;  // Contains position independent code. | 1042   AssemblerBuffer buffer_;  // Contains position independent code. | 
| 1043   ObjectPoolWrapper object_pool_wrapper_; | 1043   ObjectPoolWrapper object_pool_wrapper_; | 
| 1044 |  | 
| 1045   int32_t prologue_offset_; | 1044   int32_t prologue_offset_; | 
| 1046 | 1045   bool has_single_entry_point_; | 
| 1047   bool use_far_branches_; | 1046   bool use_far_branches_; | 
| 1048 | 1047 | 
| 1049   // If you are thinking of using one or both of these instructions directly, | 1048   // If you are thinking of using one or both of these instructions directly, | 
| 1050   // instead LoadImmediate should probably be used. | 1049   // instead LoadImmediate should probably be used. | 
| 1051   void movw(Register rd, uint16_t imm16, Condition cond = AL); | 1050   void movw(Register rd, uint16_t imm16, Condition cond = AL); | 
| 1052   void movt(Register rd, uint16_t imm16, Condition cond = AL); | 1051   void movt(Register rd, uint16_t imm16, Condition cond = AL); | 
| 1053 | 1052 | 
| 1054   void BindARMv6(Label* label); | 1053   void BindARMv6(Label* label); | 
| 1055   void BindARMv7(Label* label); | 1054   void BindARMv7(Label* label); | 
| 1056 | 1055 | 
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1194                                   Register value, | 1193                                   Register value, | 
| 1195                                   Label* no_update); | 1194                                   Label* no_update); | 
| 1196 | 1195 | 
| 1197   DISALLOW_ALLOCATION(); | 1196   DISALLOW_ALLOCATION(); | 
| 1198   DISALLOW_COPY_AND_ASSIGN(Assembler); | 1197   DISALLOW_COPY_AND_ASSIGN(Assembler); | 
| 1199 }; | 1198 }; | 
| 1200 | 1199 | 
| 1201 }  // namespace dart | 1200 }  // namespace dart | 
| 1202 | 1201 | 
| 1203 #endif  // RUNTIME_VM_ASSEMBLER_ARM_H_ | 1202 #endif  // RUNTIME_VM_ASSEMBLER_ARM_H_ | 
| OLD | NEW | 
|---|