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.
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
I'm testing a patch.
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
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
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
Fixed on trunk and the GCC 5 and 6 release branches.
Closing as fixed.
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
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
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
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