Hi,

ia64/VMS doesn't closely follow the 'standard' ia64 ABI (in order to be 
backward compatible with VAX).
We recently found one mismatch while passing FP parameters.

Manually tested and checked - no test case added as this require another 
compiler to test.

Committed on trunk.

Tristan.

2012-03-12  Tristan Gingold  <ging...@adacore.com>

        * config/ia64/ia64.c (ia64_function_arg_1): Move code around.
        (ia64_function_arg_advance): Ditto.

Index: gcc/config/ia64/ia64.c
===================================================================
--- gcc/config/ia64/ia64.c      (revision 185231)
+++ gcc/config/ia64/ia64.c      (working copy)
@@ -4491,6 +4491,15 @@
   if (cum->words + offset >= MAX_ARGUMENT_SLOTS)
     return 0;
 
+  /* On OpenVMS argument is either in Rn or Fn.  */
+  if (TARGET_ABI_OPEN_VMS)
+    {
+      if (FLOAT_MODE_P (mode))
+       return gen_rtx_REG (mode, FR_ARG_FIRST + cum->words);
+      else
+       return gen_rtx_REG (mode, basereg + cum->words);
+    }
+
   /* Check for and handle homogeneous FP aggregates.  */
   if (type)
     hfa_mode = hfa_element_mode (type, 0);
@@ -4577,15 +4586,6 @@
       return gen_rtx_PARALLEL (mode, gen_rtvec_v (i, loc));
     }
   
-  /* On OpenVMS variable argument is either in Rn or Fn.  */
-  else if (TARGET_ABI_OPEN_VMS && named == 0)
-    {
-      if (FLOAT_MODE_P (mode))
-       return gen_rtx_REG (mode, FR_ARG_FIRST + cum->words);
-      else
-       return gen_rtx_REG (mode, basereg + cum->words);
-    }
-
   /* Integral and aggregates go in general registers.  If we have run out of
      FR registers, then FP values must also go in general registers.  This can
      happen when we have a SFmode HFA.  */
@@ -4736,6 +4736,14 @@
   cum->atypes[cum->words] = ia64_arg_type (mode);
   cum->words += words + offset;
 
+  /* On OpenVMS argument is either in Rn or Fn.  */
+  if (TARGET_ABI_OPEN_VMS && named == 0)
+    {
+      cum->int_regs = cum->words;
+      cum->fp_regs = cum->words;
+      return;
+    }
+
   /* Check for and handle homogeneous FP aggregates.  */
   if (type)
     hfa_mode = hfa_element_mode (type, 0);
@@ -4776,13 +4784,6 @@
       cum->fp_regs = fp_regs;
     }
 
-  /* On OpenVMS variable argument is either in Rn or Fn.  */
-  else if (TARGET_ABI_OPEN_VMS && named == 0)
-    {
-      cum->int_regs = cum->words;
-      cum->fp_regs = cum->words;
-    }
-
   /* Integral and aggregates go in general registers.  So do TFmode FP values.
      If we have run out of FR registers, then other FP values must also go in
      general registers.  This can happen when we have a SFmode HFA.  */

Reply via email to