aboutsummaryrefslogtreecommitdiff
path: root/gcc/optabs.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r--gcc/optabs.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c
index cc742a4..801b945 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -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);