Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(382)

Side by Side Diff: runtime/vm/assembler_arm64.h

Issue 1192103004: VM: New calling convention for generated code. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: fixed comments Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/assembler_arm.cc ('k') | runtime/vm/assembler_arm64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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_
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm.cc ('k') | runtime/vm/assembler_arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698