summaryrefslogtreecommitdiff
path: root/gcc/config/ns32k
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1996-06-27 20:23:23 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1996-06-27 20:23:23 -0400
commite5b7b845d58a711cf917e0d8c56a8e2a3e515d47 (patch)
treefde131d1fa848a49c70e7920487d6278ee620d5b /gcc/config/ns32k
parent8bca29225cba386c6ed05c39b251ace8cc24429f (diff)
downloadgcc-e5b7b845d58a711cf917e0d8c56a8e2a3e515d47.tar.gz
(adddi3, subdi3, negdi3): New patterns.
From-SVN: r12341
Diffstat (limited to 'gcc/config/ns32k')
-rw-r--r--gcc/config/ns32k/ns32k.md112
1 files changed, 111 insertions, 1 deletions
diff --git a/gcc/config/ns32k/ns32k.md b/gcc/config/ns32k/ns32k.md
index a1a08851f00..28e65e6df91 100644
--- a/gcc/config/ns32k/ns32k.md
+++ b/gcc/config/ns32k/ns32k.md
@@ -1,5 +1,5 @@
;;- Machine description for GNU compiler, ns32000 Version
-;; Copyright (C) 1988, 1994 Free Software Foundation, Inc.
+;; Copyright (C) 1988, 1994, 1996 Free Software Foundation, Inc.
;; Contributed by Michael Tiemann (tiemann@cygnus.com)
;; This file is part of GNU CC.
@@ -858,6 +858,47 @@
"GET_CODE (operands[1]) == CONST_INT"
"addr %c1(sp),%0")
+(define_insn "adddi3"
+ [(set (match_operand:DI 0 "general_operand" "=ro")
+ (plus:DI (match_operand:DI 1 "general_operand" "%0")
+ (match_operand:DI 2 "general_operand" "ron")))]
+ ""
+ "*
+{
+ rtx low[3], high[3], xops[4];
+ split_di (operands, 3, low, high);
+ xops[0] = low[0];
+ xops[1] = high[0];
+ xops[2] = low[2];
+ xops[3] = high[2];
+
+ if (GET_CODE (xops[2]) == CONST_INT)
+ {
+ int i = INTVAL (xops[2]);
+
+ if (i <= 7 && i >= -8)
+ {
+ if (i == 0)
+ {
+ i = INTVAL (xops[3]);
+ if (i <= 7 && i >= -8)
+ output_asm_insn (\"addqd %$%3,%1\", xops);
+ else
+ output_asm_insn (\"addd %$%3,%1\", xops);
+ }
+ else
+ {
+ output_asm_insn (\"addqd %$%2,%0\", xops);
+ output_asm_insn (\"addcd %$%3,%1\", xops);
+ }
+ return \"\";
+ }
+ }
+ output_asm_insn (\"addd %2,%0\", xops);
+ output_asm_insn (\"addcd %3,%1\", xops);
+ return \"\";
+}")
+
(define_insn "addsi3"
[(set (match_operand:SI 0 "general_operand" "=g,=g&<")
(plus:SI (match_operand:SI 1 "general_operand" "%0,r")
@@ -971,6 +1012,47 @@
return \"adjspd %$%0\";
}")
+(define_insn "subdi3"
+ [(set (match_operand:DI 0 "general_operand" "=ro")
+ (minus:DI (match_operand:DI 1 "general_operand" "0")
+ (match_operand:DI 2 "general_operand" "ron")))]
+ ""
+ "*
+{
+ rtx low[3], high[3], xops[4];
+ split_di (operands, 3, low, high);
+ xops[0] = low[0];
+ xops[1] = high[0];
+ xops[2] = low[2];
+ xops[3] = high[2];
+
+ if (GET_CODE (xops[2]) == CONST_INT)
+ {
+ int i = INTVAL (xops[2]);
+
+ if (i <= 8 && i >= -7)
+ {
+ if (i == 0)
+ {
+ i = INTVAL (xops[3]);
+ if (i <= 8 && i >= -7)
+ output_asm_insn (\"addqd %$%n3,%1\", xops);
+ else
+ output_asm_insn (\"subd %$%3,%1\", xops);
+ }
+ else
+ {
+ output_asm_insn (\"addqd %$%n2,%0\", xops);
+ output_asm_insn (\"subcd %$%3,%1\", xops);
+ }
+ return \"\";
+ }
+ }
+ output_asm_insn (\"subd %2,%0\", xops);
+ output_asm_insn (\"subcd %3,%1\", xops);
+ return \"\";
+}")
+
(define_insn "subsi3"
[(set (match_operand:SI 0 "general_operand" "=g")
(minus:SI (match_operand:SI 1 "general_operand" "0")
@@ -1390,6 +1472,34 @@
"TARGET_32081"
"negf %1,%0")
+(define_insn "negdi2"
+ [(set (match_operand:DI 0 "general_operand" "=ro")
+ (neg:DI (match_operand:DI 1 "general_operand" "ro")))]
+ ""
+ "*
+{
+ rtx low[2], high[2], xops[4];
+ split_di (operands, 2, low, high);
+ xops[0] = low[0];
+ xops[1] = high[0];
+ xops[2] = low[1];
+ xops[3] = high[1];
+
+ if (rtx_equal_p (operands[0], operands[1]))
+ {
+ output_asm_insn (\"negd %3,%1\", xops);
+ output_asm_insn (\"negd %2,%0\", xops);
+ output_asm_insn (\"subcd %$0,%1\", xops);
+ }
+ else
+ {
+ output_asm_insn (\"negd %2,%0\", xops);
+ output_asm_insn (\"movqd %$0,%1\", xops);
+ output_asm_insn (\"subcd %3,%1\", xops);
+ }
+ return \"\";
+}")
+
(define_insn "negsi2"
[(set (match_operand:SI 0 "general_operand" "=g<")
(neg:SI (match_operand:SI 1 "general_operand" "rmn")))]