[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