[PATCH v2 6/6] sim/common: Fix issue with wrong byte order on BE targets

Stafford Horne shorne@gmail.com
Tue Apr 9 21:40:00 GMT 2019


Currently only the OpenRISC sim uses this JOINSIDF() function to compose a
double float from 2 registers.  The old code doesn't seem to work as the
work order gets swapped when running on a x86_64 host.  This change
fixes that, but I am not sure if its the best thing to do.

On mips they do similar reg pair floating point operations composing
doubles from 2 32-bit registers in sim/mips/cp1.c value_fpr().

sim/common/ChangeLog:

	* cgen-ops.h (JOINSIDF): Fix big endian check.
---
 sim/common/cgen-ops.h | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/sim/common/cgen-ops.h b/sim/common/cgen-ops.h
index 841552066f..d718394723 100644
--- a/sim/common/cgen-ops.h
+++ b/sim/common/cgen-ops.h
@@ -431,12 +431,8 @@ JOINSIDI (SI x0, SI x1)
 SEMOPS_INLINE DF
 JOINSIDF (SI x0, SI x1)
 {
-  union { SI in[2]; DF out; } x;
-  if (CURRENT_TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
-    x.in[0] = x0, x.in[1] = x1;
-  else
-    x.in[1] = x0, x.in[0] = x1;
-  return x.out;
+  /* Making doubles is the same as making long longs.  */
+  return MAKEDI (x0, x1);
 }
 
 SEMOPS_INLINE XF
-- 
2.19.1



More information about the Binutils mailing list