Roger Sayle c9c466ea33 x86_64: Improve code expanded for highpart multiplications.
While working on a middle-end patch to more aggressively use highpart
multiplications on targets that support them, I noticed that the RTL
expanded by the x86 backend interacts poorly with register allocation
leading to suboptimal code.

For the testcase,
typedef int __attribute ((mode(TI))) ti_t;
long foo(long x)
{
  return ((ti_t)x * 19065) >> 64;
}

we'd like to avoid:
foo:	movq    %rdi, %rax
        movl    $19065, %edx
        imulq   %rdx
        movq    %rdx, %rax
        ret

and would prefer:
foo:	movl    $19065, %eax
        imulq   %rdi
        movq    %rdx, %rax
        ret

This patch provides a pair of peephole2 transformations to tweak the
spills generated by reload, and at the same time replaces the current
define_expand with a define_insn pattern using the new [su]mul_highpart
RTX codes.

2021-12-20  Roger Sayle  <roger@nextmovesoftware.com>
	    Uroš Bizjak  <ubizjak@gmail.com>

gcc/ChangeLog
	* config/i386/i386.md (any_mul_highpart): New code iterator.
	(sgnprefix, s): Add attribute support for [su]mul_highpart.
	(<s>mul<mode>3_highpart): Delete expander.
	(<s>mul<mode>3_highpart, <s>mulsi32_highpart_zext):
	New define_insn patterns.
	(define_peephole2): Tweak the register allocation for the above
	instructions after reload.

gcc/testsuite/ChangeLog
	* gcc.target/i386/smuldi3_highpart.c: New test case.
2021-12-20 15:22:18 +00:00
2021-10-27 00:16:33 +00:00
2021-12-17 00:16:20 +00:00
2021-12-17 00:16:20 +00:00
2021-11-24 00:16:29 +00:00
2021-10-23 00:16:26 +00:00
2021-09-22 00:16:28 +00:00
2021-12-13 00:16:28 +00:00
2021-11-30 00:16:44 +00:00
2021-10-23 00:16:26 +00:00
2021-07-22 00:16:46 +00:00
2021-11-13 00:16:39 +00:00
2021-12-17 00:16:20 +00:00
2021-11-02 00:16:32 +00:00
2021-12-05 00:16:28 +00:00
2021-10-23 00:16:26 +00:00
2021-11-16 00:16:31 +00:00
2021-12-18 00:16:23 +00:00
2021-12-20 00:16:21 +00:00
2021-12-14 00:16:25 +00:00
2021-12-17 00:16:20 +00:00
2021-11-27 00:16:19 +00:00
2021-10-20 00:16:43 +00:00
2021-12-16 00:16:28 +00:00
2021-06-09 00:16:30 +00:00
2021-12-07 00:16:23 +00:00
2021-12-16 00:16:28 +00:00
2021-12-03 00:17:04 +00:00
2021-05-15 00:16:27 +00:00
2021-12-17 00:16:20 +00:00
2021-06-24 16:51:40 +05:30
2021-12-18 00:16:23 +00:00
2021-12-17 10:54:16 +01:00

This directory contains the GNU Compiler Collection (GCC).

The GNU Compiler Collection is free software.  See the files whose
names start with COPYING for copying permission.  The manuals, and
some of the runtime libraries, are under different terms; see the
individual source files for details.

The directory INSTALL contains copies of the installation information
as HTML and plain text.  The source of this information is
gcc/doc/install.texi.  The installation information includes details
of what is included in the GCC sources and what files GCC installs.

See the file gcc/doc/gcc.texi (together with other files that it
includes) for usage and porting information.  An online readable
version of the manual is in the files gcc/doc/gcc.info*.

See http://gcc.gnu.org/bugs/ for how to report bugs usefully.

Copyright years on GCC source files may be listed using range
notation, e.g., 1987-2012, indicating that every year in the range,
inclusive, is a copyrightable year that could otherwise be listed
individually.
S
Description
Yggdrasil port of the GNU Compiler Collection
Readme 978 MiB
Languages
C++ 33%
C 27.4%
Ada 13%
Go 7.1%
D 7%
Other 12.1%