]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/54418 ([SH] Invalid operands for opcode)
authorOleg Endo <olegendo@gcc.gnu.org>
Sun, 2 Sep 2012 23:15:25 +0000 (23:15 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Sun, 2 Sep 2012 23:15:25 +0000 (23:15 +0000)
PR target/54418
* config/sh/sh.md (cmpgeusi_t): Remove N alternative.
Check operands[1] in split condition instead of operands[0].
Add comments.

From-SVN: r190864

gcc/ChangeLog
gcc/config/sh/sh.md

index b1f8c50131667b1e82eb0d081f8c95e4ff6351c6..b743a98d531e3029b9d35664cac77e24ff725d26 100644 (file)
@@ -1,3 +1,10 @@
+2012-09-02  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/54418
+       * config/sh/sh.md (cmpgeusi_t): Remove N alternative.
+       Check operands[1] in split condition instead of operands[0].
+       Add comments.
+
 2012-09-02  Mark Kettenis  <kettenis@openbsd.org>
 
        * config.gcc (x86_64-*-openbsd*): New target.
index f1b5df72b3fd06a2cc6e96ecd0274f76ed9671eb..d69d2947ebbda9dd41afc7d076de74eccf256821 100644 (file)
 ;; SImode unsigned integer comparisons
 ;; -------------------------------------------------------------------------
 
+;; Usually comparisons of 'unsigned int >= 0' are optimized away completely.
+;; However, especially when optimizations are off (e.g. -O0) such comparisons
+;; might remain and we have to handle them.  If the '>= 0' case wasn't
+;; handled here, something else would just load a '0' into the second operand
+;; and do the comparison.  We can do slightly better by just setting the
+;; T bit to '1'.
 (define_insn_and_split "cmpgeusi_t"
   [(set (reg:SI T_REG)
        (geu:SI (match_operand:SI 0 "arith_reg_operand" "r")
-               (match_operand:SI 1 "arith_reg_or_0_operand" "rN")))]
+               (match_operand:SI 1 "arith_reg_or_0_operand" "r")))]
   "TARGET_SH1"
   "cmp/hs      %1,%0"
-  "&& satisfies_constraint_Z (operands[0])"
+  "&& satisfies_constraint_Z (operands[1])"
   [(set (reg:SI T_REG) (const_int 1))]
   ""
   [(set_attr "type" "mt_group")])