[NDS32] Fix bug in bit-instruction checking functions.
authorChung-Ju Wu <jasonwucj@gmail.com>
Wed, 25 Apr 2018 12:32:19 +0000 (12:32 +0000)
committerChung-Ju Wu <jasonwucj@gcc.gnu.org>
Wed, 25 Apr 2018 12:32:19 +0000 (12:32 +0000)
gcc/
* config/nds32/nds32-predicates.c (nds32_can_use_bclr_p): Mask with
GET_MODE_MASK before any checking.
(nds32_can_use_bset_p): Likewise.
(nds32_can_use_btgl_p): Likewise.

From-SVN: r259647

gcc/ChangeLog
gcc/config/nds32/nds32-predicates.c

index a0adc88433e14647c4d31fb385348f1cf0730794..6ea0aaa7eeaa1ef4dd02a3d72f418653c62d9234 100644 (file)
@@ -1,3 +1,10 @@
+2018-04-25  Chung-Ju Wu  <jasonwucj@gmail.com>
+
+       * config/nds32/nds32-predicates.c (nds32_can_use_bclr_p): Mask with
+       GET_MODE_MASK before any checking.
+       (nds32_can_use_bset_p): Likewise.
+       (nds32_can_use_btgl_p): Likewise.
+
 2018-04-25  Chung-Ju Wu  <jasonwucj@gmail.com>
 
        * config/nds32/nds32-doubleword.md: New define_split pattern for
index 5e01430c8e31d4775f8ee20e39ddc962e62bc29f..a670623bf9a12daaaaa379d8ade6c02e061dc1c8 100644 (file)
@@ -360,12 +360,13 @@ int
 nds32_can_use_bclr_p (int ival)
 {
   int one_bit_count;
+  unsigned HOST_WIDE_INT mask = GET_MODE_MASK (SImode);
 
   /* Calculate the number of 1-bit of (~ival), if there is only one 1-bit,
      it means the original ival has only one 0-bit,
      So it is ok to perform 'bclr' operation.  */
 
-  one_bit_count = popcount_hwi ((unsigned HOST_WIDE_INT) (~ival));
+  one_bit_count = popcount_hwi ((unsigned HOST_WIDE_INT) (~ival) & mask);
 
   /* 'bclr' is a performance extension instruction.  */
   return (TARGET_EXT_PERF && (one_bit_count == 1));
@@ -376,11 +377,12 @@ int
 nds32_can_use_bset_p (int ival)
 {
   int one_bit_count;
+  unsigned HOST_WIDE_INT mask = GET_MODE_MASK (SImode);
 
   /* Caculate the number of 1-bit of ival, if there is only one 1-bit,
      it is ok to perform 'bset' operation.  */
 
-  one_bit_count = popcount_hwi ((unsigned HOST_WIDE_INT) (ival));
+  one_bit_count = popcount_hwi ((unsigned HOST_WIDE_INT) (ival) & mask);
 
   /* 'bset' is a performance extension instruction.  */
   return (TARGET_EXT_PERF && (one_bit_count == 1));
@@ -391,11 +393,12 @@ int
 nds32_can_use_btgl_p (int ival)
 {
   int one_bit_count;
+  unsigned HOST_WIDE_INT mask = GET_MODE_MASK (SImode);
 
   /* Caculate the number of 1-bit of ival, if there is only one 1-bit,
      it is ok to perform 'btgl' operation.  */
 
-  one_bit_count = popcount_hwi ((unsigned HOST_WIDE_INT) (ival));
+  one_bit_count = popcount_hwi ((unsigned HOST_WIDE_INT) (ival) & mask);
 
   /* 'btgl' is a performance extension instruction.  */
   return (TARGET_EXT_PERF && (one_bit_count == 1));