aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386/i386.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/i386/i386.c')
-rw-r--r--gcc/config/i386/i386.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 1a4d568..4629053 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -23397,16 +23397,24 @@ expand_small_movmem_or_setmem (rtx destmem, rtx srcmem,
}
destmem = offset_address (destmem, count, 1);
- destmem = offset_address (destmem, GEN_INT (-size - GET_MODE_SIZE (mode)),
+ destmem = offset_address (destmem, GEN_INT (-2 * size),
GET_MODE_SIZE (mode));
- if (issetmem)
- emit_move_insn (destmem, gen_lowpart (mode, value));
- else
+ if (!issetmem)
{
srcmem = offset_address (srcmem, count, 1);
- srcmem = offset_address (srcmem, GEN_INT (-size - GET_MODE_SIZE (mode)),
+ srcmem = offset_address (srcmem, GEN_INT (-2 * size),
GET_MODE_SIZE (mode));
- emit_move_insn (destmem, srcmem);
+ }
+ for (n = 0; n * GET_MODE_SIZE (mode) < size; n++)
+ {
+ if (issetmem)
+ emit_move_insn (destmem, gen_lowpart (mode, value));
+ else
+ {
+ emit_move_insn (destmem, srcmem);
+ srcmem = offset_address (srcmem, modesize, GET_MODE_SIZE (mode));
+ }
+ destmem = offset_address (destmem, modesize, GET_MODE_SIZE (mode));
}
emit_jump_insn (gen_jump (done_label));
emit_barrier ();