h8300.c (single_one_operand): Correctly compute mask when mode is SImode.
authorKazu Hirata <kazu@cs.umass.edu>
Tue, 12 Nov 2002 14:01:33 +0000 (14:01 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Tue, 12 Nov 2002 14:01:33 +0000 (14:01 +0000)
* config/h8300/h8300.c (single_one_operand): Correctly compute
mask when mode is SImode.
(single_zero_operand): Likewise.
* config/h8300/h8300.md (two new anonymous insns): New.

From-SVN: r59050

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

index 400f34f9dc1eaaa1b7a6f55c50ee8ef1abb5e78b..f39d76b80fed089c08b5b3c418b1b6467b5c000b 100644 (file)
@@ -1,3 +1,10 @@
+2002-11-12  Kazu Hirata  <kazu@cs.umass.edu>
+
+       * config/h8300/h8300.c (single_one_operand): Correctly compute
+       mask when mode is SImode.
+       (single_zero_operand): Likewise.
+       * config/h8300/h8300.md (two new anonymous insns): New.
+
 2002-11-12  Gerald Pfeifer  <pfeifer@dbai.tuwien.ac.at>
 
        * doc/contrib.texi (Contributors): Use GCJ instead of gcj to refer
index 43a0c88ca30d49f0e8c4be6c0f7c3d0133e8836d..56a06a099cbc37ec6fa750c72454428223df5a02 100644 (file)
@@ -763,7 +763,9 @@ single_one_operand (operand, mode)
       /* We really need to do this masking because 0x80 in QImode is
         represented as -128 for example.  */
       unsigned HOST_WIDE_INT mask =
-       ((unsigned HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (mode)) - 1;
+       (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_WIDE_INT)
+       ? ((unsigned HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (mode)) - 1
+       : ~0;
       unsigned HOST_WIDE_INT value = INTVAL (operand);
 
       if (exact_log2 (value & mask) >= 0)
@@ -786,7 +788,9 @@ single_zero_operand (operand, mode)
       /* We really need to do this masking because 0x80 in QImode is
         represented as -128 for example.  */
       unsigned HOST_WIDE_INT mask =
-       ((unsigned HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (mode)) - 1;
+       (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_WIDE_INT)
+       ? ((unsigned HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (mode)) - 1
+       : ~0;
       unsigned HOST_WIDE_INT value = INTVAL (operand);
 
       if (exact_log2 (~value & mask) >= 0)
index f0b906810afad2a489df031e3e1d258f85511bf2..129ff630e3a6e399612ce60bdd634bf5728fe748 100644 (file)
   [(set_attr "length" "2")
    (set_attr "cc" "set_zn")])
 
+(define_insn ""
+  [(set (cc0)
+       (and:HI (match_operand:HI 0 "register_operand" "r")
+               (match_operand:HI 1 "single_one_operand" "n")))]
+  ""
+  "*
+{
+  operands[1] = GEN_INT (INTVAL (operands[1]) & 0xffff);
+  if (INTVAL (operands[1]) > 128)
+    {
+      operands[1] = GEN_INT (INTVAL (operands[1]) >> 8);
+      return \"btst\\t%V1,%t0\";
+    }
+  return \"btst\\t%V1,%s0\";
+}"
+  [(set_attr "length" "2")
+   (set_attr "cc" "set_zn")])
+
+(define_insn ""
+  [(set (cc0)
+       (and:SI (match_operand:SI 0 "register_operand" "r")
+               (match_operand:SI 1 "single_one_operand" "n")))]
+  "(TARGET_H8300H || TARGET_H8300S)
+   && (INTVAL (operands[1]) & 0xffff) != 0"
+  "*
+{
+  operands[1] = GEN_INT (INTVAL (operands[1]) & 0xffff);
+  if (INTVAL (operands[1]) > 128)
+    {
+      operands[1] = GEN_INT (INTVAL (operands[1]) >> 8);
+      return \"btst\\t%V1,%x0\";
+    }
+  return \"btst\\t%V1,%w0\";
+}"
+  [(set_attr "length" "2")
+   (set_attr "cc" "set_zn")])
+
 (define_insn "tstqi"
   [(set (cc0) (match_operand:QI 0 "register_operand" "r"))]
   ""