(smax, smin, umax, umin): Add define_splits.
authorRichard Kenner <kenner@gcc.gnu.org>
Sat, 19 Sep 1992 19:42:00 +0000 (15:42 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Sat, 19 Sep 1992 19:42:00 +0000 (15:42 -0400)
From-SVN: r2169

gcc/config/rs6000/rs6000.md

index 90947d1..9da114a 100644 (file)
 
 ;; For SMIN, SMAX, UMIN, and UMAX, we use DEFINE_EXPAND's that involve a doz[i]
 ;; instruction and some auxiliary computations.  Then we just have a single
-;; DEFINE_INSN for doz[i].
+;; DEFINE_INSN for doz[i] and the define_splits to make them if made by
+;; combine.
 
 (define_expand "sminsi3"
   [(set (match_dup 3)
   "
 { operands[3] = gen_reg_rtx (SImode); }")
 
+(define_split
+  [(set (match_operand:SI 0 "gpc_reg_operand" "")
+       (smin:SI (match_operand:SI 1 "gpc_reg_operand" "")
+                (match_operand:SI 2 "reg_or_short_operand" "")))
+   (clobber (match_operand:SI 3 "gpc_reg_operand" ""))]
+  ""
+  [(set (match_dup 3)
+       (if_then_else:SI (gt:SI (match_dup 1) (match_dup 2))
+                        (const_int 0)
+                        (minus:SI (match_dup 2) (match_dup 1))))
+   (set (match_dup 0) (minus:SI (match_dup 2) (match_dup 3)))]
+  "")
+
 (define_expand "smaxsi3"
   [(set (match_dup 3)
        (if_then_else:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "")
   "
 { operands[3] = gen_reg_rtx (SImode); }")
 
+(define_split
+  [(set (match_operand:SI 0 "gpc_reg_operand" "")
+       (smax:SI (match_operand:SI 1 "gpc_reg_operand" "")
+                (match_operand:SI 2 "reg_or_short_operand" "")))
+   (clobber (match_operand:SI 3 "gpc_reg_operand" ""))]
+  ""
+  [(set (match_dup 3)
+       (if_then_else:SI (gt:SI (match_dup 1) (match_dup 2))
+                        (const_int 0)
+                        (minus:SI (match_dup 2) (match_dup 1))))
+   (set (match_dup 0) (plus:SI (match_dup 3) (match_dup 1)))]
+  "")
+
 (define_expand "uminsi3"
   [(set (match_dup 3) (xor:SI (match_operand:SI 1 "gpc_reg_operand" "")
                              (const_int -2147483648)))