* config/rx/rx.md (bitset_in_memory, bitclr_in_memory: Fix timings.
authorNick Clifton <nickc@redhat.com>
Thu, 10 Mar 2011 11:25:02 +0000 (11:25 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Thu, 10 Mar 2011 11:25:02 +0000 (11:25 +0000)
From-SVN: r170845

gcc/ChangeLog
gcc/config/rx/rx.md

index ca24623dfd596be1bce4d70d6305b91ed0ce5dbe..8adc5a457ae291cf153bdfb19db0cc1dca5c53ea 100644 (file)
@@ -1,3 +1,7 @@
+2011-03-10  Nick Clifton  <nickc@redhat.com>
+
+       * config/rx/rx.md (bitset_in_memory, bitclr_in_memory: Fix timings.
+
 2011-03-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/47866
index 7629a886e5c709d990d9eae85ede21a0a369a59c..c8b95d0c5d2d072373de5ba6b24e8a579ddb79cc 100644 (file)
   ""
   "bset\t%1, %0.B"
   [(set_attr "length" "3")
-   (set_attr "timings" "34")]
+   (set_attr "timings" "33")]
 )
 
 (define_insn "*bitinvert"
   ""
   "bclr\t%1, %0.B"
   [(set_attr "length" "3")
-   (set_attr "timings" "34")]
+   (set_attr "timings" "33")]
 )
 
 (define_insn "*insv_imm"
     rtx addr2 = gen_rtx_REG (SImode, 2);
     rtx len   = gen_rtx_REG (SImode, 3);
 
+    /* Do not use when the source or destination are volatile - the SMOVF
+       instruction will read and write in word sized blocks, which may be
+       outside of the valid address range.  */
+    if (MEM_P (operands[0]) && MEM_VOLATILE_P (operands[0]))
+      FAIL;
+    if (MEM_P (operands[1]) && MEM_VOLATILE_P (operands[1]))
+      FAIL;
+
     if (REG_P (operands[0]) && (REGNO (operands[0]) == 2
                                      || REGNO (operands[0]) == 3))
       FAIL;
     if (REG_P (operands[2]) && (REGNO (operands[2]) == 1
                                      || REGNO (operands[2]) == 2))
       FAIL;
+
     emit_move_insn (addr1, force_operand (XEXP (operands[0], 0), NULL_RTX));
     emit_move_insn (addr2, force_operand (XEXP (operands[1], 0), NULL_RTX));
     emit_move_insn (len, force_operand (operands[2], NULL_RTX));