rs6000: Simplify "switch (which_alternative)" patterns
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 25 Sep 2018 23:31:22 +0000 (01:31 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 25 Sep 2018 23:31:22 +0000 (01:31 +0200)
A few of the rs6000 patterns use C code as output control string, where
that code is just a "switch (which_alternative)" with all alternatives
returning a constant string or just the result of a function call as
template.
Write such cases as just a list of templates, with the few pieces that
are C code preceded by "*".

* config/rs6000/altivec.md (*altivec_mov<mode>): Write the output
control string as a list of templates instead of as C code.
(*altivec_movti): Ditto.
* config/rs6000/darwin.md (movdf_low_di): Ditto.

From-SVN: r264587

gcc/ChangeLog
gcc/config/rs6000/altivec.md
gcc/config/rs6000/darwin.md

index d43e6d682ccef6e30ece8a83388791230882a771..54d9ecfe36e6369e256303a21c61381def0cad78 100644 (file)
@@ -1,3 +1,10 @@
+2018-09-25  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * config/rs6000/altivec.md (*altivec_mov<mode>): Write the output
+       control string as a list of templates instead of as C code.
+       (*altivec_movti): Ditto.
+       * config/rs6000/darwin.md (movdf_low_di): Ditto.
+
 2018-09-25  Jim Wilson  <jimw@sifive.com>
 
        * config/riscv/riscv.c (riscv_split_symbol): Mark auipc label as weak
index 345be09ceff59aa177d12bd0624e9d7163e88881..f37ad5a59b008204df04faee9e32fc2f585744e7 100644 (file)
   "VECTOR_MEM_ALTIVEC_P (<MODE>mode)
    && (register_operand (operands[0], <MODE>mode) 
        || register_operand (operands[1], <MODE>mode))"
-{
-  switch (which_alternative)
-    {
-    case 0: return "stvx %1,%y0";
-    case 1: return "lvx %0,%y1";
-    case 2: return "vor %0,%1,%1";
-    case 3: return "#";
-    case 4: return "#";
-    case 5: return "#";
-    case 6: return "vxor %0,%0,%0";
-    case 7: return output_vec_const_move (operands);
-    case 8: return "#";
-    default: gcc_unreachable ();
-    }
-}
+  "@
+   stvx %1,%y0
+   lvx %0,%y1
+   vor %0,%1,%1
+   #
+   #
+   #
+   vxor %0,%0,%0
+   * return output_vec_const_move (operands);
+   #"
   [(set_attr "type" "vecstore,vecload,veclogical,store,load,*,veclogical,*,*")
    (set_attr "length" "4,4,4,20,20,20,4,8,32")])
 
   "VECTOR_MEM_ALTIVEC_P (TImode)
    && (register_operand (operands[0], TImode) 
        || register_operand (operands[1], TImode))"
-{
-  switch (which_alternative)
-    {
-    case 0: return "stvx %1,%y0";
-    case 1: return "lvx %0,%y1";
-    case 2: return "vor %0,%1,%1";
-    case 3: return "#";
-    case 4: return "#";
-    case 5: return "#";
-    case 6: return "vxor %0,%0,%0";
-    case 7: return output_vec_const_move (operands);
-    default: gcc_unreachable ();
-    }
-}
+  "@
+   stvx %1,%y0
+   lvx %0,%y1
+   vor %0,%1,%1
+   #
+   #
+   #
+   vxor %0,%0,%0
+   * return output_vec_const_move (operands);"
   [(set_attr "type" "vecstore,vecload,veclogical,store,load,*,veclogical,*")])
 
 ;; Load up a vector with the most significant bit set by loading up -1 and
index 37acb312b4b778bed88df7ee886f08af7d752b36..2d6d1ca57dd52b4f4233a2d6bc40f2837cda62cd 100644 (file)
@@ -60,17 +60,9 @@ You should have received a copy of the GNU General Public License
         (mem:DF (lo_sum:DI (match_operand:DI 1 "gpc_reg_operand" "b,b")
                            (match_operand 2 "" ""))))]
   "TARGET_MACHO && TARGET_HARD_FLOAT && TARGET_64BIT"
-{
-  switch (which_alternative)
-    {
-      case 0:
-       return "lfd %0,lo16(%2)(%1)";
-      case 1:
-       return "ld %0,lo16(%2)(%1)";
-      default:
-       gcc_unreachable ();
-    }
-}
+  "@
+   lfd %0,lo16(%2)(%1)
+   ld %0,lo16(%2)(%1)"
   [(set_attr "type" "load")])
 
 (define_insn "movdf_low_st_si"