summaryrefslogtreecommitdiff
path: root/deps/v8/src/arm64/code-stubs-arm64.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/arm64/code-stubs-arm64.h')
-rw-r--r--deps/v8/src/arm64/code-stubs-arm64.h68
1 files changed, 4 insertions, 64 deletions
diff --git a/deps/v8/src/arm64/code-stubs-arm64.h b/deps/v8/src/arm64/code-stubs-arm64.h
index 6cedfadeb9..0713d3a319 100644
--- a/deps/v8/src/arm64/code-stubs-arm64.h
+++ b/deps/v8/src/arm64/code-stubs-arm64.h
@@ -68,69 +68,9 @@ class RecordWriteStub: public PlatformCodeStub {
bool SometimesSetsUpAFrame() override { return false; }
- static Mode GetMode(Code* stub) {
- // Find the mode depending on the first two instructions.
- Instruction* instr1 =
- reinterpret_cast<Instruction*>(stub->instruction_start());
- Instruction* instr2 = instr1->following();
-
- if (instr1->IsUncondBranchImm()) {
- DCHECK(instr2->IsPCRelAddressing() && (instr2->Rd() == xzr.code()));
- return INCREMENTAL;
- }
-
- DCHECK(instr1->IsPCRelAddressing() && (instr1->Rd() == xzr.code()));
-
- if (instr2->IsUncondBranchImm()) {
- return INCREMENTAL_COMPACTION;
- }
-
- DCHECK(instr2->IsPCRelAddressing());
+ static Mode GetMode(Code* stub);
- return STORE_BUFFER_ONLY;
- }
-
- // We patch the two first instructions of the stub back and forth between an
- // adr and branch when we start and stop incremental heap marking.
- // The branch is
- // b label
- // The adr is
- // adr xzr label
- // so effectively a nop.
- static void Patch(Code* stub, Mode mode) {
- // We are going to patch the two first instructions of the stub.
- PatchingAssembler patcher(stub->GetIsolate(), stub->instruction_start(), 2);
- Instruction* instr1 = patcher.InstructionAt(0);
- Instruction* instr2 = patcher.InstructionAt(kInstructionSize);
- // Instructions must be either 'adr' or 'b'.
- DCHECK(instr1->IsPCRelAddressing() || instr1->IsUncondBranchImm());
- DCHECK(instr2->IsPCRelAddressing() || instr2->IsUncondBranchImm());
- // Retrieve the offsets to the labels.
- auto offset_to_incremental_noncompacting =
- static_cast<int32_t>(instr1->ImmPCOffset());
- auto offset_to_incremental_compacting =
- static_cast<int32_t>(instr2->ImmPCOffset());
-
- switch (mode) {
- case STORE_BUFFER_ONLY:
- DCHECK(GetMode(stub) == INCREMENTAL ||
- GetMode(stub) == INCREMENTAL_COMPACTION);
- patcher.adr(xzr, offset_to_incremental_noncompacting);
- patcher.adr(xzr, offset_to_incremental_compacting);
- break;
- case INCREMENTAL:
- DCHECK(GetMode(stub) == STORE_BUFFER_ONLY);
- patcher.b(offset_to_incremental_noncompacting >> kInstructionSizeLog2);
- patcher.adr(xzr, offset_to_incremental_compacting);
- break;
- case INCREMENTAL_COMPACTION:
- DCHECK(GetMode(stub) == STORE_BUFFER_ONLY);
- patcher.adr(xzr, offset_to_incremental_noncompacting);
- patcher.b(offset_to_incremental_compacting >> kInstructionSizeLog2);
- break;
- }
- DCHECK(GetMode(stub) == mode);
- }
+ static void Patch(Code* stub, Mode mode);
DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR();
@@ -181,8 +121,8 @@ class RecordWriteStub: public PlatformCodeStub {
Register object_;
Register address_;
Register scratch0_;
- Register scratch1_;
- Register scratch2_;
+ Register scratch1_ = NoReg;
+ Register scratch2_ = NoReg;
CPURegList saved_regs_;
CPURegList saved_fp_regs_;