| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 VM_ASSEMBLER_ARM64_H_ | 5 #ifndef VM_ASSEMBLER_ARM64_H_ |
| 6 #define VM_ASSEMBLER_ARM64_H_ | 6 #define VM_ASSEMBLER_ARM64_H_ |
| 7 | 7 |
| 8 #ifndef VM_ASSEMBLER_H_ | 8 #ifndef VM_ASSEMBLER_H_ |
| 9 #error Do not include assembler_arm64.h directly; use assembler.h instead. | 9 #error Do not include assembler_arm64.h directly; use assembler.h instead. |
| 10 #endif | 10 #endif |
| (...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1145 fldrd(reg, Address(SP, 1 * kDoubleSize, Address::PostIndex)); | 1145 fldrd(reg, Address(SP, 1 * kDoubleSize, Address::PostIndex)); |
| 1146 } | 1146 } |
| 1147 void PopQuad(VRegister reg) { | 1147 void PopQuad(VRegister reg) { |
| 1148 fldrq(reg, Address(SP, 1 * kQuadSize, Address::PostIndex)); | 1148 fldrq(reg, Address(SP, 1 * kQuadSize, Address::PostIndex)); |
| 1149 } | 1149 } |
| 1150 void TagAndPushPP() { | 1150 void TagAndPushPP() { |
| 1151 // Add the heap object tag back to PP before putting it on the stack. | 1151 // Add the heap object tag back to PP before putting it on the stack. |
| 1152 add(TMP, PP, Operand(kHeapObjectTag)); | 1152 add(TMP, PP, Operand(kHeapObjectTag)); |
| 1153 str(TMP, Address(SP, -1 * kWordSize, Address::PreIndex)); | 1153 str(TMP, Address(SP, -1 * kWordSize, Address::PreIndex)); |
| 1154 } | 1154 } |
| 1155 void TagAndPushPPAndPcMarker(Register pc_marker_reg) { | 1155 void TagAndPushPPAndPcMarker() { |
| 1156 ASSERT(pc_marker_reg != TMP2); | 1156 COMPILE_ASSERT(CODE_REG != TMP2); |
| 1157 // Add the heap object tag back to PP before putting it on the stack. | 1157 // Add the heap object tag back to PP before putting it on the stack. |
| 1158 add(TMP2, PP, Operand(kHeapObjectTag)); | 1158 add(TMP2, PP, Operand(kHeapObjectTag)); |
| 1159 stp(TMP2, pc_marker_reg, | 1159 stp(TMP2, CODE_REG, |
| 1160 Address(SP, -2 * kWordSize, Address::PairPreIndex)); | 1160 Address(SP, -2 * kWordSize, Address::PairPreIndex)); |
| 1161 } | 1161 } |
| 1162 void PopAndUntagPP() { | 1162 void PopAndUntagPP() { |
| 1163 ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex)); | 1163 ldr(PP, Address(SP, 1 * kWordSize, Address::PostIndex)); |
| 1164 sub(PP, PP, Operand(kHeapObjectTag)); | 1164 sub(PP, PP, Operand(kHeapObjectTag)); |
| 1165 // The caller of PopAndUntagPP() must explicitly allow use of popped PP. | 1165 // The caller of PopAndUntagPP() must explicitly allow use of popped PP. |
| 1166 set_constant_pool_allowed(false); | 1166 set_constant_pool_allowed(false); |
| 1167 } | 1167 } |
| 1168 void tst(Register rn, Operand o) { | 1168 void tst(Register rn, Operand o) { |
| 1169 ands(ZR, rn, o); | 1169 ands(ZR, rn, o); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1191 void SmiUntag(Register dst, Register src) { | 1191 void SmiUntag(Register dst, Register src) { |
| 1192 AsrImmediate(dst, src, kSmiTagSize); | 1192 AsrImmediate(dst, src, kSmiTagSize); |
| 1193 } | 1193 } |
| 1194 void SmiTag(Register reg) { | 1194 void SmiTag(Register reg) { |
| 1195 LslImmediate(reg, reg, kSmiTagSize); | 1195 LslImmediate(reg, reg, kSmiTagSize); |
| 1196 } | 1196 } |
| 1197 void SmiTag(Register dst, Register src) { | 1197 void SmiTag(Register dst, Register src) { |
| 1198 LslImmediate(dst, src, kSmiTagSize); | 1198 LslImmediate(dst, src, kSmiTagSize); |
| 1199 } | 1199 } |
| 1200 | 1200 |
| 1201 void Branch(const StubEntry& stub_entry); | 1201 void Branch(const StubEntry& stub_entry, |
| 1202 Register pp, |
| 1203 Patchability patchable = kNotPatchable); |
| 1202 void BranchPatchable(const StubEntry& stub_entry); | 1204 void BranchPatchable(const StubEntry& stub_entry); |
| 1203 | 1205 |
| 1204 void BranchLink(const ExternalLabel* label); | 1206 void BranchLink(const StubEntry& stub_entry, |
| 1205 void BranchLink(const StubEntry& stub_entry); | 1207 Patchability patchable = kNotPatchable); |
| 1206 | 1208 |
| 1207 // BranchLinkPatchable must be a fixed-length sequence so we can patch it | |
| 1208 // with the debugger. | |
| 1209 void BranchLinkPatchable(const StubEntry& stub_entry); | 1209 void BranchLinkPatchable(const StubEntry& stub_entry); |
| 1210 | 1210 |
| 1211 // Macros accepting a pp Register argument may attempt to load values from | 1211 // Macros accepting a pp Register argument may attempt to load values from |
| 1212 // the object pool when possible. Unless you are sure that the untagged object | 1212 // the object pool when possible. Unless you are sure that the untagged object |
| 1213 // pool pointer is in another register, or that it is not available at all, | 1213 // pool pointer is in another register, or that it is not available at all, |
| 1214 // PP should be passed for pp. | 1214 // PP should be passed for pp. |
| 1215 void AddImmediate(Register dest, Register rn, int64_t imm); | 1215 void AddImmediate(Register dest, Register rn, int64_t imm); |
| 1216 void AddImmediateSetFlags(Register dest, Register rn, int64_t imm); | 1216 void AddImmediateSetFlags(Register dest, Register rn, int64_t imm); |
| 1217 void SubImmediateSetFlags(Register dest, Register rn, int64_t imm); | 1217 void SubImmediateSetFlags(Register dest, Register rn, int64_t imm); |
| 1218 void AndImmediate(Register rd, Register rn, int64_t imm); | 1218 void AndImmediate(Register rd, Register rn, int64_t imm); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1276 // Object pool, loading from pool, etc. | 1276 // Object pool, loading from pool, etc. |
| 1277 void LoadPoolPointer(Register pp = PP); | 1277 void LoadPoolPointer(Register pp = PP); |
| 1278 | 1278 |
| 1279 bool constant_pool_allowed() const { | 1279 bool constant_pool_allowed() const { |
| 1280 return constant_pool_allowed_; | 1280 return constant_pool_allowed_; |
| 1281 } | 1281 } |
| 1282 void set_constant_pool_allowed(bool b) { | 1282 void set_constant_pool_allowed(bool b) { |
| 1283 constant_pool_allowed_ = b; | 1283 constant_pool_allowed_ = b; |
| 1284 } | 1284 } |
| 1285 | 1285 |
| 1286 void LoadWordFromPoolOffset(Register dst, uint32_t offset); | |
| 1287 void LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset); | |
| 1288 intptr_t FindImmediate(int64_t imm); | 1286 intptr_t FindImmediate(int64_t imm); |
| 1289 bool CanLoadFromObjectPool(const Object& object) const; | 1287 bool CanLoadFromObjectPool(const Object& object) const; |
| 1290 void LoadExternalLabel(Register dst, const ExternalLabel* label); | 1288 void LoadExternalLabel(Register dst, const ExternalLabel* label); |
| 1291 void LoadNativeEntry(Register dst, const ExternalLabel* label); | 1289 void LoadNativeEntry(Register dst, const ExternalLabel* label); |
| 1292 void LoadExternalLabelFixed(Register dst, | 1290 void LoadExternalLabelFixed(Register dst, |
| 1293 const ExternalLabel* label, | 1291 const ExternalLabel* label, |
| 1294 Patchability patchable); | 1292 Patchability patchable); |
| 1295 void LoadFunctionFromCalleePool(Register dst, | 1293 void LoadFunctionFromCalleePool(Register dst, |
| 1296 const Function& function, | 1294 const Function& function, |
| 1297 Register new_pp); | 1295 Register new_pp); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1333 | 1331 |
| 1334 // When entering Dart code from C++, we copy the system stack pointer (CSP) | 1332 // When entering Dart code from C++, we copy the system stack pointer (CSP) |
| 1335 // to the Dart stack pointer (SP), and reserve a little space for the stack | 1333 // to the Dart stack pointer (SP), and reserve a little space for the stack |
| 1336 // to grow. | 1334 // to grow. |
| 1337 void SetupDartSP(intptr_t reserved_space) { | 1335 void SetupDartSP(intptr_t reserved_space) { |
| 1338 ASSERT(Utils::IsAligned(reserved_space, 16)); | 1336 ASSERT(Utils::IsAligned(reserved_space, 16)); |
| 1339 mov(SP, CSP); | 1337 mov(SP, CSP); |
| 1340 sub(CSP, CSP, Operand(reserved_space)); | 1338 sub(CSP, CSP, Operand(reserved_space)); |
| 1341 } | 1339 } |
| 1342 | 1340 |
| 1341 void CheckCodePointer(); |
| 1342 void RestoreCodePointer(); |
| 1343 |
| 1343 void EnterDartFrame(intptr_t frame_size, Register new_pp = kNoRegister); | 1344 void EnterDartFrame(intptr_t frame_size, Register new_pp = kNoRegister); |
| 1344 void EnterOsrFrame(intptr_t extra_size, Register new_pp); | 1345 void EnterOsrFrame(intptr_t extra_size, Register new_pp); |
| 1345 void LeaveDartFrame(); | 1346 void LeaveDartFrame(RestorePP restore_pp = kRestoreCallerPP); |
| 1346 | 1347 |
| 1347 void EnterCallRuntimeFrame(intptr_t frame_size); | 1348 void EnterCallRuntimeFrame(intptr_t frame_size); |
| 1348 void LeaveCallRuntimeFrame(); | 1349 void LeaveCallRuntimeFrame(); |
| 1349 void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count); | 1350 void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count); |
| 1350 | 1351 |
| 1351 // Set up a stub frame so that the stack traversal code can easily identify | 1352 // Set up a stub frame so that the stack traversal code can easily identify |
| 1352 // a stub frame. | 1353 // a stub frame. |
| 1353 void EnterStubFrame(); | 1354 void EnterStubFrame(); |
| 1354 void LeaveStubFrame(); | 1355 void LeaveStubFrame(); |
| 1355 | 1356 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1419 intptr_t pc_offset_; | 1420 intptr_t pc_offset_; |
| 1420 const String& comment_; | 1421 const String& comment_; |
| 1421 | 1422 |
| 1422 DISALLOW_COPY_AND_ASSIGN(CodeComment); | 1423 DISALLOW_COPY_AND_ASSIGN(CodeComment); |
| 1423 }; | 1424 }; |
| 1424 | 1425 |
| 1425 GrowableArray<CodeComment*> comments_; | 1426 GrowableArray<CodeComment*> comments_; |
| 1426 | 1427 |
| 1427 bool constant_pool_allowed_; | 1428 bool constant_pool_allowed_; |
| 1428 | 1429 |
| 1429 void Branch(const ExternalLabel* label); | 1430 void LoadWordFromPoolOffset(Register dst, uint32_t offset, Register pp = PP); |
| 1430 void BranchPatchable(const ExternalLabel* label); | 1431 void LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset); |
| 1431 void BranchLinkPatchable(const ExternalLabel* label); | |
| 1432 | 1432 |
| 1433 void LoadObjectHelper(Register dst, const Object& obj, bool is_unique); | 1433 void LoadObjectHelper(Register dst, const Object& obj, bool is_unique); |
| 1434 | 1434 |
| 1435 void AddSubHelper(OperandSize os, bool set_flags, bool subtract, | 1435 void AddSubHelper(OperandSize os, bool set_flags, bool subtract, |
| 1436 Register rd, Register rn, Operand o) { | 1436 Register rd, Register rn, Operand o) { |
| 1437 ASSERT((rd != R31) && (rn != R31)); | 1437 ASSERT((rd != R31) && (rn != R31)); |
| 1438 const Register crd = ConcreteRegister(rd); | 1438 const Register crd = ConcreteRegister(rd); |
| 1439 const Register crn = ConcreteRegister(rn); | 1439 const Register crn = ConcreteRegister(rn); |
| 1440 if (o.type() == Operand::Immediate) { | 1440 if (o.type() == Operand::Immediate) { |
| 1441 ASSERT(rn != ZR); | 1441 ASSERT(rn != ZR); |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1924 Register value, | 1924 Register value, |
| 1925 Label* no_update); | 1925 Label* no_update); |
| 1926 | 1926 |
| 1927 DISALLOW_ALLOCATION(); | 1927 DISALLOW_ALLOCATION(); |
| 1928 DISALLOW_COPY_AND_ASSIGN(Assembler); | 1928 DISALLOW_COPY_AND_ASSIGN(Assembler); |
| 1929 }; | 1929 }; |
| 1930 | 1930 |
| 1931 } // namespace dart | 1931 } // namespace dart |
| 1932 | 1932 |
| 1933 #endif // VM_ASSEMBLER_ARM64_H_ | 1933 #endif // VM_ASSEMBLER_ARM64_H_ |
| OLD | NEW |