From aed1add31bf14e0cf760f01ac02437988b5762c3 Mon Sep 17 00:00:00 2001
From: DJ Delorie <dj@redhat.com>
Date: Mon, 27 Oct 2008 18:25:21 +0000
Subject: [PATCH] merge from gcc

---
 libdecnumber/ChangeLog        | 12 ++++++++++++
 libdecnumber/decBasic.c       | 12 ++++++++----
 libdecnumber/decDouble.h      |  6 ++++--
 libdecnumber/decNumberLocal.h | 12 ++++++------
 libdecnumber/decQuad.h        |  6 ++++--
 libdecnumber/decSingle.h      |  6 ++++--
 6 files changed, 38 insertions(+), 16 deletions(-)

diff --git a/libdecnumber/ChangeLog b/libdecnumber/ChangeLog
index a89179b3d7e..eec08665135 100644
--- a/libdecnumber/ChangeLog
+++ b/libdecnumber/ChangeLog
@@ -1,3 +1,15 @@
+2008-10-27  Janis Johnson  <janis187@us.ibm.com>
+
+	PR other/37897
+	* decDouble.h (decDouble): Replace struct with union accessible
+	by more types.
+	* decSingle.h (decSingle): Ditto.
+	* decQuad.h (decQuad): Ditto.
+	* decNumberLocal.h (DFWORD, DFBYTE, DFWWORD): access decFloat via
+	new members.
+	* decBasic.c (decFloatCompareTotal): Avoid type-pun violation.
+	(decNumberCompare): Ditto.
+
 2008-06-17  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
 	* Makefile.in ($(srcdir)/aclocal.m4): Update dependencies.
diff --git a/libdecnumber/decBasic.c b/libdecnumber/decBasic.c
index 9ce277d2c30..fddba979053 100644
--- a/libdecnumber/decBasic.c
+++ b/libdecnumber/decBasic.c
@@ -1660,8 +1660,10 @@ decFloat * decFloatCompareTotal(decFloat *result,
       /* decode the coefficients */
       /* (shift both right two if Quad to make a multiple of four) */
       #if QUAD
-	USHORTAT(bufl)=0;
-	USHORTAT(bufr)=0;
+	ub = bufl;                           /* avoid type-pun violation */
+	USHORTAT(ub)=0;
+	uc = bufr;                           /* avoid type-pun violation */
+	USHORTAT(uc)=0;
       #endif
       GETCOEFF(dfl, bufl+QUAD*2);	     /* decode from decFloat */
       GETCOEFF(dfr, bufr+QUAD*2);	     /* .. */
@@ -3542,8 +3544,10 @@ static Int decNumCompare(const decFloat *dfl, const decFloat *dfr, Flag tot) {
   /* decode the coefficients */
   /* (shift both right two if Quad to make a multiple of four) */
   #if QUAD
-    UINTAT(bufl)=0;
-    UINTAT(bufr)=0;
+    ub=bufl;                            /* avoid type-pun violation */
+    UINTAT(ub)=0;
+    uc=bufr;                            /* avoid type-pun violation */
+    UINTAT(uc)=0;
   #endif
   GETCOEFF(dfl, bufl+QUAD*2);		/* decode from decFloat */
   GETCOEFF(dfr, bufr+QUAD*2);		/* .. */
diff --git a/libdecnumber/decDouble.h b/libdecnumber/decDouble.h
index 32eba395d85..53fcf406bec 100644
--- a/libdecnumber/decDouble.h
+++ b/libdecnumber/decDouble.h
@@ -58,9 +58,11 @@
   #include "decContext.h"
   #include "decQuad.h"
 
-  /* The decDouble decimal 64-bit type, accessible by bytes */
-  typedef struct {
+  /* The decDouble decimal 64-bit type, accessible by various types */
+  typedef union {
     uint8_t bytes[DECDOUBLE_Bytes]; /* fields: 1, 5, 8, 50 bits	  */
+    uint16_t shorts[DECDOUBLE_Bytes/2];
+    uint32_t words[DECDOUBLE_Bytes/4];
     } decDouble;
 
   /* ---------------------------------------------------------------- */
diff --git a/libdecnumber/decNumberLocal.h b/libdecnumber/decNumberLocal.h
index 809eaa466a2..f1568f725e1 100644
--- a/libdecnumber/decNumberLocal.h
+++ b/libdecnumber/decNumberLocal.h
@@ -308,13 +308,13 @@
   #define DECWORDS  (DECBYTES/4)
   #define DECWWORDS (DECWBYTES/4)
   #if DECLITEND
-    #define DFWORD(df, off) UINTAT((df)->bytes+(DECWORDS-1-(off))*4)
-    #define DFBYTE(df, off) UBYTEAT((df)->bytes+(DECBYTES-1-(off)))
-    #define DFWWORD(dfw, off) UINTAT((dfw)->bytes+(DECWWORDS-1-(off))*4)
+    #define DFWORD(df, off) ((df)->words[DECWORDS-1-(off)])
+    #define DFBYTE(df, off) ((df)->bytes[DECBYTES-1-(off)])
+    #define DFWWORD(dfw, off) ((dfw)->words[DECWWORDS-1-(off)])
   #else
-    #define DFWORD(df, off) UINTAT((df)->bytes+(off)*4)
-    #define DFBYTE(df, off) UBYTEAT((df)->bytes+(off))
-    #define DFWWORD(dfw, off) UINTAT((dfw)->bytes+(off)*4)
+    #define DFWORD(df, off) ((df)->words[off])
+    #define DFBYTE(df, off) ((df)->bytes[off])
+    #define DFWWORD(dfw, off) ((dfw)->words[off])
   #endif
 
   /* Tests for sign or specials, directly on DECFLOATs		      */
diff --git a/libdecnumber/decQuad.h b/libdecnumber/decQuad.h
index 39f75d33e3a..af9bc24e265 100644
--- a/libdecnumber/decQuad.h
+++ b/libdecnumber/decQuad.h
@@ -59,9 +59,11 @@
   /* Required include						      */
   #include "decContext.h"
 
-  /* The decQuad decimal 128-bit type, accessible by bytes */
-  typedef struct {
+  /* The decQuad decimal 128-bit type, accessible by various types */
+  typedef union {
     uint8_t bytes[DECQUAD_Bytes];  /* fields: 1, 5, 12, 110 bits */
+    uint16_t shorts[DECQUAD_Bytes/2];
+    uint32_t words[DECQUAD_Bytes/4];
     } decQuad;
 
   /* ---------------------------------------------------------------- */
diff --git a/libdecnumber/decSingle.h b/libdecnumber/decSingle.h
index 8dd1bd38ac0..bae39848eed 100644
--- a/libdecnumber/decSingle.h
+++ b/libdecnumber/decSingle.h
@@ -59,9 +59,11 @@
   #include "decQuad.h"
   #include "decDouble.h"
 
-  /* The decSingle decimal 32-bit type, accessible by bytes */
-  typedef struct {
+  /* The decSingle decimal 32-bit type, accessible by various types */
+  typedef union {
     uint8_t bytes[DECSINGLE_Bytes];	/* fields: 1, 5, 6, 20 bits */
+    uint16_t shorts[DECSINGLE_Bytes/2];
+    uint32_t words[DECSINGLE_Bytes/4];
     } decSingle;
 
   /* ---------------------------------------------------------------- */
-- 
GitLab