[BZ,#22142] powerpc: Fix the carry bit on mpn_[add|sub]_n on POWER7

Message ID 20170915134656.1277-1-tuliom@linux.vnet.ibm.com
State Committed
Delegated to: Adhemerval Zanella Netto
Headers

Commit Message

Tulio Magno Quites Machado Filho Sept. 15, 2017, 1:46 p.m. UTC
  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.
---
 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(-)
  

Comments

Adhemerval Zanella Sept. 15, 2017, 2:30 p.m. UTC | #1
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
>
  

Patch

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