]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
(expand_binop): Must always widen second operand of shift.
authorRichard Kenner <kenner@gcc.gnu.org>
Tue, 7 Sep 1993 18:54:27 +0000 (14:54 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Tue, 7 Sep 1993 18:54:27 +0000 (14:54 -0400)
From-SVN: r5276

gcc/optabs.c

index cc742a405182afe1424517dc91a526bbe953a789..801b9456aee283e183e5d7844f152f970b337fcb 100644 (file)
@@ -526,7 +526,12 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
              no_extend = 1;
 
            xop0 = widen_operand (xop0, wider_mode, unsignedp, no_extend);
-           xop1 = widen_operand (xop1, wider_mode, unsignedp, no_extend);
+
+           /* The second operand of a shift must always be extended.  */
+           xop1 = widen_operand (xop1, wider_mode, unsignedp,
+                                 no_extend && binoptab != ashl_optab
+                                 && binoptab != lshl_optab);
+
            temp = expand_binop (wider_mode, binoptab, xop0, xop1, NULL_RTX,
                                 unsignedp, OPTAB_DIRECT);
            if (temp)
@@ -1419,7 +1424,11 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
                no_extend = 1;
 
              xop0 = widen_operand (xop0, wider_mode, unsignedp, no_extend);
-             xop1 = widen_operand (xop1, wider_mode, unsignedp, no_extend);
+
+             /* The second operand of a shift must always be extended.  */
+             xop1 = widen_operand (xop1, wider_mode, unsignedp,
+                                   no_extend && binoptab != ashl_optab
+                                   && binoptab != lshl_optab);
 
              temp = expand_binop (wider_mode, binoptab, xop0, xop1, NULL_RTX,
                                   unsignedp, methods);