* ifcvt.c (noce_try_sign_mask): Call emit_store_flag to generate
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 Jul 2004 14:57:34 +0000 (14:57 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 Jul 2004 14:57:34 +0000 (14:57 +0000)
a "sign mask" instead of using ashr_optab directly.

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

gcc/ChangeLog
gcc/ifcvt.c

index 5f635ca..5ab3fee 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 bd4c30c..0be6472 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;