This is the mail archive of the
libc-ports@sources.redhat.com
mailing list for the libc-ports project.
[COMMITTED] BZ#1500: hppa: Fix _FPU_GETCW and _FPU_SETCW.
- From: "Carlos O'Donell" <carlos at redhat dot com>
- To: "libc-ports at sourceware dot org" <libc-ports at sourceware dot org>, Guy Martin <gmsoft at tuxicoman dot be>
- Date: Wed, 15 May 2013 11:39:50 -0400
- Subject: [COMMITTED] BZ#1500: hppa: Fix _FPU_GETCW and _FPU_SETCW.
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.
diff --git a/ports/sysdeps/hppa/fpu/fpu_control.h b/ports/sysdeps/hppa/fpu/fpu_control.h
index 5cac334..627cdd5 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. */