[cfe-commits] r163728 - in /cfe/trunk: lib/Sema/SemaStmtAsm.cpp test/CodeGen/ms-inline-asm.c

Chad Rosier mcrosier at apple.com
Wed Sep 12 11:14:26 PDT 2012


Author: mcrosier
Date: Wed Sep 12 13:14:25 2012
New Revision: 163728

URL: http://llvm.org/viewvc/llvm-project?rev=163728&view=rev
Log:
[ms-inline asm] If we have a single asm operand that maps to multiple
MCOperands then iterate over all of then when computing clobbers, inputs and
outputs.

On x86 the 1-to-many mapping is a memory operand that includes a BaseReg(reg),
MemScale(imm), MemIndexReg(reg), an Expr(MCExpr or imm) and a MemSegReg(reg).
Invalid register (Op.getReg() == 0) are not considered when computing clobber.

Modified:
    cfe/trunk/lib/Sema/SemaStmtAsm.cpp
    cfe/trunk/test/CodeGen/ms-inline-asm.c

Modified: cfe/trunk/lib/Sema/SemaStmtAsm.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmtAsm.cpp?rev=163728&r1=163727&r2=163728&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaStmtAsm.cpp (original)
+++ cfe/trunk/lib/Sema/SemaStmtAsm.cpp Wed Sep 12 13:14:25 2012
@@ -581,62 +581,60 @@
       unsigned MCIdx = TargetParser->getMCInstOperandNum(Kind, Inst, Operands,
                                                          i, NumMCOperands);
       assert (NumMCOperands && "Expected at least 1 MCOperand!");
-      // If we have a one-to-many mapping, then search for the MCExpr.
-      if (NumMCOperands > 1) {
-        bool foundExpr = false;
-        for (unsigned j = MCIdx, e = MCIdx + NumMCOperands; j != e; ++j) {
-          if (Inst.getOperand(j).isExpr()) {
-            foundExpr = true;
-            MCIdx = j;
-            break;
-          }
-        }
-        assert (foundExpr && "Expected for find an expression!");
-      }
 
-      const llvm::MCOperand &Op = Inst.getOperand(MCIdx);
+      for (unsigned j = MCIdx, e = MCIdx + NumMCOperands; j != e; ++j) {
+        const llvm::MCOperand &Op = Inst.getOperand(j);
 
-      // Register/Clobber.
-      if (Op.isReg() && NumDefs && (MCIdx < NumDefs)) {
-        std::string Reg;
-        llvm::raw_string_ostream OS(Reg);
-        IP->printRegName(OS, Op.getReg());
-
-        StringRef Clobber(OS.str());
-        if (!Context.getTargetInfo().isValidClobber(Clobber))
-          return StmtError(Diag(AsmLoc, diag::err_asm_unknown_register_name) <<
-                           Clobber);
-        ClobberRegs.insert(Reg);
-        continue;
-      }
-      // Expr/Input or Output.
-      if (Op.isExpr()) {
-        const llvm::MCExpr *Expr = Op.getExpr();
-        const llvm::MCSymbolRefExpr *SymRef;
-        if ((SymRef = dyn_cast<llvm::MCSymbolRefExpr>(Expr))) {
-          StringRef Name = SymRef->getSymbol().getName();
-          IdentifierInfo *II = getIdentifierInfo(Name, AsmToks,
-                                                 AsmTokRanges[StrIdx].first,
-                                                 AsmTokRanges[StrIdx].second);
-          if (II) {
-            CXXScopeSpec SS;
-            UnqualifiedId Id;
-            SourceLocation Loc;
-            Id.setIdentifier(II, AsmLoc);
-            ExprResult Result = ActOnIdExpression(getCurScope(), SS, Loc, Id,
-                                                  false, false);
-            if (!Result.isInvalid()) {
-              bool isMemDef = (i == 1) && Desc.mayStore();
-              if (isMemDef) {
-                Outputs.push_back(II);
-                OutputExprs.push_back(Result.take());
-                OutputExprNames.push_back(Name.str());
-                OutputConstraints.push_back("=r");
-              } else {
-                Inputs.push_back(II);
-                InputExprs.push_back(Result.take());
-                InputExprNames.push_back(Name.str());
-                InputConstraints.push_back("r");
+        // Skip immediates.
+        if (Op.isImm() || Op.isFPImm())
+          continue;
+
+        // Skip invalid register operands.
+        if (Op.isReg() && Op.getReg() == 0)
+          continue;
+
+        // Register/Clobber.
+        if (Op.isReg() && NumDefs && (j < NumDefs)) {
+          std::string Reg;
+          llvm::raw_string_ostream OS(Reg);
+          IP->printRegName(OS, Op.getReg());
+
+          StringRef Clobber(OS.str());
+          if (!Context.getTargetInfo().isValidClobber(Clobber))
+            return StmtError(
+              Diag(AsmLoc, diag::err_asm_unknown_register_name) << Clobber);
+          ClobberRegs.insert(Reg);
+          continue;
+        }
+        // Expr/Input or Output.
+        if (Op.isExpr()) {
+          const llvm::MCExpr *Expr = Op.getExpr();
+          const llvm::MCSymbolRefExpr *SymRef;
+          if ((SymRef = dyn_cast<llvm::MCSymbolRefExpr>(Expr))) {
+            StringRef Name = SymRef->getSymbol().getName();
+            IdentifierInfo *II = getIdentifierInfo(Name, AsmToks,
+                                                   AsmTokRanges[StrIdx].first,
+                                                   AsmTokRanges[StrIdx].second);
+            if (II) {
+              CXXScopeSpec SS;
+              UnqualifiedId Id;
+              SourceLocation Loc;
+              Id.setIdentifier(II, AsmLoc);
+              ExprResult Result = ActOnIdExpression(getCurScope(), SS, Loc, Id,
+                                                    false, false);
+              if (!Result.isInvalid()) {
+                bool isMemDef = (i == 1) && Desc.mayStore();
+                if (isMemDef) {
+                  Outputs.push_back(II);
+                  OutputExprs.push_back(Result.take());
+                  OutputExprNames.push_back(Name.str());
+                  OutputConstraints.push_back("=r");
+                } else {
+                  Inputs.push_back(II);
+                  InputExprs.push_back(Result.take());
+                  InputExprNames.push_back(Name.str());
+                  InputConstraints.push_back("r");
+                }
               }
             }
           }

Modified: cfe/trunk/test/CodeGen/ms-inline-asm.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ms-inline-asm.c?rev=163728&r1=163727&r2=163728&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/ms-inline-asm.c (original)
+++ cfe/trunk/test/CodeGen/ms-inline-asm.c Wed Sep 12 13:14:25 2012
@@ -127,3 +127,15 @@
 // CHECK: t14
 // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
 }
+
+void t15(void) {
+  __asm mov eax, DWORD PTR [eax]
+// CHECK: t15
+// CHECK: call void asm sideeffect inteldialect "mov eax, DWORD PTR [eax]", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
+}
+
+void t16(unsigned long long V) {
+  __asm mov eax, DWORD PTR [V]
+// CHECK: t16
+// CHECK:   call void asm sideeffect inteldialect "mov eax, DWORD PTR [$0]", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i64 %0) nounwind
+}





More information about the cfe-commits mailing list