x86: Update piecewise move and store
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 2 Aug 2021 17:01:46 +0000 (10:01 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 2 Aug 2021 17:38:19 +0000 (10:38 -0700)
commit29f0e955c97da002b5adb4e8c9dfd2ea9709e207
tree739aa72e30ea996caad29089e8813e39bd0fabc1
parent7f4c3943f795fda33df648d2196b678bada1ba81
x86: Update piecewise move and store

We can use TImode/OImode/XImode integers for piecewise move and store.

1. Define MAX_MOVE_MAX to 64, which is the constant maximum number of
bytes that a single instruction can move quickly between memory and
registers or between two memory locations.
2. Define MOVE_MAX to the maximum number of bytes we can move from memory
to memory in one reasonably fast instruction.  The difference between
MAX_MOVE_MAX and MOVE_MAX is that MAX_MOVE_MAX must be a constant,
independent of compiler options, since it is used in reload.h to define
struct target_reload and MOVE_MAX can vary, depending on compiler options.
3. When vector register is used for piecewise move and store, we don't
increase stack_alignment_needed since vector register spill isn't
required for piecewise move and store.  Since stack_realign_needed is
set to true by checking stack_alignment_estimated set by pseudo vector
register usage, we also need to check stack_realign_needed to eliminate
frame pointer.

gcc/

* config/i386/i386.c (ix86_finalize_stack_frame_flags): Also
check stack_realign_needed for stack realignment.
(ix86_legitimate_constant_p): Always allow CONST_WIDE_INT smaller
than the largest integer supported by vector register.
* config/i386/i386.h (MAX_MOVE_MAX): New.  Set to 64.
(MOVE_MAX): Set to bytes of the largest integer supported by
vector register.
(STORE_MAX_PIECES): New.

gcc/testsuite/

* gcc.target/i386/pr90773-1.c: Adjust to expect movq for 32-bit.
* gcc.target/i386/pr90773-4.c: Also run for 32-bit.
* gcc.target/i386/pr90773-15.c: Likewise.
* gcc.target/i386/pr90773-16.c: Likewise.
* gcc.target/i386/pr90773-17.c: Likewise.
* gcc.target/i386/pr90773-24.c: Likewise.
* gcc.target/i386/pr90773-25.c: Likewise.
* gcc.target/i386/pr100865-1.c: Likewise.
* gcc.target/i386/pr100865-2.c: Likewise.
* gcc.target/i386/pr100865-3.c: Likewise.
* gcc.target/i386/pr90773-14.c: Also run for 32-bit and expect
XMM movd to store 4 bytes.
* gcc.target/i386/pr100865-4a.c: Also run for 32-bit and expect
YMM registers.
* gcc.target/i386/pr100865-4b.c: Likewise.
* gcc.target/i386/pr100865-10a.c: Expect YMM registers.
* gcc.target/i386/pr100865-10b.c: Likewise.
17 files changed:
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/testsuite/gcc.target/i386/pr100865-1.c
gcc/testsuite/gcc.target/i386/pr100865-10a.c
gcc/testsuite/gcc.target/i386/pr100865-10b.c
gcc/testsuite/gcc.target/i386/pr100865-2.c
gcc/testsuite/gcc.target/i386/pr100865-3.c
gcc/testsuite/gcc.target/i386/pr100865-4a.c
gcc/testsuite/gcc.target/i386/pr100865-4b.c
gcc/testsuite/gcc.target/i386/pr90773-1.c
gcc/testsuite/gcc.target/i386/pr90773-14.c
gcc/testsuite/gcc.target/i386/pr90773-15.c
gcc/testsuite/gcc.target/i386/pr90773-16.c
gcc/testsuite/gcc.target/i386/pr90773-17.c
gcc/testsuite/gcc.target/i386/pr90773-24.c
gcc/testsuite/gcc.target/i386/pr90773-25.c
gcc/testsuite/gcc.target/i386/pr90773-4.c