ifcvt.c (noce_try_sign_mask): Call emit_store_flag to generate a "sign mask" instead...
authorRoger Sayle <roger@eyesopen.com>
Sun, 4 Jul 2004 14:57:34 +0000 (14:57 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sun, 4 Jul 2004 14:57:34 +0000 (14:57 +0000)
* ifcvt.c (noce_try_sign_mask): Call emit_store_flag to generate
a "sign mask" instead of using ashr_optab directly.

From-SVN: r84081

gcc/ChangeLog
gcc/ifcvt.c

index 5f635ca21b918c6d0d13dac5bb93c2bbba728cba..5ab3fee2a138f4d124a7bf476e23dd777c3277e0 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-04  Roger Sayle  <roger@eyesopen.com>
+
+       * ifcvt.c (noce_try_sign_mask): Call emit_store_flag to generate
+       a "sign mask" instead of using ashr_optab directly.
+
 2004-07-04  Neil Booth  <neil@duron.akihabara.co.uk>
 
        * doc/cpp.texi: Don't document what we do for ill-formed expressions.
index bd4c30c00acbb624145bda8fb1757929e88e7a17..0be64727d350d58df41bcfaffcdd2d77ccdaf44e 100644 (file)
@@ -1735,8 +1735,10 @@ noce_try_sign_mask (struct noce_if_info *if_info)
     return FALSE;
 
   start_sequence ();
-  c = gen_int_mode (GET_MODE_BITSIZE (mode) - 1, mode);
-  m = expand_binop (mode, ashr_optab, m, c, NULL_RTX, 0, OPTAB_DIRECT);
+  /* Use emit_store_flag to generate "m < 0 ? -1 : 0" instead of expanding
+     "(signed) m >> 31" directly.  This benefits targets with specialized
+     insns to obtain the signmask, but still uses ashr_optab otherwise.  */
+  m = emit_store_flag (gen_reg_rtx (mode), LT, m, const0_rtx, mode, 0, -1);
   t = m ? expand_binop (mode, and_optab, m, t, NULL_RTX, 0, OPTAB_DIRECT)
        : NULL_RTX;