| Index: src/mips64/assembler-mips64-inl.h
|
| diff --git a/src/mips64/assembler-mips64-inl.h b/src/mips64/assembler-mips64-inl.h
|
| index a824ee7fc13c7d38a63a40dd079319c960498e9b..a6e0298763819cd077949f75833bce9d08d5cf33 100644
|
| --- a/src/mips64/assembler-mips64-inl.h
|
| +++ b/src/mips64/assembler-mips64-inl.h
|
| @@ -438,12 +438,24 @@ void Assembler::CheckTrampolinePoolQuick(int extra_instructions) {
|
| }
|
|
|
|
|
| -void Assembler::emit(Instr x) {
|
| +void Assembler::emit(Instr x, CompactBranchType is_compact_branch) {
|
| if (!is_buffer_growth_blocked()) {
|
| CheckBuffer();
|
| }
|
| + if (IsPrevInstrCompactBranch()) {
|
| + if (Instruction::IsForbiddenAfterBranchInstr(x)) {
|
| + // Nop instruction to preceed a CTI in forbidden slot:
|
| + Instr nop = SPECIAL | SLL;
|
| + *reinterpret_cast<Instr*>(pc_) = nop;
|
| + pc_ += kInstrSize;
|
| + }
|
| + ClearCompactBranchState();
|
| + }
|
| *reinterpret_cast<Instr*>(pc_) = x;
|
| pc_ += kInstrSize;
|
| + if (is_compact_branch == CompactBranchType::COMPACT_BRANCH) {
|
| + EmittedCompactBranchInstruction();
|
| + }
|
| CheckTrampolinePoolQuick();
|
| }
|
|
|
| @@ -452,6 +464,14 @@ void Assembler::emit(uint64_t x) {
|
| 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();
|
| + }
|
| *reinterpret_cast<uint64_t*>(pc_) = x;
|
| pc_ += kInstrSize * 2;
|
| CheckTrampolinePoolQuick();
|
|
|