summaryrefslogtreecommitdiff
path: root/disassembler/disassembler_riscv64.cc
diff options
context:
space:
mode:
Diffstat (limited to 'disassembler/disassembler_riscv64.cc')
-rw-r--r--disassembler/disassembler_riscv64.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/disassembler/disassembler_riscv64.cc b/disassembler/disassembler_riscv64.cc
index 992fe31637..c0c5986160 100644
--- a/disassembler/disassembler_riscv64.cc
+++ b/disassembler/disassembler_riscv64.cc
@@ -708,6 +708,7 @@ void DisassemblerRiscv64::Printer::Print32BinOpImm(uint32_t insn32) {
DCHECK_EQ(insn32 & 0x77u, 0x13u); // Note: Bit 0x8 selects narrow binop.
bool narrow = (insn32 & 0x8u) != 0u;
uint32_t funct3 = (insn32 >> 12) & 7u;
+ uint32_t funct6 = (insn32 >> 26) & 0x3Fu;
uint32_t rd = GetRd(insn32);
uint32_t rs1 = GetRs1(insn32);
int32_t imm = Decode32Imm12(insn32);
@@ -740,6 +741,12 @@ void DisassemblerRiscv64::Printer::Print32BinOpImm(uint32_t insn32) {
os_ << "orc.b " << XRegName(rd) << ", " << XRegName(rs1);
} else if (imm == 0x6b8u && !narrow && funct3 == 5u) {
os_ << "rev8 " << XRegName(rd) << ", " << XRegName(rs1);
+ } else if (!narrow && funct6 == 0x12u && (funct3 == /*BCLRI*/ 1u || funct3 == /*BEXTI*/ 5u)) {
+ os_ << ((funct3 == /*BCLRI*/ 1u) ? "bclri" : "bexti");
+ } else if (!narrow && funct6 == 0x1Au && funct3 == 0x1u /*BINVI*/) {
+ os_ << "binvi";
+ } else if (!narrow && funct6 == 0xAu && funct3 == 0x1u /*BSETI*/) {
+ os_ << "bseti";
} else {
bool bad_high_bits = false;
if (funct3 == /*SLLI*/ 1u || funct3 == /*SRLI/SRAI*/ 5u) {
@@ -788,6 +795,13 @@ void DisassemblerRiscv64::Printer::Print32BinOp(uint32_t insn32) {
os_ << "snez " << XRegName(rd) << ", " << XRegName(rs2);
} else if (narrow && high_bits == 0x08000000u && funct3 == /*ADD.UW*/ 0u && rs2 == Zero) {
os_ << "zext.w " << XRegName(rd) << ", " << XRegName(rs1);
+ } else if (!narrow && high_bits == 0x48000000u &&
+ (funct3 == /*BCLR*/ 1u || funct3 == /*BEXT*/ 5u)) {
+ os_ << ((funct3 == /*BCLR*/ 1u) ? "bclr" : "bext");
+ } else if (!narrow && high_bits == 0x68000000u && funct3 == /*BINV*/ 1u) {
+ os_ << "binv";
+ } else if (!narrow && high_bits == 0x28000000u && funct3 == /*BSET*/ 1u) {
+ os_ << "bset";
} else {
bool bad_high_bits = false;
if (high_bits == 0x40000000u && (funct3 == /*SUB*/ 0u || funct3 == /*SRA*/ 5u)) {