forked from OSchip/llvm-project
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:
parent
5fca8ca8cd
commit
d774ae9ed1
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue