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

Dale Johannesen dalej at apple.com
Sun Mar 2 16:09:55 PST 2008


Author: johannes
Date: Sun Mar  2 18:09:54 2008
New Revision: 47832

URL: http://llvm.org/viewvc/llvm-project?rev=47832&view=rev
Log:
Return 32-bit MMX values on Darwin as per (de facto)
calling convention.  PR 2114.


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

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=47832&r1=47831&r2=47832&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 Sun Mar  2 18:09:54 2008
@@ -98,6 +98,28 @@
   isSingleElementStructOrArray(X, true, false)
 #endif
 
+/* The MMX vector v1i64 is returned in EAX and EDX on Darwin.  Communicate
+    this by returning i64 here.  */
+#define LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR(X)          \
+  ((TARGET_MACHO &&                                     \
+    !TARGET_64BIT &&                                    \
+    TREE_CODE(X) == VECTOR_TYPE &&                      \
+    TYPE_SIZE(X) &&                                     \
+    TREE_CODE(TYPE_SIZE(X))==INTEGER_CST &&             \
+    TREE_INT_CST_LOW(TYPE_SIZE(X))==64 &&               \
+    TYPE_VECTOR_SUBPARTS(X)==1) ? uint64_type_node : 0)
+
+/* MMX vectors v2i32, v4i16, v8i8, v2f32 are returned using sret on Darwin
+   32-bit.  */
+#define LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW(X)          \
+  ((TARGET_MACHO &&                                     \
+    !TARGET_64BIT &&                                    \
+    TREE_CODE(X) == VECTOR_TYPE &&                      \
+    TYPE_SIZE(X) &&                                     \
+    TREE_CODE(TYPE_SIZE(X))==INTEGER_CST &&             \
+    TREE_INT_CST_LOW(TYPE_SIZE(X))==64 &&               \
+    TYPE_VECTOR_SUBPARTS(X)>1) ? true : false)
+
 extern bool llvm_x86_should_pass_aggregate_in_memory(tree, const Type *);
 
 #define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY)      \

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=47832&r1=47831&r2=47832&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-abi.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-abi.h Sun Mar  2 18:09:54 2008
@@ -195,6 +195,20 @@
   isSingleElementStructOrArray(X, false, false)
 #endif
 
+// LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR - Return a TYPE tree if this vector type
+// should be returned using the convention for that scalar TYPE, 0 otherwise.
+// X may be evaluated more than once.
+#ifndef LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR
+#define LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR(X) 0
+#endif
+
+// LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW - Return true if this vector type
+// should be returned using the aggregate shadow (sret) convention, 0 otherwise.
+// X may be evaluated more than once.
+#ifndef LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW
+#define LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW(X) 0
+#endif
+
 /// DefaultABI - This class implements the default LLVM ABI where structures are
 /// passed by decimating them into individual components and unions are passed
 /// by passing the largest member of the union.
@@ -214,7 +228,16 @@
   /// handles things like returning structures via hidden parameters.
   void HandleReturnType(tree type) {
     const Type *Ty = ConvertType(type);
-    if (Ty->isFirstClassType() || Ty == Type::VoidTy) {
+    if (Ty->getTypeID() == Type::VectorTyID) {
+      // Vector handling is weird on x86.
+      tree ScalarType = LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR(type);
+      if (ScalarType)
+        C.HandleAggregateResultAsScalar(ConvertType(ScalarType));
+      else if (LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW(type))
+        C.HandleAggregateShadowArgument(PointerType::getUnqual(Ty), false);
+      else
+        C.HandleScalarResult(Ty);
+    } else if (Ty->isFirstClassType() || Ty == Type::VoidTy) {
       // Return scalar values normally.
       C.HandleScalarResult(Ty);
     } else if (TYPE_SIZE(type) && TREE_CODE(TYPE_SIZE(type)) == INTEGER_CST &&





More information about the llvm-commits mailing list