expmed.c (expand_divmod): Don't widen for computing remainder if we seem to have...
authorTorbjorn Granlund <tege@matematik.su.se>
Mon, 5 Oct 1998 00:08:56 +0000 (02:08 +0200)
committerJeff Law <law@gcc.gnu.org>
Mon, 5 Oct 1998 00:08:56 +0000 (18:08 -0600)
        * expmed.c (expand_divmod): Don't widen for computing remainder
        if we seem to have a divmod pattern for needed mode.

From-SVN: r22828

gcc/ChangeLog
gcc/expmed.c

index 929c4b1..fa5a057 100644 (file)
@@ -1,3 +1,8 @@
+Mon Oct  5 01:07:23 1998  Torbjorn Granlund  <tege@matematik.su.se>
+
+       * expmed.c (expand_divmod): Don't widen for computing remainder
+       if we seem to have a divmod pattern for needed mode.
+
 Mon Oct  5 01:01:42 1998  Zack Weinberg  <zack@rabi.phys.columbia.edu>  
 
        * cpplib.c (macroexpand): Correct off-by-one error in handling
index 734365f..f9bd9ad 100644 (file)
@@ -3709,10 +3709,22 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp)
 
       if (rem_flag)
        {
-         /* Try to produce the remainder directly without a library call.  */
-         remainder = sign_expand_binop (compute_mode, umod_optab, smod_optab,
-                                        op0, op1, target,
-                                        unsignedp, OPTAB_WIDEN);
+         /* Try to produce the remainder without producing the quotient.
+            If we seem to have a divmod patten that does not require widening,
+            don't try windening here.  We should really have an WIDEN argument
+            to expand_twoval_binop, since what we'd really like to do here is
+            1) try a mod insn in compute_mode
+            2) try a divmod insn in compute_mode
+            3) try a div insn in compute_mode and multiply-subtract to get
+               remainder
+            4) try the same things with widening allowed.  */
+         remainder
+           = sign_expand_binop (compute_mode, umod_optab, smod_optab,
+                                op0, op1, target,
+                                unsignedp,
+                                ((optab2->handlers[(int) compute_mode].insn_code
+                                  != CODE_FOR_nothing)
+                                 ? OPTAB_DIRECT : OPTAB_WIDEN));
          if (remainder == 0)
            {
              /* No luck there.  Can we do remainder and divide at once