msp430-protos.h (msp430_split_addsi): New prototype.
authorJozef Lawrynowicz <jozef.l@mittosystems.com>
Mon, 7 Oct 2019 20:05:30 +0000 (20:05 +0000)
committerJozef Lawrynowicz <jozefl@gcc.gnu.org>
Mon, 7 Oct 2019 20:05:30 +0000 (20:05 +0000)
2019-10-07  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

* config/msp430/msp430-protos.h (msp430_split_addsi): New prototype.
* config/msp430/msp430.c (msp430_split_addsi): New.
* config/msp430/msp430.md: Call msp430_split_addsi () instead of using
a block of C code for splitting addsi.

From-SVN: r276670

gcc/ChangeLog
gcc/config/msp430/msp430-protos.h
gcc/config/msp430/msp430.c
gcc/config/msp430/msp430.md

index bbdce86a0f87f6a58db239957ecc9eaacd3754eb..91ebb5a114c8576eeff66a2d830f6480049fba51 100644 (file)
@@ -1,3 +1,10 @@
+2019-10-07  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
+
+       * config/msp430/msp430-protos.h (msp430_split_addsi): New prototype.
+       * config/msp430/msp430.c (msp430_split_addsi): New.
+       * config/msp430/msp430.md: Call msp430_split_addsi () instead of using
+       a block of C code for splitting addsi.
+
 2019-10-07  Uroš Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386-expand.c (ix86_expand_floorceildf_32,
index 1c1757fc7ab75de414fa1c7b39d9efd8f6d2953a..37ca48297acc4436ae3a25607e7908d8931eec6e 100644 (file)
@@ -44,6 +44,7 @@ void  msp430_output_labelref (FILE *, const char *);
 void   msp430_register_pragmas (void);
 rtx    msp430_return_addr_rtx (int);
 void   msp430_split_movsi (rtx *);
+int msp430_split_addsi (rtx *);
 void    msp430_start_function (FILE *, const char *, tree);
 rtx    msp430_subreg (machine_mode, rtx, machine_mode, int);
 bool    msp430_use_f5_series_hwmult (void);
index 354b4ddb4194ca5fde586865362907df2f341865..add19bdb97ce957b8a4967838a67bef6e8a0af0a 100644 (file)
@@ -2841,6 +2841,29 @@ msp430_subreg (machine_mode mode, rtx r, machine_mode omode, int byte)
   return rv;
 }
 
+int
+msp430_split_addsi (rtx *operands)
+{
+  operands[3] = msp430_subreg (HImode, operands[0], SImode, 0);
+  operands[4] = msp430_subreg (HImode, operands[1], SImode, 0);
+  operands[5] = msp430_subreg (HImode, operands[2], SImode, 0);
+  operands[6] = msp430_subreg (HImode, operands[0], SImode, 2);
+  operands[7] = msp430_subreg (HImode, operands[1], SImode, 2);
+  operands[8] = msp430_subreg (HImode, operands[2], SImode, 2);
+
+  /* BZ 64160: Do not use this splitter when the dest partially overlaps the
+     source.  */
+  if (reg_overlap_mentioned_p (operands[3], operands[7])
+      || reg_overlap_mentioned_p (operands[3], operands[8]))
+    return 1;
+
+  if (GET_CODE (operands[5]) == CONST_INT)
+    operands[9] = GEN_INT (INTVAL (operands[5]) & 0xffff);
+  else
+    operands[9] = gen_rtx_ZERO_EXTEND (SImode, operands[5]);
+  return 0;
+}
+
 /* Called by movsi_x to generate the HImode operands.  */
 void
 msp430_split_movsi (rtx *operands)
index c72f7aade30bd7b5617d088c0149c9f9a6a55a4d..e1c61f5ea3d12c20cc0a4f035e1c623064f952f4 100644 (file)
                 (zero_extend:HI (reg:BI CARRY))))
    ]
   "
-   operands[3] = msp430_subreg (HImode, operands[0], SImode, 0);
-   operands[4] = msp430_subreg (HImode, operands[1], SImode, 0);
-   operands[5] = msp430_subreg (HImode, operands[2], SImode, 0);
-   operands[6] = msp430_subreg (HImode, operands[0], SImode, 2);
-   operands[7] = msp430_subreg (HImode, operands[1], SImode, 2);
-   operands[8] = msp430_subreg (HImode, operands[2], SImode, 2);
-
-   /* BZ 64160: Do not use this splitter when the dest partially overlaps the source.  */
-   if (reg_overlap_mentioned_p (operands[3], operands[7])
-       || reg_overlap_mentioned_p (operands[3], operands[8]))
-      FAIL;
-
-   if (GET_CODE (operands[5]) == CONST_INT)
-     operands[9] = GEN_INT (INTVAL (operands[5]) & 0xffff);
-   else
-     operands[9] = gen_rtx_ZERO_EXTEND (SImode, operands[5]);
-   "
+  if (msp430_split_addsi (operands))
+    FAIL;
+  "
   )