[llvm-commits] [llvm-gcc-4.2] r117619 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h llvm-abi.h llvm-convert.cpp

Dale Johannesen dalej at apple.com
Thu Oct 28 17:18:18 PDT 2010


Author: johannes
Date: Thu Oct 28 19:18:18 2010
New Revision: 117619

URL: http://llvm.org/viewvc/llvm-project?rev=117619&view=rev
Log:
Emit x86_mmx types for asm arguments based on looking
at the constraints ("y" is MMX).  8602988.


Modified:
    llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h
    llvm-gcc-4.2/trunk/gcc/llvm-abi.h
    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp

Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h?rev=117619&r1=117618&r2=117619&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h Thu Oct 28 19:18:18 2010
@@ -43,6 +43,13 @@
     LLVMTy->getScalarSizeInBits() !=64) ?                              \
    Type::getX86_MMXTy(Context) : LLVMTy)
 
+/* For parameters to an asm, check the constraint and use X86_mmx if an MMX
+   register is called for.  "y" means an MMX register. */
+#define LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE(Constraint, LLVMTy) \
+  ((TARGET_MMX &&                                                 \
+    StringRef(Constraint).equals(StringRef(std::string("y")))) ?  \
+    Type::getX86_MMXTy(Context) : LLVMTy)
+
 /* LLVM specific stuff for supporting calling convention output */
 #define TARGET_ADJUST_LLVM_CC(CC, type)                         \
   {                                                             \

Modified: llvm-gcc-4.2/trunk/gcc/llvm-abi.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-abi.h?rev=117619&r1=117618&r2=117619&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-abi.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-abi.h Thu Oct 28 19:18:18 2010
@@ -383,7 +383,11 @@
 #endif
 
 #ifndef LLVM_ADJUST_MMX_PARAMETER_TYPE
-#define LLVM_ADJUST_MMX_PARAMETER_TYPE(LLVMTy) LLVMTy
+#define LLVM_ADJUST_MMX_PARAMETER_TYPE(LLVMTy) (LLVMTy)
+#endif
+
+#ifndef LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE
+#define LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE(Constraint, LLVMTy) (LLVMTy)
 #endif
 
 /// DefaultABI - This class implements the default LLVM ABI where structures are

Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=117619&r1=117618&r2=117619&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Thu Oct 28 19:18:18 2010
@@ -4922,14 +4922,16 @@
       StoreCallResultAddrs.push_back(Dest.Ptr);
       ConstraintStr += ",=";
       ConstraintStr += SimplifiedConstraint;
-      CallResultTypes.push_back(DestValTy);
+      CallResultTypes.push_back(LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE(
+                                SimplifiedConstraint, DestValTy));
       CallResultIsSigned.push_back(!TYPE_UNSIGNED(TREE_TYPE(Operand)));
       OutputLocations.push_back(std::make_pair(true, CallResultTypes.size()-1));
     } else {
       ConstraintStr += ",=*";
       ConstraintStr += SimplifiedConstraint;
       CallOps.push_back(Dest.Ptr);
-      CallArgTypes.push_back(Dest.Ptr->getType());
+      CallArgTypes.push_back(LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE(
+                                SimplifiedConstraint, Dest.Ptr->getType()));
       OutputLocations.push_back(std::make_pair(false, CallArgTypes.size()-1));
     }
   }
@@ -5051,8 +5053,12 @@
         }
       }
 
+      const Type* AdjTy = LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE(
+                              Constraint, Op->getType());
+      if (AdjTy != Op->getType())
+        Op = BitCastToType(Op, AdjTy);
       CallOps.push_back(Op);
-      CallArgTypes.push_back(Op->getType());
+      CallArgTypes.push_back(AdjTy);
     } else {                          // Memory operand.
       lang_hooks.mark_addressable(TREE_VALUE(Input));
       isIndirect = true;
@@ -5156,11 +5162,20 @@
   CV->setDoesNotThrow();
 
   // If the call produces a value, store it into the destination.
-  if (StoreCallResultAddrs.size() == 1)
-    Builder.CreateStore(CV, StoreCallResultAddrs[0]);
-  else if (unsigned NumResults = StoreCallResultAddrs.size()) {
+  if (StoreCallResultAddrs.size() == 1) {
+    Value *V = CV;
+    const Type *DestValTy =
+      cast<PointerType>(StoreCallResultAddrs[0]->getType())->getElementType();
+    if (CV->getType() != DestValTy)
+      V = BitCastToType(CV, DestValTy);
+    Builder.CreateStore(V, StoreCallResultAddrs[0]);
+  } else if (unsigned NumResults = StoreCallResultAddrs.size()) {
     for (unsigned i = 0; i != NumResults; ++i) {
+      const Type *DestValTy =
+        cast<PointerType>(StoreCallResultAddrs[i]->getType())->getElementType();
       Value *ValI = Builder.CreateExtractValue(CV, i, "asmresult");
+      if (ValI->getType() != DestValTy)
+        ValI = BitCastToType(ValI, DestValTy);
       Builder.CreateStore(ValI, StoreCallResultAddrs[i]);
     }
   }





More information about the llvm-commits mailing list