V8 Project
v8::internal::RecordWriteStub::RegisterAllocation Class Reference
+ Collaboration diagram for v8::internal::RecordWriteStub::RegisterAllocation:

Public Member Functions

 RegisterAllocation (Register object, Register address, Register scratch0)
 
void Save (MacroAssembler *masm)
 
void Restore (MacroAssembler *masm)
 
void SaveCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
void RestoreCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
Register object ()
 
Register address ()
 
Register scratch0 ()
 
Register scratch1 ()
 
 RegisterAllocation (Register object, Register address, Register scratch)
 
void Save (MacroAssembler *masm)
 
void Restore (MacroAssembler *masm)
 
void SaveCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
void RestoreCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
Register object ()
 
Register address ()
 
Register scratch0 ()
 
Register scratch1 ()
 
Register scratch2 ()
 
 RegisterAllocation (Register object, Register address, Register scratch0)
 
void Save (MacroAssembler *masm)
 
void Restore (MacroAssembler *masm)
 
void SaveCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
void RestoreCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
Register object ()
 
Register address ()
 
Register scratch0 ()
 
Register scratch1 ()
 
 RegisterAllocation (Register object, Register address, Register scratch0)
 
void Save (MacroAssembler *masm)
 
void Restore (MacroAssembler *masm)
 
void SaveCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
void RestoreCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
Register object ()
 
Register address ()
 
Register scratch0 ()
 
Register scratch1 ()
 
 RegisterAllocation (Register object, Register address, Register scratch0)
 
void Save (MacroAssembler *masm)
 
void Restore (MacroAssembler *masm)
 
void SaveCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
void RestoreCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
Register object ()
 
Register address ()
 
Register scratch0 ()
 
Register scratch1 ()
 
 RegisterAllocation (Register object, Register address, Register scratch0)
 
void Save (MacroAssembler *masm)
 
void Restore (MacroAssembler *masm)
 
void SaveCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
void RestoreCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
Register object ()
 
Register address ()
 
Register scratch0 ()
 
Register scratch1 ()
 
 RegisterAllocation (Register object, Register address, Register scratch0)
 
void Save (MacroAssembler *masm)
 
void Restore (MacroAssembler *masm)
 
void SaveCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
void RestoreCallerSaveRegisters (MacroAssembler *masm, SaveFPRegsMode mode)
 
Register object ()
 
Register address ()
 
Register scratch0 ()
 
Register scratch1 ()
 

Private Member Functions

Register GetRegThatIsNotEcxOr (Register r1, Register r2, Register r3)
 
Register GetRegThatIsNotRcxOr (Register r1, Register r2, Register r3)
 
Register GetRegThatIsNotEcxOr (Register r1, Register r2, Register r3)
 

Static Private Member Functions

static CPURegList GetValidRegistersForAllocation ()
 

Private Attributes

Register object_
 
Register address_
 
Register scratch0_
 
Register scratch1_
 
Register scratch2_
 
CPURegList saved_regs_
 
CPURegList saved_fp_regs_
 
Register object_orig_
 
Register address_orig_
 
Register scratch0_orig_
 

Friends

class RecordWriteStub
 

Detailed Description

Definition at line 178 of file code-stubs-arm.h.

Constructor & Destructor Documentation

◆ RegisterAllocation() [1/7]

v8::internal::RecordWriteStub::RegisterAllocation::RegisterAllocation ( Register  object,
Register  address,
Register  scratch0 
)
inline

Definition at line 180 of file code-stubs-arm.h.

183  : object_(object),
184  address_(address),
186  DCHECK(!AreAliased(scratch0, object, address, no_reg));
188  }
#define DCHECK(condition)
Definition: logging.h:205
bool AreAliased(const CPURegister &reg1, const CPURegister &reg2, const CPURegister &reg3=NoReg, const CPURegister &reg4=NoReg, const CPURegister &reg5=NoReg, const CPURegister &reg6=NoReg, const CPURegister &reg7=NoReg, const CPURegister &reg8=NoReg)
const Register no_reg
Register GetRegisterThatIsNotOneOf(Register reg1, Register reg2=no_reg, Register reg3=no_reg, Register reg4=no_reg, Register reg5=no_reg, Register reg6=no_reg)

References address(), address_, v8::internal::AreAliased(), DCHECK, v8::internal::GetRegisterThatIsNotOneOf(), v8::internal::no_reg, object_, scratch0(), scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ RegisterAllocation() [2/7]

v8::internal::RecordWriteStub::RegisterAllocation::RegisterAllocation ( Register  object,
Register  address,
Register  scratch 
)
inline

Definition at line 172 of file code-stubs-arm64.h.

175  : object_(object),
176  address_(address),
177  scratch0_(scratch),
180  DCHECK(!AreAliased(scratch, object, address));
181 
182  // The SaveCallerSaveRegisters method needs to save caller-saved
183  // registers, but we don't bother saving MacroAssembler scratch registers.
186 
187  // We would like to require more scratch registers for this stub,
188  // but the number of registers comes down to the ones used in
189  // FullCodeGen::SetVar(), which is architecture independent.
190  // We allocate 2 extra scratch registers that we'll save on the stack.
191  CPURegList pool_available = GetValidRegistersForAllocation();
192  CPURegList used_regs(object, address, scratch);
193  pool_available.Remove(used_regs);
194  scratch1_ = Register(pool_available.PopLowestIndex());
195  scratch2_ = Register(pool_available.PopLowestIndex());
196 
197  // The scratch registers will be restored by other means so we don't need
198  // to save them with the other caller saved registers.
202  }
#define kCallerSavedFP
void Remove(const CPURegList &other)
static CPURegList DefaultTmpList()
static CPURegList DefaultFPTmpList()
const RegList kCallerSaved
Definition: frames-arm.h:50

References address(), v8::internal::AreAliased(), DCHECK, v8::internal::MacroAssembler::DefaultFPTmpList(), v8::internal::MacroAssembler::DefaultTmpList(), GetValidRegistersForAllocation(), v8::internal::CPURegList::PopLowestIndex(), v8::internal::CPURegList::Remove(), saved_fp_regs_, saved_regs_, scratch0_, scratch1_, and scratch2_.

+ Here is the call graph for this function:

◆ RegisterAllocation() [3/7]

v8::internal::RecordWriteStub::RegisterAllocation::RegisterAllocation ( Register  object,
Register  address,
Register  scratch0 
)
inline

Definition at line 202 of file code-stubs-ia32.h.

References address(), address_, v8::internal::AreAliased(), DCHECK, v8::internal::ecx, GetRegThatIsNotEcxOr(), v8::internal::Register::is(), v8::internal::no_reg, object_, scratch0(), scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ RegisterAllocation() [4/7]

v8::internal::RecordWriteStub::RegisterAllocation::RegisterAllocation ( Register  object,
Register  address,
Register  scratch0 
)
inline

Definition at line 222 of file code-stubs-mips.h.

225  : object_(object),
226  address_(address),
228  DCHECK(!AreAliased(scratch0, object, address, no_reg));
230  }

References address(), address_, v8::internal::AreAliased(), DCHECK, v8::internal::GetRegisterThatIsNotOneOf(), v8::internal::no_reg, object_, scratch0(), scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ RegisterAllocation() [5/7]

v8::internal::RecordWriteStub::RegisterAllocation::RegisterAllocation ( Register  object,
Register  address,
Register  scratch0 
)
inline

Definition at line 224 of file code-stubs-mips64.h.

227  : object_(object),
228  address_(address),
230  DCHECK(!AreAliased(scratch0, object, address, no_reg));
232  }

References address(), address_, v8::internal::AreAliased(), DCHECK, v8::internal::GetRegisterThatIsNotOneOf(), v8::internal::no_reg, object_, scratch0(), scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ RegisterAllocation() [6/7]

v8::internal::RecordWriteStub::RegisterAllocation::RegisterAllocation ( Register  object,
Register  address,
Register  scratch0 
)
inline

Definition at line 194 of file code-stubs-x64.h.

197  : object_orig_(object),
200  object_(object),
201  address_(address),
203  DCHECK(!AreAliased(scratch0, object, address, no_reg));
205  if (scratch0.is(rcx)) {
207  }
208  if (object.is(rcx)) {
210  }
211  if (address.is(rcx)) {
213  }
215  }
Register GetRegThatIsNotRcxOr(Register r1, Register r2, Register r3)
const Register rcx

References address(), address_, v8::internal::AreAliased(), DCHECK, GetRegThatIsNotRcxOr(), v8::internal::Register::is(), v8::internal::no_reg, object_, v8::internal::rcx, scratch0(), scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ RegisterAllocation() [7/7]

v8::internal::RecordWriteStub::RegisterAllocation::RegisterAllocation ( Register  object,
Register  address,
Register  scratch0 
)
inline

Definition at line 199 of file code-stubs-x87.h.

202  : object_orig_(object),
205  object_(object),
206  address_(address),
208  DCHECK(!AreAliased(scratch0, object, address, no_reg));
210  if (scratch0.is(ecx)) {
212  }
213  if (object.is(ecx)) {
215  }
216  if (address.is(ecx)) {
218  }
220  }

References address(), address_, v8::internal::AreAliased(), DCHECK, v8::internal::ecx, GetRegThatIsNotEcxOr(), v8::internal::Register::is(), v8::internal::no_reg, object_, scratch0(), scratch0_, and scratch1_.

+ Here is the call graph for this function:

Member Function Documentation

◆ address() [1/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::address ( )
inline

Definition at line 220 of file code-stubs-arm.h.

220 { return address_; }

References address_.

Referenced by RegisterAllocation().

+ Here is the caller graph for this function:

◆ address() [2/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::address ( )
inline

Definition at line 235 of file code-stubs-arm64.h.

235 { return address_; }

References address_.

◆ address() [3/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::address ( )
inline

Definition at line 306 of file code-stubs-ia32.h.

306 { return address_; }

References address_.

◆ address() [4/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::address ( )
inline

Definition at line 262 of file code-stubs-mips.h.

262 { return address_; }

References address_.

◆ address() [5/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::address ( )
inline

Definition at line 264 of file code-stubs-mips64.h.

264 { return address_; }

References address_.

◆ address() [6/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::address ( )
inline

Definition at line 280 of file code-stubs-x64.h.

280 { return address_; }

References address_.

◆ address() [7/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::address ( )
inline

Definition at line 295 of file code-stubs-x87.h.

295 { return address_; }

References address_.

◆ GetRegThatIsNotEcxOr() [1/2]

Register v8::internal::RecordWriteStub::RegisterAllocation::GetRegThatIsNotEcxOr ( Register  r1,
Register  r2,
Register  r3 
)
inlineprivate

Definition at line 320 of file code-stubs-ia32.h.

322  {
323  for (int i = 0; i < Register::NumAllocatableRegisters(); i++) {
324  Register candidate = Register::FromAllocationIndex(i);
325  if (candidate.is(ecx)) continue;
326  if (candidate.is(r1)) continue;
327  if (candidate.is(r2)) continue;
328  if (candidate.is(r3)) continue;
329  return candidate;
330  }
331  UNREACHABLE();
332  return no_reg;
333  }
#define UNREACHABLE()
Definition: logging.h:30
const Register r2
const Register r3
const Register r1
static Register FromAllocationIndex(int index)
static int NumAllocatableRegisters()

References v8::internal::ecx, v8::internal::Register::FromAllocationIndex(), v8::internal::Register::is(), v8::internal::no_reg, v8::internal::Register::NumAllocatableRegisters(), v8::internal::r1, v8::internal::r2, v8::internal::r3, and UNREACHABLE.

Referenced by RegisterAllocation().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ GetRegThatIsNotEcxOr() [2/2]

Register v8::internal::RecordWriteStub::RegisterAllocation::GetRegThatIsNotEcxOr ( Register  r1,
Register  r2,
Register  r3 
)
inlineprivate

Definition at line 309 of file code-stubs-x87.h.

311  {
312  for (int i = 0; i < Register::NumAllocatableRegisters(); i++) {
313  Register candidate = Register::FromAllocationIndex(i);
314  if (candidate.is(ecx)) continue;
315  if (candidate.is(r1)) continue;
316  if (candidate.is(r2)) continue;
317  if (candidate.is(r3)) continue;
318  return candidate;
319  }
320  UNREACHABLE();
321  return no_reg;
322  }

References v8::internal::ecx, v8::internal::Register::FromAllocationIndex(), v8::internal::Register::is(), v8::internal::no_reg, v8::internal::Register::NumAllocatableRegisters(), v8::internal::r1, v8::internal::r2, v8::internal::r3, and UNREACHABLE.

+ Here is the call graph for this function:

◆ GetRegThatIsNotRcxOr()

Register v8::internal::RecordWriteStub::RegisterAllocation::GetRegThatIsNotRcxOr ( Register  r1,
Register  r2,
Register  r3 
)
inlineprivate

Definition at line 294 of file code-stubs-x64.h.

296  {
297  for (int i = 0; i < Register::NumAllocatableRegisters(); i++) {
298  Register candidate = Register::FromAllocationIndex(i);
299  if (candidate.is(rcx)) continue;
300  if (candidate.is(r1)) continue;
301  if (candidate.is(r2)) continue;
302  if (candidate.is(r3)) continue;
303  return candidate;
304  }
305  UNREACHABLE();
306  return no_reg;
307  }

References v8::internal::Register::FromAllocationIndex(), v8::internal::Register::is(), v8::internal::no_reg, v8::internal::Register::NumAllocatableRegisters(), v8::internal::r1, v8::internal::r2, v8::internal::r3, v8::internal::rcx, and UNREACHABLE.

Referenced by RegisterAllocation().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ GetValidRegistersForAllocation()

static CPURegList v8::internal::RecordWriteStub::RegisterAllocation::GetValidRegistersForAllocation ( )
inlinestaticprivate

Definition at line 250 of file code-stubs-arm64.h.

250  {
251  // The list of valid registers for allocation is defined as all the
252  // registers without those with a special meaning.
253  //
254  // The default list excludes registers x26 to x31 because they are
255  // reserved for the following purpose:
256  // - x26 root register
257  // - x27 context pointer register
258  // - x28 jssp
259  // - x29 frame pointer
260  // - x30 link register(lr)
261  // - x31 xzr/stack pointer
262  CPURegList list(CPURegister::kRegister, kXRegSizeInBits, 0, 25);
263 
264  // We also remove MacroAssembler's scratch registers.
265  list.Remove(MacroAssembler::DefaultTmpList());
266 
267  return list;
268  }
const unsigned kXRegSizeInBits

References v8::internal::MacroAssembler::DefaultTmpList(), v8::internal::CPURegister::kRegister, v8::internal::kXRegSizeInBits, and v8::internal::CPURegList::Remove().

Referenced by RegisterAllocation().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ object() [1/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::object ( )
inline

Definition at line 219 of file code-stubs-arm.h.

219 { return object_; }

References object_.

◆ object() [2/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::object ( )
inline

Definition at line 234 of file code-stubs-arm64.h.

234 { return object_; }

References object_.

◆ object() [3/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::object ( )
inline

Definition at line 305 of file code-stubs-ia32.h.

305 { return object_; }

References object_.

◆ object() [4/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::object ( )
inline

Definition at line 261 of file code-stubs-mips.h.

261 { return object_; }

References object_.

◆ object() [5/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::object ( )
inline

Definition at line 263 of file code-stubs-mips64.h.

263 { return object_; }

References object_.

◆ object() [6/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::object ( )
inline

Definition at line 279 of file code-stubs-x64.h.

279 { return object_; }

References object_.

◆ object() [7/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::object ( )
inline

Definition at line 294 of file code-stubs-x87.h.

294 { return object_; }

References object_.

◆ Restore() [1/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Restore ( MacroAssembler masm)
inline

Definition at line 197 of file code-stubs-arm.h.

197  {
198  masm->pop(scratch1_);
199  }

References v8::internal::MacroAssembler::pop(), and scratch1_.

+ Here is the call graph for this function:

◆ Restore() [2/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Restore ( MacroAssembler masm)
inline

Definition at line 210 of file code-stubs-arm64.h.

210  {
211  masm->Pop(scratch2_, scratch1_);
212  }

References v8::internal::MacroAssembler::Pop(), scratch1_, and scratch2_.

+ Here is the call graph for this function:

◆ Restore() [3/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Restore ( MacroAssembler masm)
inline

Definition at line 251 of file code-stubs-ia32.h.

251  {
252  // These will have been preserved the entire time, so we just need to move
253  // them back. Only in one case is the orig_ reg different from the plain
254  // one, since only one of them can alias with ecx.
255  if (!object_.is(object_orig_)) {
256  masm->mov(object_orig_, object_);
257  masm->pop(object_);
258  }
259  if (!address_.is(address_orig_)) {
260  masm->mov(address_orig_, address_);
261  masm->pop(address_);
262  }
263  masm->pop(scratch1_);
264  if (!ecx.is(scratch0_orig_) &&
265  !ecx.is(object_orig_) &&
266  !ecx.is(address_orig_)) {
267  masm->pop(ecx);
268  }
269  if (!scratch0_.is(scratch0_orig_)) masm->pop(scratch0_);
270  }

References address_, address_orig_, v8::internal::ecx, v8::internal::Register::is(), v8::internal::MacroAssembler::mov(), object_, object_orig_, v8::internal::MacroAssembler::pop(), scratch0_, scratch0_orig_, and scratch1_.

+ Here is the call graph for this function:

◆ Restore() [4/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Restore ( MacroAssembler masm)
inline

Definition at line 239 of file code-stubs-mips.h.

239  {
240  masm->pop(scratch1_);
241  }

References v8::internal::MacroAssembler::pop(), and scratch1_.

+ Here is the call graph for this function:

◆ Restore() [5/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Restore ( MacroAssembler masm)
inline

Definition at line 241 of file code-stubs-mips64.h.

241  {
242  masm->pop(scratch1_);
243  }

References v8::internal::MacroAssembler::pop(), and scratch1_.

+ Here is the call graph for this function:

◆ Restore() [6/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Restore ( MacroAssembler masm)
inline

Definition at line 243 of file code-stubs-x64.h.

243  {
244  // These will have been preserved the entire time, so we just need to move
245  // them back. Only in one case is the orig_ reg different from the plain
246  // one, since only one of them can alias with rcx.
247  if (!object_.is(object_orig_)) {
248  masm->movp(object_orig_, object_);
249  masm->Pop(object_);
250  }
251  if (!address_.is(address_orig_)) {
252  masm->movp(address_orig_, address_);
253  masm->Pop(address_);
254  }
255  masm->Pop(scratch1_);
256  if (!rcx.is(scratch0_orig_) &&
257  !rcx.is(object_orig_) &&
258  !rcx.is(address_orig_)) {
259  masm->Pop(rcx);
260  }
261  if (!scratch0_.is(scratch0_orig_)) masm->Pop(scratch0_);
262  }

References address_, address_orig_, v8::internal::Register::is(), v8::internal::Assembler::movp(), object_, object_orig_, v8::internal::MacroAssembler::Pop(), v8::internal::rcx, scratch0_, scratch0_orig_, and scratch1_.

+ Here is the call graph for this function:

◆ Restore() [7/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Restore ( MacroAssembler masm)
inline

Definition at line 248 of file code-stubs-x87.h.

248  {
249  // These will have been preserved the entire time, so we just need to move
250  // them back. Only in one case is the orig_ reg different from the plain
251  // one, since only one of them can alias with ecx.
252  if (!object_.is(object_orig_)) {
253  masm->mov(object_orig_, object_);
254  masm->pop(object_);
255  }
256  if (!address_.is(address_orig_)) {
257  masm->mov(address_orig_, address_);
258  masm->pop(address_);
259  }
260  masm->pop(scratch1_);
261  if (!ecx.is(scratch0_orig_) &&
262  !ecx.is(object_orig_) &&
263  !ecx.is(address_orig_)) {
264  masm->pop(ecx);
265  }
266  if (!scratch0_.is(scratch0_orig_)) masm->pop(scratch0_);
267  }

References address_, address_orig_, v8::internal::ecx, v8::internal::Register::is(), v8::internal::MacroAssembler::mov(), object_, object_orig_, v8::internal::MacroAssembler::pop(), scratch0_, scratch0_orig_, and scratch1_.

+ Here is the call graph for this function:

◆ RestoreCallerSaveRegisters() [1/7]

void v8::internal::RecordWriteStub::RegisterAllocation::RestoreCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 211 of file code-stubs-arm.h.

212  {
213  if (mode == kSaveFPRegs) {
214  masm->RestoreFPRegs(sp, scratch0_);
215  }
216  masm->ldm(ia_w, sp, (kCallerSaved | lr.bit()) & ~scratch1_.bit());
217  }
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long mode(MIPS only)") DEFINE_BOOL(enable_always_align_csp
const Register sp
const Register lr

References v8::internal::Register::bit(), v8::internal::ia_w, v8::internal::kCallerSaved, v8::internal::kSaveFPRegs, v8::internal::Assembler::ldm(), v8::internal::lr, mode(), v8::internal::MacroAssembler::RestoreFPRegs(), scratch0_, scratch1_, and v8::internal::sp.

+ Here is the call graph for this function:

◆ RestoreCallerSaveRegisters() [2/7]

void v8::internal::RecordWriteStub::RegisterAllocation::RestoreCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 225 of file code-stubs-arm64.h.

225  {
226  // TODO(all): This can be very expensive, and it is likely that not every
227  // register will need to be preserved. Can we improve this?
228  if (mode == kSaveFPRegs) {
229  masm->PopCPURegList(saved_fp_regs_);
230  }
231  masm->PopCPURegList(saved_regs_);
232  }

References v8::internal::kSaveFPRegs, mode(), v8::internal::MacroAssembler::PopCPURegList(), saved_fp_regs_, and saved_regs_.

+ Here is the call graph for this function:

◆ RestoreCallerSaveRegisters() [3/7]

void v8::internal::RecordWriteStub::RegisterAllocation::RestoreCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 290 of file code-stubs-ia32.h.

291  {
292  if (mode == kSaveFPRegs) {
293  // Restore all XMM registers except XMM0.
294  for (int i = XMMRegister::kMaxNumRegisters - 1; i > 0; i--) {
295  XMMRegister reg = XMMRegister::from_code(i);
296  masm->movsd(reg, Operand(esp, (i - 1) * kDoubleSize));
297  }
298  masm->add(esp,
299  Immediate(kDoubleSize * (XMMRegister::kMaxNumRegisters - 1)));
300  }
301  if (!scratch0_.is(edx) && !scratch1_.is(edx)) masm->pop(edx);
302  if (!scratch0_.is(eax) && !scratch1_.is(eax)) masm->pop(eax);
303  }
const Register edx
const Register esp
const int kDoubleSize
Definition: globals.h:127
const Register eax
static const int kMaxNumRegisters
static XMMRegister from_code(int code)

References v8::internal::Assembler::add(), v8::internal::eax, v8::internal::edx, v8::internal::esp, v8::internal::XMMRegister::from_code(), v8::internal::Register::is(), v8::internal::kDoubleSize, v8::internal::XMMRegister::kMaxNumRegisters, v8::internal::kSaveFPRegs, mode(), v8::internal::Assembler::movsd(), v8::internal::MacroAssembler::pop(), scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ RestoreCallerSaveRegisters() [4/7]

void v8::internal::RecordWriteStub::RegisterAllocation::RestoreCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 253 of file code-stubs-mips.h.

254  {
255  if (mode == kSaveFPRegs) {
256  masm->MultiPopFPU(kCallerSavedFPU);
257  }
258  masm->MultiPop((kJSCallerSaved | ra.bit()) & ~scratch1_.bit());
259  }
const RegList kJSCallerSaved
Definition: frames-arm.h:24
const RegList kCallerSavedFPU
Definition: frames-mips.h:66

References v8::internal::Register::bit(), v8::internal::kCallerSavedFPU, v8::internal::kJSCallerSaved, v8::internal::kSaveFPRegs, mode(), v8::internal::MacroAssembler::MultiPop(), v8::internal::MacroAssembler::MultiPopFPU(), and scratch1_.

+ Here is the call graph for this function:

◆ RestoreCallerSaveRegisters() [5/7]

void v8::internal::RecordWriteStub::RegisterAllocation::RestoreCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 255 of file code-stubs-mips64.h.

256  {
257  if (mode == kSaveFPRegs) {
258  masm->MultiPopFPU(kCallerSavedFPU);
259  }
260  masm->MultiPop((kJSCallerSaved | ra.bit()) & ~scratch1_.bit());
261  }

References v8::internal::Register::bit(), v8::internal::kCallerSavedFPU, v8::internal::kJSCallerSaved, v8::internal::kSaveFPRegs, mode(), v8::internal::MacroAssembler::MultiPop(), v8::internal::MacroAssembler::MultiPopFPU(), and scratch1_.

+ Here is the call graph for this function:

◆ RestoreCallerSaveRegisters() [6/7]

void v8::internal::RecordWriteStub::RegisterAllocation::RestoreCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 274 of file code-stubs-x64.h.

275  {
276  masm->PopCallerSaved(mode, scratch0_, scratch1_, rcx);
277  }

References mode(), v8::internal::MacroAssembler::PopCallerSaved(), v8::internal::rcx, scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ RestoreCallerSaveRegisters() [7/7]

void v8::internal::RecordWriteStub::RegisterAllocation::RestoreCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 283 of file code-stubs-x87.h.

284  {
285  if (mode == kSaveFPRegs) {
286  // Restore FPU state in m108byte.
287  masm->frstor(Operand(esp, 0));
288  masm->add(esp, Immediate(108));
289  }
290  if (!scratch0_.is(edx) && !scratch1_.is(edx)) masm->pop(edx);
291  if (!scratch0_.is(eax) && !scratch1_.is(eax)) masm->pop(eax);
292  }

References v8::internal::Assembler::add(), v8::internal::eax, v8::internal::edx, v8::internal::esp, v8::internal::Assembler::frstor(), v8::internal::Register::is(), v8::internal::kSaveFPRegs, mode(), v8::internal::MacroAssembler::pop(), scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ Save() [1/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Save ( MacroAssembler masm)
inline

Definition at line 190 of file code-stubs-arm.h.

190  {
192  // We don't have to save scratch0_ because it was given to us as
193  // a scratch register.
194  masm->push(scratch1_);
195  }

References address_, v8::internal::AreAliased(), DCHECK, object_, v8::internal::MacroAssembler::push(), scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ Save() [2/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Save ( MacroAssembler masm)
inline

Definition at line 204 of file code-stubs-arm64.h.

204  {
205  // We don't have to save scratch0_ because it was given to us as
206  // a scratch register.
207  masm->Push(scratch1_, scratch2_);
208  }

References v8::internal::MacroAssembler::Push(), scratch1_, and scratch2_.

+ Here is the call graph for this function:

◆ Save() [3/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Save ( MacroAssembler masm)
inline

Definition at line 225 of file code-stubs-ia32.h.

225  {
231  // We don't have to save scratch0_orig_ because it was given to us as
232  // a scratch register. But if we had to switch to a different reg then
233  // we should save the new scratch0_.
234  if (!scratch0_.is(scratch0_orig_)) masm->push(scratch0_);
235  if (!ecx.is(scratch0_orig_) &&
236  !ecx.is(object_orig_) &&
237  !ecx.is(address_orig_)) {
238  masm->push(ecx);
239  }
240  masm->push(scratch1_);
241  if (!address_.is(address_orig_)) {
242  masm->push(address_);
243  masm->mov(address_, address_orig_);
244  }
245  if (!object_.is(object_orig_)) {
246  masm->push(object_);
247  masm->mov(object_, object_orig_);
248  }
249  }

References address_, address_orig_, v8::internal::AreAliased(), DCHECK, v8::internal::ecx, v8::internal::Register::is(), v8::internal::MacroAssembler::mov(), object_, object_orig_, v8::internal::MacroAssembler::push(), scratch0_, scratch0_orig_, and scratch1_.

+ Here is the call graph for this function:

◆ Save() [4/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Save ( MacroAssembler masm)
inline

Definition at line 232 of file code-stubs-mips.h.

232  {
234  // We don't have to save scratch0_ because it was given to us as
235  // a scratch register.
236  masm->push(scratch1_);
237  }

References address_, v8::internal::AreAliased(), DCHECK, object_, v8::internal::MacroAssembler::push(), scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ Save() [5/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Save ( MacroAssembler masm)
inline

Definition at line 234 of file code-stubs-mips64.h.

234  {
236  // We don't have to save scratch0_ because it was given to us as
237  // a scratch register.
238  masm->push(scratch1_);
239  }

References address_, v8::internal::AreAliased(), DCHECK, object_, v8::internal::MacroAssembler::push(), scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ Save() [6/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Save ( MacroAssembler masm)
inline

Definition at line 217 of file code-stubs-x64.h.

217  {
223  // We don't have to save scratch0_orig_ because it was given to us as
224  // a scratch register. But if we had to switch to a different reg then
225  // we should save the new scratch0_.
226  if (!scratch0_.is(scratch0_orig_)) masm->Push(scratch0_);
227  if (!rcx.is(scratch0_orig_) &&
228  !rcx.is(object_orig_) &&
229  !rcx.is(address_orig_)) {
230  masm->Push(rcx);
231  }
232  masm->Push(scratch1_);
233  if (!address_.is(address_orig_)) {
234  masm->Push(address_);
235  masm->movp(address_, address_orig_);
236  }
237  if (!object_.is(object_orig_)) {
238  masm->Push(object_);
239  masm->movp(object_, object_orig_);
240  }
241  }

References address_, address_orig_, v8::internal::AreAliased(), DCHECK, v8::internal::Register::is(), v8::internal::Assembler::movp(), object_, object_orig_, v8::internal::MacroAssembler::Push(), v8::internal::rcx, scratch0_, scratch0_orig_, and scratch1_.

+ Here is the call graph for this function:

◆ Save() [7/7]

void v8::internal::RecordWriteStub::RegisterAllocation::Save ( MacroAssembler masm)
inline

Definition at line 222 of file code-stubs-x87.h.

222  {
228  // We don't have to save scratch0_orig_ because it was given to us as
229  // a scratch register. But if we had to switch to a different reg then
230  // we should save the new scratch0_.
231  if (!scratch0_.is(scratch0_orig_)) masm->push(scratch0_);
232  if (!ecx.is(scratch0_orig_) &&
233  !ecx.is(object_orig_) &&
234  !ecx.is(address_orig_)) {
235  masm->push(ecx);
236  }
237  masm->push(scratch1_);
238  if (!address_.is(address_orig_)) {
239  masm->push(address_);
240  masm->mov(address_, address_orig_);
241  }
242  if (!object_.is(object_orig_)) {
243  masm->push(object_);
244  masm->mov(object_, object_orig_);
245  }
246  }

References address_, address_orig_, v8::internal::AreAliased(), DCHECK, v8::internal::ecx, v8::internal::Register::is(), v8::internal::MacroAssembler::mov(), object_, object_orig_, v8::internal::MacroAssembler::push(), scratch0_, scratch0_orig_, and scratch1_.

+ Here is the call graph for this function:

◆ SaveCallerSaveRegisters() [1/7]

void v8::internal::RecordWriteStub::RegisterAllocation::SaveCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 204 of file code-stubs-arm.h.

204  {
205  masm->stm(db_w, sp, (kCallerSaved | lr.bit()) & ~scratch1_.bit());
206  if (mode == kSaveFPRegs) {
207  masm->SaveFPRegs(sp, scratch0_);
208  }
209  }

References v8::internal::Register::bit(), v8::internal::db_w, v8::internal::kCallerSaved, v8::internal::kSaveFPRegs, v8::internal::lr, mode(), v8::internal::MacroAssembler::SaveFPRegs(), scratch0_, scratch1_, v8::internal::sp, and v8::internal::Assembler::stm().

+ Here is the call graph for this function:

◆ SaveCallerSaveRegisters() [2/7]

void v8::internal::RecordWriteStub::RegisterAllocation::SaveCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 216 of file code-stubs-arm64.h.

216  {
217  // TODO(all): This can be very expensive, and it is likely that not every
218  // register will need to be preserved. Can we improve this?
219  masm->PushCPURegList(saved_regs_);
220  if (mode == kSaveFPRegs) {
221  masm->PushCPURegList(saved_fp_regs_);
222  }
223  }

References v8::internal::kSaveFPRegs, mode(), v8::internal::MacroAssembler::PushCPURegList(), saved_fp_regs_, and saved_regs_.

+ Here is the call graph for this function:

◆ SaveCallerSaveRegisters() [3/7]

void v8::internal::RecordWriteStub::RegisterAllocation::SaveCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 276 of file code-stubs-ia32.h.

276  {
277  if (!scratch0_.is(eax) && !scratch1_.is(eax)) masm->push(eax);
278  if (!scratch0_.is(edx) && !scratch1_.is(edx)) masm->push(edx);
279  if (mode == kSaveFPRegs) {
280  masm->sub(esp,
281  Immediate(kDoubleSize * (XMMRegister::kMaxNumRegisters - 1)));
282  // Save all XMM registers except XMM0.
283  for (int i = XMMRegister::kMaxNumRegisters - 1; i > 0; i--) {
284  XMMRegister reg = XMMRegister::from_code(i);
285  masm->movsd(Operand(esp, (i - 1) * kDoubleSize), reg);
286  }
287  }
288  }

References v8::internal::eax, v8::internal::edx, v8::internal::esp, v8::internal::XMMRegister::from_code(), v8::internal::Register::is(), v8::internal::kDoubleSize, v8::internal::XMMRegister::kMaxNumRegisters, v8::internal::kSaveFPRegs, mode(), v8::internal::Assembler::movsd(), v8::internal::MacroAssembler::push(), scratch0_, scratch1_, and v8::internal::Assembler::sub().

+ Here is the call graph for this function:

◆ SaveCallerSaveRegisters() [4/7]

void v8::internal::RecordWriteStub::RegisterAllocation::SaveCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 246 of file code-stubs-mips.h.

246  {
247  masm->MultiPush((kJSCallerSaved | ra.bit()) & ~scratch1_.bit());
248  if (mode == kSaveFPRegs) {
249  masm->MultiPushFPU(kCallerSavedFPU);
250  }
251  }

References v8::internal::Register::bit(), v8::internal::kCallerSavedFPU, v8::internal::kJSCallerSaved, v8::internal::kSaveFPRegs, mode(), v8::internal::MacroAssembler::MultiPush(), v8::internal::MacroAssembler::MultiPushFPU(), and scratch1_.

+ Here is the call graph for this function:

◆ SaveCallerSaveRegisters() [5/7]

void v8::internal::RecordWriteStub::RegisterAllocation::SaveCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 248 of file code-stubs-mips64.h.

248  {
249  masm->MultiPush((kJSCallerSaved | ra.bit()) & ~scratch1_.bit());
250  if (mode == kSaveFPRegs) {
251  masm->MultiPushFPU(kCallerSavedFPU);
252  }
253  }

References v8::internal::Register::bit(), v8::internal::kCallerSavedFPU, v8::internal::kJSCallerSaved, v8::internal::kSaveFPRegs, mode(), v8::internal::MacroAssembler::MultiPush(), v8::internal::MacroAssembler::MultiPushFPU(), and scratch1_.

+ Here is the call graph for this function:

◆ SaveCallerSaveRegisters() [6/7]

void v8::internal::RecordWriteStub::RegisterAllocation::SaveCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 270 of file code-stubs-x64.h.

270  {
271  masm->PushCallerSaved(mode, scratch0_, scratch1_, rcx);
272  }

References mode(), v8::internal::MacroAssembler::PushCallerSaved(), v8::internal::rcx, scratch0_, and scratch1_.

+ Here is the call graph for this function:

◆ SaveCallerSaveRegisters() [7/7]

void v8::internal::RecordWriteStub::RegisterAllocation::SaveCallerSaveRegisters ( MacroAssembler masm,
SaveFPRegsMode  mode 
)
inline

Definition at line 273 of file code-stubs-x87.h.

273  {
274  if (!scratch0_.is(eax) && !scratch1_.is(eax)) masm->push(eax);
275  if (!scratch0_.is(edx) && !scratch1_.is(edx)) masm->push(edx);
276  if (mode == kSaveFPRegs) {
277  // Save FPU state in m108byte.
278  masm->sub(esp, Immediate(108));
279  masm->fnsave(Operand(esp, 0));
280  }
281  }

References v8::internal::eax, v8::internal::edx, v8::internal::esp, v8::internal::Assembler::fnsave(), v8::internal::Register::is(), v8::internal::kSaveFPRegs, mode(), v8::internal::MacroAssembler::push(), scratch0_, scratch1_, and v8::internal::Assembler::sub().

+ Here is the call graph for this function:

◆ scratch0() [1/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch0 ( )
inline

Definition at line 221 of file code-stubs-arm.h.

221 { return scratch0_; }

References scratch0_.

Referenced by RegisterAllocation().

+ Here is the caller graph for this function:

◆ scratch0() [2/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch0 ( )
inline

Definition at line 236 of file code-stubs-arm64.h.

236 { return scratch0_; }

References scratch0_.

◆ scratch0() [3/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch0 ( )
inline

Definition at line 307 of file code-stubs-ia32.h.

307 { return scratch0_; }

References scratch0_.

◆ scratch0() [4/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch0 ( )
inline

Definition at line 263 of file code-stubs-mips.h.

263 { return scratch0_; }

References scratch0_.

◆ scratch0() [5/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch0 ( )
inline

Definition at line 265 of file code-stubs-mips64.h.

265 { return scratch0_; }

References scratch0_.

◆ scratch0() [6/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch0 ( )
inline

Definition at line 281 of file code-stubs-x64.h.

281 { return scratch0_; }

References scratch0_.

◆ scratch0() [7/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch0 ( )
inline

Definition at line 296 of file code-stubs-x87.h.

296 { return scratch0_; }

References scratch0_.

◆ scratch1() [1/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch1 ( )
inline

Definition at line 222 of file code-stubs-arm.h.

222 { return scratch1_; }

References scratch1_.

◆ scratch1() [2/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch1 ( )
inline

Definition at line 237 of file code-stubs-arm64.h.

237 { return scratch1_; }

References scratch1_.

◆ scratch1() [3/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch1 ( )
inline

Definition at line 308 of file code-stubs-ia32.h.

308 { return scratch1_; }

References scratch1_.

◆ scratch1() [4/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch1 ( )
inline

Definition at line 264 of file code-stubs-mips.h.

264 { return scratch1_; }

References scratch1_.

◆ scratch1() [5/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch1 ( )
inline

Definition at line 266 of file code-stubs-mips64.h.

266 { return scratch1_; }

References scratch1_.

◆ scratch1() [6/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch1 ( )
inline

Definition at line 282 of file code-stubs-x64.h.

282 { return scratch1_; }

References scratch1_.

◆ scratch1() [7/7]

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch1 ( )
inline

Definition at line 297 of file code-stubs-x87.h.

297 { return scratch1_; }

References scratch1_.

◆ scratch2()

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch2 ( )
inline

Definition at line 238 of file code-stubs-arm64.h.

238 { return scratch2_; }

References scratch2_.

Friends And Related Function Documentation

◆ RecordWriteStub

Definition at line 230 of file code-stubs-arm.h.

Member Data Documentation

◆ address_

Register v8::internal::RecordWriteStub::RegisterAllocation::address_
private

Definition at line 226 of file code-stubs-arm.h.

Referenced by address(), RegisterAllocation(), Restore(), and Save().

◆ address_orig_

Register v8::internal::RecordWriteStub::RegisterAllocation::address_orig_
private

Definition at line 312 of file code-stubs-ia32.h.

Referenced by Restore(), and Save().

◆ object_

Register v8::internal::RecordWriteStub::RegisterAllocation::object_
private

Definition at line 225 of file code-stubs-arm.h.

Referenced by object(), RegisterAllocation(), Restore(), and Save().

◆ object_orig_

Register v8::internal::RecordWriteStub::RegisterAllocation::object_orig_
private

Definition at line 311 of file code-stubs-ia32.h.

Referenced by Restore(), and Save().

◆ saved_fp_regs_

CPURegList v8::internal::RecordWriteStub::RegisterAllocation::saved_fp_regs_
private

◆ saved_regs_

CPURegList v8::internal::RecordWriteStub::RegisterAllocation::saved_regs_
private

◆ scratch0_

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch0_
private

◆ scratch0_orig_

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch0_orig_
private

Definition at line 313 of file code-stubs-ia32.h.

Referenced by Restore(), and Save().

◆ scratch1_

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch1_
private

◆ scratch2_

Register v8::internal::RecordWriteStub::RegisterAllocation::scratch2_
private

Definition at line 245 of file code-stubs-arm64.h.

Referenced by RegisterAllocation(), Restore(), Save(), and scratch2().


The documentation for this class was generated from the following files: