| Index: src/mips/assembler-mips.cc
|
| diff --git a/src/mips/assembler-mips.cc b/src/mips/assembler-mips.cc
|
| index fc664aafa524df3888f25ee752a00837515753d3..6831b0b0d370b2e32dd8d625460e90225737f61e 100644
|
| --- a/src/mips/assembler-mips.cc
|
| +++ b/src/mips/assembler-mips.cc
|
| @@ -959,6 +959,20 @@ void Assembler::GenInstrImmediate(Opcode opcode,
|
| }
|
|
|
|
|
| +void Assembler::GenInstrImmediate(Opcode opcode, Register rs, int32_t j) {
|
| + DCHECK(rs.is_valid() && (is_uint21(j)));
|
| + Instr instr = opcode | (rs.code() << kRsShift) | (j & kImm21Mask);
|
| + emit(instr);
|
| +}
|
| +
|
| +
|
| +void Assembler::GenInstrImmediate(Opcode opcode, int32_t offset26) {
|
| + DCHECK(is_int26(offset26));
|
| + Instr instr = opcode | (offset26 & kImm26Mask);
|
| + emit(instr);
|
| +}
|
| +
|
| +
|
| void Assembler::GenInstrJump(Opcode opcode,
|
| uint32_t address) {
|
| BlockTrampolinePoolScope block_trampoline_pool(this);
|
| @@ -1156,6 +1170,19 @@ void Assembler::bal(int16_t offset) {
|
| }
|
|
|
|
|
| +void Assembler::bc(int32_t offset) {
|
| + DCHECK(IsMipsArchVariant(kMips32r6));
|
| + GenInstrImmediate(BC, offset);
|
| +}
|
| +
|
| +
|
| +void Assembler::balc(int32_t offset) {
|
| + DCHECK(IsMipsArchVariant(kMips32r6));
|
| + positions_recorder()->WriteRecordedPositions();
|
| + GenInstrImmediate(BALC, offset);
|
| +}
|
| +
|
| +
|
| void Assembler::beq(Register rs, Register rt, int16_t offset) {
|
| BlockTrampolinePoolScope block_trampoline_pool(this);
|
| GenInstrImmediate(BEQ, rs, rt, offset);
|
| @@ -1355,7 +1382,7 @@ void Assembler::beqc(Register rs, Register rt, int16_t offset) {
|
| void Assembler::beqzc(Register rs, int32_t offset) {
|
| DCHECK(IsMipsArchVariant(kMips32r6));
|
| DCHECK(!(rs.is(zero_reg)));
|
| - Instr instr = BEQZC | (rs.code() << kRsShift) | offset;
|
| + Instr instr = POP66 | (rs.code() << kRsShift) | (offset & kImm21Mask);
|
| emit(instr);
|
| }
|
|
|
| @@ -1370,7 +1397,7 @@ void Assembler::bnec(Register rs, Register rt, int16_t offset) {
|
| void Assembler::bnezc(Register rs, int32_t offset) {
|
| DCHECK(IsMipsArchVariant(kMips32r6));
|
| DCHECK(!(rs.is(zero_reg)));
|
| - Instr instr = BNEZC | (rs.code() << kRsShift) | offset;
|
| + Instr instr = POP76 | (rs.code() << kRsShift) | offset;
|
| emit(instr);
|
| }
|
|
|
| @@ -1422,29 +1449,18 @@ void Assembler::jalr(Register rs, Register rd) {
|
| }
|
|
|
|
|
| -void Assembler::j_or_jr(int32_t target, Register rs) {
|
| - // Get pc of delay slot.
|
| - uint32_t ipc = reinterpret_cast<uint32_t>(pc_ + 1 * kInstrSize);
|
| - bool in_range = (ipc ^ static_cast<uint32_t>(target) >>
|
| - (kImm26Bits + kImmFieldShift)) == 0;
|
| - if (in_range) {
|
| - j(target);
|
| - } else {
|
| - jr(t9);
|
| - }
|
| +void Assembler::jic(Register rt, int16_t offset) {
|
| + DCHECK(IsMipsArchVariant(kMips32r6));
|
| + Instr instr = POP66 | (JIC << kRsShift) | (rt.code() << kRtShift) |
|
| + (offset & kImm16Mask);
|
| + emit(instr);
|
| }
|
|
|
|
|
| -void Assembler::jal_or_jalr(int32_t target, Register rs) {
|
| - // Get pc of delay slot.
|
| - uint32_t ipc = reinterpret_cast<uint32_t>(pc_ + 1 * kInstrSize);
|
| - bool in_range = (ipc ^ static_cast<uint32_t>(target) >>
|
| - (kImm26Bits+kImmFieldShift)) == 0;
|
| - if (in_range) {
|
| - jal(target);
|
| - } else {
|
| - jalr(t9);
|
| - }
|
| +void Assembler::jialc(Register rt, int16_t offset) {
|
| + DCHECK(IsMipsArchVariant(kMips32r6));
|
| + positions_recorder()->WriteRecordedPositions();
|
| + GenInstrImmediate(POP76, zero_reg, rt, offset);
|
| }
|
|
|
|
|
| @@ -1757,11 +1773,46 @@ void Assembler::lui(Register rd, int32_t j) {
|
| void Assembler::aui(Register rs, Register rt, int32_t j) {
|
| // This instruction uses same opcode as 'lui'. The difference in encoding is
|
| // 'lui' has zero reg. for rs field.
|
| + DCHECK(!(rs.is(zero_reg)));
|
| DCHECK(is_uint16(j));
|
| GenInstrImmediate(LUI, rs, rt, j);
|
| }
|
|
|
|
|
| +// ---------PC-Relative instructions-----------
|
| +
|
| +void Assembler::addiupc(Register rs, int32_t imm19) {
|
| + DCHECK(IsMipsArchVariant(kMips32r6));
|
| + DCHECK(rs.is_valid() && is_int19(imm19));
|
| + int32_t imm21 = ADDIUPC << kImm19Bits | (imm19 & kImm19Mask);
|
| + GenInstrImmediate(PCREL, rs, imm21);
|
| +}
|
| +
|
| +
|
| +void Assembler::lwpc(Register rs, int32_t offset19) {
|
| + DCHECK(IsMipsArchVariant(kMips32r6));
|
| + DCHECK(rs.is_valid() && is_int19(offset19));
|
| + int32_t imm21 = LWPC << kImm19Bits | (offset19 & kImm19Mask);
|
| + GenInstrImmediate(PCREL, rs, imm21);
|
| +}
|
| +
|
| +
|
| +void Assembler::auipc(Register rs, int16_t imm16) {
|
| + DCHECK(IsMipsArchVariant(kMips32r6));
|
| + DCHECK(rs.is_valid() && is_int16(imm16));
|
| + int32_t imm21 = AUIPC << kImm16Bits | (imm16 & kImm16Mask);
|
| + GenInstrImmediate(PCREL, rs, imm21);
|
| +}
|
| +
|
| +
|
| +void Assembler::aluipc(Register rs, int16_t imm16) {
|
| + DCHECK(IsMipsArchVariant(kMips32r6));
|
| + DCHECK(rs.is_valid() && is_int16(imm16));
|
| + int32_t imm21 = ALUIPC << kImm16Bits | (imm16 & kImm16Mask);
|
| + GenInstrImmediate(PCREL, rs, imm21);
|
| +}
|
| +
|
| +
|
| // -------------Misc-instructions--------------
|
|
|
| // Break / Trap instructions.
|
| @@ -1937,8 +1988,8 @@ void Assembler::ext_(Register rt, Register rs, uint16_t pos, uint16_t size) {
|
|
|
|
|
| void Assembler::bitswap(Register rd, Register rt) {
|
| - DCHECK(kArchVariant == kMips32r6);
|
| - GenInstrRegister(SPECIAL3, zero_reg, rt, rd, 0, BITSWAP);
|
| + DCHECK(IsMipsArchVariant(kMips32r6));
|
| + GenInstrRegister(SPECIAL3, zero_reg, rt, rd, 0, BSHFL);
|
| }
|
|
|
|
|
| @@ -1951,6 +2002,14 @@ void Assembler::pref(int32_t hint, const MemOperand& rs) {
|
| }
|
|
|
|
|
| +void Assembler::align(Register rd, Register rs, Register rt, uint8_t bp) {
|
| + DCHECK(IsMipsArchVariant(kMips32r6));
|
| + DCHECK(is_uint3(bp));
|
| + uint16_t sa = (ALIGN << kBp2Bits) | bp;
|
| + GenInstrRegister(SPECIAL3, rs, rt, rd, sa, BSHFL);
|
| +}
|
| +
|
| +
|
| // --------Coprocessor-instructions----------------
|
|
|
| // Load, store, move.
|
|
|