alpha.c (alpha_pass_by_reference): Pass un-named SFmode and SCmode arguments by refer...
authorUros Bizjak <uros@gcc.gnu.org>
Tue, 13 Sep 2016 16:29:40 +0000 (18:29 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 13 Sep 2016 16:29:40 +0000 (18:29 +0200)
* config/alpha/alpha.c (alpha_pass_by_reference): Pass un-named
SFmode and SCmode arguments by reference.

From-SVN: r240116

gcc/ChangeLog
gcc/config/alpha/alpha.c

index 93c90ce07856497b4a4ccdbe94caf983fb7c8771..27c83ef885e77b52358a83ffaf35ba543a98db02 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-13  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/alpha/alpha.c (alpha_pass_by_reference): Pass un-named
+       SFmode and SCmode arguments by reference.
+
 2016-09-13  David Malcolm  <dmalcolm@redhat.com>
 
        * diagnostic-show-locus.c (selftest::test_one_liner_fixit_insert):
@@ -6,8 +11,7 @@
        for renaming of add_fixit_insert to add_fixit_insert_before.
        (selftest::test_one_liner_fixit_insert_after): New function.
        (selftest::test_one_liner_fixit_validation_adhoc_locations):
-       Update for renaming of add_fixit_insert to
-       add_fixit_insert_before.
+       Update for renaming of add_fixit_insert to add_fixit_insert_before.
        (selftest::test_one_liner_many_fixits): Likewise.
        (selftest::test_diagnostic_show_locus_one_liner): Update for
        renaming, call new test function.
        (selftest::test_fixit_consolidation): Likewise.
        * diagnostic.c (selftest::test_print_parseable_fixits_insert):
        Likewise.
-       * edit-context.c (selftest::test_applying_fixits_insert): Rename
-       to...
+       * edit-context.c (selftest::test_applying_fixits_insert): Rename to...
        (selftest::test_applying_fixits_insert_before): ...this.
        (selftest::test_applying_fixits_insert): Update for renaming of
        add_fixit_insert to add_fixit_insert_before.
        (selftest::test_applying_fixits_insert_after): New function.
        (selftest::test_applying_fixits_insert_after_at_line_end): New
        function.
-       (selftest::test_applying_fixits_insert_after_failure): New
-       function.
+       (selftest::test_applying_fixits_insert_after_failure): New function.
        (selftest::test_applying_fixits_multiple): Update for renaming of
        add_fixit_insert to add_fixit_insert_before.
        (selftest::change_line): Likewise.
@@ -33,8 +35,8 @@
        (selftest::test_applying_fixits_line_out_of_range): Likewise.
        (selftest::test_applying_fixits_column_validation): Likewise.
        (selftest::test_applying_fixits_column_validation): Likewise.
-       (selftest::edit_context_c_tests): Update for renamed test
-       function; call new test functions.
+       (selftest::edit_context_c_tests): Update for renamed test function;
+       call new test functions.
 
 2016-09-13  Pat Haugen  <pthaugen@us.ibm.com>
 
index 702cd277ede8860c53d3ce4c03a8c6d81f7b5c5b..81cef4ee387cd4d133e79a97803ee61ee29cc8a2 100644 (file)
@@ -5754,8 +5754,29 @@ static bool
 alpha_pass_by_reference (cumulative_args_t ca ATTRIBUTE_UNUSED,
                         machine_mode mode,
                         const_tree type ATTRIBUTE_UNUSED,
-                        bool named ATTRIBUTE_UNUSED)
+                        bool named)
 {
+  /* Pass float and _Complex float variable arguments by reference.
+     This avoids 64-bit store from a FP register to a pretend args save area
+     and subsequent 32-bit load from the saved location to a FP register.
+
+     Note that 32-bit loads and stores to/from a FP register on alpha reorder
+     bits to form a canonical 64-bit value in the FP register.  This fact
+     invalidates compiler assumption that 32-bit FP value lives in the lower
+     32-bits of the passed 64-bit FP value, so loading the 32-bit value from
+     the stored 64-bit location using 32-bit FP load is invalid on alpha.
+
+     This introduces sort of ABI incompatibility, but until _Float32 was
+     introduced, C-family languages promoted 32-bit float variable arg to
+     a 64-bit double, and it was not allowed to pass float as a varible
+     argument.  Passing _Complex float as a variable argument never
+     worked on alpha.  Thus, we have no backward compatibility issues
+     to worry about, and passing unpromoted _Float32 and _Complex float
+     as a variable argument will actually work in the future.  */
+
+  if (mode == SFmode || mode == SCmode)
+    return !named;
+
   return mode == TFmode || mode == TCmode;
 }