From 01af7e0a0c230ca90c22b1f34ff9215ab6a714fd Mon Sep 17 00:00:00 2001 From: John David Anglin Date: Fri, 21 Feb 2020 23:30:24 +0000 Subject: [PATCH] Fix handling of floating-point homogeneous aggregates. 2020-02-21 John David Anglin * gcc/config/pa/pa.c (pa_function_value): Fix check for word and double-word size when handling aggregate return values. * gcc/config/pa/som.h (ASM_DECLARE_FUNCTION_NAME): Fix to indicate that homogeneous SFmode and DFmode aggregates are passed and returned in general registers. --- gcc/ChangeLog | 8 ++++++++ gcc/config/pa/pa.c | 2 +- gcc/config/pa/som.h | 18 ++++++++++++------ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 20e0b12927b..cea52f00523 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2020-02-21 John David Anglin + + * gcc/config/pa/pa.c (pa_function_value): Fix check for word and + double-word size when handling aggregate return values. + * gcc/config/pa/som.h (ASM_DECLARE_FUNCTION_NAME): Fix to indicate + that homogeneous SFmode and DFmode aggregates are passed and returned + in general registers. + 2020-02-21 Jakub Jelinek PR translation/93759 diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 24b88304637..a662de96ac9 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -9335,7 +9335,7 @@ pa_function_value (const_tree valtype, HOST_WIDE_INT valsize = int_size_in_bytes (valtype); /* Handle aggregates that fit exactly in a word or double word. */ - if ((valsize & (UNITS_PER_WORD - 1)) == 0) + if (valsize == UNITS_PER_WORD || valsize == 2 * UNITS_PER_WORD) return gen_rtx_REG (TYPE_MODE (valtype), 28); if (TARGET_64BIT) diff --git a/gcc/config/pa/som.h b/gcc/config/pa/som.h index 95c3bd238fe..505fdd65d79 100644 --- a/gcc/config/pa/som.h +++ b/gcc/config/pa/som.h @@ -98,8 +98,8 @@ do { \ #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ - do { tree fntype = TREE_TYPE (TREE_TYPE (DECL)); \ - tree tree_type = TREE_TYPE (DECL); \ + do { tree tree_type = TREE_TYPE (DECL); \ + tree fntype = TREE_TYPE (tree_type); \ tree parm; \ int i; \ if (TREE_PUBLIC (DECL) || TARGET_GAS) \ @@ -121,9 +121,11 @@ do { \ { \ tree type = DECL_ARG_TYPE (parm); \ machine_mode mode = TYPE_MODE (type); \ - if (mode == SFmode && ! TARGET_SOFT_FLOAT) \ + if (!AGGREGATE_TYPE_P (type) \ + && mode == SFmode && ! TARGET_SOFT_FLOAT) \ fprintf (FILE, ",ARGW%d=FR", i++); \ - else if (mode == DFmode && ! TARGET_SOFT_FLOAT) \ + else if (!AGGREGATE_TYPE_P (type) \ + && mode == DFmode && ! TARGET_SOFT_FLOAT) \ { \ if (i <= 2) \ { \ @@ -158,9 +160,13 @@ do { \ for (; i < 4; i++) \ fprintf (FILE, ",ARGW%d=GR", i); \ } \ - if (TYPE_MODE (fntype) == DFmode && ! TARGET_SOFT_FLOAT) \ + if (!AGGREGATE_TYPE_P (fntype) \ + && TYPE_MODE (fntype) == DFmode \ + && ! TARGET_SOFT_FLOAT) \ fputs (DFMODE_RETURN_STRING, FILE); \ - else if (TYPE_MODE (fntype) == SFmode && ! TARGET_SOFT_FLOAT) \ + else if (!AGGREGATE_TYPE_P (fntype) \ + && TYPE_MODE (fntype) == SFmode \ + && ! TARGET_SOFT_FLOAT) \ fputs (SFMODE_RETURN_STRING, FILE); \ else if (fntype != void_type_node) \ fputs (",RTNVAL=GR", FILE); \ -- 2.30.2