From 36e22bed27863665234a9409ffc9dc50b79bf1a7 Mon Sep 17 00:00:00 2001 From: David Schultz Date: Mon, 16 Feb 2004 10:02:40 +0000 Subject: [PATCH] Fix some aliasing problems. --- lib/libc/alpha/gen/isinf.c | 20 ++++++++++++++------ lib/libc/amd64/gen/isinf.c | 33 +++++++++++++++++++-------------- lib/libc/i386/gen/isinf.c | 33 +++++++++++++++++++-------------- lib/libc/ia64/gen/isinf.c | 20 ++++++++++++++------ lib/libc/powerpc/gen/isinf.c | 20 ++++++++++++++------ lib/libc/sparc64/gen/isinf.c | 20 ++++++++++++++------ 6 files changed, 94 insertions(+), 52 deletions(-) diff --git a/lib/libc/alpha/gen/isinf.c b/lib/libc/alpha/gen/isinf.c index 0017ea58f56..df6ac963b56 100644 --- a/lib/libc/alpha/gen/isinf.c +++ b/lib/libc/alpha/gen/isinf.c @@ -43,18 +43,26 @@ int isnan(d) double d; { - struct ieee_double *p = (struct ieee_double *)&d; + union { + double v; + struct ieee_double s; + } u; - return (p->dbl_exp == DBL_EXP_INFNAN && - (p->dbl_frach || p->dbl_fracl)); + u.v = d; + return (u.s.dbl_exp == DBL_EXP_INFNAN && + (u.s.dbl_frach || u.s.dbl_fracl)); } int isinf(d) double d; { - struct ieee_double *p = (struct ieee_double *)&d; + union { + double v; + struct ieee_double s; + } u; - return (p->dbl_exp == DBL_EXP_INFNAN && - !p->dbl_frach && !p->dbl_fracl); + u.v = d; + return (u.s.dbl_exp == DBL_EXP_INFNAN && + !u.s.dbl_frach && !u.s.dbl_fracl); } diff --git a/lib/libc/amd64/gen/isinf.c b/lib/libc/amd64/gen/isinf.c index d894b4f7fa7..a5e9dec4b54 100644 --- a/lib/libc/amd64/gen/isinf.c +++ b/lib/libc/amd64/gen/isinf.c @@ -41,30 +41,35 @@ __FBSDID("$FreeBSD$"); #include +struct IEEEdp { + u_int manl : 32; + u_int manh : 20; + u_int exp : 11; + u_int sign : 1; +}; + int isnan(d) double d; { - register struct IEEEdp { - u_int manl : 32; - u_int manh : 20; - u_int exp : 11; - u_int sign : 1; - } *p = (struct IEEEdp *)&d; + union { + double v; + struct IEEEdp s; + } u; - return(p->exp == 2047 && (p->manh || p->manl)); + u.v = d; + return(u.s.exp == 2047 && (u.s.manh || u.s.manl)); } int isinf(d) double d; { - register struct IEEEdp { - u_int manl : 32; - u_int manh : 20; - u_int exp : 11; - u_int sign : 1; - } *p = (struct IEEEdp *)&d; + union { + double v; + struct IEEEdp s; + } u; - return(p->exp == 2047 && !p->manh && !p->manl); + u.v = d; + return(u.s.exp == 2047 && !u.s.manh && !u.s.manl); } diff --git a/lib/libc/i386/gen/isinf.c b/lib/libc/i386/gen/isinf.c index d894b4f7fa7..0d9cd8653ee 100644 --- a/lib/libc/i386/gen/isinf.c +++ b/lib/libc/i386/gen/isinf.c @@ -41,30 +41,35 @@ __FBSDID("$FreeBSD$"); #include +struct IEEEdp { + u_int manl : 32; + u_int manh : 20; + u_int exp : 11; + u_int sign : 1; +}; + int isnan(d) double d; { - register struct IEEEdp { - u_int manl : 32; - u_int manh : 20; - u_int exp : 11; - u_int sign : 1; - } *p = (struct IEEEdp *)&d; + union { + double v; + struct IEEEdp s; + } u; - return(p->exp == 2047 && (p->manh || p->manl)); + u.v = d; + return (u.s.exp == 2047 && (u.s.manh || u.s.manl)); } int isinf(d) double d; { - register struct IEEEdp { - u_int manl : 32; - u_int manh : 20; - u_int exp : 11; - u_int sign : 1; - } *p = (struct IEEEdp *)&d; + union { + double v; + struct IEEEdp s; + } u; - return(p->exp == 2047 && !p->manh && !p->manl); + u.v = d; + return (u.s.exp == 2047 && !u.s.manh && !u.s.manl); } diff --git a/lib/libc/ia64/gen/isinf.c b/lib/libc/ia64/gen/isinf.c index f47ef619939..8f346f36ff2 100644 --- a/lib/libc/ia64/gen/isinf.c +++ b/lib/libc/ia64/gen/isinf.c @@ -43,18 +43,26 @@ int isnan(d) double d; { - struct ieee_double *p = (struct ieee_double *)&d; + union { + double v; + struct ieee_double s; + } u; - return (p->dbl_exp == DBL_EXP_INFNAN && - (p->dbl_frach || p->dbl_fracl)); + u.v = d; + return (u.s.dbl_exp == DBL_EXP_INFNAN && + (u.s.dbl_frach || u.s.dbl_fracl)); } int isinf(d) double d; { - struct ieee_double *p = (struct ieee_double *)&d; + union { + double v; + struct ieee_double s; + } u; - return (p->dbl_exp == DBL_EXP_INFNAN && - !p->dbl_frach && !p->dbl_fracl); + u.v = d; + return (u.s.dbl_exp == DBL_EXP_INFNAN && + !u.s.dbl_frach && !u.s.dbl_fracl); } diff --git a/lib/libc/powerpc/gen/isinf.c b/lib/libc/powerpc/gen/isinf.c index fb6d73b9816..0b9ef6cbaee 100644 --- a/lib/libc/powerpc/gen/isinf.c +++ b/lib/libc/powerpc/gen/isinf.c @@ -43,17 +43,25 @@ __FBSDID("$FreeBSD$"); int isnan(double d) { - struct ieee_double *p = (struct ieee_double *)&d; + union { + double v; + struct ieee_double s; + } u; - return (p->dbl_exp == DBL_EXP_INFNAN && - (p->dbl_frach || p->dbl_fracl)); + u.v = d; + return (u.s.dbl_exp == DBL_EXP_INFNAN && + (u.s.dbl_frach || u.s.dbl_fracl)); } int isinf(double d) { - struct ieee_double *p = (struct ieee_double *)&d; + union { + double v; + struct ieee_double s; + } u; - return (p->dbl_exp == DBL_EXP_INFNAN && - !p->dbl_frach && !p->dbl_fracl); + u.v = d; + return (u.s.dbl_exp == DBL_EXP_INFNAN && + !u.s.dbl_frach && !u.s.dbl_fracl); } diff --git a/lib/libc/sparc64/gen/isinf.c b/lib/libc/sparc64/gen/isinf.c index c92650e2699..0cbdfff8a10 100644 --- a/lib/libc/sparc64/gen/isinf.c +++ b/lib/libc/sparc64/gen/isinf.c @@ -44,18 +44,26 @@ int isnan(d) double d; { - struct ieee_double *p = (struct ieee_double *)&d; + union { + double v; + struct ieee_double s; + } u; - return (p->dbl_exp == DBL_EXP_INFNAN && - (p->dbl_frach || p->dbl_fracl)); + u.v = d; + return (u.s.dbl_exp == DBL_EXP_INFNAN && + (u.s.dbl_frach || u.s.dbl_fracl)); } int isinf(d) double d; { - struct ieee_double *p = (struct ieee_double *)&d; + union { + double v; + struct ieee_double s; + } u; - return (p->dbl_exp == DBL_EXP_INFNAN && - !p->dbl_frach && !p->dbl_fracl); + u.v = d; + return (u.s.dbl_exp == DBL_EXP_INFNAN && + !u.s.dbl_frach && !u.s.dbl_fracl); }