| Index: src/mips64/assembler-mips64.cc
|
| diff --git a/src/mips64/assembler-mips64.cc b/src/mips64/assembler-mips64.cc
|
| index 08f70ad33dbc4e69c24d0308d67df8997e904ea9..074b39f196559f3f966e31d5b5121e1079ae216c 100644
|
| --- a/src/mips64/assembler-mips64.cc
|
| +++ b/src/mips64/assembler-mips64.cc
|
| @@ -945,6 +945,21 @@ 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) | static_cast<uint32_t>(j & kImm21Mask);
|
| + emit(instr);
|
| +}
|
| +
|
| +
|
| +void Assembler::GenInstrImmediate(Opcode opcode, int32_t offset26) {
|
| + DCHECK((kMinInt26 <= offset26) && (offset26 <= kMaxInt26));
|
| + Instr instr = opcode | static_cast<uint32_t>(offset26 & kImm26Mask);
|
| + emit(instr);
|
| +}
|
| +
|
| +
|
| void Assembler::GenInstrJump(Opcode opcode,
|
| uint32_t address) {
|
| BlockTrampolinePoolScope block_trampoline_pool(this);
|
| @@ -1090,7 +1105,7 @@ int32_t Assembler::branch_offset21_compact(Label* L,
|
| }
|
| }
|
|
|
| - int32_t offset = target_pos - pc_offset();
|
| + int32_t offset = target_pos - (pc_offset() + kBranchPCOffset);
|
| DCHECK((offset & 3) == 0);
|
| DCHECK(((offset >> 2) & 0xFFE00000) == 0); // Offset is 21bit width.
|
|
|
| @@ -1137,6 +1152,18 @@ void Assembler::bal(int16_t offset) {
|
| }
|
|
|
|
|
| +void Assembler::bc(int32_t offset) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + GenInstrImmediate(BC, offset);
|
| +}
|
| +
|
| +
|
| +void Assembler::balc(int32_t offset) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + GenInstrImmediate(BALC, offset);
|
| +}
|
| +
|
| +
|
| void Assembler::beq(Register rs, Register rt, int16_t offset) {
|
| BlockTrampolinePoolScope block_trampoline_pool(this);
|
| GenInstrImmediate(BEQ, rs, rt, offset);
|
| @@ -1336,7 +1363,8 @@ void Assembler::beqc(Register rs, Register rt, int16_t offset) {
|
| void Assembler::beqzc(Register rs, int32_t offset) {
|
| DCHECK(kArchVariant == kMips64r6);
|
| DCHECK(!(rs.is(zero_reg)));
|
| - Instr instr = BEQZC | (rs.code() << kRsShift) | offset;
|
| + Instr instr = POP66 | (rs.code() << kRsShift) |
|
| + (static_cast<uint32_t>(offset) & kImm21Mask);
|
| emit(instr);
|
| }
|
|
|
| @@ -1351,7 +1379,7 @@ void Assembler::bnec(Register rs, Register rt, int16_t offset) {
|
| void Assembler::bnezc(Register rs, int32_t offset) {
|
| DCHECK(kArchVariant == kMips64r6);
|
| DCHECK(!(rs.is(zero_reg)));
|
| - Instr instr = BNEZC | (rs.code() << kRsShift) | offset;
|
| + Instr instr = POP76 | (rs.code() << kRsShift) | offset;
|
| emit(instr);
|
| }
|
|
|
| @@ -1429,6 +1457,21 @@ void Assembler::jal_or_jalr(int64_t target, Register rs) {
|
| }
|
|
|
|
|
| +void Assembler::jic(Register rt, int16_t offset) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + Instr instr = POP66 | (JIC << kRsShift) | (rt.code() << kRtShift) |
|
| + static_cast<uint16_t>(offset);
|
| + emit(instr);
|
| +}
|
| +
|
| +
|
| +void Assembler::jialc(Register rt, int16_t offset) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + positions_recorder()->WriteRecordedPositions();
|
| + GenInstrImmediate(POP76, zero_reg, rt, offset);
|
| +}
|
| +
|
| +
|
| // -------Data-processing-instructions---------
|
|
|
| // Arithmetic.
|
| @@ -1959,6 +2002,66 @@ void Assembler::sd(Register rd, const MemOperand& rs) {
|
| }
|
|
|
|
|
| +// ---------PC-Relative instructions-----------
|
| +
|
| +void Assembler::addiupc(Register rs, int32_t imm19) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + DCHECK(rs.is_valid());
|
| + DCHECK((kMinInt19 <= imm19) && (imm19 <= kMaxInt19));
|
| + int32_t imm21 =
|
| + ADDIUPC << kImm19Bits | static_cast<uint32_t>(imm19 & kImm19Mask);
|
| + GenInstrImmediate(PCREL, rs, imm21);
|
| +}
|
| +
|
| +
|
| +void Assembler::lwpc(Register rs, int32_t offset19) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + DCHECK(rs.is_valid());
|
| + DCHECK((kMinInt19 <= offset19) && (offset19 <= kMaxInt19));
|
| + int32_t imm21 =
|
| + LWPC << kImm19Bits | static_cast<uint32_t>(offset19 & kImm19Mask);
|
| + GenInstrImmediate(PCREL, rs, imm21);
|
| +}
|
| +
|
| +
|
| +void Assembler::lwupc(Register rs, int32_t offset19) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + DCHECK(rs.is_valid());
|
| + DCHECK((kMinInt19 <= offset19) && (offset19 <= kMaxInt19));
|
| + int32_t imm21 =
|
| + LWUPC << kImm19Bits | static_cast<uint32_t>(offset19 & kImm19Mask);
|
| + GenInstrImmediate(PCREL, rs, imm21);
|
| +}
|
| +
|
| +
|
| +void Assembler::ldpc(Register rs, int32_t offset18) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + DCHECK(rs.is_valid());
|
| + DCHECK((kMinInt18 <= offset18) && (offset18 <= kMaxInt18));
|
| + int32_t imm21 =
|
| + LDPC << kImm18Bits | static_cast<uint32_t>(offset18 & kImm18Mask);
|
| + GenInstrImmediate(PCREL, rs, imm21);
|
| +}
|
| +
|
| +
|
| +void Assembler::auipc(Register rs, int16_t imm16) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + DCHECK(rs.is_valid() && is_int16(imm16));
|
| + int32_t imm21 =
|
| + AUIPC << kImm16Bits | static_cast<uint32_t>(imm16 & kImm16Mask);
|
| + GenInstrImmediate(PCREL, rs, imm21);
|
| +}
|
| +
|
| +
|
| +void Assembler::aluipc(Register rs, int16_t imm16) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + DCHECK(rs.is_valid() && is_int16(imm16));
|
| + int32_t imm21 =
|
| + ALUIPC << kImm16Bits | static_cast<uint32_t>(imm16 & kImm16Mask);
|
| + GenInstrImmediate(PCREL, rs, imm21);
|
| +}
|
| +
|
| +
|
| // -------------Misc-instructions--------------
|
|
|
| // Break / Trap instructions.
|
| @@ -2207,13 +2310,13 @@ void Assembler::dext_(Register rt, Register rs, uint16_t pos, uint16_t size) {
|
|
|
| void Assembler::bitswap(Register rd, Register rt) {
|
| DCHECK(kArchVariant == kMips64r6);
|
| - GenInstrRegister(SPECIAL3, zero_reg, rt, rd, 0, BITSWAP);
|
| + GenInstrRegister(SPECIAL3, zero_reg, rt, rd, 0, BSHFL);
|
| }
|
|
|
|
|
| void Assembler::dbitswap(Register rd, Register rt) {
|
| DCHECK(kArchVariant == kMips64r6);
|
| - GenInstrRegister(SPECIAL3, zero_reg, rt, rd, 0, DBITSWAP);
|
| + GenInstrRegister(SPECIAL3, zero_reg, rt, rd, 0, DBSHFL);
|
| }
|
|
|
|
|
| @@ -2225,6 +2328,22 @@ void Assembler::pref(int32_t hint, const MemOperand& rs) {
|
| }
|
|
|
|
|
| +void Assembler::align(Register rd, Register rs, Register rt, uint8_t bp) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + DCHECK(is_uint3(bp));
|
| + uint16_t sa = (ALIGN << kBp2Bits) | bp;
|
| + GenInstrRegister(SPECIAL3, rs, rt, rd, sa, BSHFL);
|
| +}
|
| +
|
| +
|
| +void Assembler::dalign(Register rd, Register rs, Register rt, uint8_t bp) {
|
| + DCHECK(kArchVariant == kMips64r6);
|
| + DCHECK(is_uint3(bp));
|
| + uint16_t sa = (DALIGN << kBp3Bits) | bp;
|
| + GenInstrRegister(SPECIAL3, rs, rt, rd, sa, DBSHFL);
|
| +}
|
| +
|
| +
|
| // --------Coprocessor-instructions----------------
|
|
|
| // Load, store, move.
|
|
|