mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-13 09:33:50 +00:00
ARM: Correct printing of pre-indexed operands.
According to the ARM reference manual, constant offsets are mandatory for pre-indexed addressing modes. The MC disassembler was not obeying this when the offset is 0. It was producing instructions like: str r0, [r1]!. Correct syntax is: str r0, [r1, #0]!. This change modifies the dumping of operands so that the offset is always printed, regardless of its value, when pre-indexed addressing mode is used. Patch by Mihail Popa <Mihail.Popa@arm.com> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179398 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9458f3ecee
commit
d64ee4455a
@ -744,18 +744,26 @@ def imm1_16 : Operand<i32>, PatLeaf<(imm), [{ return Imm > 0 && Imm <= 16; }],
|
|||||||
// addrmode_imm12 := reg +/- imm12
|
// addrmode_imm12 := reg +/- imm12
|
||||||
//
|
//
|
||||||
def MemImm12OffsetAsmOperand : AsmOperandClass { let Name = "MemImm12Offset"; }
|
def MemImm12OffsetAsmOperand : AsmOperandClass { let Name = "MemImm12Offset"; }
|
||||||
def addrmode_imm12 : Operand<i32>,
|
class AddrMode_Imm12 : Operand<i32>,
|
||||||
ComplexPattern<i32, 2, "SelectAddrModeImm12", []> {
|
ComplexPattern<i32, 2, "SelectAddrModeImm12", []> {
|
||||||
// 12-bit immediate operand. Note that instructions using this encode
|
// 12-bit immediate operand. Note that instructions using this encode
|
||||||
// #0 and #-0 differently. We flag #-0 as the magic value INT32_MIN. All other
|
// #0 and #-0 differently. We flag #-0 as the magic value INT32_MIN. All other
|
||||||
// immediate values are as normal.
|
// immediate values are as normal.
|
||||||
|
|
||||||
let EncoderMethod = "getAddrModeImm12OpValue";
|
let EncoderMethod = "getAddrModeImm12OpValue";
|
||||||
let PrintMethod = "printAddrModeImm12Operand";
|
|
||||||
let DecoderMethod = "DecodeAddrModeImm12Operand";
|
let DecoderMethod = "DecodeAddrModeImm12Operand";
|
||||||
let ParserMatchClass = MemImm12OffsetAsmOperand;
|
let ParserMatchClass = MemImm12OffsetAsmOperand;
|
||||||
let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
|
let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def addrmode_imm12 : AddrMode_Imm12 {
|
||||||
|
let PrintMethod = "printAddrModeImm12Operand<false>";
|
||||||
|
}
|
||||||
|
|
||||||
|
def addrmode_imm12_pre : AddrMode_Imm12 {
|
||||||
|
let PrintMethod = "printAddrModeImm12Operand<true>";
|
||||||
|
}
|
||||||
|
|
||||||
// ldst_so_reg := reg +/- reg shop imm
|
// ldst_so_reg := reg +/- reg shop imm
|
||||||
//
|
//
|
||||||
def MemRegOffsetAsmOperand : AsmOperandClass { let Name = "MemRegOffset"; }
|
def MemRegOffsetAsmOperand : AsmOperandClass { let Name = "MemRegOffset"; }
|
||||||
@ -855,14 +863,23 @@ def am2offset_imm : Operand<i32>,
|
|||||||
//
|
//
|
||||||
// FIXME: split into imm vs. reg versions.
|
// FIXME: split into imm vs. reg versions.
|
||||||
def AddrMode3AsmOperand : AsmOperandClass { let Name = "AddrMode3"; }
|
def AddrMode3AsmOperand : AsmOperandClass { let Name = "AddrMode3"; }
|
||||||
def addrmode3 : Operand<i32>,
|
class AddrMode3 : Operand<i32>,
|
||||||
ComplexPattern<i32, 3, "SelectAddrMode3", []> {
|
ComplexPattern<i32, 3, "SelectAddrMode3", []> {
|
||||||
let EncoderMethod = "getAddrMode3OpValue";
|
let EncoderMethod = "getAddrMode3OpValue";
|
||||||
let PrintMethod = "printAddrMode3Operand";
|
|
||||||
let ParserMatchClass = AddrMode3AsmOperand;
|
let ParserMatchClass = AddrMode3AsmOperand;
|
||||||
let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm);
|
let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def addrmode3 : AddrMode3
|
||||||
|
{
|
||||||
|
let PrintMethod = "printAddrMode3Operand<false>";
|
||||||
|
}
|
||||||
|
|
||||||
|
def addrmode3_pre : AddrMode3
|
||||||
|
{
|
||||||
|
let PrintMethod = "printAddrMode3Operand<true>";
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: split into imm vs. reg versions.
|
// FIXME: split into imm vs. reg versions.
|
||||||
// FIXME: parser method to handle +/- register.
|
// FIXME: parser method to handle +/- register.
|
||||||
def AM3OffsetAsmOperand : AsmOperandClass {
|
def AM3OffsetAsmOperand : AsmOperandClass {
|
||||||
@ -888,15 +905,22 @@ def ldstm_mode : OptionalDefOperand<OtherVT, (ops i32), (ops (i32 1))> {
|
|||||||
// addrmode5 := reg +/- imm8*4
|
// addrmode5 := reg +/- imm8*4
|
||||||
//
|
//
|
||||||
def AddrMode5AsmOperand : AsmOperandClass { let Name = "AddrMode5"; }
|
def AddrMode5AsmOperand : AsmOperandClass { let Name = "AddrMode5"; }
|
||||||
def addrmode5 : Operand<i32>,
|
class AddrMode5 : Operand<i32>,
|
||||||
ComplexPattern<i32, 2, "SelectAddrMode5", []> {
|
ComplexPattern<i32, 2, "SelectAddrMode5", []> {
|
||||||
let PrintMethod = "printAddrMode5Operand";
|
|
||||||
let EncoderMethod = "getAddrMode5OpValue";
|
let EncoderMethod = "getAddrMode5OpValue";
|
||||||
let DecoderMethod = "DecodeAddrMode5Operand";
|
let DecoderMethod = "DecodeAddrMode5Operand";
|
||||||
let ParserMatchClass = AddrMode5AsmOperand;
|
let ParserMatchClass = AddrMode5AsmOperand;
|
||||||
let MIOperandInfo = (ops GPR:$base, i32imm);
|
let MIOperandInfo = (ops GPR:$base, i32imm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def addrmode5 : AddrMode5 {
|
||||||
|
let PrintMethod = "printAddrMode5Operand<false>";
|
||||||
|
}
|
||||||
|
|
||||||
|
def addrmode5_pre : AddrMode5 {
|
||||||
|
let PrintMethod = "printAddrMode5Operand<true>";
|
||||||
|
}
|
||||||
|
|
||||||
// addrmode6 := reg with optional alignment
|
// addrmode6 := reg with optional alignment
|
||||||
//
|
//
|
||||||
def AddrMode6AsmOperand : AsmOperandClass { let Name = "AlignedMemory"; }
|
def AddrMode6AsmOperand : AsmOperandClass { let Name = "AlignedMemory"; }
|
||||||
@ -2241,7 +2265,7 @@ def LDRD : AI3ld<0b1101, 0, (outs GPR:$Rd, GPR:$dst2),
|
|||||||
multiclass AI2_ldridx<bit isByte, string opc,
|
multiclass AI2_ldridx<bit isByte, string opc,
|
||||||
InstrItinClass iii, InstrItinClass iir> {
|
InstrItinClass iii, InstrItinClass iir> {
|
||||||
def _PRE_IMM : AI2ldstidx<1, isByte, 1, (outs GPR:$Rt, GPR:$Rn_wb),
|
def _PRE_IMM : AI2ldstidx<1, isByte, 1, (outs GPR:$Rt, GPR:$Rn_wb),
|
||||||
(ins addrmode_imm12:$addr), IndexModePre, LdFrm, iii,
|
(ins addrmode_imm12_pre:$addr), IndexModePre, LdFrm, iii,
|
||||||
opc, "\t$Rt, $addr!", "$addr.base = $Rn_wb", []> {
|
opc, "\t$Rt, $addr!", "$addr.base = $Rn_wb", []> {
|
||||||
bits<17> addr;
|
bits<17> addr;
|
||||||
let Inst{25} = 0;
|
let Inst{25} = 0;
|
||||||
@ -2310,7 +2334,7 @@ defm LDRB : AI2_ldridx<1, "ldrb", IIC_iLoad_bh_iu, IIC_iLoad_bh_ru>;
|
|||||||
|
|
||||||
multiclass AI3_ldridx<bits<4> op, string opc, InstrItinClass itin> {
|
multiclass AI3_ldridx<bits<4> op, string opc, InstrItinClass itin> {
|
||||||
def _PRE : AI3ldstidx<op, 1, 1, (outs GPR:$Rt, GPR:$Rn_wb),
|
def _PRE : AI3ldstidx<op, 1, 1, (outs GPR:$Rt, GPR:$Rn_wb),
|
||||||
(ins addrmode3:$addr), IndexModePre,
|
(ins addrmode3_pre:$addr), IndexModePre,
|
||||||
LdMiscFrm, itin,
|
LdMiscFrm, itin,
|
||||||
opc, "\t$Rt, $addr!", "$addr.base = $Rn_wb", []> {
|
opc, "\t$Rt, $addr!", "$addr.base = $Rn_wb", []> {
|
||||||
bits<14> addr;
|
bits<14> addr;
|
||||||
@ -2344,7 +2368,7 @@ defm LDRSH : AI3_ldridx<0b1111, "ldrsh", IIC_iLoad_bh_ru>;
|
|||||||
defm LDRSB : AI3_ldridx<0b1101, "ldrsb", IIC_iLoad_bh_ru>;
|
defm LDRSB : AI3_ldridx<0b1101, "ldrsb", IIC_iLoad_bh_ru>;
|
||||||
let hasExtraDefRegAllocReq = 1 in {
|
let hasExtraDefRegAllocReq = 1 in {
|
||||||
def LDRD_PRE : AI3ldstidx<0b1101, 0, 1, (outs GPR:$Rt, GPR:$Rt2, GPR:$Rn_wb),
|
def LDRD_PRE : AI3ldstidx<0b1101, 0, 1, (outs GPR:$Rt, GPR:$Rt2, GPR:$Rn_wb),
|
||||||
(ins addrmode3:$addr), IndexModePre,
|
(ins addrmode3_pre:$addr), IndexModePre,
|
||||||
LdMiscFrm, IIC_iLoad_d_ru,
|
LdMiscFrm, IIC_iLoad_d_ru,
|
||||||
"ldrd", "\t$Rt, $Rt2, $addr!",
|
"ldrd", "\t$Rt, $Rt2, $addr!",
|
||||||
"$addr.base = $Rn_wb", []> {
|
"$addr.base = $Rn_wb", []> {
|
||||||
@ -2500,7 +2524,7 @@ def STRD : AI3str<0b1111, (outs), (ins GPR:$Rt, GPR:$src2, addrmode3:$addr),
|
|||||||
multiclass AI2_stridx<bit isByte, string opc,
|
multiclass AI2_stridx<bit isByte, string opc,
|
||||||
InstrItinClass iii, InstrItinClass iir> {
|
InstrItinClass iii, InstrItinClass iir> {
|
||||||
def _PRE_IMM : AI2ldstidx<0, isByte, 1, (outs GPR:$Rn_wb),
|
def _PRE_IMM : AI2ldstidx<0, isByte, 1, (outs GPR:$Rn_wb),
|
||||||
(ins GPR:$Rt, addrmode_imm12:$addr), IndexModePre,
|
(ins GPR:$Rt, addrmode_imm12_pre:$addr), IndexModePre,
|
||||||
StFrm, iii,
|
StFrm, iii,
|
||||||
opc, "\t$Rt, $addr!", "$addr.base = $Rn_wb", []> {
|
opc, "\t$Rt, $addr!", "$addr.base = $Rn_wb", []> {
|
||||||
bits<17> addr;
|
bits<17> addr;
|
||||||
@ -2622,7 +2646,7 @@ def STRH_preidx: ARMPseudoInst<(outs GPR:$Rn_wb),
|
|||||||
|
|
||||||
|
|
||||||
def STRH_PRE : AI3ldstidx<0b1011, 0, 1, (outs GPR:$Rn_wb),
|
def STRH_PRE : AI3ldstidx<0b1011, 0, 1, (outs GPR:$Rn_wb),
|
||||||
(ins GPR:$Rt, addrmode3:$addr), IndexModePre,
|
(ins GPR:$Rt, addrmode3_pre:$addr), IndexModePre,
|
||||||
StMiscFrm, IIC_iStore_bh_ru,
|
StMiscFrm, IIC_iStore_bh_ru,
|
||||||
"strh", "\t$Rt, $addr!", "$addr.base = $Rn_wb", []> {
|
"strh", "\t$Rt, $addr!", "$addr.base = $Rn_wb", []> {
|
||||||
bits<14> addr;
|
bits<14> addr;
|
||||||
@ -2654,7 +2678,7 @@ def STRH_POST : AI3ldstidx<0b1011, 0, 0, (outs GPR:$Rn_wb),
|
|||||||
|
|
||||||
let mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1 in {
|
let mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1 in {
|
||||||
def STRD_PRE : AI3ldstidx<0b1111, 0, 1, (outs GPR:$Rn_wb),
|
def STRD_PRE : AI3ldstidx<0b1111, 0, 1, (outs GPR:$Rn_wb),
|
||||||
(ins GPR:$Rt, GPR:$Rt2, addrmode3:$addr),
|
(ins GPR:$Rt, GPR:$Rt2, addrmode3_pre:$addr),
|
||||||
IndexModePre, StMiscFrm, IIC_iStore_d_ru,
|
IndexModePre, StMiscFrm, IIC_iStore_d_ru,
|
||||||
"strd", "\t$Rt, $Rt2, $addr!",
|
"strd", "\t$Rt, $Rt2, $addr!",
|
||||||
"$addr.base = $Rn_wb", []> {
|
"$addr.base = $Rn_wb", []> {
|
||||||
@ -4429,7 +4453,7 @@ multiclass LdStCop<bit load, bit Dbit, string asm> {
|
|||||||
let Inst{7-0} = addr{7-0};
|
let Inst{7-0} = addr{7-0};
|
||||||
let DecoderMethod = "DecodeCopMemInstruction";
|
let DecoderMethod = "DecodeCopMemInstruction";
|
||||||
}
|
}
|
||||||
def _PRE : ACI<(outs), (ins p_imm:$cop, c_imm:$CRd, addrmode5:$addr),
|
def _PRE : ACI<(outs), (ins p_imm:$cop, c_imm:$CRd, addrmode5_pre:$addr),
|
||||||
asm, "\t$cop, $CRd, $addr!", IndexModePre> {
|
asm, "\t$cop, $CRd, $addr!", IndexModePre> {
|
||||||
bits<13> addr;
|
bits<13> addr;
|
||||||
bits<4> cop;
|
bits<4> cop;
|
||||||
@ -4500,7 +4524,7 @@ multiclass LdSt2Cop<bit load, bit Dbit, string asm> {
|
|||||||
let Inst{7-0} = addr{7-0};
|
let Inst{7-0} = addr{7-0};
|
||||||
let DecoderMethod = "DecodeCopMemInstruction";
|
let DecoderMethod = "DecodeCopMemInstruction";
|
||||||
}
|
}
|
||||||
def _PRE : ACInoP<(outs), (ins p_imm:$cop, c_imm:$CRd, addrmode5:$addr),
|
def _PRE : ACInoP<(outs), (ins p_imm:$cop, c_imm:$CRd, addrmode5_pre:$addr),
|
||||||
asm, "\t$cop, $CRd, $addr!", IndexModePre> {
|
asm, "\t$cop, $CRd, $addr!", IndexModePre> {
|
||||||
bits<13> addr;
|
bits<13> addr;
|
||||||
bits<4> cop;
|
bits<4> cop;
|
||||||
|
@ -150,7 +150,7 @@ def lo5AllOne : PatLeaf<(i32 imm), [{
|
|||||||
def t2addrmode_imm12_asmoperand : AsmOperandClass {let Name="MemUImm12Offset";}
|
def t2addrmode_imm12_asmoperand : AsmOperandClass {let Name="MemUImm12Offset";}
|
||||||
def t2addrmode_imm12 : Operand<i32>,
|
def t2addrmode_imm12 : Operand<i32>,
|
||||||
ComplexPattern<i32, 2, "SelectT2AddrModeImm12", []> {
|
ComplexPattern<i32, 2, "SelectT2AddrModeImm12", []> {
|
||||||
let PrintMethod = "printAddrModeImm12Operand";
|
let PrintMethod = "printAddrModeImm12Operand<false>";
|
||||||
let EncoderMethod = "getAddrModeImm12OpValue";
|
let EncoderMethod = "getAddrModeImm12OpValue";
|
||||||
let DecoderMethod = "DecodeT2AddrModeImm12";
|
let DecoderMethod = "DecodeT2AddrModeImm12";
|
||||||
let ParserMatchClass = t2addrmode_imm12_asmoperand;
|
let ParserMatchClass = t2addrmode_imm12_asmoperand;
|
||||||
|
@ -490,7 +490,8 @@ void ARMInstPrinter::printAM3PostIndexOp(const MCInst *MI, unsigned Op,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ARMInstPrinter::printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
|
void ARMInstPrinter::printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
|
||||||
raw_ostream &O) {
|
raw_ostream &O,
|
||||||
|
bool AlwaysPrintImm0) {
|
||||||
const MCOperand &MO1 = MI->getOperand(Op);
|
const MCOperand &MO1 = MI->getOperand(Op);
|
||||||
const MCOperand &MO2 = MI->getOperand(Op+1);
|
const MCOperand &MO2 = MI->getOperand(Op+1);
|
||||||
const MCOperand &MO3 = MI->getOperand(Op+2);
|
const MCOperand &MO3 = MI->getOperand(Op+2);
|
||||||
@ -509,7 +510,7 @@ void ARMInstPrinter::printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
|
|||||||
unsigned ImmOffs = ARM_AM::getAM3Offset(MO3.getImm());
|
unsigned ImmOffs = ARM_AM::getAM3Offset(MO3.getImm());
|
||||||
ARM_AM::AddrOpc op = ARM_AM::getAM3Op(MO3.getImm());
|
ARM_AM::AddrOpc op = ARM_AM::getAM3Op(MO3.getImm());
|
||||||
|
|
||||||
if (ImmOffs || (op == ARM_AM::sub)) {
|
if (AlwaysPrintImm0 || ImmOffs || (op == ARM_AM::sub)) {
|
||||||
O << ", "
|
O << ", "
|
||||||
<< markup("<imm:")
|
<< markup("<imm:")
|
||||||
<< "#"
|
<< "#"
|
||||||
@ -520,6 +521,7 @@ void ARMInstPrinter::printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,
|
|||||||
O << ']' << markup(">");
|
O << ']' << markup(">");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <bool AlwaysPrintImm0>
|
||||||
void ARMInstPrinter::printAddrMode3Operand(const MCInst *MI, unsigned Op,
|
void ARMInstPrinter::printAddrMode3Operand(const MCInst *MI, unsigned Op,
|
||||||
raw_ostream &O) {
|
raw_ostream &O) {
|
||||||
const MCOperand &MO1 = MI->getOperand(Op);
|
const MCOperand &MO1 = MI->getOperand(Op);
|
||||||
@ -535,7 +537,7 @@ void ARMInstPrinter::printAddrMode3Operand(const MCInst *MI, unsigned Op,
|
|||||||
printAM3PostIndexOp(MI, Op, O);
|
printAM3PostIndexOp(MI, Op, O);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
printAM3PreOrOffsetIndexOp(MI, Op, O);
|
printAM3PreOrOffsetIndexOp(MI, Op, O, AlwaysPrintImm0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARMInstPrinter::printAddrMode3OffsetOperand(const MCInst *MI,
|
void ARMInstPrinter::printAddrMode3OffsetOperand(const MCInst *MI,
|
||||||
@ -593,6 +595,7 @@ void ARMInstPrinter::printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
|
|||||||
O << ARM_AM::getAMSubModeStr(Mode);
|
O << ARM_AM::getAMSubModeStr(Mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <bool AlwaysPrintImm0>
|
||||||
void ARMInstPrinter::printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
|
void ARMInstPrinter::printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
|
||||||
raw_ostream &O) {
|
raw_ostream &O) {
|
||||||
const MCOperand &MO1 = MI->getOperand(OpNum);
|
const MCOperand &MO1 = MI->getOperand(OpNum);
|
||||||
@ -608,7 +611,7 @@ void ARMInstPrinter::printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
|
|||||||
|
|
||||||
unsigned ImmOffs = ARM_AM::getAM5Offset(MO2.getImm());
|
unsigned ImmOffs = ARM_AM::getAM5Offset(MO2.getImm());
|
||||||
unsigned Op = ARM_AM::getAM5Op(MO2.getImm());
|
unsigned Op = ARM_AM::getAM5Op(MO2.getImm());
|
||||||
if (ImmOffs || Op == ARM_AM::sub) {
|
if (AlwaysPrintImm0 || ImmOffs || Op == ARM_AM::sub) {
|
||||||
O << ", "
|
O << ", "
|
||||||
<< markup("<imm:")
|
<< markup("<imm:")
|
||||||
<< "#"
|
<< "#"
|
||||||
@ -1022,6 +1025,7 @@ void ARMInstPrinter::printT2SOOperand(const MCInst *MI, unsigned OpNum,
|
|||||||
ARM_AM::getSORegOffset(MO2.getImm()), UseMarkup);
|
ARM_AM::getSORegOffset(MO2.getImm()), UseMarkup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <bool AlwaysPrintImm0>
|
||||||
void ARMInstPrinter::printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
|
void ARMInstPrinter::printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
|
||||||
raw_ostream &O) {
|
raw_ostream &O) {
|
||||||
const MCOperand &MO1 = MI->getOperand(OpNum);
|
const MCOperand &MO1 = MI->getOperand(OpNum);
|
||||||
@ -1046,7 +1050,7 @@ void ARMInstPrinter::printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
|
|||||||
<< "#-" << -OffImm
|
<< "#-" << -OffImm
|
||||||
<< markup(">");
|
<< markup(">");
|
||||||
}
|
}
|
||||||
else if (OffImm > 0) {
|
else if (AlwaysPrintImm0 || OffImm > 0) {
|
||||||
O << ", "
|
O << ", "
|
||||||
<< markup("<imm:")
|
<< markup("<imm:")
|
||||||
<< "#" << OffImm
|
<< "#" << OffImm
|
||||||
|
@ -47,12 +47,13 @@ public:
|
|||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum,
|
void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum,
|
||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
|
template <bool AlwaysPrintImm0>
|
||||||
void printAddrMode3Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
void printAddrMode3Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
||||||
void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum,
|
void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum,
|
||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
void printAM3PostIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O);
|
void printAM3PostIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O);
|
||||||
void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,raw_ostream &O);
|
void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O,
|
||||||
|
bool AlwaysPrintImm0);
|
||||||
void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
|
void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
|
||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
||||||
@ -60,6 +61,7 @@ public:
|
|||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
|
|
||||||
void printLdStmModeOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
void printLdStmModeOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
||||||
|
template <bool AlwaysPrintImm0>
|
||||||
void printAddrMode5Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
void printAddrMode5Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
||||||
void printAddrMode6Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
void printAddrMode6Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
||||||
void printAddrMode7Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
void printAddrMode7Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
||||||
@ -91,6 +93,7 @@ public:
|
|||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
|
|
||||||
void printT2SOOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
void printT2SOOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
|
||||||
|
template<bool AlwaysPrintImm0>
|
||||||
void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
|
void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
|
||||||
raw_ostream &O);
|
raw_ostream &O);
|
||||||
void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
|
void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
|
||||||
|
@ -2309,7 +2309,7 @@ Lforward:
|
|||||||
strpl r3, [r10, #0]!
|
strpl r3, [r10, #0]!
|
||||||
|
|
||||||
@ CHECK: strpl r3, [r10, #-0]! @ encoding: [0x00,0x30,0x2a,0x55]
|
@ CHECK: strpl r3, [r10, #-0]! @ encoding: [0x00,0x30,0x2a,0x55]
|
||||||
@ CHECK: strpl r3, [r10]! @ encoding: [0x00,0x30,0xaa,0x55]
|
@ CHECK: strpl r3, [r10, #0]! @ encoding: [0x00,0x30,0xaa,0x55]
|
||||||
|
|
||||||
@------------------------------------------------------------------------------
|
@------------------------------------------------------------------------------
|
||||||
@ SUB
|
@ SUB
|
||||||
|
@ -51,24 +51,48 @@
|
|||||||
# CHECKx: ldclvc p5, cr15, [r8], #-0
|
# CHECKx: ldclvc p5, cr15, [r8], #-0
|
||||||
#0x00 0xf5 0x78 0x7c
|
#0x00 0xf5 0x78 0x7c
|
||||||
|
|
||||||
|
# CHECK: ldc p13, c9, [r2, #0]!
|
||||||
|
0x00 0x9d 0xb2 0xed
|
||||||
|
|
||||||
|
# CHECK: ldcl p1, c9, [r3, #0]!
|
||||||
|
0x00 0x91 0xf3 0xed
|
||||||
|
|
||||||
# CHECK: ldr r0, [r2], #15
|
# CHECK: ldr r0, [r2], #15
|
||||||
0x0f 0x00 0x92 0xe4
|
0x0f 0x00 0x92 0xe4
|
||||||
|
|
||||||
# CHECK: ldr r5, [r7, -r10, lsl #2]
|
# CHECK: ldr r5, [r7, -r10, lsl #2]
|
||||||
0x0a 0x51 0x17 0xe7
|
0x0a 0x51 0x17 0xe7
|
||||||
|
|
||||||
|
# CHECK: ldr r4, [r5, #0]!
|
||||||
|
0x00 0x40 0xb5 0xe5
|
||||||
|
|
||||||
|
# CHECK: ldrb lr, [r10, #0]!
|
||||||
|
0x00 0xe0 0xfa 0xe5
|
||||||
|
|
||||||
|
# CHECK: ldrd r4, r5, [r0, #0]!
|
||||||
|
0xd0 0x40 0xe0 0xe1
|
||||||
|
|
||||||
# CHECK: ldrh r0, [r2], #0
|
# CHECK: ldrh r0, [r2], #0
|
||||||
0xb0 0x00 0xd2 0xe0
|
0xb0 0x00 0xd2 0xe0
|
||||||
|
|
||||||
# CHECK: ldrh r0, [r2]
|
# CHECK: ldrh r0, [r2]
|
||||||
0xb0 0x00 0xd2 0xe1
|
0xb0 0x00 0xd2 0xe1
|
||||||
|
|
||||||
|
# CHECK: ldrh lr, [sp, #0]!
|
||||||
|
0xb0 0xe0 0xfd 0xe1
|
||||||
|
|
||||||
# CHECK: ldrht r0, [r2], #15
|
# CHECK: ldrht r0, [r2], #15
|
||||||
0xbf 0x00 0xf2 0xe0
|
0xbf 0x00 0xf2 0xe0
|
||||||
|
|
||||||
|
# CHECK: ldrsb r1, [lr, #0]!
|
||||||
|
0xd0 0x10 0xfe 0xe1
|
||||||
|
|
||||||
# CHECK: ldrsbtvs lr, [r2], -r9
|
# CHECK: ldrsbtvs lr, [r2], -r9
|
||||||
0xd9 0xe0 0x32 0x60
|
0xd9 0xe0 0x32 0x60
|
||||||
|
|
||||||
|
# CHECK: ldrsh r9, [r1, #0]
|
||||||
|
0xf0 0x90 0xf1 0xe1
|
||||||
|
|
||||||
# CHECK: lsls r0, r2, #31
|
# CHECK: lsls r0, r2, #31
|
||||||
0x82 0x0f 0xb0 0xe1
|
0x82 0x0f 0xb0 0xe1
|
||||||
|
|
||||||
@ -245,9 +269,27 @@
|
|||||||
# CHECK: stc p2, c4, [r9], {157}
|
# CHECK: stc p2, c4, [r9], {157}
|
||||||
0x9d 0x42 0x89 0xec
|
0x9d 0x42 0x89 0xec
|
||||||
|
|
||||||
|
# CHECK: stc p15, c0, [r3, #0]!
|
||||||
|
0x00 0x0f 0xa3 0xed
|
||||||
|
|
||||||
# CHECK: stc2 p2, c4, [r9], {157}
|
# CHECK: stc2 p2, c4, [r9], {157}
|
||||||
0x9d 0x42 0x89 0xfc
|
0x9d 0x42 0x89 0xfc
|
||||||
|
|
||||||
|
# CHECK: stcl p13, c12, [r9, #0]!
|
||||||
|
0x00 0xcd 0xe9 0xed
|
||||||
|
|
||||||
|
# CHECK: str pc, [r11, #0]!
|
||||||
|
0x00 0xf0 0xab 0xe5
|
||||||
|
|
||||||
|
# CHECK: strb r9, [r10, #0]!
|
||||||
|
0x00 0x90 0xea 0xe5
|
||||||
|
|
||||||
|
# CHECK: strd r12, sp, [r6, #0]!
|
||||||
|
0xf0 0xc0 0xe6 0xe1
|
||||||
|
|
||||||
|
# CHECK: strh r7, [r9, #0]!
|
||||||
|
0xb0 0x70 0xe9 0xe1
|
||||||
|
|
||||||
# CHECK: bne #-24
|
# CHECK: bne #-24
|
||||||
0xfa 0xff 0xff 0x1a
|
0xfa 0xff 0xff 0x1a
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user