aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2016-09-13 18:29:40 +0200
committerUros Bizjak <uros@gcc.gnu.org>2016-09-13 18:29:40 +0200
commit809aff7457150eb0a4d0562ee67a9b826d65ea28 (patch)
tree475ad053bbfd931f6c9c53bed2daa0d31d1e8c86
parent254830bab29913361ddd47358d3d90b7d4a49f3d (diff)
downloadgcc-809aff7457150eb0a4d0562ee67a9b826d65ea28.zip
gcc-809aff7457150eb0a4d0562ee67a9b826d65ea28.tar.gz
gcc-809aff7457150eb0a4d0562ee67a9b826d65ea28.tar.bz2
alpha.c (alpha_pass_by_reference): Pass un-named SFmode and SCmode arguments by reference.
* config/alpha/alpha.c (alpha_pass_by_reference): Pass un-named SFmode and SCmode arguments by reference. From-SVN: r240116
-rw-r--r--gcc/ChangeLog18
-rw-r--r--gcc/config/alpha/alpha.c23
2 files changed, 32 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 93c90ce..27c83ef 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
@@ -16,16 +20,14 @@
(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>
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 702cd27..81cef4e 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -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;
}