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 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after 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 // Branching to ExternalLabels. | |
1202 void Branch(const ExternalLabel* label) { | |
1203 LoadExternalLabel(TMP, label); | |
1204 br(TMP); | |
1205 } | |
1206 | |
1207 void Branch(const StubEntry& stub_entry); | 1201 void Branch(const StubEntry& stub_entry); |
1208 | |
1209 // Fixed length branch to label. | |
1210 void BranchPatchable(const ExternalLabel* label) { | |
1211 // TODO(zra): Use LoadExternalLabelFixed if possible. | |
1212 LoadImmediateFixed(TMP, label->address()); | |
1213 br(TMP); | |
1214 } | |
1215 | |
1216 void BranchPatchable(const StubEntry& stub_entry); | 1202 void BranchPatchable(const StubEntry& stub_entry); |
1217 | 1203 |
1218 void BranchLink(const ExternalLabel* label) { | 1204 void BranchLink(const ExternalLabel* label); |
1219 LoadExternalLabel(TMP, label); | |
1220 blr(TMP); | |
1221 } | |
1222 | |
1223 void BranchLink(const StubEntry& stub_entry); | 1205 void BranchLink(const StubEntry& stub_entry); |
1224 | 1206 |
1225 // BranchLinkPatchable must be a fixed-length sequence so we can patch it | 1207 // BranchLinkPatchable must be a fixed-length sequence so we can patch it |
1226 // with the debugger. | 1208 // with the debugger. |
1227 void BranchLinkPatchable(const ExternalLabel* label) { | |
1228 LoadExternalLabelFixed(TMP, label, kPatchable); | |
1229 blr(TMP); | |
1230 } | |
1231 | |
1232 void BranchLinkPatchable(const StubEntry& stub_entry); | 1209 void BranchLinkPatchable(const StubEntry& stub_entry); |
1233 | 1210 |
1234 // 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 |
1235 // 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 |
1236 // 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, |
1237 // PP should be passed for pp. | 1214 // PP should be passed for pp. |
1238 void AddImmediate(Register dest, Register rn, int64_t imm); | 1215 void AddImmediate(Register dest, Register rn, int64_t imm); |
1239 void AddImmediateSetFlags(Register dest, Register rn, int64_t imm); | 1216 void AddImmediateSetFlags(Register dest, Register rn, int64_t imm); |
1240 void SubImmediateSetFlags(Register dest, Register rn, int64_t imm); | 1217 void SubImmediateSetFlags(Register dest, Register rn, int64_t imm); |
1241 void AndImmediate(Register rd, Register rn, int64_t imm); | 1218 void AndImmediate(Register rd, Register rn, int64_t imm); |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1441 intptr_t pc_offset_; | 1418 intptr_t pc_offset_; |
1442 const String& comment_; | 1419 const String& comment_; |
1443 | 1420 |
1444 DISALLOW_COPY_AND_ASSIGN(CodeComment); | 1421 DISALLOW_COPY_AND_ASSIGN(CodeComment); |
1445 }; | 1422 }; |
1446 | 1423 |
1447 GrowableArray<CodeComment*> comments_; | 1424 GrowableArray<CodeComment*> comments_; |
1448 | 1425 |
1449 bool constant_pool_allowed_; | 1426 bool constant_pool_allowed_; |
1450 | 1427 |
| 1428 void Branch(const ExternalLabel* label); |
| 1429 void BranchPatchable(const ExternalLabel* label); |
| 1430 void BranchLinkPatchable(const ExternalLabel* label); |
| 1431 |
1451 void LoadObjectHelper(Register dst, const Object& obj, bool is_unique); | 1432 void LoadObjectHelper(Register dst, const Object& obj, bool is_unique); |
1452 | 1433 |
1453 void AddSubHelper(OperandSize os, bool set_flags, bool subtract, | 1434 void AddSubHelper(OperandSize os, bool set_flags, bool subtract, |
1454 Register rd, Register rn, Operand o) { | 1435 Register rd, Register rn, Operand o) { |
1455 ASSERT((rd != R31) && (rn != R31)); | 1436 ASSERT((rd != R31) && (rn != R31)); |
1456 const Register crd = ConcreteRegister(rd); | 1437 const Register crd = ConcreteRegister(rd); |
1457 const Register crn = ConcreteRegister(rn); | 1438 const Register crn = ConcreteRegister(rn); |
1458 if (o.type() == Operand::Immediate) { | 1439 if (o.type() == Operand::Immediate) { |
1459 ASSERT(rn != ZR); | 1440 ASSERT(rn != ZR); |
1460 EmitAddSubImmOp(subtract ? SUBI : ADDI, crd, crn, o, os, set_flags); | 1441 EmitAddSubImmOp(subtract ? SUBI : ADDI, crd, crn, o, os, set_flags); |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1942 Register value, | 1923 Register value, |
1943 Label* no_update); | 1924 Label* no_update); |
1944 | 1925 |
1945 DISALLOW_ALLOCATION(); | 1926 DISALLOW_ALLOCATION(); |
1946 DISALLOW_COPY_AND_ASSIGN(Assembler); | 1927 DISALLOW_COPY_AND_ASSIGN(Assembler); |
1947 }; | 1928 }; |
1948 | 1929 |
1949 } // namespace dart | 1930 } // namespace dart |
1950 | 1931 |
1951 #endif // VM_ASSEMBLER_ARM64_H_ | 1932 #endif // VM_ASSEMBLER_ARM64_H_ |
OLD | NEW |