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

Side by Side Diff: src/arm64/code-stubs-arm64.cc

Issue 209933003: ARM64: push/pop registers in stubs for safepoints (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: review fix Created 6 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « src/arm64/code-stubs-arm64.h ('k') | src/arm64/lithium-codegen-arm64.h » ('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 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 1115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1126 1126
1127 void StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime( 1127 void StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(
1128 Isolate* isolate) { 1128 Isolate* isolate) {
1129 StoreBufferOverflowStub stub1(kDontSaveFPRegs); 1129 StoreBufferOverflowStub stub1(kDontSaveFPRegs);
1130 stub1.GetCode(isolate); 1130 stub1.GetCode(isolate);
1131 StoreBufferOverflowStub stub2(kSaveFPRegs); 1131 StoreBufferOverflowStub stub2(kSaveFPRegs);
1132 stub2.GetCode(isolate); 1132 stub2.GetCode(isolate);
1133 } 1133 }
1134 1134
1135 1135
1136 void StoreRegistersStateStub::Generate(MacroAssembler* masm) {
1137 MacroAssembler::NoUseRealAbortsScope no_use_real_aborts(masm);
1138 UseScratchRegisterScope temps(masm);
1139 Register saved_lr = temps.UnsafeAcquire(to_be_pushed_lr());
1140 Register return_address = temps.AcquireX();
1141 __ Mov(return_address, lr);
1142 // Restore lr with the value it had before the call to this stub (the value
1143 // which must be pushed).
1144 __ Mov(lr, saved_lr);
1145 if (save_doubles_ == kSaveFPRegs) {
1146 __ PushSafepointRegistersAndDoubles();
1147 } else {
1148 __ PushSafepointRegisters();
1149 }
1150 __ Ret(return_address);
1151 }
1152
1153
1154 void RestoreRegistersStateStub::Generate(MacroAssembler* masm) {
1155 MacroAssembler::NoUseRealAbortsScope no_use_real_aborts(masm);
1156 UseScratchRegisterScope temps(masm);
1157 Register return_address = temps.AcquireX();
1158 // Preserve the return address (lr will be clobbered by the pop).
1159 __ Mov(return_address, lr);
1160 if (save_doubles_ == kSaveFPRegs) {
1161 __ PopSafepointRegistersAndDoubles();
1162 } else {
1163 __ PopSafepointRegisters();
1164 }
1165 __ Ret(return_address);
1166 }
1167
1168
1136 void MathPowStub::Generate(MacroAssembler* masm) { 1169 void MathPowStub::Generate(MacroAssembler* masm) {
1137 // Stack on entry: 1170 // Stack on entry:
1138 // jssp[0]: Exponent (as a tagged value). 1171 // jssp[0]: Exponent (as a tagged value).
1139 // jssp[1]: Base (as a tagged value). 1172 // jssp[1]: Base (as a tagged value).
1140 // 1173 //
1141 // The (tagged) result will be returned in x0, as a heap number. 1174 // The (tagged) result will be returned in x0, as a heap number.
1142 1175
1143 Register result_tagged = x0; 1176 Register result_tagged = x0;
1144 Register base_tagged = x10; 1177 Register base_tagged = x10;
1145 Register exponent_tagged = x11; 1178 Register exponent_tagged = x11;
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
1387 // It is important that the following stubs are generated in this order 1420 // It is important that the following stubs are generated in this order
1388 // because pregenerated stubs can only call other pregenerated stubs. 1421 // because pregenerated stubs can only call other pregenerated stubs.
1389 // RecordWriteStub uses StoreBufferOverflowStub, which in turn uses 1422 // RecordWriteStub uses StoreBufferOverflowStub, which in turn uses
1390 // CEntryStub. 1423 // CEntryStub.
1391 CEntryStub::GenerateAheadOfTime(isolate); 1424 CEntryStub::GenerateAheadOfTime(isolate);
1392 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); 1425 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate);
1393 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); 1426 StubFailureTrampolineStub::GenerateAheadOfTime(isolate);
1394 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); 1427 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate);
1395 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); 1428 CreateAllocationSiteStub::GenerateAheadOfTime(isolate);
1396 BinaryOpICStub::GenerateAheadOfTime(isolate); 1429 BinaryOpICStub::GenerateAheadOfTime(isolate);
1430 StoreRegistersStateStub::GenerateAheadOfTime(isolate);
1431 RestoreRegistersStateStub::GenerateAheadOfTime(isolate);
1397 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); 1432 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate);
1398 } 1433 }
1399 1434
1400 1435
1436 void StoreRegistersStateStub::GenerateAheadOfTime(Isolate* isolate) {
1437 StoreRegistersStateStub stub1(kDontSaveFPRegs);
1438 stub1.GetCode(isolate);
1439 StoreRegistersStateStub stub2(kSaveFPRegs);
1440 stub2.GetCode(isolate);
1441 }
1442
1443
1444 void RestoreRegistersStateStub::GenerateAheadOfTime(Isolate* isolate) {
1445 RestoreRegistersStateStub stub1(kDontSaveFPRegs);
1446 stub1.GetCode(isolate);
1447 RestoreRegistersStateStub stub2(kSaveFPRegs);
1448 stub2.GetCode(isolate);
1449 }
1450
1451
1401 void CodeStub::GenerateFPStubs(Isolate* isolate) { 1452 void CodeStub::GenerateFPStubs(Isolate* isolate) {
1402 // Floating-point code doesn't get special handling in ARM64, so there's 1453 // Floating-point code doesn't get special handling in ARM64, so there's
1403 // nothing to do here. 1454 // nothing to do here.
1404 USE(isolate); 1455 USE(isolate);
1405 } 1456 }
1406 1457
1407 1458
1408 bool CEntryStub::NeedsImmovableCode() { 1459 bool CEntryStub::NeedsImmovableCode() {
1409 // CEntryStub stores the return address on the stack before calling into 1460 // CEntryStub stores the return address on the stack before calling into
1410 // C++ code. In some cases, the VM accesses this address, but it is not used 1461 // C++ code. In some cases, the VM accesses this address, but it is not used
(...skipping 4264 matching lines...) Expand 10 before | Expand all | Expand 10 after
5675 MemOperand(fp, 6 * kPointerSize), 5726 MemOperand(fp, 6 * kPointerSize),
5676 NULL); 5727 NULL);
5677 } 5728 }
5678 5729
5679 5730
5680 #undef __ 5731 #undef __
5681 5732
5682 } } // namespace v8::internal 5733 } } // namespace v8::internal
5683 5734
5684 #endif // V8_TARGET_ARCH_ARM64 5735 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « src/arm64/code-stubs-arm64.h ('k') | src/arm64/lithium-codegen-arm64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698