]> granicus.if.org Git - clang/commitdiff
IRgen/ABI/ARM: Return large vectors in memory.
authorDaniel Dunbar <daniel@zuster.org>
Thu, 23 Sep 2010 01:54:32 +0000 (01:54 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 23 Sep 2010 01:54:32 +0000 (01:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114619 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/TargetInfo.cpp
test/CodeGen/arm-vector-arguments.c

index f1da3c3903593356c5fa9bbe984626fc13a25d86..e8e25ca6d488dd8743f432418f8fd1ee48ba89a2 100644 (file)
@@ -2391,6 +2391,10 @@ ABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy) const {
   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>())
index 0d1bdd16741f7ac2a193a5315e2b0014a1034871..0d28642e4b0ee828312cb3f899977a333e58788f 100644 (file)
 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; }