ARM: add operands pre-writeback variants when needed

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184181 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Amaury de la Vieuville
2013-06-18 08:12:51 +00:00
parent ce046b98ed
commit f8b60d6f30
4 changed files with 77 additions and 40 deletions

View File

@@ -1079,6 +1079,7 @@ void ARMInstPrinter::printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
O << "]" << markup(">");
}
template<bool AlwaysPrintImm0>
void ARMInstPrinter::printT2AddrModeImm8Operand(const MCInst *MI,
unsigned OpNum,
raw_ostream &O) {
@@ -1089,22 +1090,25 @@ void ARMInstPrinter::printT2AddrModeImm8Operand(const MCInst *MI,
printRegName(O, MO1.getReg());
int32_t OffImm = (int32_t)MO2.getImm();
bool isSub = OffImm < 0;
// Don't print +0.
if (OffImm != 0)
O << ", ";
if (OffImm != 0 && UseMarkup)
O << "<imm:";
if (OffImm == INT32_MIN)
O << "#-0";
else if (OffImm < 0)
O << "#-" << -OffImm;
else if (OffImm > 0)
O << "#" << OffImm;
if (OffImm != 0 && UseMarkup)
O << ">";
OffImm = 0;
if (isSub) {
O << ", "
<< markup("<imm:")
<< "#-" << -OffImm
<< markup(">");
} else if (AlwaysPrintImm0 || OffImm > 0) {
O << ", "
<< markup("<imm:")
<< "#" << OffImm
<< markup(">");
}
O << "]" << markup(">");
}
template<bool AlwaysPrintImm0>
void ARMInstPrinter::printT2AddrModeImm8s4Operand(const MCInst *MI,
unsigned OpNum,
raw_ostream &O) {
@@ -1120,22 +1124,24 @@ void ARMInstPrinter::printT2AddrModeImm8s4Operand(const MCInst *MI,
printRegName(O, MO1.getReg());
int32_t OffImm = (int32_t)MO2.getImm();
bool isSub = OffImm < 0;
assert(((OffImm & 0x3) == 0) && "Not a valid immediate!");
// Don't print +0.
if (OffImm != 0)
O << ", ";
if (OffImm != 0 && UseMarkup)
O << "<imm:";
if (OffImm == INT32_MIN)
O << "#-0";
else if (OffImm < 0)
O << "#-" << -OffImm;
else if (OffImm > 0)
O << "#" << OffImm;
if (OffImm != 0 && UseMarkup)
O << ">";
OffImm = 0;
if (isSub) {
O << ", "
<< markup("<imm:")
<< "#-" << -OffImm
<< markup(">");
} else if (AlwaysPrintImm0 || OffImm > 0) {
O << ", "
<< markup("<imm:")
<< "#" << OffImm
<< markup(">");
}
O << "]" << markup(">");
}

View File

@@ -97,8 +97,10 @@ public:
template<bool AlwaysPrintImm0>
void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
raw_ostream &O);
template<bool AlwaysPrintImm0>
void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
raw_ostream &O);
template<bool AlwaysPrintImm0>
void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum,
raw_ostream &O);
void printT2AddrModeImm0_1020s4Operand(const MCInst *MI, unsigned OpNum,