OSDN Git Service

* config/h8300/h8300.md (udivqi3): Remove.
authorkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 15 Dec 2001 01:16:28 +0000 (01:16 +0000)
committerkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 15 Dec 2001 01:16:28 +0000 (01:16 +0000)
(divqi3): Likewise.
(udivhi3): Likewise.
(divhi3): Likewise.
(umodqi3): Likewise.
(modqi3): Likewise.
(umodhi3): Likewise.
(modhi3): Likewise.
(udivmodqi3): New.
(divmodqi3): Likewise.
(udivmodhi3): Likewise.
(divmodhi3): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48023 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/h8300/h8300.md

index 14fd691..3dba7c7 100644 (file)
@@ -1,3 +1,18 @@
+2001-12-14  Kazu Hirata  <kazu@hxi.com>
+
+       * config/h8300/h8300.md (udivqi3): Remove.
+       (divqi3): Likewise.
+       (udivhi3): Likewise.
+       (divhi3): Likewise.
+       (umodqi3): Likewise.
+       (modqi3): Likewise.
+       (umodhi3): Likewise.
+       (modhi3): Likewise.
+       (udivmodqi3): New.
+       (divmodqi3): Likewise.
+       (udivmodhi3): Likewise.
+       (divmodhi3): Likewise.
+
 Sat Dec 15 01:39:12 CET 2001  Jan Hubicka  <jh@suse.cz>
 
        * cfgcleanup.c (flow_find_cross_jump): Replace tests for note
index 2e0ad0d..285d9ad 100644 (file)
    (set_attr "cc" "none_0hit")])
 
 ;; ----------------------------------------------------------------------
-;; DIVIDE INSTRUCTIONS
+;; DIVIDE/MOD INSTRUCTIONS
 ;; ----------------------------------------------------------------------
 
-(define_insn "udivqi3"
+(define_insn "udivmodqi4"
   [(set (match_operand:QI 0 "register_operand" "=r")
        (truncate:QI
          (udiv:HI
            (match_operand:HI 1 "general_operand" "0")
-           (zero_extend:HI (match_operand:QI 2 "register_operand" "r")))))]
-  ""
-  "divxu       %X2,%T0"
-  [(set_attr "length" "2")
-   (set_attr "cc" "clobber")])
-
-;; ??? Will divxu always work here?
-
-(define_insn "divqi3"
-  [(set (match_operand:QI 0 "register_operand" "=r")
+           (zero_extend:HI (match_operand:QI 2 "register_operand" "r")))))
+   (set (match_operand:QI 3 "register_operand" "=r")
        (truncate:QI
-         (div:HI
-           (match_operand:HI 1 "general_operand" "0")
-           (sign_extend:HI (match_operand:QI 2 "register_operand" "r")))))]
-  ""
-  "divxu       %X2,%T0"
-  [(set_attr "length" "2")
-   (set_attr "cc" "clobber")])
-
-(define_insn "udivhi3"
-  [(set (match_operand:HI 0 "register_operand" "=r")
-       (truncate:HI
-         (udiv:SI
-           (match_operand:SI 1 "general_operand" "0")
-           (zero_extend:SI (match_operand:HI 2 "register_operand" "r")))))]
-  "TARGET_H8300H || TARGET_H8300S"
-  "divxu.w     %T2,%S0"
-  [(set_attr "length" "2")
-   (set_attr "cc" "clobber")])
-
-(define_insn "divhi3"
-  [(set (match_operand:HI 0 "register_operand" "=r")
-       (truncate:HI
-         (div:SI
-           (match_operand:SI 1 "general_operand" "0")
-           (sign_extend:SI (match_operand:HI 2 "register_operand" "r")))))]
+         (umod:HI
+           (match_dup 1)
+           (zero_extend:HI (match_dup 2)))))]
   "TARGET_H8300H || TARGET_H8300S"
-  "divxs.w     %T2,%S0"
+  "*
+{
+  if (find_reg_note (insn, REG_UNUSED, operands[3]))
+    return \"divxu.b\\t%X2,%T0\";
+  else
+    return \"divxu.b\\t%X2,%T0\;mov.b\\t%t0,%s3\";
+}"
   [(set_attr "length" "4")
    (set_attr "cc" "clobber")])
 
-;; ----------------------------------------------------------------------
-;; MOD INSTRUCTIONS
-;; ----------------------------------------------------------------------
-
-(define_insn "umodqi3"
+(define_insn "divmodqi4"
   [(set (match_operand:QI 0 "register_operand" "=r")
        (truncate:QI
-         (umod:HI
+         (div:HI
            (match_operand:HI 1 "general_operand" "0")
-           (zero_extend:HI (match_operand:QI 2 "register_operand" "r")))))]
-  ""
-  "divxu       %X2,%T0\;mov    %t0,%s0"
-  [(set_attr "length" "4")
-   (set_attr "cc" "clobber")])
-
-(define_insn "modqi3"
-  [(set (match_operand:QI 0 "register_operand" "=r")
+           (sign_extend:HI (match_operand:QI 2 "register_operand" "r")))))
+   (set (match_operand:QI 3 "register_operand" "=r")
        (truncate:QI
          (mod:HI
-           (match_operand:HI 1 "general_operand" "0")
-           (sign_extend:HI (match_operand:QI 2 "register_operand" "r")))))]
+           (match_dup 1)
+           (sign_extend:HI (match_dup 2)))))]
   "TARGET_H8300H || TARGET_H8300S"
-  "divxs.b     %X2,%T0\;mov    %t0,%s0"
+  "*
+{
+  if (find_reg_note (insn, REG_UNUSED, operands[3]))
+    return \"divxs.b\\t%X2,%T0\";
+  else
+    return \"divxs.b\\t%X2,%T0\;mov.b\\t%t0,%s3\";
+}"
   [(set_attr "length" "6")
    (set_attr "cc" "clobber")])
 
-(define_insn "umodhi3"
+(define_insn "udivmodhi4"
   [(set (match_operand:HI 0 "register_operand" "=r")
        (truncate:HI
-         (umod:SI
+         (udiv:SI
            (match_operand:SI 1 "general_operand" "0")
-           (zero_extend:SI (match_operand:HI 2 "register_operand" "r")))))]
+           (zero_extend:SI (match_operand:HI 2 "register_operand" "r")))))
+   (set (match_operand:HI 3 "register_operand" "=r")
+       (truncate:HI
+         (umod:SI
+           (match_dup 1)
+           (zero_extend:SI (match_dup 2)))))]
   "TARGET_H8300H || TARGET_H8300S"
-  "divxu.w     %T2,%S0\;mov    %e0,%f0"
+  "*
+{
+  if (find_reg_note (insn, REG_UNUSED, operands[3]))
+    return \"divxu.w\\t%T2,%S0\";
+  else
+    return \"divxu.w\\t%T2,%S0\;mov.w\\t%e0,%f3\";
+}"
   [(set_attr "length" "4")
    (set_attr "cc" "clobber")])
 
-(define_insn "modhi3"
+(define_insn "divmodhi4"
   [(set (match_operand:HI 0 "register_operand" "=r")
        (truncate:HI
-         (mod:SI
+         (div:SI
            (match_operand:SI 1 "general_operand" "0")
-           (sign_extend:SI (match_operand:HI 2 "register_operand" "r")))))]
+           (sign_extend:SI (match_operand:HI 2 "register_operand" "r")))))
+   (set (match_operand:HI 3 "register_operand" "=r")
+       (truncate:HI
+         (mod:SI
+           (match_dup 1)
+           (sign_extend:SI (match_dup 2)))))]
   "TARGET_H8300H || TARGET_H8300S"
-  "divxs.w     %T2,%S0\;mov    %e0,%f0"
+  "*
+{
+  if (find_reg_note (insn, REG_UNUSED, operands[3]))
+    return \"divxs.w\\t%T2,%S0\";
+  else
+    return \"divxs.w\\t%T2,%S0\;mov.w\\t%e0,%f3\";
+}"
   [(set_attr "length" "6")
    (set_attr "cc" "clobber")])
 \f