diff options
| author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2004-03-16 20:42:02 +0000 |
|---|---|---|
| committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2004-03-16 20:42:02 +0000 |
| commit | 261e614637cb46e3af00ca395bf4afa42ddc859b (patch) | |
| tree | 6f573f40ecc689ac27427614841b8f02fedfd30e /lib/libc/alpha | |
| parent | eb34a15088c59bef89903607f473c1b6ddf66930 (diff) | |
Notes
Diffstat (limited to 'lib/libc/alpha')
| -rw-r--r-- | lib/libc/alpha/gen/flt_rounds.c | 11 | ||||
| -rw-r--r-- | lib/libc/alpha/gen/fpgetround.c | 11 | ||||
| -rw-r--r-- | lib/libc/alpha/gen/fpgetsticky.c | 11 | ||||
| -rw-r--r-- | lib/libc/alpha/gen/fpsetround.c | 13 | ||||
| -rw-r--r-- | lib/libc/alpha/gen/fpsetsticky.c | 16 |
5 files changed, 36 insertions, 26 deletions
diff --git a/lib/libc/alpha/gen/flt_rounds.c b/lib/libc/alpha/gen/flt_rounds.c index a5181e38f3c2..c3219d91bd33 100644 --- a/lib/libc/alpha/gen/flt_rounds.c +++ b/lib/libc/alpha/gen/flt_rounds.c @@ -47,13 +47,14 @@ static const int map[] = { int __flt_rounds() { - double fpcrval; - u_int64_t old; + union { + double fpcrval; + u_int64_t intval; + } u; __asm__("trapb"); - __asm__("mf_fpcr %0" : "=f" (fpcrval)); + __asm__("mf_fpcr %0" : "=f" (u.fpcrval)); __asm__("trapb"); - old = *(u_int64_t *)&fpcrval; - return map[(old >> 58) & 0x3]; + return map[(u.intval >> 58) & 0x3]; } diff --git a/lib/libc/alpha/gen/fpgetround.c b/lib/libc/alpha/gen/fpgetround.c index 70de6480c27c..1fd96b2ec53e 100644 --- a/lib/libc/alpha/gen/fpgetround.c +++ b/lib/libc/alpha/gen/fpgetround.c @@ -41,11 +41,12 @@ __FBSDID("$FreeBSD$"); fp_rnd_t fpgetround() { - double fpcrval; - u_int64_t old; + union { + double fpcrval; + u_int64_t intval; + } u; - GET_FPCR(fpcrval); - old = *(u_int64_t *)&fpcrval; + GET_FPCR(u.fpcrval); - return ((old & FPCR_DYN_MASK) >> FPCR_DYN_SHIFT); + return ((u.intval & FPCR_DYN_MASK) >> FPCR_DYN_SHIFT); } diff --git a/lib/libc/alpha/gen/fpgetsticky.c b/lib/libc/alpha/gen/fpgetsticky.c index 2cca07dcea86..7586eb40722f 100644 --- a/lib/libc/alpha/gen/fpgetsticky.c +++ b/lib/libc/alpha/gen/fpgetsticky.c @@ -41,11 +41,12 @@ __FBSDID("$FreeBSD$"); fp_except_t fpgetsticky() { - double fpcrval; - u_int64_t old; + union { + double fpcrval; + u_int64_t intval; + } u; - GET_FPCR(fpcrval); - old = *(u_int64_t *)&fpcrval; - return (((old >> IEEE_STATUS_TO_FPCR_SHIFT) & IEEE_STATUS_MASK) + GET_FPCR(u.fpcrval); + return (((u.intval >> IEEE_STATUS_TO_FPCR_SHIFT) & IEEE_STATUS_MASK) >> IEEE_STATUS_TO_EXCSUM_SHIFT); } diff --git a/lib/libc/alpha/gen/fpsetround.c b/lib/libc/alpha/gen/fpsetround.c index 627aca96fd6e..8e994c74d72a 100644 --- a/lib/libc/alpha/gen/fpsetround.c +++ b/lib/libc/alpha/gen/fpsetround.c @@ -42,17 +42,20 @@ fp_rnd_t fpsetround(rnd_dir) fp_rnd_t rnd_dir; { - double fpcrval; + union { + double fpcrval; + u_int64_t intval; + } u; u_int64_t old, new; - GET_FPCR(fpcrval); - old = *(u_int64_t *)&fpcrval; + GET_FPCR(u.fpcrval); + old = u.intval; new = old & (~FPCR_DYN_MASK); new |= ((long) rnd_dir << FPCR_DYN_SHIFT) & FPCR_DYN_MASK; - *(u_int64_t *)&fpcrval = new; - SET_FPCR(fpcrval); + u.intval = new; + SET_FPCR(u.fpcrval); return ((old & FPCR_DYN_MASK) >> FPCR_DYN_SHIFT); } diff --git a/lib/libc/alpha/gen/fpsetsticky.c b/lib/libc/alpha/gen/fpsetsticky.c index 02af77a7a3f6..698109f1b02e 100644 --- a/lib/libc/alpha/gen/fpsetsticky.c +++ b/lib/libc/alpha/gen/fpsetsticky.c @@ -42,16 +42,20 @@ fp_except_t fpsetsticky(sticky) fp_except_t sticky; { - double fpcrval; - u_int64_t old,new ; + union { + double fpcrval; + u_int64_t intval; + } u; + u_int64_t old, new; - GET_FPCR(fpcrval); - old = *(u_int64_t *)&fpcrval; + GET_FPCR(u.fpcrval); + + old = u.intval; new = old & ~ (IEEE_STATUS_MASK << IEEE_STATUS_TO_FPCR_SHIFT); new |= ((sticky << IEEE_STATUS_TO_EXCSUM_SHIFT) & IEEE_STATUS_MASK) << IEEE_STATUS_TO_FPCR_SHIFT; - *(u_int64_t *)&fpcrval = new; - SET_FPCR(fpcrval); + u.intval = new; + SET_FPCR(u.fpcrval); return (((old >> IEEE_STATUS_TO_FPCR_SHIFT) & IEEE_STATUS_MASK) >> IEEE_STATUS_TO_EXCSUM_SHIFT); |
