fix 2xi16 to pass as i32 instead of <2 x i16>. The former passes in

memory (as required) the later now passes in an xmm register.  This
fixes gcc.dg/compat/vector_1 on x86-32.

llvm-svn: 112211
This commit is contained in:
Chris Lattner 2010-08-26 20:05:13 +00:00
parent 5fca8ca8cd
commit d774ae9ed1
2 changed files with 26 additions and 1 deletions

View File

@ -589,6 +589,25 @@ ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty) const {
return getIndirectResult(Ty); return getIndirectResult(Ty);
} }
if (const VectorType *VT = Ty->getAs<VectorType>()) {
// On Darwin, some vectors are returned in registers.
if (IsDarwinVectorABI) {
uint64_t Size = getContext().getTypeSize(Ty);
// Always return in register if it fits in a general purpose
// register, or if it is 64 bits and has a single element.
if ((Size == 8 || Size == 16 || Size == 32) ||
(Size == 64 && VT->getNumElements() == 1))
return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),
Size));
return ABIArgInfo::getIndirect(0);
}
return ABIArgInfo::getDirect();
}
if (const EnumType *EnumTy = Ty->getAs<EnumType>()) if (const EnumType *EnumTy = Ty->getAs<EnumType>())
Ty = EnumTy->getDecl()->getIntegerType(); Ty = EnumTy->getDecl()->getIntegerType();

View File

@ -1,4 +1,4 @@
// RUN: %clang_cc1 -fblocks -triple i386-apple-darwin9 -emit-llvm -o %t %s // RUN: %clang_cc1 -w -fblocks -triple i386-apple-darwin9 -emit-llvm -o %t %s
// RUN: FileCheck < %t %s // RUN: FileCheck < %t %s
// CHECK: define signext i8 @f0() // CHECK: define signext i8 @f0()
@ -214,3 +214,9 @@ struct __attribute__((aligned(32))) s53 {
int y; int y;
}; };
void f53(struct s53 x) {} void f53(struct s53 x) {}
typedef unsigned short v2i16 __attribute__((__vector_size__(4)));
// CHECK: define i32 @f54(i32 %arg.coerce)
v2i16 f54(v2i16 arg) { return arg+arg; }