rx.opt (mallow-string-insns): New option.
authorNick Clifton <nickc@redhat.com>
Wed, 15 Apr 2015 07:41:07 +0000 (07:41 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Wed, 15 Apr 2015 07:41:07 +0000 (07:41 +0000)
* config/rx/rx.opt (mallow-string-insns): New option.
* config/rx/rx.c (RX_BUILTIN_RMPA): Disable the use of this
builtin if string instructions are denied.
* config/rx/rx.h (TARGET_CPU_CPP_BUILTINS): Define
__RX_ALLOW_STRING_INSNS__ or __RX_DISALLOW_STRING_INSNS__, as
appropriate.
(ASM_SPEC): Pass -mno-allow-string-insns on to the assembler.
* config/rx/rx.md (movstr): Enable pattern only if string
instructions are allowed.
(rx_movstr, rx_strend, movmemsi, rx_movmem): Likewise.
(cmpstrnsi, cmpstrsi, rx_cmpstrn, rmpa): Likewise.
* config/rx/t-rx (MULTILIB_OPTIONS): Add mno-allow-string-insns.
(MULTILIB_DIRNAMES): Add no-strings.
* doc/invoke.texi: Document -mno-allow-string-insns.

* gcc.target/rx/builtins.c: Disable RMPA test if string
instructions are not allowed.

From-SVN: r222116

gcc/ChangeLog
gcc/config/rx/rx.c
gcc/config/rx/rx.h
gcc/config/rx/rx.md
gcc/config/rx/rx.opt
gcc/config/rx/t-rx
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/rx/builtins.c

index c68a2fac88250676d4c414b8c24c5d56401f00b9..7757d3855740f761e4a01c95ee1761b07cace88e 100644 (file)
@@ -1,3 +1,19 @@
+2015-04-15  Nick Clifton  <nickc@redhat.com>
+
+       * config/rx/rx.opt (mallow-string-insns): New option.
+       * config/rx/rx.c (RX_BUILTIN_RMPA): Disable the use of this
+       builtin if string instructions are denied.
+       * config/rx/rx.h (TARGET_CPU_CPP_BUILTINS): Define
+       __RX_ALLOW_STRING_INSNS__ or __RX_DISALLOW_STRING_INSNS__, as
+       appropriate.
+       (ASM_SPEC): Pass -mno-allow-string-insns on to the assembler.
+       * config/rx/rx.md (movstr): Enable pattern only if string
+       instructions are allowed.
+       (rx_movstr, rx_strend, movmemsi, rx_movmem): Likewise.
+       (cmpstrnsi, cmpstrsi, rx_cmpstrn, rmpa): Likewise.
+       * config/rx/t-rx (MULTILIB_OPTIONS): Add mno-allow-string-insns.
+       (MULTILIB_DIRNAMES): Add no-strings.
+       * doc/invoke.texi: Document -mno-allow-string-insns.
 2015-04-15  Alan Modra  <amodra@gmail.com>
 
        PR target/65408
index 6fe21aab98615182bac2a7b9c0a93104d85f9b55..9180fe20f66bbc40b94f22c1344d22978d6edca0 100644 (file)
@@ -2620,7 +2620,12 @@ rx_expand_builtin (tree exp,
        (op, gen_mvtachi, true);
     case RX_BUILTIN_MVTACLO: return rx_expand_void_builtin_1_arg
        (op, gen_mvtaclo, true);
-    case RX_BUILTIN_RMPA:    emit_insn (gen_rmpa ()); return NULL_RTX;
+    case RX_BUILTIN_RMPA:
+      if (rx_allow_string_insns)
+       emit_insn (gen_rmpa ());
+      else
+       error ("-mno-allow-string-insns forbids the generation of the RMPA instruction");
+      return NULL_RTX;
     case RX_BUILTIN_MVFC:    return rx_expand_builtin_mvfc (arg, target);
     case RX_BUILTIN_MVTC:    return rx_expand_builtin_mvtc (exp);
     case RX_BUILTIN_MVTIPL:  return rx_expand_builtin_mvtipl (op);
index 4c566247e713710408bb73d7d988e87131a89a81..238f340bf27445ff56ed465f9510c7048afb15ce 100644 (file)
        builtin_define ("__RX_GCC_ABI__");      \
       else                                     \
        builtin_define ("__RX_ABI__");          \
+                                               \
+      if (rx_allow_string_insns)               \
+       builtin_define ("__RX_ALLOW_STRING_INSNS__"); \
+      else                                     \
+       builtin_define ("__RX_DISALLOW_STRING_INSNS__");\
     }                                           \
   while (0)
 
 %{msmall-data-limit*:-msmall-data-limit} \
 %{mrelax:-relax} \
 %{mpid} \
+%{mno-allow-string-insns} \
 %{mint-register=*} \
 %{mgcc-abi:-mgcc-abi} %{!mgcc-abi:-mrx-abi} \
 %{mcpu=*} \
index 590c70f0f380ba03f09bfdf4a840da7fc425edb1..1e10327871d9441ace10e9273ce89c0730afe6f3 100644 (file)
        (match_operand:BLK 2 "memory_operand"))   ;; Source
    (use (match_operand:SI  0 "register_operand")) ;; Updated Dest
   ]
-  ""
+  "rx_allow_string_insns"
   {
     rtx addr1 = gen_rtx_REG (SImode, 1);
     rtx addr2 = gen_rtx_REG (SImode, 2);
    (clobber (reg:SI 1))
    (clobber (reg:SI 2))
    (clobber (reg:SI 3))]
-  ""
+  "rx_allow_string_insns"
   "smovu"
   [(set_attr "length" "2")
    (set_attr "timings" "1111")] ;; The timing is a guesstimate.
    (clobber (reg:SI 3))
    (clobber (reg:CC CC_REG))
    ]
-  ""
+  "rx_allow_string_insns"
   "mov\t%1, r1\n\tmov\t#0, r2\n\tsuntil.b\n\tmov\tr1, %0\n\tsub\t#1, %0"
   [(set_attr "length" "10")
    (set_attr "timings" "1111")] ;; The timing is a guesstimate.
      (match_operand          3 "immediate_operand") ;; Align
      (unspec_volatile:BLK [(reg:SI 1) (reg:SI 2) (reg:SI 3)] UNSPEC_MOVMEM)]
     )]
-  ""
+  "rx_allow_string_insns"
   {
     rtx addr1 = gen_rtx_REG (SImode, 1);
     rtx addr2 = gen_rtx_REG (SImode, 2);
    (clobber (reg:SI 1))
    (clobber (reg:SI 2))
    (clobber (reg:SI 3))]
-  ""
+  "rx_allow_string_insns"
   "smovf"
   [(set_attr "length" "2")
    (set_attr "timings" "1111")] ;; The timing is a guesstimate.
                            UNSPEC_CMPSTRN))
    (use (match_operand:SI                       3 "register_operand"))  ;; Max Length
    (match_operand:SI                            4 "immediate_operand")] ;; Known Align
-  ""
+  "rx_allow_string_insns"
   {
     rtx str1 = gen_rtx_REG (SImode, 1);
     rtx str2 = gen_rtx_REG (SImode, 2);
                             (match_operand:BLK 2 "memory_operand")]    ;; String2
                            UNSPEC_CMPSTRN))
    (match_operand:SI                            3 "immediate_operand")] ;; Known Align
-  ""
+  "rx_allow_string_insns"
   {
     rtx str1 = gen_rtx_REG (SImode, 1);
     rtx str2 = gen_rtx_REG (SImode, 2);
    (clobber (reg:SI 2))
    (clobber (reg:SI 3))
    (clobber (reg:CC CC_REG))]
-  ""
+  "rx_allow_string_insns"
   "scmpu               ; Perform the string comparison
    mov     #-1, %0      ; Set up -1 result (which cannot be created
                         ; by the SC insn)
   (clobber (reg:SI 1))
   (clobber (reg:SI 2))
   (clobber (reg:SI 3))]
-  ""
+  "rx_allow_string_insns"
   "rmpa"
   [(set_attr "length" "2")
    (set_attr "timings" "1010")]
index 1ccda4c26253b5e3d2a60e92e441f3fe01cea776..11113e2e305a8c580059cb2a03b94e0fa8414ac5 100644 (file)
@@ -128,6 +128,8 @@ mwarn-multiple-fast-interrupts
 Target Report Var(rx_warn_multiple_fast_interrupts) Init(1) Warning
 Warn when multiple, different, fast interrupt handlers are in the compilation unit.
 
+;---------------------------------------------------
+
 mgcc-abi
 Target RejectNegative Report Mask(GCC_ABI)
 Enable the use of the old, broken, ABI where all stacked function arguments are aligned to 32-bits.
@@ -136,6 +138,14 @@ mrx-abi
 Target RejectNegative Report InverseMask(GCC_ABI)
 Enable the use the standard RX ABI where all stacked function arguments are naturally aligned.  This is the default.
 
+;---------------------------------------------------
+
 mlra
 Target Report Mask(ENABLE_LRA)
 Enable the use of the LRA register allocator.
+
+;---------------------------------------------------
+
+mallow-string-insns
+Target Report Var(rx_allow_string_insns) Init(1)
+Enables or disables the use of the SMOVF, SMOVB, SMOVU, SUNTIL, SWHILE and RMPA instructions.  Enabled by default.
index b532be6082d9b4c8eda8fcd166454ef7dc231d76..f29fd3dc0a5b4ffa2fd72fc5e627dd694035c94d 100644 (file)
@@ -20,7 +20,7 @@
 
 # Enable multilibs:
 
-MULTILIB_OPTIONS    = m64bit-doubles  nofpu        mbig-endian-data  mpid
+MULTILIB_OPTIONS    = m64bit-doubles  mnofpu        mbig-endian-data  mpid
 MULTILIB_DIRNAMES   =  64-bit-double  no-fpu-libs   big-endian-data   pid
 
 # If necessary uncomment the next two lines to generate multilibs
@@ -28,6 +28,9 @@ MULTILIB_DIRNAMES   =  64-bit-double  no-fpu-libs   big-endian-data   pid
 # MULTILIB_OPTIONS    += mgcc-abi
 # MULTILIB_DIRNAMES   +=  gcc-abi
 
+MULTILIB_OPTIONS   += mno-allow-string-insns
+MULTILIB_DIRNAMES  += no-strings
+
 MULTILIB_MATCHES    = nofpu=mnofpu  nofpu=mcpu?rx200  nofpu=mcpu?rx100
 
 MULTILIB_EXCEPTIONS =
index 520c2c51ce6e25a09ec8538d385d56a01f269806..18f6990624865f1e221b9cfae4a5b2a9bc555df1 100644 (file)
@@ -940,6 +940,7 @@ See RS/6000 and PowerPC Options.
 -mmax-constant-size=@gol
 -mint-register=@gol
 -mpid@gol
+-mallow-string-insns -mno-allow-string-insns@gol
 -mno-warn-multiple-fast-interrupts@gol
 -msave-acc-in-interrupts}
 
@@ -20057,6 +20058,27 @@ fast interrupt handler when it is compiling a file.  The default is to
 issue a warning for each extra fast interrupt handler found, as the RX
 only supports one such interrupt.
 
+@item -mallow-string-insns
+@itemx -mno-allow-string-insns
+@opindex mallow-string-insns
+@opindex mno-allow-string-insns
+Enables or disables the use of the string manipulation instructions
+@code{SMOVF}, @code{SCMPU}, @code{SMOVB}, @code{SMOVU}, @code{SUNTIL}
+@code{SWHILE} and also the @code{RMPA} instruction.  These
+instructions may prefetch data, which is not safe to do if accessing
+an I/O register.  (See section 12.2.7 of the RX62N Group User's Manual
+for more information).
+
+The default is to allow these instructions, but it is not possible for
+GCC to reliably detect all circumstances where a string instruction
+might be used to access an I/O register, so their use cannot be
+disabled automatically.  Instead it is reliant upon the programmer to
+use the @option{-mno-allow-string-insns} option if their program
+accesses I/O space.
+
+When the instructions are enabled GCC defines the C preprocessor
+symbol @code{__RX_ALLOW_STRING_INSNS__}, otherwise it defines the
+symbol @code{__RX_DISALLOW_STRING_INSNS__}.
 @end table
 
 @emph{Note:} The generic GCC command-line option @option{-ffixed-@var{reg}}
index db3d1d325cd39825a7508b2bef19a58053456455..a007f32bb9a3d00793ef295e25f89415a1e5c06f 100644 (file)
@@ -1,3 +1,8 @@
+2015-04-15  Nick Clifton  <nickc@redhat.com>
+
+       * gcc.target/rx/builtins.c: Disable RMPA test if string
+       instructions are not allowed.
+
 2015-04-15  Alan Modra  <amodra@gmail.com>
 
        * gcc.dg/pr65408.c: New.
index d503ed3ef94ad2147186092df89c4429b40c7b86..45071bb26df1f6159625e60e6af86333af18fb5f 100644 (file)
@@ -137,8 +137,10 @@ wait (void)
   __builtin_rx_wait ();
 }
 
+#ifndef __RX_DISALLOW_STRING_INSNS__
 void
 rmpa (int * multiplicand, int * multiplier, int num)
 {
   __builtin_rx_rmpa ();
 }
+#endif