aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-09-13 17:26:24 +0000
committerRichard Stallman <rms@gnu.org>1992-09-13 17:26:24 +0000
commit0bbb7f4d247de49a2a322c384acddd11337b2e71 (patch)
treeee3164c60acc9b22c7d1df2dbb15e6a220878a72 /gcc
parent304f705fef2dbd7ae4dec1b31f0543ec926acb94 (diff)
downloadgcc-0bbb7f4d247de49a2a322c384acddd11337b2e71.zip
gcc-0bbb7f4d247de49a2a322c384acddd11337b2e71.tar.gz
gcc-0bbb7f4d247de49a2a322c384acddd11337b2e71.tar.bz2
(expand_binop): Convert op1 of shift libcall to word_mode.
From-SVN: r2117
Diffstat (limited to 'gcc')
-rw-r--r--gcc/optabs.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 390cb72..5466892 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -1059,14 +1059,23 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
{
rtx insns;
rtx funexp = binoptab->handlers[(int) mode].libfunc;
+ rtx op1x = op1;
+ enum machine_mode op1_mode = mode;
start_sequence ();
+ if (shift_op)
+ {
+ op1_mode = word_mode;
+ /* Specify unsigned here,
+ since negative shift counts are meaningless. */
+ op1x = convert_to_mode (word_mode, op1, 1);
+ }
+
/* Pass 1 for NO_QUEUE so we don't lose any increments
if the libcall is cse'd or moved. */
emit_library_call (binoptab->handlers[(int) mode].libfunc,
- 1, mode, 2, op0, mode, op1,
- (shift_op ? word_mode : mode));
+ 1, mode, 2, op0, mode, op1x, op1_mode);
insns = get_insns ();
end_sequence ();