OSDN Git Service

* sh.h (binary_logical_operator): Declare.
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 31 Oct 2002 12:53:06 +0000 (12:53 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 31 Oct 2002 12:53:06 +0000 (12:53 +0000)
* sh.c (binary_logical_operator): New function.
* sh.md (xordi3+1): New combiner splitter pattern.

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

gcc/ChangeLog
gcc/config/sh/sh.c
gcc/config/sh/sh.h
gcc/config/sh/sh.md

index 15eaa39..95b754a 100644 (file)
@@ -1,3 +1,9 @@
+Thu Oct 31 12:45:55 2002  J"orn Rennecke <joern.rennecke@superh.com>
+
+       * sh.h (binary_logical_operator): Declare.
+       * sh.c (binary_logical_operator): New function.
+       * sh.md (xordi3+1): New combiner splitter pattern.
+
 2002-10-31  David O'Brien  <obrien@FreeBSD.org>
 
        * config/sparc/freebsd.h (TRANSFER_FROM_TRAMPOLINE): Define
index 3521c47..4e6981b 100644 (file)
@@ -6177,6 +6177,25 @@ binary_float_operator (op, mode)
 }
 
 int
+binary_logical_operator (op, mode)
+     rtx op;
+     enum machine_mode mode;
+{
+  if (GET_MODE (op) != mode)
+    return 0;
+  switch (GET_CODE (op))
+    {
+    case IOR:
+    case AND:
+    case XOR:
+      return 1;
+    default:
+      break;
+    }
+  return 0;
+}
+
+int
 equality_comparison_operator (op, mode)
      rtx op;
      enum machine_mode mode;
index 64a0f2a..d0bbbdf 100644 (file)
@@ -3225,6 +3225,7 @@ extern int rtx_equal_function_value_matters;
   {"arith_reg_operand", {SUBREG, REG}},                                        \
   {"arith_reg_or_0_operand", {SUBREG, REG, CONST_INT, CONST_VECTOR}},  \
   {"binary_float_operator", {PLUS, MINUS, MULT, DIV}},                 \
+  {"binary_logical_operator", {AND, IOR, XOR}},                                \
   {"commutative_float_operator", {PLUS, MULT}},                                \
   {"equality_comparison_operator", {EQ,NE}},                           \
   {"extend_reg_operand", {SUBREG, REG, TRUNCATE}},                     \
index 00a91df..95b1406 100644 (file)
        xor     %1, %2, %0
        xori    %1, %2, %0"
   [(set_attr "type" "arith_media")])
+
+;; Combiner bridge pattern for 2 * sign extend -> logical op -> truncate.
+;; converts 2 * sign extend -> logical op into logical op -> sign extend
+(define_split
+  [(set (match_operand:DI 0 "arith_reg_operand" "")
+       (sign_extend:DI (match_operator 4 "binary_logical_operator"
+                         [(match_operand 1 "any_register_operand" "")
+                          (match_operand 2 "any_register_operand" "")])))]
+  "TARGET_SHMEDIA"
+  [(set (match_dup 5) (match_dup 4))
+   (set (match_dup 0) (sign_extend:DI (match_dup 5)))]
+"
+{
+  enum machine_mode inmode = GET_MODE (operands[1]);
+  int regno, offset = 0;
+
+  if (GET_CODE (operands[0]) == SUBREG)
+    {
+      offset = SUBREG_BYTE (operands[0]);
+      operands[0] = SUBREG_REG (operands[0]);
+    }
+  if (GET_CODE (operands[0]) != REG)
+    abort ();
+  if (! TARGET_LITTLE_ENDIAN)
+    offset += 8 - GET_MODE_SIZE (inmode);
+  operands[5] = gen_rtx_SUBREG (inmode, operands[0], offset);
+}")
 \f
 ;; -------------------------------------------------------------------------
 ;; Shifts and rotates