mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-03 17:24:24 +00:00
[mips][microMIPS] Fix disassembling of 16-bit microMIPS instructions LWM16 and SWM16
Differential Revision: http://reviews.llvm.org/D7436 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228683 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bd1729e5d4
commit
cb5f9ea1ec
@ -299,6 +299,11 @@ static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
|
||||
uint64_t Address,
|
||||
const void *Decoder);
|
||||
|
||||
static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
|
||||
unsigned Insn,
|
||||
uint64_t Address,
|
||||
const void *Decoder);
|
||||
|
||||
static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
|
||||
unsigned Insn,
|
||||
uint64_t Address,
|
||||
@ -1304,6 +1309,22 @@ static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst &Inst,
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst &Inst,
|
||||
unsigned Insn,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
int Offset = SignExtend32<4>(Insn & 0xf);
|
||||
|
||||
if (DecodeRegListOperand16(Inst, Insn, Address, Decoder)
|
||||
== MCDisassembler::Fail)
|
||||
return MCDisassembler::Fail;
|
||||
|
||||
Inst.addOperand(MCOperand::CreateReg(Mips::SP));
|
||||
Inst.addOperand(MCOperand::CreateImm(Offset << 2));
|
||||
|
||||
return MCDisassembler::Success;
|
||||
}
|
||||
|
||||
static DecodeStatus DecodeMemMMImm12(MCInst &Inst,
|
||||
unsigned Insn,
|
||||
uint64_t Address,
|
||||
@ -1803,15 +1824,10 @@ static DecodeStatus DecodeRegListOperand16(MCInst &Inst, unsigned Insn,
|
||||
uint64_t Address,
|
||||
const void *Decoder) {
|
||||
unsigned Regs[] = {Mips::S0, Mips::S1, Mips::S2, Mips::S3};
|
||||
unsigned RegNum;
|
||||
|
||||
unsigned RegLst = fieldFromInstruction(Insn, 4, 2);
|
||||
// Empty register lists are not allowed.
|
||||
if (RegLst == 0)
|
||||
return MCDisassembler::Fail;
|
||||
unsigned RegNum = RegLst & 0x3;
|
||||
|
||||
RegNum = RegLst & 0x3;
|
||||
for (unsigned i = 0; i < RegNum - 1; i++)
|
||||
for (unsigned i = 0; i <= RegNum; i++)
|
||||
Inst.addOperand(MCOperand::CreateReg(Regs[i]));
|
||||
|
||||
Inst.addOperand(MCOperand::CreateReg(Mips::RA));
|
||||
|
@ -505,6 +505,7 @@ class StoreMultMM16<string opstr,
|
||||
ComplexPattern Addr = addr> :
|
||||
MicroMipsInst16<(outs), (ins reglist16:$rt, mem_mm_4sp:$addr),
|
||||
!strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI> {
|
||||
let DecoderMethod = "DecodeMemMMReglistImm4Lsl2";
|
||||
let mayStore = 1;
|
||||
}
|
||||
|
||||
@ -513,6 +514,7 @@ class LoadMultMM16<string opstr,
|
||||
ComplexPattern Addr = addr> :
|
||||
MicroMipsInst16<(outs reglist16:$rt), (ins mem_mm_4sp:$addr),
|
||||
!strconcat(opstr, "\t$rt, $addr"), [], Itin, FrmI> {
|
||||
let DecoderMethod = "DecodeMemMMReglistImm4Lsl2";
|
||||
let mayLoad = 1;
|
||||
}
|
||||
|
||||
|
@ -489,3 +489,9 @@
|
||||
|
||||
# CHECK: lw $3, 32($gp)
|
||||
0x65 0x88
|
||||
|
||||
# CHECK: lwm16 $16, $17, $ra, 8($sp)
|
||||
0x45 0x12
|
||||
|
||||
# CHECK: swm16 $16, $17, $ra, 8($sp)
|
||||
0x45 0x52
|
||||
|
@ -489,3 +489,9 @@
|
||||
|
||||
# CHECK: lw $3, 32($gp)
|
||||
0x88 0x65
|
||||
|
||||
# CHECK: lwm16 $16, $17, $ra, 8($sp)
|
||||
0x12 0x45
|
||||
|
||||
# CHECK: swm16 $16, $17, $ra, 8($sp)
|
||||
0x52 0x45
|
||||
|
Loading…
x
Reference in New Issue
Block a user