Major bug fix though it happened rarely (only on a compare after an
integer overflow):
We need to use %icc and not %xcc for comparisons on 32-bit or smaller
integer values.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7111 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
index f66b36f..829a3b8 100644
--- a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
+++ b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
@@ -393,12 +393,27 @@
switch (mop.getType())
{
- case MachineOperand::MO_VirtualRegister:
case MachineOperand::MO_CCRegister:
+ {
+ // We need to print %icc or %xcc as %ccr for certain opcodes.
+ int regNum = (int)mop.getAllocatedRegNum();
+ if (regNum != Target.getRegInfo().getInvalidRegNum() &&
+ Target.getRegInfo().getRegClassIDOfReg(regNum)
+ == UltraSparcRegInfo::IntCCRegClassID)
+ {
+ if (opCode == V9::RDCCR || opCode == V9::WRCCRi || opCode == V9::WRCCRr)
+ {
+ toAsm << "%" << Target.getRegInfo().getMachineRegClass(UltraSparcRegInfo::IntCCRegClassID)->getRegName(SparcIntCCRegClass::ccr);
+ break;
+ }
+ }
+ // all other cases can be handled like any other register
+ }
+
+ case MachineOperand::MO_VirtualRegister:
case MachineOperand::MO_MachineRegister:
{
int regNum = (int)mop.getAllocatedRegNum();
-
if (regNum == Target.getRegInfo().getInvalidRegNum()) {
// better to print code with NULL registers than to die
toAsm << "<NULL VALUE>";