[cfe-commits] r114619 - in /cfe/trunk: lib/CodeGen/TargetInfo.cpp test/CodeGen/arm-vector-arguments.c

Daniel Dunbar daniel at zuster.org
Wed Sep 22 18:54:32 PDT 2010


Author: ddunbar
Date: Wed Sep 22 20:54:32 2010
New Revision: 114619

URL: http://llvm.org/viewvc/llvm-project?rev=114619&view=rev
Log:
IRgen/ABI/ARM: Return large vectors in memory.

Modified:
    cfe/trunk/lib/CodeGen/TargetInfo.cpp
    cfe/trunk/test/CodeGen/arm-vector-arguments.c

Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=114619&r1=114618&r2=114619&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Wed Sep 22 20:54:32 2010
@@ -2391,6 +2391,10 @@
   if (RetTy->isVoidType())
     return ABIArgInfo::getIgnore();
 
+  // Large vector types should be returned via memory.
+  if (RetTy->isVectorType() && getContext().getTypeSize(RetTy) > 128)
+    return ABIArgInfo::getIndirect(0);
+
   if (!isAggregateTypeForABI(RetTy)) {
     // Treat an enum type as its underlying type.
     if (const EnumType *EnumTy = RetTy->getAs<EnumType>())

Modified: cfe/trunk/test/CodeGen/arm-vector-arguments.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm-vector-arguments.c?rev=114619&r1=114618&r2=114619&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/arm-vector-arguments.c (original)
+++ cfe/trunk/test/CodeGen/arm-vector-arguments.c Wed Sep 22 20:54:32 2010
@@ -11,3 +11,19 @@
 int8x16_t f0(int8x16_t a0, int8x16_t a1) {
   return vzipq_s8(a0, a1).val[0];
 }
+
+// Test direct vector passing.
+
+typedef float T_float32x2 __attribute__ ((__vector_size__ (8)));
+typedef float T_float32x4 __attribute__ ((__vector_size__ (16)));
+typedef float T_float32x8 __attribute__ ((__vector_size__ (32)));
+typedef float T_float32x16 __attribute__ ((__vector_size__ (64)));
+
+// CHECK: define <2 x float> @f1_0(<2 x float> %{{.*}})
+T_float32x2 f1_0(T_float32x2 a0) { return a0; }
+// CHECK: define <4 x float> @f1_1(<4 x float> %{{.*}})
+T_float32x4 f1_1(T_float32x4 a0) { return a0; }
+// CHECK: define void @f1_2(<8 x float>* sret %{{.*}}, <8 x float> %{{.*}})
+T_float32x8 f1_2(T_float32x8 a0) { return a0; }
+// CHECK: define void @f1_3(<16 x float>* sret %{{.*}}, <16 x float> %{{.*}})
+T_float32x16 f1_3(T_float32x16 a0) { return a0; }





More information about the cfe-commits mailing list