Index: src/mips/assembler-mips-inl.h |
diff --git a/src/mips/assembler-mips-inl.h b/src/mips/assembler-mips-inl.h |
index 3cde3c5f128287236dcafe09bf7809ec423b248c..27ec8e5bda9b40fccec4f9218264edea38085927 100644 |
--- a/src/mips/assembler-mips-inl.h |
+++ b/src/mips/assembler-mips-inl.h |
@@ -437,11 +437,23 @@ void Assembler::CheckTrampolinePoolQuick(int extra_instructions) { |
} |
-void Assembler::emit(Instr x, CompactBranchType is_compact_branch) { |
+void Assembler::CheckForEmitInForbiddenSlot() { |
if (!is_buffer_growth_blocked()) { |
CheckBuffer(); |
} |
if (IsPrevInstrCompactBranch()) { |
+ // Nop instruction to preceed a CTI in forbidden slot: |
+ Instr nop = SPECIAL | SLL; |
+ *reinterpret_cast<Instr*>(pc_) = nop; |
+ pc_ += kInstrSize; |
+ |
+ ClearCompactBranchState(); |
+ } |
+} |
+ |
+ |
+void Assembler::EmitHelper(Instr x, CompactBranchType is_compact_branch) { |
+ if (IsPrevInstrCompactBranch()) { |
if (Instruction::IsForbiddenAfterBranchInstr(x)) { |
// Nop instruction to preceed a CTI in forbidden slot: |
Instr nop = SPECIAL | SLL; |
@@ -459,6 +471,22 @@ void Assembler::emit(Instr x, CompactBranchType is_compact_branch) { |
} |
+template <typename T> |
+void Assembler::EmitHelper(T x) { |
+ *reinterpret_cast<T*>(pc_) = x; |
+ pc_ += sizeof(x); |
+ CheckTrampolinePoolQuick(); |
+} |
+ |
+ |
+void Assembler::emit(Instr x, CompactBranchType is_compact_branch) { |
+ if (!is_buffer_growth_blocked()) { |
+ CheckBuffer(); |
+ } |
+ EmitHelper(x, is_compact_branch); |
+} |
+ |
+ |
} // namespace internal |
} // namespace v8 |