This patch is a companion patch to patch #8, and it allows using the PADDI
(PLI) instruction to load up 32-bit SImode constants rather than generating
separate ADDI + ADDIS instructions.

Along with the other patches, I have done bootstraps on a little endian power8
system, and there were no regressions in the test suite.  Can I check this into
the trunk?

2019-10-08  Michael Meissner  <meiss...@linux.ibm.com>

        * config/rs6000/rs6000.md (movsi_internal1): Add support to load
        up 32-bit SImode integer constants with PADDI.
        (movsi integer constant splitter): Do not split constant if PADDI
        can load it up directly.

Index: gcc/config/rs6000/rs6000.md
===================================================================
--- gcc/config/rs6000/rs6000.md (revision 276724)
+++ gcc/config/rs6000/rs6000.md (working copy)
@@ -6904,22 +6904,22 @@ (define_insn "movsi_low"
 
 ;;             MR           LA           LWZ          LFIWZX       LXSIWZX
 ;;             STW          STFIWX       STXSIWX      LI           LIS
-;;             #            XXLOR        XXSPLTIB 0   XXSPLTIB -1  VSPLTISW
-;;             XXLXOR 0     XXLORC -1    P9 const     MTVSRWZ      MFVSRWZ
-;;             MF%1         MT%0         NOP
+;;             PLI          #            XXLOR        XXSPLTIB 0   XXSPLTIB -1
+;;             VSPLTISW     XXLXOR 0     XXLORC -1    P9 const     MTVSRWZ
+;;             MFVSRWZ      MF%1         MT%0         NOP
 (define_insn "*movsi_internal1"
   [(set (match_operand:SI 0 "nonimmediate_operand"
                "=r,         r,           r,           d,           v,
                 m,          Z,           Z,           r,           r,
-                r,          wa,          wa,          wa,          v,
-                wa,         v,           v,           wa,          r,
-                r,          *h,          *h")
+                r,          r,           wa,          wa,          wa,
+                v,          wa,          v,           v,           wa,
+                r,          r,           *h,          *h")
        (match_operand:SI 1 "input_operand"
                "r,          U,           m,           Z,           Z,
                 r,          d,           v,           I,           L,
-                n,          wa,          O,           wM,          wB,
-                O,          wM,          wS,          r,           wa,
-                *h,         r,           0"))]
+                eI,         n,           wa,          O,           wM,
+                wB,         O,           wM,          wS,          r,
+                wa,         *h,          r,           0"))]
   "gpc_reg_operand (operands[0], SImode)
    || gpc_reg_operand (operands[1], SImode)"
   "@
@@ -6933,6 +6933,7 @@ (define_insn "*movsi_internal1"
    stxsiwx %x1,%y0
    li %0,%1
    lis %0,%v1
+   li %0,%1
    #
    xxlor %x0,%x1,%x1
    xxspltib %x0,0
@@ -6949,21 +6950,21 @@ (define_insn "*movsi_internal1"
   [(set_attr "type"
                "*,          *,           load,        fpload,      fpload,
                 store,      fpstore,     fpstore,     *,           *,
-                *,          veclogical,  vecsimple,   vecsimple,   vecsimple,
-                veclogical, veclogical,  vecsimple,   mffgpr,      mftgpr,
-                *,          *,           *")
+                *,          *,           veclogical,  vecsimple,   vecsimple,
+                vecsimple,  veclogical,  veclogical,  vecsimple,   mffgpr,
+                mftgpr,     *,           *,           *")
    (set_attr "length"
                "*,          *,           *,           *,           *,
                 *,          *,           *,           *,           *,
-                8,          *,           *,           *,           *,
-                *,          *,           8,           *,           *,
-                *,          *,           *")
+                *,          8,           *,           *,           *,
+                *,          *,           *,           8,           *,
+                *,          *,           *,           *")
    (set_attr "isa"
                "*,          *,           *,           p8v,         p8v,
                 *,          p8v,         p8v,         *,           *,
-                *,          p8v,         p9v,         p9v,         p8v,
-                p9v,        p8v,         p9v,         p8v,         p8v,
-                *,          *,           *")])
+                fut,        *,           p8v,         p9v,         p9v,
+                p8v,        p9v,         p8v,         p9v,         p8v,
+                p8v,        *,           *,           *")])
 
 ;; Like movsi, but adjust a SF value to be used in a SI context, i.e.
 ;; (set (reg:SI ...) (subreg:SI (reg:SF ...) 0))
@@ -7108,14 +7109,15 @@ (define_insn "*movsi_from_df"
   "xscvdpsp %x0,%x1"
   [(set_attr "type" "fp")])
 
-;; Split a load of a large constant into the appropriate two-insn
-;; sequence.
+;; Split a load of a large constant into the appropriate two-insn sequence.  On
+;; systems that support PADDI (PLI), we can use PLI to load any 32-bit constant
+;; in one instruction.
 
 (define_split
   [(set (match_operand:SI 0 "gpc_reg_operand")
        (match_operand:SI 1 "const_int_operand"))]
   "(unsigned HOST_WIDE_INT) (INTVAL (operands[1]) + 0x8000) >= 0x10000
-   && (INTVAL (operands[1]) & 0xffff) != 0"
+   && (INTVAL (operands[1]) & 0xffff) != 0 && !TARGET_PREFIXED_ADDR"
   [(set (match_dup 0)
        (match_dup 2))
    (set (match_dup 0)

-- 
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797

Reply via email to