Author: marius
Date: Sun Mar 21 13:18:08 2010
New Revision: 205410
URL: http://svn.freebsd.org/changeset/base/205410

Log:
  Avoid aliasing which leads to incorrect results when compiling with the
  default strict aliasing rules.
  
  PR:           144900
  Submitted by: Peter Jeremy
  MFC after:    3 days

Modified:
  head/lib/libc/sparc64/fpu/fpu_explode.c

Modified: head/lib/libc/sparc64/fpu/fpu_explode.c
==============================================================================
--- head/lib/libc/sparc64/fpu/fpu_explode.c     Sun Mar 21 13:09:54 2010        
(r205409)
+++ head/lib/libc/sparc64/fpu/fpu_explode.c     Sun Mar 21 13:18:08 2010        
(r205410)
@@ -139,9 +139,9 @@ __fpu_xtof(fp, i)
         * a signed or unsigned entity.
         */
        if (fp->fp_sign && (int64_t)i < 0)
-               *((int64_t*)fp->fp_mant) = -i;
+               *((int64_t *)fp->fp_mant) = -i;
        else
-               *((int64_t*)fp->fp_mant) = i;
+               *((int64_t *)fp->fp_mant) = i;
        fp->fp_mant[2] = 0;
        fp->fp_mant[3] = 0;
        __fpu_norm(fp);
@@ -262,14 +262,12 @@ __fpu_explode(fe, fp, type, reg)
        struct fpn *fp;
        int type, reg;
 {
-       u_int32_t s, *sp;
-       u_int64_t l[2];
-       void *vl = l;
+       u_int64_t l0, l1;
+       u_int32_t s;
 
        if (type == FTYPE_LNG || type == FTYPE_DBL || type == FTYPE_EXT) {
-               l[0] = __fpu_getreg64(reg & ~1);
-               sp = vl;
-               fp->fp_sign = sp[0] >> 31;
+               l0 = __fpu_getreg64(reg & ~1);
+               fp->fp_sign = l0 >> 63;
        } else {
                s = __fpu_getreg(reg);
                fp->fp_sign = s >> 31;
@@ -277,7 +275,7 @@ __fpu_explode(fe, fp, type, reg)
        fp->fp_sticky = 0;
        switch (type) {
        case FTYPE_LNG:
-               s = __fpu_xtof(fp, l[0]);
+               s = __fpu_xtof(fp, l0);
                break;
 
        case FTYPE_INT:
@@ -289,12 +287,13 @@ __fpu_explode(fe, fp, type, reg)
                break;
 
        case FTYPE_DBL:
-               s = __fpu_dtof(fp, sp[0], sp[1]);
+               s = __fpu_dtof(fp, l0 >> 32, l0 & 0xffffffff);
                break;
 
        case FTYPE_EXT:
-               l[1] = __fpu_getreg64((reg & ~1) + 2);
-               s = __fpu_qtof(fp, sp[0], sp[1], sp[2], sp[3]);
+               l1 = __fpu_getreg64((reg & ~1) + 2);
+               s = __fpu_qtof(fp, l0 >> 32, l0 & 0xffffffff, l1 >> 32,
+                   l1 & 0xffffffff);
                break;
 
        default:
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to