From: Uros Bizjak Date: Tue, 13 Sep 2016 16:29:40 +0000 (+0200) Subject: alpha.c (alpha_pass_by_reference): Pass un-named SFmode and SCmode arguments by refer... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=809aff7457150eb0a4d0562ee67a9b826d65ea28;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 93c90ce0785..27c83ef885e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-09-13 Uros Bizjak + + * config/alpha/alpha.c (alpha_pass_by_reference): Pass un-named + SFmode and SCmode arguments by reference. + 2016-09-13 David Malcolm * 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 diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 702cd277ede..81cef4ee387 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; }