aboutsummaryrefslogtreecommitdiff
path: root/gcc/optabs.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-06-27 19:16:01 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1994-06-27 19:16:01 -0400
commitcb5b00cfa15f4dc709984e3f39d708e5ce985139 (patch)
tree2342e7f9be4757deda2178dfd0a1b013d45ad6dd /gcc/optabs.c
parentdfaa6d72a3daba2accbbc2c47c7903dcbb49a96d (diff)
downloadgcc-cb5b00cfa15f4dc709984e3f39d708e5ce985139.zip
gcc-cb5b00cfa15f4dc709984e3f39d708e5ce985139.tar.gz
gcc-cb5b00cfa15f4dc709984e3f39d708e5ce985139.tar.bz2
(expand_binop, multi-words shifts and rotates): Fix errors in last
change. From-SVN: r7575
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r--gcc/optabs.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 011d3ff..7eaa809 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -644,20 +644,20 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
GEN_INT (shift_count - BITS_PER_WORD),
into_target, unsignedp, next_methods);
- if (inter != 0)
+ if (inter != 0 && inter != into_target)
emit_move_insn (into_target, inter);
/* For a signed right shift, we must fill the word we are shifting
out of with copies of the sign bit. Otherwise it is zeroed. */
- if (binoptab != ashr_optab)
- emit_move_insn (outof_target, CONST0_RTX (word_mode));
+ if (inter != 0 && binoptab != ashr_optab)
+ inter = CONST0_RTX (word_mode);
else if (inter != 0)
inter = expand_binop (word_mode, binoptab,
outof_input,
GEN_INT (BITS_PER_WORD - 1),
outof_target, unsignedp, next_methods);
- if (inter != 0)
+ if (inter != 0 && inter != outof_target)
emit_move_insn (outof_target, inter);
}
else
@@ -688,7 +688,7 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
inter = expand_binop (word_mode, binoptab, outof_input,
op1, outof_target, unsignedp, next_methods);
- if (inter != 0)
+ if (inter != 0 && inter != outof_target)
emit_move_insn (outof_target, inter);
if (inter != 0)
@@ -699,7 +699,7 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
inter = expand_binop (word_mode, ior_optab, carries, inter,
into_target, unsignedp, next_methods);
- if (inter != 0)
+ if (inter != 0 && inter != into_target)
emit_move_insn (into_target, inter);
}
@@ -798,7 +798,7 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
else
inter = 0;
- if (inter != 0)
+ if (inter != 0 && inter != into_target)
emit_move_insn (into_target, inter);
outof_temp1 = expand_binop (word_mode, unsigned_shift,
@@ -813,7 +813,7 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
outof_temp1, outof_temp2,
outof_target, unsignedp, next_methods);
- if (inter != 0)
+ if (inter != 0 && inter != outof_target)
emit_move_insn (outof_target, inter);
}