The Mips specific inline asm operand modifier 'z' has the
authorJack Carter <jcarter@mips.com>
Thu, 28 Jun 2012 01:33:40 +0000 (01:33 +0000)
committerJack Carter <jcarter@mips.com>
Thu, 28 Jun 2012 01:33:40 +0000 (01:33 +0000)
following description in the gnu sources:

    Print $0 if operand is zero otherwise print the op normally.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159324 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MipsAsmPrinter.cpp
test/CodeGen/Mips/inlineasm-operand-code.ll

index 0609241df2c185a0ec6a0c3583acfea114509d14..1c5bb1633be32c7aa0d32124a2df128c55aaf7cf 100644 (file)
@@ -323,6 +323,17 @@ bool MipsAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
         return true;
       O << MO.getImm() - 1;
       return false;
+    case 'z': // $0 if zero, regular printing otherwise
+    {
+      if (MO.getType() != MachineOperand::MO_Immediate)
+        return true;
+      int64_t Val = MO.getImm();
+      if (Val)
+        O << Val;
+      else
+        O << "$0";
+      return false;
+    }
     }
   }
 
@@ -335,11 +346,12 @@ bool MipsAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
                                            const char *ExtraCode,
                                            raw_ostream &O) {
   if (ExtraCode && ExtraCode[0])
-     return true; // Unknown modifier.
+    return true; // Unknown modifier.
 
   const MachineOperand &MO = MI->getOperand(OpNum);
   assert(MO.isReg() && "unexpected inline asm memory operand");
   O << "0($" << MipsInstPrinter::getRegisterName(MO.getReg()) << ")";
+
   return false;
 }
 
index 2dcc10def2f596cd7f0610ff59a3119e9418c9ff..ca4f3e4c5aed19b05c33273bca811951e7548da0 100644 (file)
@@ -29,5 +29,17 @@ entry:
 ;CHECK:        #NO_APP
   tail call i32 asm sideeffect "addi $0,$1,${2:m}", "=r,r,I"(i32 7, i32 -3) nounwind
 
+; z with -3
+;CHECK:        #APP
+;CHECK:        addi ${{[0-9]+}},${{[0-9]+}},-3
+;CHECK:        #NO_APP
+  tail call i32 asm sideeffect "addi $0,$1,${2:z}", "=r,r,I"(i32 7, i32 -3) nounwind
+
+; z with 0
+;CHECK:        #APP
+;CHECK:        addi ${{[0-9]+}},${{[0-9]+}},$0
+;CHECK:        #NO_APP
+  tail call i32 asm sideeffect "addi $0,$1,${2:z}", "=r,r,I"(i32 7, i32 0) nounwind
+
   ret i32 0
 }