summary refs log tree commit diff
diff options
context:
space:
mode:
authorCarlos O'Donell <carlos@systemhalted.org>2013-05-15 11:47:47 -0400
committerCarlos O'Donell <carlos@systemhalted.org>2013-05-15 12:05:10 -0400
commitb7f7d28b61a806f02e1f4cea81213027c088be8b (patch)
treea4d7b1c56605fd6ba907f9eb46d771ee82acbc36
parent7abeee129ef9872abd8e2fe0f94b1ad31f4ac591 (diff)
downloadglibc-b7f7d28b61a806f02e1f4cea81213027c088be8b.tar.gz
glibc-b7f7d28b61a806f02e1f4cea81213027c088be8b.tar.xz
glibc-b7f7d28b61a806f02e1f4cea81213027c088be8b.zip
hppa: Fix _FPU_GETCW and _FPU_SETCW.
The following patch fixes both _FPU_GETCW and
_FPU_SETCW for hppa. The initial implementation was
flawed and not well tested. We failed to set cw,
and passed in the value of a register to fldd.
This patch fixes both of those errors and allows
the libm tests to pass without failure.

Signed-off-by: Guy Martin <gmsoft@tuxicoman.be>
Signed-off-by: Carlos O'Donell <carlos@redhat.com>
---

2013-05-15  Guy Martin  <gmsoft@tuxicoman.be>
	    Carlos O'Donell  <carlos@redhat.com>

	[BZ# 15000]
	* ports/sysdeps/hppa/fpu/fpu_control.h (_FPU_GETCW): Set cw.
	(_FPU_SETCW): Pass address to fldd.
-rw-r--r--NEWS12
-rw-r--r--ports/ChangeLog.hppa7
-rw-r--r--ports/sysdeps/hppa/fpu/fpu_control.h4
3 files changed, 15 insertions, 8 deletions
diff --git a/NEWS b/NEWS
index 72c6a1c717..f7bff07963 100644
--- a/NEWS
+++ b/NEWS
@@ -12,12 +12,12 @@ Version 2.18
   2546, 2560, 5159, 6809, 10060, 10062, 10357, 11120, 11561, 12387, 12723,
   13550, 13889, 13951, 13988, 14142, 14176, 14200, 14280, 14293, 14317,
   14327, 14478, 14496, 14582, 14686, 14812, 14888, 14908, 14920, 14952,
-  14964, 14981, 14982, 14985, 14994, 14996, 15003, 15006, 15007, 15020,
-  15023, 15036, 15054, 15055, 15062, 15078, 15084, 15085, 15086, 15160,
-  15214, 15221, 15232, 15234, 15283, 15285, 15287, 15304, 15305, 15307,
-  15309, 15327, 15330, 15335, 15336, 15337, 15342, 15346, 15359, 15361,
-  15366, 15380, 15394, 15395, 15405, 15406, 15409, 15416, 15418, 15419,
-  15423, 15426, 15429, 15448.
+  14964, 14981, 14982, 14985, 14994, 14996, 15000, 15003, 15006, 15007,
+  15020, 15023, 15036, 15054, 15055, 15062, 15078, 15084, 15085, 15086,
+  15160, 15214, 15221, 15232, 15234, 15283, 15285, 15287, 15304, 15305,
+  15307, 15309, 15327, 15330, 15335, 15336, 15337, 15342, 15346, 15359,
+  15361, 15366, 15380, 15394, 15395, 15405, 15406, 15409, 15416, 15418,
+  15419, 15423, 15426, 15429, 15448.
 
 * CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
   #15078).
diff --git a/ports/ChangeLog.hppa b/ports/ChangeLog.hppa
index 6aa0e9188b..64bf7605f4 100644
--- a/ports/ChangeLog.hppa
+++ b/ports/ChangeLog.hppa
@@ -1,3 +1,10 @@
+2013-05-15  Guy Martin  <gmsoft@tuxicoman.be>
+	    Carlos O'Donell  <carlos@redhat.com>
+
+	[BZ# 15000]
+	* ports/sysdeps/hppa/fpu/fpu_control.h (_FPU_GETCW): Set cw.
+	(_FPU_SETCW): Pass address to fldd.
+
 2013-04-02  Thomas Schwinge  <thomas@codesourcery.com>
 
 	* sysdeps/hppa/math_private.h: New file.
diff --git a/ports/sysdeps/hppa/fpu/fpu_control.h b/ports/sysdeps/hppa/fpu/fpu_control.h
index 5cac3344d6..627cdd5b92 100644
--- a/ports/sysdeps/hppa/fpu/fpu_control.h
+++ b/ports/sysdeps/hppa/fpu/fpu_control.h
@@ -49,7 +49,7 @@ typedef unsigned int fpu_control_t;
   __asm__ ("fstd %%fr0,0(%1)\n\t"						\
            "fldd 0(%1),%%fr0\n\t"						\
 	   : "=m" (__fullfp.__fpreg) : "r" (&__fullfp.__fpreg) : "%r0");	\
-  __fullfp.__halfreg[0];							\
+  cw = __fullfp.__halfreg[0];							\
 })
 
 #define _FPU_SETCW(cw) \
@@ -57,7 +57,7 @@ typedef unsigned int fpu_control_t;
   union { __extension__ unsigned long long __fpreg; unsigned int __halfreg[2]; } __fullfp;	\
   __fullfp.__halfreg[0] = cw;							\
   __asm__ ("fldd 0(%1),%%fr0\n\t"						\
-	   : : "m" (__fullfp.__fpreg), "r" (__fullfp.__fpreg) : "%r0" );	\
+	   : : "m" (__fullfp.__fpreg), "r" (&__fullfp.__fpreg) : "%r0" );	\
 })
 
 /* Default control word set at startup.  */