This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] [BZ #22142] powerpc: Fix the carry bit on mpn_[add|sub]_n on POWER7
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: libc-alpha at sourceware dot org
- Date: Fri, 15 Sep 2017 11:30:20 -0300
- Subject: Re: [PATCH] [BZ #22142] powerpc: Fix the carry bit on mpn_[add|sub]_n on POWER7
- Authentication-results: sourceware.org; auth=none
- References: <20170915134656.1277-1-tuliom@linux.vnet.ibm.com>
On 15/09/2017 10:46, Tulio Magno Quites Machado Filho wrote:
> Fix the ifdef clause that was being used in the opposite way, setting
> a wrong value of the carry bit.
>
> This is also correcting 2 memory accesses that were mistakenly referring
> to r0 while they were supposed to mean the immediate value 0.
>
> 2017-09-15 Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
>
> [BZ #22142]
> * stdio-common/tst-printf.c (fp_test): Add tests for DBL_MAX and
> -DBL_MAX.
> (do_test): Likewise.
> * stdio-common/tst-printf.sh: Likewise.
> * sysdeps/powerpc/powerpc64/power7/add_n.S: Invert the initial
> ifdef clause in order to set the carry bit right. Replace r0 by
> 0 without changing the behavior.
LGTM, this is sync with GMP code mpn/powerpc64/mode64/p7/aors_n.asm.
> ---
> stdio-common/tst-printf.c | 4 ++++
> stdio-common/tst-printf.sh | 8 ++++++++
> sysdeps/powerpc/powerpc64/power7/add_n.S | 8 ++++----
> 3 files changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/stdio-common/tst-printf.c b/stdio-common/tst-printf.c
> index b6d62a5..162effa 100644
> --- a/stdio-common/tst-printf.c
> +++ b/stdio-common/tst-printf.c
> @@ -136,6 +136,8 @@ fp_test (void)
> }
> printf("%10s\n", (char *) NULL);
> printf("%-10s\n", (char *) NULL);
> + printf("%.8f\n", DBL_MAX);
> + printf("%.8f\n", -DBL_MAX);
> }
>
> static int
> @@ -181,6 +183,8 @@ I am ready for my first lesson today.";
> printf("null string:\t\"%s\"\n", (char *)NULL);
> printf("limited string:\t\"%.22s\"\n", longstr);
>
> + printf("a-style max:\t\"%a\"\n", DBL_MAX);
> + printf("a-style -max:\t\"%a\"\n", -DBL_MAX);
> printf("e-style >= 1:\t\"%e\"\n", 12.34);
> printf("e-style >= .1:\t\"%e\"\n", 0.1234);
> printf("e-style < .1:\t\"%e\"\n", 0.001234);
> diff --git a/stdio-common/tst-printf.sh b/stdio-common/tst-printf.sh
> index c413980..48cb62c 100644
> --- a/stdio-common/tst-printf.sh
> +++ b/stdio-common/tst-printf.sh
> @@ -57,6 +57,8 @@ space-padded string: " Hi, Z."
> left-adjusted S string: "Hi, Z. "
> null string: "(null)"
> limited string: "Good morning, Doctor C"
> +a-style max: "0x1.fffffffffffffp+1023"
> +a-style -max: "-0x1.fffffffffffffp+1023"
> e-style >= 1: "1.234000e+01"
> e-style >= .1: "1.234000e-01"
> e-style < .1: "1.234000e-03"
> @@ -124,6 +126,8 @@ prefix 6d 6o 6x 6X 6u
> % | -123 | 377 | ff | FF |4294967295 |
> (null)
> (null)
> +179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.00000000
> +-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.00000000
> 1.234568e+06 should be 1.234568e+06
> 1234567.800000 should be 1234567.800000
> 1.23457e+06 should be 1.23457e+06
> @@ -173,6 +177,8 @@ space-padded string: " Hi, Z."
> left-adjusted S string: "Hi, Z. "
> null string: "(null)"
> limited string: "Good morning, Doctor C"
> +a-style max: "0x1.fffffffffffffp+1023"
> +a-style -max: "-0x1.fffffffffffffp+1023"
> e-style >= 1: "1.234000e+01"
> e-style >= .1: "1.234000e-01"
> e-style < .1: "1.234000e-03"
> @@ -240,6 +246,8 @@ prefix 6d 6o 6x 6X 6u
> % | -123 | 377 | ff | FF |4294967295 |
> (null)
> (null)
> +179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.00000000
> +-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.00000000
> 1.234568e+06 should be 1.234568e+06
> 1234567.800000 should be 1234567.800000
> 1.23457e+06 should be 1.23457e+06
> diff --git a/sysdeps/powerpc/powerpc64/power7/add_n.S b/sysdeps/powerpc/powerpc64/power7/add_n.S
> index 02335c1..88aec84 100644
> --- a/sysdeps/powerpc/powerpc64/power7/add_n.S
> +++ b/sysdeps/powerpc/powerpc64/power7/add_n.S
> @@ -38,17 +38,17 @@
>
> ENTRY_TOCLESS (FUNC, 5)
> #ifdef USE_AS_SUB
> - addic r0, r0, 0
> + addic r0, r1, -1
> #else
> - addic r0, r1, -1
> + addic r0, r0, 0
> #endif
> andi. r7, N, 1
> beq L(bx0)
>
> ld r7, 0(UP)
> - ld r9, r0(VP)
> + ld r9, 0(VP)
> ADDSUBC r11, r9, r7
> - std r11, r0(RP)
> + std r11, 0(RP)
> cmpldi N, N, 1
> beq N, L(end)
> addi UP, UP, 8
>