Hi Kirill, Thanks for Ilya's input on the PR thread.
We've done some testing/checking across the Darwin versions last night and I've bootstrapped all langs including Ada, and tested the patch below (together with the fragment you posted earlier) on Darwin12. >> On Fri, Sep 6, 2013 at 10:34 AM, Kirill Yukhin <kirill.yuk...@gmail.com> >> wrote: >>> Here is a patch to fix pr58269. >>> Actually this is not a full fix, but an obvious part. Here's what I propose for the remainder of the fix (FAOD, I cannot approve the Darwin changes). ==== Darwin is supposed to follow the System V psABI for x86_64 and, AFAICT for Darwin9, 10, 11 and 12 it is complying for function calls involving xmm0-7 (additional float args are, indeed, placed on the stack). Ergo, saving xmm8-15 in __builtin_apply_args() only consumes time and stack space - the content is not part of the call. As a fall-back; if I've missed a subtlety and, for some reason, we need to adjust the xmm set saved for compatibility with an older (gcc-4.2 based) system compiler, then we can override SSE_REGPARM_MAX in i386/darwin*.h for the relevant system version. Losing TARGET_MACHO conditional code is always nice :) Mike: Actually, since this seems to have uncovered a pre-existing wrong code bug, perhaps (this part of the) fix should also be applied to open branches? gcc: PR target/58269 config/i386/i386.c (ix86_function_arg_regno_p): Make Darwin use the xmm register set described in the psABI. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index a8d70bc..e68b3f9 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -5706,17 +5706,9 @@ ix86_function_arg_regno_p (int regno) && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX))); } - if (TARGET_MACHO) - { - if (SSE_REGNO_P (regno) && TARGET_SSE) - return true; - } - else - { - if (TARGET_SSE && SSE_REGNO_P (regno) - && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX)) - return true; - } + if (TARGET_SSE && SSE_REGNO_P (regno) + && (regno < FIRST_SSE_REG + SSE_REGPARM_MAX)) + return true; /* TODO: The function should depend on current function ABI but builtins.c would need updating then. Therefore we use the