mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-06 15:58:39 +09:00
parent
ee48a26c52
commit
e2773bdc37
6 changed files with 83 additions and 174 deletions
|
|
@ -1596,6 +1596,87 @@ AssemblerMIPSShared::bindLater(Label* label, wasm::TrapDesc target)
|
|||
label->reset();
|
||||
}
|
||||
|
||||
void
|
||||
AssemblerMIPSShared::bind(InstImm* inst, uintptr_t branch, uintptr_t target)
|
||||
{
|
||||
intptr_t offset = target - branch;
|
||||
|
||||
// Generate the patchable mixed jump for call.
|
||||
if (inst->extractOpcode() == ((uint32_t)op_jal >> OpcodeShift)) {
|
||||
addMixedJump(BufferOffset(branch), ImmPtr((void*)target));
|
||||
return;
|
||||
}
|
||||
|
||||
// If encoded offset is 4, then the jump must be short
|
||||
if (BOffImm16(inst[0]).decode() == 4) {
|
||||
MOZ_ASSERT(BOffImm16::IsInRange(offset));
|
||||
inst[0].setBOffImm16(BOffImm16(offset));
|
||||
inst[1].makeNop();
|
||||
return;
|
||||
}
|
||||
|
||||
if (BOffImm16::IsInRange(offset)) {
|
||||
inst[0].setBOffImm16(BOffImm16(offset));
|
||||
inst[1].makeNop();
|
||||
return;
|
||||
}
|
||||
|
||||
addMixedJump(BufferOffset(branch), ImmPtr((void*)target));
|
||||
}
|
||||
|
||||
void
|
||||
AssemblerMIPSShared::bind(RepatchLabel* label)
|
||||
{
|
||||
BufferOffset dest = nextOffset();
|
||||
if (label->used() && !oom()) {
|
||||
// If the label has a use, then change this use to refer to
|
||||
// the bound label;
|
||||
BufferOffset b(label->offset());
|
||||
InstImm* inst = (InstImm*)editSrc(b);
|
||||
InstImm inst_beq = InstImm(op_beq, zero, zero, BOffImm16(0));
|
||||
intptr_t offset = dest.getOffset() - label->offset();
|
||||
|
||||
// If first instruction is j, then this is a mixed jump.
|
||||
// If second instruction is lui, then this is a loop backedge.
|
||||
if (inst[0].extractOpcode() == (uint32_t(op_j) >> OpcodeShift)) {
|
||||
// For unconditional mixed branches generated by jumpWithPatch
|
||||
addMixedJump(b, ImmPtr((void*)dest.getOffset()), MixedJumpPatch::PATCHABLE);
|
||||
} else if (inst[1].extractOpcode() == (uint32_t(op_lui) >> OpcodeShift) ||
|
||||
BOffImm16::IsInRange(offset))
|
||||
{
|
||||
// Handle code produced by:
|
||||
// backedgeJump
|
||||
MOZ_ASSERT(BOffImm16::IsInRange(offset));
|
||||
MOZ_ASSERT(inst[0].extractOpcode() == (uint32_t(op_beq) >> OpcodeShift) ||
|
||||
inst[0].extractOpcode() == (uint32_t(op_bne) >> OpcodeShift) ||
|
||||
inst[0].extractOpcode() == (uint32_t(op_blez) >> OpcodeShift) ||
|
||||
inst[0].extractOpcode() == (uint32_t(op_bgtz) >> OpcodeShift));
|
||||
inst[0].setBOffImm16(BOffImm16(offset));
|
||||
} else if (inst[0].encode() == inst_beq.encode()) {
|
||||
// Handle open mixed unconditional jumps created by
|
||||
// MacroAssemblerMIPSShared::ma_b(..., wasm::Trap, ...).
|
||||
// We need to add it to mixed jumps array here.
|
||||
// See MacroAssemblerMIPS::branchWithCode().
|
||||
MOZ_ASSERT(inst[1].encode() == NopInst);
|
||||
addMixedJump(b, ImmPtr((void*)dest.getOffset()), MixedJumpPatch::PATCHABLE);
|
||||
inst[0] = InstJump(op_j, JOffImm26(0)).encode();
|
||||
} else {
|
||||
// Handle open mixed conditional jumps created by
|
||||
// MacroAssemblerMIPSShared::ma_b(..., wasm::Trap, ...).
|
||||
inst[0] = invertBranch(inst[0], BOffImm16(4 * sizeof(uint32_t)));
|
||||
// No need for a "nop" here because we can clobber scratch.
|
||||
// We need to add it to mixed jumps array here.
|
||||
// See MacroAssemblerMIPS::branchWithCode().
|
||||
MOZ_ASSERT(inst[1].encode() == NopInst);
|
||||
MOZ_ASSERT(inst[2].encode() == NopInst);
|
||||
MOZ_ASSERT(inst[3].encode() == NopInst);
|
||||
addMixedJump(b, ImmPtr((void*)dest.getOffset()), MixedJumpPatch::PATCHABLE);
|
||||
inst[2] = InstJump(op_j, JOffImm26(0)).encode();
|
||||
}
|
||||
}
|
||||
label->bind(dest.getOffset());
|
||||
}
|
||||
|
||||
void
|
||||
AssemblerMIPSShared::retarget(Label* label, Label* target)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1211,8 +1211,9 @@ class AssemblerMIPSShared : public AssemblerShared
|
|||
// label operations
|
||||
void bind(Label* label, BufferOffset boff = BufferOffset());
|
||||
void bindLater(Label* label, wasm::TrapDesc target);
|
||||
virtual void bind(InstImm* inst, uintptr_t branch, uintptr_t target) = 0;
|
||||
void bind(InstImm* inst, uintptr_t branch, uintptr_t target);
|
||||
virtual void Bind(uint8_t* rawCode, CodeOffset* label, const void* address) = 0;
|
||||
void bind(RepatchLabel* label);
|
||||
void bind(CodeOffset* label) {
|
||||
label->bind(currentOffset());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -296,87 +296,6 @@ Assembler::Bind(uint8_t* rawCode, CodeOffset* label, const void* address)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
Assembler::bind(InstImm* inst, uintptr_t branch, uintptr_t target)
|
||||
{
|
||||
int32_t offset = target - branch;
|
||||
|
||||
// Generate the patchable mixed jump for call.
|
||||
if (inst->extractOpcode() == ((uint32_t)op_jal >> OpcodeShift)) {
|
||||
addMixedJump(BufferOffset(branch), ImmPtr((void*)target));
|
||||
return;
|
||||
}
|
||||
|
||||
// If encoded offset is 4, then the jump must be short
|
||||
if (BOffImm16(inst[0]).decode() == 4) {
|
||||
MOZ_ASSERT(BOffImm16::IsInRange(offset));
|
||||
inst[0].setBOffImm16(BOffImm16(offset));
|
||||
inst[1].makeNop();
|
||||
return;
|
||||
}
|
||||
|
||||
if (BOffImm16::IsInRange(offset)) {
|
||||
inst[0].setBOffImm16(BOffImm16(offset));
|
||||
inst[1].makeNop();
|
||||
return;
|
||||
}
|
||||
|
||||
addMixedJump(BufferOffset(branch), ImmPtr((const void*)target));
|
||||
}
|
||||
|
||||
void
|
||||
Assembler::bind(RepatchLabel* label)
|
||||
{
|
||||
BufferOffset dest = nextOffset();
|
||||
if (label->used() && !oom()) {
|
||||
// If the label has a use, then change this use to refer to
|
||||
// the bound label;
|
||||
BufferOffset b(label->offset());
|
||||
InstImm* inst = (InstImm*)editSrc(b);
|
||||
InstImm inst_beq = InstImm(op_beq, zero, zero, BOffImm16(0));
|
||||
uint32_t offset = dest.getOffset() - label->offset();
|
||||
|
||||
// If first instruction is j, then this is a mixed jump.
|
||||
// If second instruction is lui, then this is a loop backedge.
|
||||
if (inst[0].extractOpcode() == (uint32_t(op_j) >> OpcodeShift)) {
|
||||
// For unconditional long branches generated by jumpWithPatch
|
||||
addMixedJump(b, ImmPtr((void*)dest.getOffset()), MixedJumpPatch::PATCHABLE);
|
||||
} else if (inst[1].extractOpcode() == (uint32_t(op_lui) >> OpcodeShift) ||
|
||||
BOffImm16::IsInRange(offset))
|
||||
{
|
||||
// Handle code produced by:
|
||||
// backedgeJump
|
||||
MOZ_ASSERT(BOffImm16::IsInRange(offset));
|
||||
MOZ_ASSERT(inst[0].extractOpcode() == (uint32_t(op_beq) >> OpcodeShift) ||
|
||||
inst[0].extractOpcode() == (uint32_t(op_bne) >> OpcodeShift) ||
|
||||
inst[0].extractOpcode() == (uint32_t(op_blez) >> OpcodeShift) ||
|
||||
inst[0].extractOpcode() == (uint32_t(op_bgtz) >> OpcodeShift));
|
||||
inst[0].setBOffImm16(BOffImm16(offset));
|
||||
} else if (inst[0].encode() == inst_beq.encode()) {
|
||||
// Handle open mixed unconditional jumps created by
|
||||
// MacroAssemblerMIPSShared::ma_b(..., wasm::Trap, ...).
|
||||
// We need to add it to mixed jumps array here.
|
||||
// See MacroAssemblerMIPS::branchWithCode().
|
||||
MOZ_ASSERT(inst[1].encode() == NopInst);
|
||||
addMixedJump(b, ImmPtr((void*)dest.getOffset()), MixedJumpPatch::PATCHABLE);
|
||||
inst[0] = InstJump(op_j, JOffImm26(0)).encode();
|
||||
} else {
|
||||
// Handle open mixed conditional jumps created by
|
||||
// MacroAssemblerMIPSShared::ma_b(..., wasm::Trap, ...).
|
||||
inst[0] = invertBranch(inst[0], BOffImm16(4 * sizeof(void*)));
|
||||
// No need for a "nop" here because we can clobber scratch.
|
||||
// We need to add it to mixed jumps array here.
|
||||
// See MacroAssemblerMIPS::branchWithCode().
|
||||
MOZ_ASSERT(inst[1].encode() == NopInst);
|
||||
MOZ_ASSERT(inst[2].encode() == NopInst);
|
||||
MOZ_ASSERT(inst[3].encode() == NopInst);
|
||||
addMixedJump(b, ImmPtr((void*)dest.getOffset()), MixedJumpPatch::PATCHABLE);
|
||||
inst[2] = InstJump(op_j, JOffImm26(0)).encode();
|
||||
}
|
||||
}
|
||||
label->bind(dest.getOffset());
|
||||
}
|
||||
|
||||
uint32_t
|
||||
Assembler::PatchWrite_NearCallSize()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -144,16 +144,11 @@ class Assembler : public AssemblerMIPSShared
|
|||
}
|
||||
|
||||
public:
|
||||
using AssemblerMIPSShared::bind;
|
||||
|
||||
void bind(RepatchLabel* label);
|
||||
void Bind(uint8_t* rawCode, CodeOffset* label, const void* address);
|
||||
|
||||
static void TraceJumpRelocations(JSTracer* trc, JitCode* code, CompactBufferReader& reader);
|
||||
static void TraceDataRelocations(JSTracer* trc, JitCode* code, CompactBufferReader& reader);
|
||||
|
||||
void bind(InstImm* inst, uintptr_t branch, uintptr_t target);
|
||||
|
||||
static uint32_t PatchWrite_NearCallSize();
|
||||
|
||||
static uint32_t ExtractLuiOriValue(Instruction* inst0, Instruction* inst1);
|
||||
|
|
|
|||
|
|
@ -228,88 +228,6 @@ Assembler::Bind(uint8_t* rawCode, CodeOffset* label, const void* address)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
Assembler::bind(InstImm* inst, uintptr_t branch, uintptr_t target)
|
||||
{
|
||||
int64_t offset = target - branch;
|
||||
|
||||
// Generate the patchable mixed jump for call.
|
||||
if (inst->extractOpcode() == ((uint32_t)op_jal >> OpcodeShift)) {
|
||||
addMixedJump(BufferOffset(branch), ImmPtr((void*)target));
|
||||
return;
|
||||
}
|
||||
|
||||
// If encoded offset is 4, then the jump must be short
|
||||
if (BOffImm16(inst[0]).decode() == 4) {
|
||||
MOZ_ASSERT(BOffImm16::IsInRange(offset));
|
||||
inst[0].setBOffImm16(BOffImm16(offset));
|
||||
inst[1].makeNop();
|
||||
return;
|
||||
}
|
||||
|
||||
if (BOffImm16::IsInRange(offset)) {
|
||||
inst[0].setBOffImm16(BOffImm16(offset));
|
||||
inst[1].makeNop();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
addMixedJump(BufferOffset(branch), ImmPtr((void*)target));
|
||||
}
|
||||
|
||||
void
|
||||
Assembler::bind(RepatchLabel* label)
|
||||
{
|
||||
BufferOffset dest = nextOffset();
|
||||
if (label->used() && !oom()) {
|
||||
// If the label has a use, then change this use to refer to
|
||||
// the bound label;
|
||||
BufferOffset b(label->offset());
|
||||
InstImm* inst = (InstImm*)editSrc(b);
|
||||
InstImm inst_beq = InstImm(op_beq, zero, zero, BOffImm16(0));
|
||||
uint64_t offset = dest.getOffset() - label->offset();
|
||||
|
||||
// If first instruction is j, then this is a mixed jump.
|
||||
// If second instruction is lui, then this is a loop backedge.
|
||||
if (inst[0].extractOpcode() == (uint32_t(op_j) >> OpcodeShift)) {
|
||||
// For unconditional mixed branches generated by jumpWithPatch
|
||||
addMixedJump(b, ImmPtr((void*)dest.getOffset()), MixedJumpPatch::PATCHABLE);
|
||||
} else if (inst[1].extractOpcode() == (uint32_t(op_lui) >> OpcodeShift) ||
|
||||
BOffImm16::IsInRange(offset))
|
||||
{
|
||||
// Handle code produced by:
|
||||
// backedgeJump
|
||||
MOZ_ASSERT(BOffImm16::IsInRange(offset));
|
||||
MOZ_ASSERT(inst[0].extractOpcode() == (uint32_t(op_beq) >> OpcodeShift) ||
|
||||
inst[0].extractOpcode() == (uint32_t(op_bne) >> OpcodeShift) ||
|
||||
inst[0].extractOpcode() == (uint32_t(op_blez) >> OpcodeShift) ||
|
||||
inst[0].extractOpcode() == (uint32_t(op_bgtz) >> OpcodeShift));
|
||||
inst[0].setBOffImm16(BOffImm16(offset));
|
||||
} else if (inst[0].encode() == inst_beq.encode()) {
|
||||
// Handle open mixed unconditional jumps created by
|
||||
// MacroAssemblerMIPSShared::ma_b(..., wasm::Trap, ...).
|
||||
// We need to add it to mixed jumps array here.
|
||||
// See MacroAssemblerMIPS64::branchWithCode().
|
||||
MOZ_ASSERT(inst[1].encode() == NopInst);
|
||||
addMixedJump(b, ImmPtr((void*)dest.getOffset()), MixedJumpPatch::PATCHABLE);
|
||||
inst[0] = InstJump(op_j, JOffImm26(0)).encode();
|
||||
} else {
|
||||
// Handle open mixed conditional jumps created by
|
||||
// MacroAssemblerMIPSShared::ma_b(..., wasm::Trap, ...).
|
||||
inst[0] = invertBranch(inst[0], BOffImm16(4 * sizeof(uint32_t)));
|
||||
// No need for a "nop" here because we can clobber scratch.
|
||||
// We need to add it to mixed jumps array here.
|
||||
// See MacroAssemblerMIPS64::branchWithCode().
|
||||
MOZ_ASSERT(inst[1].encode() == NopInst);
|
||||
MOZ_ASSERT(inst[2].encode() == NopInst);
|
||||
MOZ_ASSERT(inst[3].encode() == NopInst);
|
||||
addMixedJump(b, ImmPtr((void*)dest.getOffset()), MixedJumpPatch::PATCHABLE);
|
||||
inst[2] = InstJump(op_j, JOffImm26(0)).encode();
|
||||
}
|
||||
}
|
||||
label->bind(dest.getOffset());
|
||||
}
|
||||
|
||||
uint32_t
|
||||
Assembler::PatchWrite_NearCallSize()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -143,16 +143,11 @@ class Assembler : public AssemblerMIPSShared
|
|||
|
||||
static uintptr_t GetPointer(uint8_t*);
|
||||
|
||||
using AssemblerMIPSShared::bind;
|
||||
|
||||
void bind(RepatchLabel* label);
|
||||
void Bind(uint8_t* rawCode, CodeOffset* label, const void* address);
|
||||
|
||||
static void TraceJumpRelocations(JSTracer* trc, JitCode* code, CompactBufferReader& reader);
|
||||
static void TraceDataRelocations(JSTracer* trc, JitCode* code, CompactBufferReader& reader);
|
||||
|
||||
void bind(InstImm* inst, uintptr_t branch, uintptr_t target);
|
||||
|
||||
static uint32_t PatchWrite_NearCallSize();
|
||||
|
||||
static uint64_t ExtractLoad64Value(Instruction* inst0);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue