summaryrefslogtreecommitdiffstats
path: root/js
diff options
context:
space:
mode:
authorJiaxun Yang <jiaxun.yang@flygoat.com>2020-05-12 12:40:09 +0800
committerJiaxun Yang <jiaxun.yang@flygoat.com>2020-05-14 16:31:57 +0800
commit79834afa6289979883ca5e119569624b72d2f94a (patch)
treeeac852dacae7747804b4a78359c782632785bda5 /js
parent8055c99af4bea1c54d0af960447f6ba5cc72751c (diff)
downloadUXP-79834afa6289979883ca5e119569624b72d2f94a.tar
UXP-79834afa6289979883ca5e119569624b72d2f94a.tar.gz
UXP-79834afa6289979883ca5e119569624b72d2f94a.tar.lz
UXP-79834afa6289979883ca5e119569624b72d2f94a.tar.xz
UXP-79834afa6289979883ca5e119569624b72d2f94a.zip
Bug 1271968 - IonMonkey: MIPS: Refactor PatchWrite_NearCall.
Tag: #1542
Diffstat (limited to 'js')
-rw-r--r--js/src/jit/mips-shared/Assembler-mips-shared.cpp26
-rw-r--r--js/src/jit/mips-shared/Assembler-mips-shared.h2
-rw-r--r--js/src/jit/mips32/Assembler-mips32.cpp33
-rw-r--r--js/src/jit/mips32/Assembler-mips32.h9
-rw-r--r--js/src/jit/mips64/Assembler-mips64.cpp39
-rw-r--r--js/src/jit/mips64/Assembler-mips64.h8
6 files changed, 31 insertions, 86 deletions
diff --git a/js/src/jit/mips-shared/Assembler-mips-shared.cpp b/js/src/jit/mips-shared/Assembler-mips-shared.cpp
index 7b8ead20a..e78d33549 100644
--- a/js/src/jit/mips-shared/Assembler-mips-shared.cpp
+++ b/js/src/jit/mips-shared/Assembler-mips-shared.cpp
@@ -1748,6 +1748,25 @@ AssemblerMIPSShared::PatchWrite_Imm32(CodeLocationLabel label, Imm32 imm)
*(raw - 1) = imm.value;
}
+uint32_t
+AssemblerMIPSShared::PatchWrite_NearCallSize()
+{
+ return 2 * sizeof(uint32_t);
+}
+
+void
+AssemblerMIPSShared::PatchWrite_NearCall(CodeLocationLabel start, CodeLocationLabel toCall)
+{
+ Instruction* inst = (Instruction*) start.raw();
+
+ // Overwrite whatever instruction used to be here with a call.
+ inst[0] = InstJump(op_jal, JOffImm26(uintptr_t(toCall.raw())));
+ inst[1] = InstNOP();
+
+ // Ensure everyone sees the code that was just written into memory.
+ AutoFlushICache::flush(uintptr_t(inst), PatchWrite_NearCallSize());
+}
+
uint8_t*
AssemblerMIPSShared::NextInstruction(uint8_t* inst_, uint32_t* count)
{
@@ -1789,8 +1808,8 @@ AssemblerMIPSShared::PatchMixedJump(uint8_t* src, uint8_t* mid, uint8_t* target)
offset = intptr_t(mid);
if (insn->extractOpcode() != ((uint32_t)op_lui >> OpcodeShift)) {
o = 1 * sizeof(uint32_t);
- Assembler::PatchInstructionImmediate(mid + Assembler::PatchWrite_NearCallSize(),
- PatchedImmPtr(&b[2]));
+ Assembler::PatchInstructionImmediate(mid + Assembler::InstructionImmediateSize() +
+ 2 * sizeof(uint32_t), PatchedImmPtr(&b[2]));
}
Assembler::PatchInstructionImmediate(mid + o, PatchedImmPtr(target));
} else {
@@ -1823,7 +1842,8 @@ AssemblerMIPSShared::PatchMixedJumps(uint8_t* buffer)
mid = buffer + mjp.mid.getOffset();
if (MixedJumpPatch::CONDITIONAL & mjp.kind) {
InstImm* bc = (InstImm*)(buffer + mjp.mid.getOffset());
- bc[0] = invertBranch(b[0], BOffImm16(Assembler::PatchWrite_NearCallSize()));
+ BOffImm16 offset(Assembler::InstructionImmediateSize() + 2 * sizeof(uint32_t));
+ bc[0] = invertBranch(b[0], offset);
}
}
diff --git a/js/src/jit/mips-shared/Assembler-mips-shared.h b/js/src/jit/mips-shared/Assembler-mips-shared.h
index 52e9051bb..3c01350e6 100644
--- a/js/src/jit/mips-shared/Assembler-mips-shared.h
+++ b/js/src/jit/mips-shared/Assembler-mips-shared.h
@@ -1282,8 +1282,10 @@ class AssemblerMIPSShared : public AssemblerShared
}
static uint32_t NopSize() { return 4; }
+ static uint32_t PatchWrite_NearCallSize();
static void PatchWrite_Imm32(CodeLocationLabel label, Imm32 imm);
+ static void PatchWrite_NearCall(CodeLocationLabel start, CodeLocationLabel toCall);
static uint32_t AlignDoubleArg(uint32_t offset) {
return (offset + 1U) &~ 1U;
diff --git a/js/src/jit/mips32/Assembler-mips32.cpp b/js/src/jit/mips32/Assembler-mips32.cpp
index 89c7a8c44..f1fb71609 100644
--- a/js/src/jit/mips32/Assembler-mips32.cpp
+++ b/js/src/jit/mips32/Assembler-mips32.cpp
@@ -297,31 +297,6 @@ Assembler::Bind(uint8_t* rawCode, CodeOffset* label, const void* address)
}
uint32_t
-Assembler::PatchWrite_NearCallSize()
-{
- return 4 * sizeof(uint32_t);
-}
-
-void
-Assembler::PatchWrite_NearCall(CodeLocationLabel start, CodeLocationLabel toCall)
-{
- Instruction* inst = (Instruction*) start.raw();
- uint8_t* dest = toCall.raw();
-
- // Overwrite whatever instruction used to be here with a call.
- // Always use long jump for two reasons:
- // - Jump has to be the same size because of PatchWrite_NearCallSize.
- // - Return address has to be at the end of replaced block.
- // Short jump wouldn't be more efficient.
- Assembler::WriteLuiOriInstructions(inst, &inst[1], ScratchRegister, (uint32_t)dest);
- inst[2] = InstReg(op_special, ScratchRegister, zero, ra, ff_jalr);
- inst[3] = InstNOP();
-
- // Ensure everyone sees the code that was just written into memory.
- AutoFlushICache::flush(uintptr_t(inst), PatchWrite_NearCallSize());
-}
-
-uint32_t
Assembler::ExtractLuiOriValue(Instruction* inst0, Instruction* inst1)
{
InstImm* i0 = (InstImm*) inst0;
@@ -335,14 +310,6 @@ Assembler::ExtractLuiOriValue(Instruction* inst0, Instruction* inst1)
}
void
-Assembler::WriteLuiOriInstructions(Instruction* inst0, Instruction* inst1,
- Register reg, uint32_t value)
-{
- *inst0 = InstImm(op_lui, zero, reg, Imm16::Upper(Imm32(value)));
- *inst1 = InstImm(op_ori, reg, reg, Imm16::Lower(Imm32(value)));
-}
-
-void
Assembler::PatchDataWithValueCheck(CodeLocationLabel label, ImmPtr newValue,
ImmPtr expectedValue)
{
diff --git a/js/src/jit/mips32/Assembler-mips32.h b/js/src/jit/mips32/Assembler-mips32.h
index 2bfb61e8e..6988d23a5 100644
--- a/js/src/jit/mips32/Assembler-mips32.h
+++ b/js/src/jit/mips32/Assembler-mips32.h
@@ -149,13 +149,10 @@ class Assembler : public AssemblerMIPSShared
static void TraceJumpRelocations(JSTracer* trc, JitCode* code, CompactBufferReader& reader);
static void TraceDataRelocations(JSTracer* trc, JitCode* code, CompactBufferReader& reader);
- static uint32_t PatchWrite_NearCallSize();
-
+ static uint32_t InstructionImmediateSize() {
+ return 2 * sizeof(uint32_t);
+ }
static uint32_t ExtractLuiOriValue(Instruction* inst0, Instruction* inst1);
- static void WriteLuiOriInstructions(Instruction* inst, Instruction* inst1,
- Register reg, uint32_t value);
-
- static void PatchWrite_NearCall(CodeLocationLabel start, CodeLocationLabel toCall);
static void PatchDataWithValueCheck(CodeLocationLabel label, ImmPtr newValue,
ImmPtr expectedValue);
static void PatchDataWithValueCheck(CodeLocationLabel label, PatchedImmPtr newValue,
diff --git a/js/src/jit/mips64/Assembler-mips64.cpp b/js/src/jit/mips64/Assembler-mips64.cpp
index a7254b825..4f3eac094 100644
--- a/js/src/jit/mips64/Assembler-mips64.cpp
+++ b/js/src/jit/mips64/Assembler-mips64.cpp
@@ -228,32 +228,6 @@ Assembler::Bind(uint8_t* rawCode, CodeOffset* label, const void* address)
}
}
-uint32_t
-Assembler::PatchWrite_NearCallSize()
-{
- // Load an address needs 4 instructions, and a jump with a delay slot.
- return (4 + 2) * sizeof(uint32_t);
-}
-
-void
-Assembler::PatchWrite_NearCall(CodeLocationLabel start, CodeLocationLabel toCall)
-{
- Instruction* inst = (Instruction*) start.raw();
- uint8_t* dest = toCall.raw();
-
- // Overwrite whatever instruction used to be here with a call.
- // Always use long jump for two reasons:
- // - Jump has to be the same size because of PatchWrite_NearCallSize.
- // - Return address has to be at the end of replaced block.
- // Short jump wouldn't be more efficient.
- Assembler::WriteLoad64Instructions(inst, ScratchRegister, (uint64_t)dest);
- inst[4] = InstReg(op_special, ScratchRegister, zero, ra, ff_jalr);
- inst[5] = InstNOP();
-
- // Ensure everyone sees the code that was just written into memory.
- AutoFlushICache::flush(uintptr_t(inst), PatchWrite_NearCallSize());
-}
-
uint64_t
Assembler::ExtractLoad64Value(Instruction* inst0)
{
@@ -315,19 +289,6 @@ Assembler::UpdateLoad64Value(Instruction* inst0, uint64_t value)
}
void
-Assembler::WriteLoad64Instructions(Instruction* inst0, Register reg, uint64_t value)
-{
- Instruction* inst1 = inst0->next();
- Instruction* inst2 = inst1->next();
- Instruction* inst3 = inst2->next();
-
- *inst0 = InstImm(op_lui, zero, reg, Imm16::Lower(Imm32(value >> 32)));
- *inst1 = InstImm(op_ori, reg, reg, Imm16::Upper(Imm32(value)));
- *inst2 = InstReg(op_special, rs_one, reg, reg, 48 - 32, ff_dsrl32);
- *inst3 = InstImm(op_ori, reg, reg, Imm16::Lower(Imm32(value)));
-}
-
-void
Assembler::PatchDataWithValueCheck(CodeLocationLabel label, ImmPtr newValue,
ImmPtr expectedValue)
{
diff --git a/js/src/jit/mips64/Assembler-mips64.h b/js/src/jit/mips64/Assembler-mips64.h
index 6561ba6c4..5ca003438 100644
--- a/js/src/jit/mips64/Assembler-mips64.h
+++ b/js/src/jit/mips64/Assembler-mips64.h
@@ -148,14 +148,12 @@ class Assembler : public AssemblerMIPSShared
static void TraceJumpRelocations(JSTracer* trc, JitCode* code, CompactBufferReader& reader);
static void TraceDataRelocations(JSTracer* trc, JitCode* code, CompactBufferReader& reader);
- static uint32_t PatchWrite_NearCallSize();
-
+ static uint32_t InstructionImmediateSize() {
+ return 4 * sizeof(uint32_t);
+ }
static uint64_t ExtractLoad64Value(Instruction* inst0);
static void UpdateLoad64Value(Instruction* inst0, uint64_t value);
- static void WriteLoad64Instructions(Instruction* inst0, Register reg, uint64_t value);
-
- static void PatchWrite_NearCall(CodeLocationLabel start, CodeLocationLabel toCall);
static void PatchDataWithValueCheck(CodeLocationLabel label, ImmPtr newValue,
ImmPtr expectedValue);
static void PatchDataWithValueCheck(CodeLocationLabel label, PatchedImmPtr newValue,