------- Comment #8 from janis at gcc dot gnu dot org 2008-02-07 02:04 ------- Some experimentation shows how GCC is passing and returning non-hardware vectors for powerpc*-linux:
-m32 (for trunk and 4.0) pass struct by reference (copy in caller's frame) return struct in memory using address in hidden first argument -mno-altivec -mabi=no-altivec pass vector argument by reference -mno-altivec -mabi=no-altivec return vector result via hidden arg 1 -maltivec -mabi=no-altivec pass vector argument by reference -maltivec -mabi=no-altivec return vector result in r3-r6 -mno-altivec -mabi=altivec pass vector argument in caller's frame -mno-altivec -mabi=altivec return vector result in r3-r6 -m64 pass struct in argument registers return struct in memory using address in hidden first argument -mno-altivec -mabi=altivec pass vector argument in caller's frame -mno-altivec -mabi=altivec return vector result in r3-r4 [processing -mabi=no-altivec has been broken since 4.1] -m64 with 4.0 -mno-altivec -mabi=no-altivec pass vector argument by reference -mno-altivec -mabi=no-altivec return vector result via hidden arg 1 -maltivec -mabi=no-altivec pass vector argument by reference -maltivec -mabi=no-altivec return vector result via hidden arg 1 -mno-altivec -mabi=altivec pass vector argument in caller's frame -mno-altivec -mabi=altivec return vector result in r3-r4 This is a mess. I'd like to change the -m32 behavior to pass non-hardware vectors by reference and to return them via a pointer in the hidden first argument. For -m64 I'd return them via a pointer in the hidden first argument, but I'm not sure whether to pass them by reference, or in argument registers like aggregates. Suggestions? -- janis at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jsm28 at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34526