Bug 80246 - Builtin's for POWER's dxex[q] and diex[q] use the wrong types
Summary: Builtin's for POWER's dxex[q] and diex[q] use the wrong types
Status: CLOSED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 7.0
: P3 normal
Target Milestone: ---
Assignee: Peter Bergner
URL: https://gcc.gnu.org/ml/gcc-patches/20...
Keywords:
Depends on:
Blocks:
 
Reported: 2017-03-29 02:07 UTC by Peter Bergner
Modified: 2017-04-03 18:07 UTC (History)
4 users (show)

See Also:
Host:
Target: powerpc
Build:
Known to work:
Known to fail: 5.0, 6.0
Last reconfirmed: 2017-03-29 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Peter Bergner 2017-03-29 02:07:23 UTC
The DFP builtins for extract exponent (dxex and dxexq) return a decimal float type when the actual value returned by the hardware instructions is a 64-bit signed binary integer (albeit in a FP register).  The return type of the builtins should match the type of the value returned and not register type it is returned in, since moving the return value when it's in a FP variable to an integer variable produces bad and/or incorrect code.

A similar issue affects the DFP insert exponent builtins (diex, diexq), but this time it is related to using the wrong type for the input argument that represents the exponent.
Comment 1 Peter Bergner 2017-03-29 02:15:25 UTC
bergner@pike:~/gcc/BUGS/LTC137326$ cat dxex.i 
long
dxex (_Decimal64 arg)
{
  return __builtin_dxex (arg);
}

bergner@pike:~/gcc/BUGS/LTC137326$ gcc -O2 -mcpu=power8 -S dxex.i
bergner@pike:~/gcc/BUGS/LTC137326$ cat dxex.s 
[snip]
dxex:
	dxex 1,1
	drintn. 0,1,1,1
	dctfix 1,1
	mfvsrd 3,1
	blr

Notice the incorrect FP -> integer cast that destroys the return value.
Expected code is:

dxex:
	dxex 0,1
	mfvsrd 3,0
	blr
Comment 2 Peter Bergner 2017-03-29 02:17:03 UTC
I'm testing a patch.
Comment 3 Peter Bergner 2017-03-30 19:57:52 UTC
Author: bergner
Date: Thu Mar 30 19:57:20 2017
New Revision: 246594

URL: https://gcc.gnu.org/viewcvs?rev=246594&root=gcc&view=rev
Log:
gcc/
	PR target/80246
	* config/rs6000/dfp.md (dfp_dxex_<mode>): Update mode of operand 0.
	(dfp_diex_<mode>): Update mode of operand 1.
	* doc/extend.texi (dxex, dxexq): Document change to return type.
	(diex, diexq): Document change to argument type.

gcc/testsuite/
	PR target/80246
	* gcc.target/powerpc/dfp-builtin-1.c: Remove unneeded dg-skip-if for
	Darwin and SPE.
	(dxex, dxexq): Update return type.
	(diex, diexq): Update argument type.
	* gcc.target/powerpc/pr80246.c: New test.

Added:
    trunk/gcc/testsuite/gcc.target/powerpc/pr80246.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/rs6000/dfp.md
    trunk/gcc/doc/extend.texi
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c
Comment 4 Peter Bergner 2017-03-30 20:06:38 UTC
Author: bergner
Date: Thu Mar 30 20:06:06 2017
New Revision: 246595

URL: https://gcc.gnu.org/viewcvs?rev=246595&root=gcc&view=rev
Log:
gcc/
	Backport from mainline
	2017-03-30  Peter Bergner  <bergner@vnet.ibm.com>

	PR target/80246
	* config/rs6000/dfp.md (dfp_dxex_<mode>): Update mode of operand 0.
	(dfp_diex_<mode>): Update mode of operand 1.
	* doc/extend.texi (dxex, dxexq): Document change to return type.
	(diex, diexq): Document change to argument type.

gcc/testsuite/
	Backport from mainline
	2017-03-30  Peter Bergner  <bergner@vnet.ibm.com>

	PR target/80246
	* gcc.target/powerpc/dfp-builtin-1.c: Remove unneeded dg-skip-if for
	Darwin and SPE.
	(dxex, dxexq): Update return type.
	(diex, diexq): Update argument type.
	* gcc.target/powerpc/pr80246.c: New test.

Added:
    branches/gcc-6-branch/gcc/testsuite/gcc.target/powerpc/pr80246.c
Modified:
    branches/gcc-6-branch/gcc/ChangeLog
    branches/gcc-6-branch/gcc/config/rs6000/dfp.md
    branches/gcc-6-branch/gcc/doc/extend.texi
    branches/gcc-6-branch/gcc/testsuite/ChangeLog
    branches/gcc-6-branch/gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c
Comment 5 Peter Bergner 2017-03-30 20:10:04 UTC
Author: bergner
Date: Thu Mar 30 20:09:32 2017
New Revision: 246596

URL: https://gcc.gnu.org/viewcvs?rev=246596&root=gcc&view=rev
Log:
gcc/
	Backport from mainline
	2017-03-30  Peter Bergner  <bergner@vnet.ibm.com>

	PR target/80246
	* config/rs6000/dfp.md (dfp_dxex_<mode>): Update mode of operand 0.
	(dfp_diex_<mode>): Update mode of operand 1.
	* doc/extend.texi (dxex, dxexq): Document change to return type.
	(diex, diexq): Document change to argument type.

gcc/testsuite/
	Backport from mainline
	2017-03-30  Peter Bergner  <bergner@vnet.ibm.com>

	PR target/80246
	* gcc.target/powerpc/dfp-builtin-1.c: Remove unneeded dg-skip-if for
	Darwin and SPE.
	(dxex, dxexq): Update return type.
	(diex, diexq): Update argument type.
	* gcc.target/powerpc/pr80246.c: New test.

Added:
    branches/gcc-5-branch/gcc/testsuite/gcc.target/powerpc/pr80246.c
Modified:
    branches/gcc-5-branch/gcc/ChangeLog
    branches/gcc-5-branch/gcc/config/rs6000/dfp.md
    branches/gcc-5-branch/gcc/doc/extend.texi
    branches/gcc-5-branch/gcc/testsuite/ChangeLog
    branches/gcc-5-branch/gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c
Comment 6 Peter Bergner 2017-03-30 20:14:49 UTC
Fixed on trunk and the GCC 5 and 6 release branches.
Comment 7 Peter Bergner 2017-03-30 20:15:18 UTC
Closing as fixed.
Comment 8 Peter Bergner 2017-04-03 16:15:33 UTC
Author: bergner
Date: Mon Apr  3 16:15:00 2017
New Revision: 246652

URL: https://gcc.gnu.org/viewcvs?rev=246652&root=gcc&view=rev
Log:
	PR target/80246
	* gcc.target/powerpc/pr80246.c: Require hard_dfp.

Modified:
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gcc.target/powerpc/pr80246.c
Comment 9 Peter Bergner 2017-04-03 17:11:29 UTC
Author: bergner
Date: Mon Apr  3 17:10:57 2017
New Revision: 246654

URL: https://gcc.gnu.org/viewcvs?rev=246654&root=gcc&view=rev
Log:
	PR target/80246
	* gcc.target/powerpc/dfp-builtin-1.c: Require hard_dfp, not
	powerpc_vsx_ok.
	(std, ld): Limit scan-assembler-times check to lp64.
	(stwu, stw, lwz): Add scan-assembler-times check for ilp32.
	* gcc.target/powerpc/dfp-builtin-2.c: Require hard_dfp, not
	powerpc_vsx_ok.

Modified:
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c
    trunk/gcc/testsuite/gcc.target/powerpc/dfp-builtin-2.c
Comment 10 Peter Bergner 2017-04-03 17:41:25 UTC
Author: bergner
Date: Mon Apr  3 17:40:53 2017
New Revision: 246659

URL: https://gcc.gnu.org/viewcvs?rev=246659&root=gcc&view=rev
Log:
	Backport from mainline
	2017-04-03  Peter Bergner  <bergner@vnet.ibm.com>

	PR target/80246
	* gcc.target/powerpc/dfp-builtin-1.c: Require hard_dfp, not
	powerpc_vsx_ok.
	(std, ld): Limit scan-assembler-times check to lp64.
	(stwu, stw, lwz): Add scan-assembler-times check for ilp32.
	* gcc.target/powerpc/dfp-builtin-2.c: Require hard_dfp, not
	powerpc_vsx_ok.

	PR target/80246
	* gcc.target/powerpc/pr80246.c: Require hard_dfp.

Modified:
    branches/gcc-6-branch/gcc/testsuite/ChangeLog
    branches/gcc-6-branch/gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c
    branches/gcc-6-branch/gcc/testsuite/gcc.target/powerpc/dfp-builtin-2.c
    branches/gcc-6-branch/gcc/testsuite/gcc.target/powerpc/pr80246.c
Comment 11 Peter Bergner 2017-04-03 18:07:25 UTC
Author: bergner
Date: Mon Apr  3 18:06:52 2017
New Revision: 246660

URL: https://gcc.gnu.org/viewcvs?rev=246660&root=gcc&view=rev
Log:
	Backport from mainline
	2017-04-03  Peter Bergner  <bergner@vnet.ibm.com>

	PR target/80246
	* gcc.target/powerpc/dfp-builtin-1.c: Require hard_dfp, not
	powerpc_vsx_ok.
	(std, ld): Limit scan-assembler-times check to lp64.
	(stwu, stw, lwz): Add scan-assembler-times check for ilp32.
	* gcc.target/powerpc/dfp-builtin-2.c: Require hard_dfp, not
	powerpc_vsx_ok.

	PR target/80246
	* gcc.target/powerpc/pr80246.c: Require hard_dfp.

Modified:
    branches/gcc-5-branch/gcc/testsuite/ChangeLog
    branches/gcc-5-branch/gcc/testsuite/gcc.target/powerpc/dfp-builtin-1.c
    branches/gcc-5-branch/gcc/testsuite/gcc.target/powerpc/dfp-builtin-2.c
    branches/gcc-5-branch/gcc/testsuite/gcc.target/powerpc/pr80246.c