rs6000: Fix vector homogeneous aggregates (PR86197)
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 19 Jun 2018 10:52:39 +0000 (12:52 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 19 Jun 2018 10:52:39 +0000 (12:52 +0200)
The existing code allows only 4 vectors worth of ieee128 homogeneous
aggregates, but it should be 8.  This happens because at one spot it
is mistakenly qualified as being passed in floating point registers.

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: r261738

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

index 3d3707d44e8de4e90ff5ab24dd72e8e6be01cb55..f580b4eb1969e6d05aadd674f48377b5480ea25e 100644 (file)
@@ -1,3 +1,10 @@
+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-06-19  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gimplify.c (gimplify_init_constructor): Really never clear for an
index 31c5bcff50d3f27f777f943b8bad8021b06a5cd2..11ef766a531ae30240ae854be390f4a19ab108f4 100644 (file)
@@ -10887,12 +10887,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;