mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-28 10:07:30 +09:00
parent
f8c46a0c10
commit
6e4c40c648
3 changed files with 56 additions and 11 deletions
|
|
@ -425,13 +425,32 @@ MacroAssembler::subFromStackPtr(Imm32 imm32)
|
||||||
// Ion frame data for a piece of code is very large. To handle this special case,
|
// Ion frame data for a piece of code is very large. To handle this special case,
|
||||||
// for frames over 1k in size we allocate memory on the stack incrementally, touching
|
// for frames over 1k in size we allocate memory on the stack incrementally, touching
|
||||||
// it as we go.
|
// it as we go.
|
||||||
|
//
|
||||||
|
// When the amount is quite large, which it can be, we emit an actual loop, in order
|
||||||
|
// to keep the function prologue compact. Compactness is a requirement for e.g.
|
||||||
|
// Wasm's CodeRange data structure, which can encode only 8-bit offsets.
|
||||||
uint32_t amountLeft = imm32.value;
|
uint32_t amountLeft = imm32.value;
|
||||||
while (amountLeft > 4096) {
|
uint32_t fullPages = amountLeft / 4096;
|
||||||
|
if (fullPages <= 8) {
|
||||||
|
while (amountLeft > 4096) {
|
||||||
|
subq(Imm32(4096), StackPointer);
|
||||||
|
store32(Imm32(0), Address(StackPointer, 0));
|
||||||
|
amountLeft -= 4096;
|
||||||
|
}
|
||||||
|
subq(Imm32(amountLeft), StackPointer);
|
||||||
|
} else {
|
||||||
|
ScratchRegisterScope scratch(*this);
|
||||||
|
Label top;
|
||||||
|
move32(Imm32(fullPages), scratch);
|
||||||
|
bind(&top);
|
||||||
subq(Imm32(4096), StackPointer);
|
subq(Imm32(4096), StackPointer);
|
||||||
store32(Imm32(0), Address(StackPointer, 0));
|
store32(Imm32(0), Address(StackPointer, 0));
|
||||||
amountLeft -= 4096;
|
subl(Imm32(1), scratch);
|
||||||
|
j(Assembler::NonZero, &top);
|
||||||
|
amountLeft -= fullPages * 4096;
|
||||||
|
if (amountLeft)
|
||||||
|
subq(Imm32(amountLeft), StackPointer);
|
||||||
}
|
}
|
||||||
subq(Imm32(amountLeft), StackPointer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -339,13 +339,39 @@ MacroAssembler::subFromStackPtr(Imm32 imm32)
|
||||||
// Ion frame data for a piece of code is very large. To handle this special case,
|
// Ion frame data for a piece of code is very large. To handle this special case,
|
||||||
// for frames over 1k in size we allocate memory on the stack incrementally, touching
|
// for frames over 1k in size we allocate memory on the stack incrementally, touching
|
||||||
// it as we go.
|
// it as we go.
|
||||||
|
//
|
||||||
|
// When the amount is quite large, which it can be, we emit an actual loop, in order
|
||||||
|
// to keep the function prologue compact. Compactness is a requirement for e.g.
|
||||||
|
// Wasm's CodeRange data structure, which can encode only 8-bit offsets.
|
||||||
uint32_t amountLeft = imm32.value;
|
uint32_t amountLeft = imm32.value;
|
||||||
while (amountLeft > 4096) {
|
uint32_t fullPages = amountLeft / 4096;
|
||||||
|
if (fullPages <= 8) {
|
||||||
|
while (amountLeft > 4096) {
|
||||||
|
subl(Imm32(4096), StackPointer);
|
||||||
|
store32(Imm32(0), Address(StackPointer, 0));
|
||||||
|
amountLeft -= 4096;
|
||||||
|
}
|
||||||
|
subl(Imm32(amountLeft), StackPointer);
|
||||||
|
} else {
|
||||||
|
// Save scratch register.
|
||||||
|
push(eax);
|
||||||
|
amountLeft -= 4;
|
||||||
|
fullPages = amountLeft / 4096;
|
||||||
|
|
||||||
|
Label top;
|
||||||
|
move32(Imm32(fullPages), eax);
|
||||||
|
bind(&top);
|
||||||
subl(Imm32(4096), StackPointer);
|
subl(Imm32(4096), StackPointer);
|
||||||
store32(Imm32(0), Address(StackPointer, 0));
|
store32(Imm32(0), Address(StackPointer, 0));
|
||||||
amountLeft -= 4096;
|
subl(Imm32(1), eax);
|
||||||
|
j(Assembler::NonZero, &top);
|
||||||
|
amountLeft -= fullPages * 4096;
|
||||||
|
if (amountLeft)
|
||||||
|
subl(Imm32(amountLeft), StackPointer);
|
||||||
|
|
||||||
|
// Restore scratch register.
|
||||||
|
movl(Operand(StackPointer, uint32_t(imm32.value) - 4), eax);
|
||||||
}
|
}
|
||||||
subl(Imm32(amountLeft), StackPointer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -400,11 +400,11 @@ CodeRange::CodeRange(uint32_t funcIndex, uint32_t funcLineOrBytecode, FuncOffset
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(begin_ < profilingReturn_);
|
MOZ_ASSERT(begin_ < profilingReturn_);
|
||||||
MOZ_ASSERT(profilingReturn_ < end_);
|
MOZ_ASSERT(profilingReturn_ < end_);
|
||||||
MOZ_ASSERT(funcBeginToTableEntry_ == offsets.tableEntry - begin_);
|
MOZ_ASSERT(offsets.tableEntry - begin_ <= UINT8_MAX);
|
||||||
MOZ_ASSERT(funcBeginToTableProfilingJump_ == offsets.tableProfilingJump - begin_);
|
MOZ_ASSERT(offsets.tableProfilingJump - begin_ <= UINT8_MAX);
|
||||||
MOZ_ASSERT(funcBeginToNonProfilingEntry_ == offsets.nonProfilingEntry - begin_);
|
MOZ_ASSERT(offsets.nonProfilingEntry - begin_ <= UINT8_MAX);
|
||||||
MOZ_ASSERT(funcProfilingJumpToProfilingReturn_ == profilingReturn_ - offsets.profilingJump);
|
MOZ_ASSERT(profilingReturn_ - offsets.profilingJump <= UINT8_MAX);
|
||||||
MOZ_ASSERT(funcProfilingEpilogueToProfilingReturn_ == profilingReturn_ - offsets.profilingEpilogue);
|
MOZ_ASSERT(profilingReturn_ - offsets.profilingEpilogue <= UINT8_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue