]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/86197 (POWERPC: float128 parameter passing)
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 10 Aug 2018 20:46:04 +0000 (22:46 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Fri, 10 Aug 2018 20:46:04 +0000 (22:46 +0200)
Backport from mainline
2018-06-19  Segher Boessenkool  <segher@kernel.crashing.org>

PR target/86197
* config/rs6000/rs6000.md (rs6000_discover_homogeneous_aggregate): An
ieee128 argument takes up only one (vector) register, not two (floating
point) registers.

From-SVN: r263479

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 40af297e4d07f3616c1800682cad77e16357ff7d..c7f615047572936ec4b899cd4c768d79b0b2fab0 100644 (file)
@@ -1,3 +1,13 @@
+2018-08-10  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       Backport from mainline
+       2018-06-19  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR target/86197
+       * config/rs6000/rs6000.md (rs6000_discover_homogeneous_aggregate): An
+       ieee128 argument takes up only one (vector) register, not two (floating
+       point) registers.
+
 2018-07-29  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/pa/pa.c (pa_output_addr_vec): Align address table.
index 04696580fa600a454324410aecd09798337e329a..733589c659ca6b74e789beabbc788969ff438c63 100644 (file)
@@ -10381,12 +10381,12 @@ rs6000_discover_homogeneous_aggregate (machine_mode mode, const_tree type,
 
       if (field_count > 0)
        {
-         int n_regs = (SCALAR_FLOAT_MODE_P (field_mode) ?
-                       (GET_MODE_SIZE (field_mode) + 7) >> 3 : 1);
+         int reg_size = ALTIVEC_OR_VSX_VECTOR_MODE (field_mode) ? 16 : 8;
+         int field_size = ROUND_UP (GET_MODE_SIZE (field_mode), reg_size);
 
          /* The ELFv2 ABI allows homogeneous aggregates to occupy
             up to AGGR_ARG_NUM_REG registers.  */
-         if (field_count * n_regs <= AGGR_ARG_NUM_REG)
+         if (field_count * field_size <= AGGR_ARG_NUM_REG * reg_size)
            {
              if (elt_mode)
                *elt_mode = field_mode;