[llvm-commits] [llvm-gcc-4.2] r46871 - /llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp
Scott Michel
scottm at aero.org
Thu Feb 7 17:11:33 PST 2008
Author: pingbak
Date: Thu Feb 7 19:11:33 2008
New Revision: 46871
URL: http://llvm.org/viewvc/llvm-project?rev=46871&view=rev
Log:
Move llvm_x86_should_pass_aggregate_in_memory so that it is declared before it
is used.
Modified:
llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp
Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp?rev=46871&r1=46870&r2=46871&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Thu Feb 7 19:11:33 2008
@@ -690,6 +690,48 @@
}
/* Target hook for llvm-abi.h. It returns true if an aggregate of the
+ specified type should be passed in a number of registers of mixed types.
+ It also returns a vector of types that correspond to the registers used
+ for parameter passing. This is only called for x86-32. */
+bool
+llvm_x86_32_should_pass_aggregate_in_mixed_regs(tree TreeType, const Type *Ty,
+ std::vector<const Type*> &Elts){
+ // If this is a small fixed size type, investigate it.
+ HOST_WIDE_INT SrcSize = int_size_in_bytes(TreeType);
+ if (SrcSize <= 0 || SrcSize > 16)
+ return false;
+
+ // X86-32 passes aggregates on the stack. If this is an extremely simple
+ // aggregate whose elements would be passed the same if passed as scalars,
+ // pass them that way in order to promote SROA on the caller and callee side.
+ // Note that we can't support passing all structs this way. For example,
+ // {i16, i16} should be passed in on 32-bit unit, which is not how "i16, i16"
+ // would be passed as stand-alone arguments.
+ const StructType *STy = dyn_cast<StructType>(Ty);
+ if (!STy || STy->isPacked()) return false;
+
+ for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
+ const Type *EltTy = STy->getElementType(i);
+ // 32 and 64-bit integers are fine, as are float, double, and long double.
+ if (EltTy == Type::Int32Ty ||
+ EltTy == Type::Int64Ty ||
+ EltTy->isFloatingPoint() ||
+ isa<PointerType>(EltTy)) {
+ Elts.push_back(EltTy);
+ continue;
+ }
+
+ // TODO: Vectors are also ok to pass if they don't require extra alignment.
+ // TODO: We can also pass structs like {i8, i32}.
+
+ Elts.clear();
+ return false;
+ }
+
+ return true;
+}
+
+/* Target hook for llvm-abi.h. It returns true if an aggregate of the
specified type should be passed in memory. */
bool llvm_x86_should_pass_aggregate_in_memory(tree TreeType, const Type *Ty) {
enum machine_mode Mode = ix86_getNaturalModeForType(TreeType);
@@ -800,46 +842,4 @@
}
return true;
}
-
-/* Target hook for llvm-abi.h. It returns true if an aggregate of the
- specified type should be passed in a number of registers of mixed types.
- It also returns a vector of types that correspond to the registers used
- for parameter passing. This is only called for x86-32. */
-bool
-llvm_x86_32_should_pass_aggregate_in_mixed_regs(tree TreeType, const Type *Ty,
- std::vector<const Type*> &Elts){
- // If this is a small fixed size type, investigate it.
- HOST_WIDE_INT SrcSize = int_size_in_bytes(TreeType);
- if (SrcSize <= 0 || SrcSize > 16)
- return false;
-
- // X86-32 passes aggregates on the stack. If this is an extremely simple
- // aggregate whose elements would be passed the same if passed as scalars,
- // pass them that way in order to promote SROA on the caller and callee side.
- // Note that we can't support passing all structs this way. For example,
- // {i16, i16} should be passed in on 32-bit unit, which is not how "i16, i16"
- // would be passed as stand-alone arguments.
- const StructType *STy = dyn_cast<StructType>(Ty);
- if (!STy || STy->isPacked()) return false;
-
- for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
- const Type *EltTy = STy->getElementType(i);
- // 32 and 64-bit integers are fine, as are float, double, and long double.
- if (EltTy == Type::Int32Ty ||
- EltTy == Type::Int64Ty ||
- EltTy->isFloatingPoint() ||
- isa<PointerType>(EltTy)) {
- Elts.push_back(EltTy);
- continue;
- }
-
- // TODO: Vectors are also ok to pass if they don't require extra alignment.
- // TODO: We can also pass structs like {i8, i32}.
-
- Elts.clear();
- return false;
- }
-
- return true;
-}
/* LLVM LOCAL end (ENTIRE FILE!) */
More information about the llvm-commits
mailing list