Reformat some code; Add support for generating PLWA with offsets whose bottom 2 bits...
authorMichael Meissner <meissner@linux.ibm.com>
Wed, 23 Oct 2019 20:09:27 +0000 (20:09 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Wed, 23 Oct 2019 20:09:27 +0000 (20:09 +0000)
2019-10-23  Michael Meissner  <meissner@linux.ibm.com>

* config/rs6000/rs6000.md (mov<mode>_64bit_dm): Reformat.
(movtd_64bit_nodm): Reformat.
(mov<mode>_32bit): Reformat.
(mov<mode>_softfloat): Reformat.
(FMOVE128_GPR splitter): Reformat.
(DIFD splitter): Reformat.
(TI2 splitter): Reformat.
* config/rs6000/predicates.md (lwa_operand): If the bottom two
bits of the offset for the memory address are non-zero, use PLWA
if prefixed instructions are available.

From-SVN: r277349

gcc/ChangeLog
gcc/config/rs6000/predicates.md
gcc/config/rs6000/rs6000.md

index b975798166cefd7c5008d6dafb10907d1964724a..b3f874ba9cab5eaf19a6ebcabe087a99037831ab 100644 (file)
@@ -1,3 +1,16 @@
+2019-10-23  Michael Meissner  <meissner@linux.ibm.com>
+
+       * config/rs6000/rs6000.md (mov<mode>_64bit_dm): Reformat.
+       (movtd_64bit_nodm): Reformat.
+       (mov<mode>_32bit): Reformat.
+       (mov<mode>_softfloat): Reformat.
+       (FMOVE128_GPR splitter): Reformat.
+       (DIFD splitter): Reformat.
+       (TI2 splitter): Reformat.
+       * config/rs6000/predicates.md (lwa_operand): If the bottom two
+       bits of the offset for the memory address are non-zero, use PLWA
+       if prefixed instructions are available.
+
 2019-10-23  Jan Hubicka  <hubicka@ucw.cz>
 
        * lto-streamer-out.c (cmp_symbol_files): Watch for overflow.
index 345d9c337af8928fcb33cb19da95e766797c30be..5ef505bb1c4f105f94b198f089eb132d6bd04e14 100644 (file)
     return false;
 
   addr = XEXP (inner, 0);
+
+  /* The LWA instruction uses the DS-form instruction format which requires
+     that the bottom two bits of the offset must be 0.  The prefixed PLWA does
+     not have this restriction.  While the actual load from memory is 32-bits,
+     we pass in DImode here to test for using a DS instruction.  */
+  if (address_is_prefixed (addr, DImode, NON_PREFIXED_DS))
+    return true;
+
   if (GET_CODE (addr) == PRE_INC
       || GET_CODE (addr) == PRE_DEC
       || (GET_CODE (addr) == PRE_MODIFY
index d0cca1e6500c1f8b2824156dcfad5109c8c12355..60b8b8ce568ee94ecbb13acf0306b41a7149b848 100644 (file)
   "#"
   "&& reload_completed"
   [(pc)]
-{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; }
+{
+  rs6000_split_multireg_move (operands[0], operands[1]);
+  DONE;
+}
   [(set_attr "length" "8")
    (set_attr "isa" "*,*,*,*,*,*,*,*,p8v,p8v")])
 
   "#"
   "&& reload_completed"
   [(pc)]
-{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; }
+{
+  rs6000_split_multireg_move (operands[0], operands[1]);
+  DONE;
+}
   [(set_attr "length" "8,8,8,12,12,8")])
 
 (define_insn_and_split "*mov<mode>_32bit"
   "#"
   "&& reload_completed"
   [(pc)]
-{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; }
+{
+  rs6000_split_multireg_move (operands[0], operands[1]);
+  DONE;
+}
   [(set_attr "length" "8,8,8,8,20,20,16")])
 
 (define_insn_and_split "*mov<mode>_softfloat"
   "#"
   "&& reload_completed"
   [(pc)]
-{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; }
+{
+  rs6000_split_multireg_move (operands[0], operands[1]);
+  DONE;
+}
   [(set_attr_alternative "length"
        [(if_then_else (match_test "TARGET_POWERPC64")
            (const_string "8")
        || (!vsx_register_operand (operands[0], <MODE>mode)
            && !vsx_register_operand (operands[1], <MODE>mode)))"
   [(pc)]
-{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; })
+{
+  rs6000_split_multireg_move (operands[0], operands[1]);
+  DONE;
+})
 
 ;; Move SFmode to a VSX from a GPR register.  Because scalar floating point
 ;; type is stored internally as double precision in the VSX registers, we have
    && gpr_or_gpr_p (operands[0], operands[1])
    && !direct_move_p (operands[0], operands[1])"
   [(pc)]
-{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; })
+{
+  rs6000_split_multireg_move (operands[0], operands[1]);
+  DONE;
+})
 
 ;;              GPR store  GPR load   GPR move   GPR li     GPR lis     GPR #
 ;;              FPR store  FPR load   FPR move   AVX store  AVX store   AVX load
    && !direct_move_p (operands[0], operands[1])
    && !quad_load_store_p (operands[0], operands[1])"
   [(pc)]
-{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; })
+{
+  rs6000_split_multireg_move (operands[0], operands[1]);
+  DONE;
+})
 \f
 (define_expand "setmemsi"
   [(parallel [(set (match_operand:BLK 0 "")