mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-22 23:24:59 +00:00
[mips][mips64r6] Add bgec and bgeuc instructions
Differential Revision: http://reviews.llvm.org/D4017 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210770 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -319,6 +319,11 @@ static DecodeStatus
|
||||
DecodeBgtzGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
|
||||
const void *Decoder);
|
||||
|
||||
template <typename InsnType>
|
||||
static DecodeStatus
|
||||
DecodeBlezGroupBranch(MCInst &MI, InsnType insn, uint64_t Address,
|
||||
const void *Decoder);
|
||||
|
||||
namespace llvm {
|
||||
extern Target TheMipselTarget, TheMipsTarget, TheMips64Target,
|
||||
TheMips64elTarget;
|
||||
@@ -514,6 +519,7 @@ static DecodeStatus DecodeBlezlGroupBranch(MCInst &MI, InsnType insn,
|
||||
InsnType Rs = fieldFromInstruction(insn, 21, 5);
|
||||
InsnType Rt = fieldFromInstruction(insn, 16, 5);
|
||||
InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
|
||||
bool HasRs = false;
|
||||
|
||||
if (Rt == 0)
|
||||
return MCDisassembler::Fail;
|
||||
@@ -521,8 +527,14 @@ static DecodeStatus DecodeBlezlGroupBranch(MCInst &MI, InsnType insn,
|
||||
MI.setOpcode(Mips::BLEZC);
|
||||
else if (Rs == Rt)
|
||||
MI.setOpcode(Mips::BGEZC);
|
||||
else
|
||||
return MCDisassembler::Fail; // FIXME: BGEC is not implemented yet.
|
||||
else {
|
||||
HasRs = true;
|
||||
MI.setOpcode(Mips::BGEC);
|
||||
}
|
||||
|
||||
if (HasRs)
|
||||
MI.addOperand(MCOperand::CreateReg(getReg(Decoder, Mips::GPR32RegClassID,
|
||||
Rs)));
|
||||
|
||||
MI.addOperand(MCOperand::CreateReg(getReg(Decoder, Mips::GPR32RegClassID,
|
||||
Rt)));
|
||||
@@ -614,6 +626,48 @@ static DecodeStatus DecodeBgtzGroupBranch(MCInst &MI, InsnType insn,
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
template <typename InsnType>
|
||||
static DecodeStatus DecodeBlezGroupBranch(MCInst &MI, InsnType insn,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
// If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
|
||||
// (otherwise we would have matched the BLEZL instruction from the earlier
|
||||
// ISA's instead).
|
||||
//
|
||||
// We have:
|
||||
// 0b000110 sssss ttttt iiiiiiiiiiiiiiii
|
||||
// Invalid if rs == 0
|
||||
// BLEZALC if rs == 0 && rt != 0
|
||||
// BGEZALC if rs == rt && rt != 0
|
||||
// BGEUC if rs != rt && rs != 0 && rt != 0
|
||||
|
||||
InsnType Rs = fieldFromInstruction(insn, 21, 5);
|
||||
InsnType Rt = fieldFromInstruction(insn, 16, 5);
|
||||
InsnType Imm = SignExtend64(fieldFromInstruction(insn, 0, 16), 16) << 2;
|
||||
bool HasRs = false;
|
||||
|
||||
if (Rt == 0)
|
||||
return MCDisassembler::Fail;
|
||||
else if (Rs == 0)
|
||||
MI.setOpcode(Mips::BLEZALC);
|
||||
else if (Rs == Rt)
|
||||
MI.setOpcode(Mips::BGEZALC);
|
||||
else {
|
||||
HasRs = true;
|
||||
MI.setOpcode(Mips::BGEUC);
|
||||
}
|
||||
|
||||
if (HasRs)
|
||||
MI.addOperand(MCOperand::CreateReg(getReg(Decoder, Mips::GPR32RegClassID,
|
||||
Rs)));
|
||||
MI.addOperand(MCOperand::CreateReg(getReg(Decoder, Mips::GPR32RegClassID,
|
||||
Rt)));
|
||||
|
||||
MI.addOperand(MCOperand::CreateImm(Imm));
|
||||
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
/// readInstruction - read four bytes from the MemoryObject
|
||||
/// and return 32 bit word sorted according to the given endianess
|
||||
static DecodeStatus readInstruction32(const MemoryObject ®ion,
|
||||
|
Reference in New Issue
Block a user