diff options
author | David Edelsohn <dje@gcc.gnu.org> | 1999-09-22 18:22:25 -0400 |
---|---|---|
committer | David Edelsohn <dje@gcc.gnu.org> | 1999-09-22 18:22:25 -0400 |
commit | c9b1b678c44b282d4e156ea6248202be3261d0ac (patch) | |
tree | b571a333054747bc0e6bb0c56a89930e8afd32f9 | |
parent | ce7e82539408e9e8b775fe02f5745d93fb83b7e8 (diff) | |
download | gcc-c9b1b678c44b282d4e156ea6248202be3261d0ac.zip gcc-c9b1b678c44b282d4e156ea6248202be3261d0ac.tar.gz gcc-c9b1b678c44b282d4e156ea6248202be3261d0ac.tar.bz2 |
rs6000.c (expand_block_move): DImode loads and stores require word-aligned displacements.
* rs6000.c (expand_block_move): DImode loads and stores require
word-aligned displacements. Increment address registers with
adddi3 on 64-bit platform. Use TARGET_POWERPC64 not TARGET_64BIT.
From-SVN: r29605
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 180 |
2 files changed, 133 insertions, 55 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5102300..1c26b3e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Wed Sep 22 17:55:31 1999 David Edelsohn <edelsohn@gnu.org> + + * rs6000.c (expand_block_move): DImode loads and stores require + word-aligned displacements. Increment address registers with + adddi3 on 64-bit platform. Use TARGET_POWERPC64 not TARGET_64BIT. + Wed Sep 22 07:07:44 1999 Alexandre Oliva <oliva@lsd.ic.unicamp.br> * config/i386/sol2.h (PREFERRED_DEBUGGING_TYPE): Use stabs. @@ -32,7 +38,7 @@ Tue Sep 7 01:27:21 1999 Jeffrey A Law (law@cygnus.com) Thu Aug 19 14:42:38 1999 Mike Stump <mrs@wrs.com> Mark Mitchell <mark@codesourcery.com> - * c-common.c (c_get_alias_set): Fix support for poitners and + * c-common.c (c_get_alias_set): Fix support for pointers and references. Fri Aug 27 01:03:48 1999 Jim Kingdon <http://developer.redhat.com> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 9f569b7..d4968e3 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -1904,7 +1904,7 @@ expand_block_move (operands) int move_bytes; /* If this is not a fixed size move, just call memcpy */ - if (!constp) + if (! constp) return 0; /* Anything to move? */ @@ -1919,7 +1919,7 @@ expand_block_move (operands) if (bytes > 4*8) return 0; } - else if (!STRICT_ALIGNMENT) + else if (! STRICT_ALIGNMENT) { if (bytes > 4*8) return 0; @@ -1936,89 +1936,134 @@ expand_block_move (operands) for ( ; bytes > 0; bytes -= move_bytes) { if (bytes > 24 /* move up to 32 bytes at a time */ - && !fixed_regs[5] - && !fixed_regs[6] - && !fixed_regs[7] - && !fixed_regs[8] - && !fixed_regs[9] - && !fixed_regs[10] - && !fixed_regs[11] - && !fixed_regs[12]) + && ! fixed_regs[5] + && ! fixed_regs[6] + && ! fixed_regs[7] + && ! fixed_regs[8] + && ! fixed_regs[9] + && ! fixed_regs[10] + && ! fixed_regs[11] + && ! fixed_regs[12]) { move_bytes = (bytes > 32) ? 32 : bytes; - emit_insn (gen_movstrsi_8reg (expand_block_move_mem (BLKmode, dest_reg, orig_dest), - expand_block_move_mem (BLKmode, src_reg, orig_src), - GEN_INT ((move_bytes == 32) ? 0 : move_bytes), + emit_insn (gen_movstrsi_8reg (expand_block_move_mem (BLKmode, + dest_reg, + orig_dest), + expand_block_move_mem (BLKmode, + src_reg, + orig_src), + GEN_INT ((move_bytes == 32) + ? 0 : move_bytes), align_rtx)); } else if (bytes > 16 /* move up to 24 bytes at a time */ - && !fixed_regs[7] - && !fixed_regs[8] - && !fixed_regs[9] - && !fixed_regs[10] - && !fixed_regs[11] - && !fixed_regs[12]) + && ! fixed_regs[7] + && ! fixed_regs[8] + && ! fixed_regs[9] + && ! fixed_regs[10] + && ! fixed_regs[11] + && ! fixed_regs[12]) { move_bytes = (bytes > 24) ? 24 : bytes; - emit_insn (gen_movstrsi_6reg (expand_block_move_mem (BLKmode, dest_reg, orig_dest), - expand_block_move_mem (BLKmode, src_reg, orig_src), + emit_insn (gen_movstrsi_6reg (expand_block_move_mem (BLKmode, + dest_reg, + orig_dest), + expand_block_move_mem (BLKmode, + src_reg, + orig_src), GEN_INT (move_bytes), align_rtx)); } else if (bytes > 8 /* move up to 16 bytes at a time */ - && !fixed_regs[9] - && !fixed_regs[10] - && !fixed_regs[11] - && !fixed_regs[12]) + && ! fixed_regs[9] + && ! fixed_regs[10] + && ! fixed_regs[11] + && ! fixed_regs[12]) { move_bytes = (bytes > 16) ? 16 : bytes; - emit_insn (gen_movstrsi_4reg (expand_block_move_mem (BLKmode, dest_reg, orig_dest), - expand_block_move_mem (BLKmode, src_reg, orig_src), + emit_insn (gen_movstrsi_4reg (expand_block_move_mem (BLKmode, + dest_reg, + orig_dest), + expand_block_move_mem (BLKmode, + src_reg, + orig_src), GEN_INT (move_bytes), align_rtx)); } - else if (bytes > 4 && !TARGET_64BIT) + else if (bytes > 4 && ! TARGET_POWERPC64) { /* move up to 8 bytes at a time */ move_bytes = (bytes > 8) ? 8 : bytes; - emit_insn (gen_movstrsi_2reg (expand_block_move_mem (BLKmode, dest_reg, orig_dest), - expand_block_move_mem (BLKmode, src_reg, orig_src), + emit_insn (gen_movstrsi_2reg (expand_block_move_mem (BLKmode, + dest_reg, + orig_dest), + expand_block_move_mem (BLKmode, + src_reg, + orig_src), GEN_INT (move_bytes), align_rtx)); } - else if (bytes >= 4 && (align >= 4 || !STRICT_ALIGNMENT)) + else if (bytes >= 4 && (align >= 4 || ! STRICT_ALIGNMENT)) { /* move 4 bytes */ move_bytes = 4; tmp_reg = gen_reg_rtx (SImode); - emit_move_insn (tmp_reg, expand_block_move_mem (SImode, src_reg, orig_src)); - emit_move_insn (expand_block_move_mem (SImode, dest_reg, orig_dest), tmp_reg); + emit_move_insn (tmp_reg, + expand_block_move_mem (SImode, + src_reg, orig_src)); + emit_move_insn (expand_block_move_mem (SImode, + dest_reg, orig_dest), + tmp_reg); } - else if (bytes == 2 && (align >= 2 || !STRICT_ALIGNMENT)) + else if (bytes == 2 && (align >= 2 || ! STRICT_ALIGNMENT)) { /* move 2 bytes */ move_bytes = 2; tmp_reg = gen_reg_rtx (HImode); - emit_move_insn (tmp_reg, expand_block_move_mem (HImode, src_reg, orig_src)); - emit_move_insn (expand_block_move_mem (HImode, dest_reg, orig_dest), tmp_reg); + emit_move_insn (tmp_reg, + expand_block_move_mem (HImode, + src_reg, orig_src)); + emit_move_insn (expand_block_move_mem (HImode, + dest_reg, orig_dest), + tmp_reg); } else if (bytes == 1) /* move 1 byte */ { move_bytes = 1; tmp_reg = gen_reg_rtx (QImode); - emit_move_insn (tmp_reg, expand_block_move_mem (QImode, src_reg, orig_src)); - emit_move_insn (expand_block_move_mem (QImode, dest_reg, orig_dest), tmp_reg); + emit_move_insn (tmp_reg, + expand_block_move_mem (QImode, + src_reg, orig_src)); + emit_move_insn (expand_block_move_mem (QImode, + dest_reg, orig_dest), + tmp_reg); } else { /* move up to 4 bytes at a time */ move_bytes = (bytes > 4) ? 4 : bytes; - emit_insn (gen_movstrsi_1reg (expand_block_move_mem (BLKmode, dest_reg, orig_dest), - expand_block_move_mem (BLKmode, src_reg, orig_src), + emit_insn (gen_movstrsi_1reg (expand_block_move_mem (BLKmode, + dest_reg, + orig_dest), + expand_block_move_mem (BLKmode, + src_reg, + orig_src), GEN_INT (move_bytes), align_rtx)); } if (bytes > move_bytes) { - emit_insn (gen_addsi3 (src_reg, src_reg, GEN_INT (move_bytes))); - emit_insn (gen_addsi3 (dest_reg, dest_reg, GEN_INT (move_bytes))); + if (! TARGET_POWERPC64) + { + emit_insn (gen_addsi3 (src_reg, src_reg, + GEN_INT (move_bytes))); + emit_insn (gen_addsi3 (dest_reg, dest_reg, + GEN_INT (move_bytes))); + } + else + { + emit_insn (gen_adddi3 (src_reg, src_reg, + GEN_INT (move_bytes))); + emit_insn (gen_adddi3 (dest_reg, dest_reg, + GEN_INT (move_bytes))); + } } } } @@ -2040,34 +2085,61 @@ expand_block_move (operands) dest_addr = gen_rtx_PLUS (Pmode, dest_reg, GEN_INT (offset)); } - /* Generate the appropriate load and store, saving the stores for later */ - if (bytes >= 8 && TARGET_64BIT && (align >= 8 || !STRICT_ALIGNMENT)) + /* Generate the appropriate load and store, saving the stores + for later. */ + if (bytes >= 8 && TARGET_POWERPC64 + /* 64-bit loads and stores require word-aligned displacements. */ + && (align >= 8 || (! STRICT_ALIGNMENT && align >= 4))) { move_bytes = 8; tmp_reg = gen_reg_rtx (DImode); - emit_insn (gen_movdi (tmp_reg, expand_block_move_mem (DImode, src_addr, orig_src))); - stores[ num_reg++ ] = gen_movdi (expand_block_move_mem (DImode, dest_addr, orig_dest), tmp_reg); + emit_insn (gen_movdi (tmp_reg, + expand_block_move_mem (DImode, + src_addr, + orig_src))); + stores[num_reg++] = gen_movdi (expand_block_move_mem (DImode, + dest_addr, + orig_dest), + tmp_reg); } - else if (bytes >= 4 && (align >= 4 || !STRICT_ALIGNMENT)) + else if (bytes >= 4 && (align >= 4 || ! STRICT_ALIGNMENT)) { move_bytes = 4; tmp_reg = gen_reg_rtx (SImode); - emit_insn (gen_movsi (tmp_reg, expand_block_move_mem (SImode, src_addr, orig_src))); - stores[ num_reg++ ] = gen_movsi (expand_block_move_mem (SImode, dest_addr, orig_dest), tmp_reg); + emit_insn (gen_movsi (tmp_reg, + expand_block_move_mem (SImode, + src_addr, + orig_src))); + stores[num_reg++] = gen_movsi (expand_block_move_mem (SImode, + dest_addr, + orig_dest), + tmp_reg); } - else if (bytes >= 2 && (align >= 2 || !STRICT_ALIGNMENT)) + else if (bytes >= 2 && (align >= 2 || ! STRICT_ALIGNMENT)) { move_bytes = 2; tmp_reg = gen_reg_rtx (HImode); - emit_insn (gen_movsi (tmp_reg, expand_block_move_mem (HImode, src_addr, orig_src))); - stores[ num_reg++ ] = gen_movhi (expand_block_move_mem (HImode, dest_addr, orig_dest), tmp_reg); + emit_insn (gen_movsi (tmp_reg, + expand_block_move_mem (HImode, + src_addr, + orig_src))); + stores[num_reg++] = gen_movhi (expand_block_move_mem (HImode, + dest_addr, + orig_dest), + tmp_reg); } else { move_bytes = 1; tmp_reg = gen_reg_rtx (QImode); - emit_insn (gen_movsi (tmp_reg, expand_block_move_mem (QImode, src_addr, orig_src))); - stores[ num_reg++ ] = gen_movqi (expand_block_move_mem (QImode, dest_addr, orig_dest), tmp_reg); + emit_insn (gen_movsi (tmp_reg, + expand_block_move_mem (QImode, + src_addr, + orig_src))); + stores[num_reg++] = gen_movqi (expand_block_move_mem (QImode, + dest_addr, + orig_dest), + tmp_reg); } if (num_reg >= MAX_MOVE_REG) |