Allow simulators to be built on Linux
[deliverable/binutils-gdb.git] / sim / common / sim-n-bits.h
index 0359c03fcee8a11a07ed1f95fba8cf2faf582c9e..85184e734620af7e8e75e8327f97624a75f94652 100644 (file)
 #error "N must be #defined"
 #endif
 
+#include "sim-xcat.h"
+
+#ifdef __STDC__
+/* If signed were defined to be say __signed (ie, some versions of Linux),
+   then the signedN macro would not work correctly.  If we have a standard
+   compiler, we have signed.  */
+#undef signed
+#endif
+
 /* NOTE: See end of file for #undef */
 #define unsignedN XCONCAT2(unsigned,N)
 #define signedN XCONCAT2(signed,N)
 #define MASKEDn XCONCAT2(MASKED,N)
 #define MASKn XCONCAT2(MASK,N)
 #define LSMASKEDn XCONCAT2(LSMASKED,N)
+#define LSMASKn XCONCAT2(LSMASK,N)
+#define MSMASKEDn XCONCAT2(MSMASKED,N)
+#define MSMASKn XCONCAT2(MSMASK,N)
 #define EXTRACTEDn XCONCAT2(EXTRACTED,N)
 #define INSERTEDn XCONCAT2(INSERTED,N)
 #define ROTn XCONCAT2(ROT,N)
 
 INLINE_SIM_BITS\
 (unsignedN)
-MASKEDn(unsignedN word,
-       unsigned start,
-       unsigned stop)
+MASKEDn (unsignedN word,
+        unsigned start,
+        unsigned stop)
 {
-  return (word & MASKn(start, stop));
+  return (word & MASKn (start, stop));
 }
 
 
 INLINE_SIM_BITS\
 (unsignedN)
-LSMASKEDn(unsignedN word,
-         unsigned nr_bits)
+LSMASKEDn (unsignedN word,
+          unsigned nr_bits)
 {
-  return (word & MASKn(N - nr_bits, N - 1));
+  return (word & LSMASKn (nr_bits));
 }
 
 
 INLINE_SIM_BITS\
 (unsignedN)
-EXTRACTEDn(unsignedN val,
-          unsigned start,
-          unsigned stop)
+MSMASKEDn (unsignedN word,
+          unsigned nr_bits)
+{
+  return (word & MSMASKn (nr_bits));
+}
+
+
+INLINE_SIM_BITS\
+(unsignedN)
+EXTRACTEDn (unsignedN val,
+           unsigned start,
+           unsigned stop)
 {
-  return LSMASKEDn((((unsignedN)(val)) >> (N - stop - 1)),
-                  stop - start + 1);
+  val <<= _MSB_SHIFT (N, start);
+  val >>= (_MSB_SHIFT (N, start) + _LSB_SHIFT (N, stop));
+  return val;
 }
 
 
 INLINE_SIM_BITS\
 (unsignedN)
-INSERTEDn(unsignedN val,
-         unsigned start,
-         unsigned stop)
+INSERTEDn (unsignedN val,
+          unsigned start,
+          unsigned stop)
 {
-  return (((unsignedN)(val)
-          << _MAKE_SHIFT(N, stop))
-         & MASKn(start, stop));
+  val &= LSMASKn (_MAKE_WIDTH (start, stop));
+  val <<= _LSB_SHIFT (N, stop);
+  return val;
 }
 
 
 INLINE_SIM_BITS\
 (unsignedN)
-ROTn(unsignedN val,
-     int shift)
+ROTn (unsignedN val,
+      int shift)
 {
-  unsignedN result;
   if (shift > 0)
-    return ROTRn(val, shift);
+    return ROTRn (val, shift);
   else if (shift < 0)
-    return ROTLn(val, -shift);
+    return ROTLn (val, -shift);
   else
     return val;
 }
@@ -97,11 +118,11 @@ ROTn(unsignedN val,
 
 INLINE_SIM_BITS\
 (unsignedN)
-ROTLn(unsignedN val,
-      unsigned shift)
+ROTLn (unsignedN val,
+       unsigned shift)
 {
   unsignedN result;
-  ASSERT(shift <= N);
+  ASSERT (shift <= N);
   result = (((val) << (shift)) | ((val) >> ((N)-(shift))));
   return result;
 }
@@ -109,11 +130,11 @@ ROTLn(unsignedN val,
 
 INLINE_SIM_BITS\
 (unsignedN)
-ROTRn(unsignedN val,
-      unsigned shift)
+ROTRn (unsignedN val,
+       unsigned shift)
 {
   unsignedN result;
-  ASSERT(shift <= N);
+  ASSERT (shift <= N);
   result = (((val) >> (shift)) | ((val) << ((N)-(shift))));
   return result;
 }
@@ -121,13 +142,15 @@ ROTRn(unsignedN val,
 
 INLINE_SIM_BITS\
 (unsignedN)
-SEXTn(signedN val,
-            unsigned sign_bit)
+SEXTn (signedN val,
+       unsigned sign_bit)
 {
   /* make the sign-bit most significant and then smear it back into
      position */
-  ASSERT(sign_bit < N);
-  return (val << sign_bit) >> sign_bit;
+  ASSERT (sign_bit < N);
+  val <<= _MSB_SHIFT (N, sign_bit);
+  val >>= _MSB_SHIFT (N, sign_bit);
+  return val;
 }
 
 
@@ -139,6 +162,9 @@ SEXTn(signedN val,
 #undef INSERTEDn
 #undef EXTRACTEDn
 #undef LSMASKEDn
+#undef LSMASKn
+#undef MSMASKEDn
+#undef MSMASKn
 #undef MASKn
 #undef MASKEDn
 #undef signedN
This page took 0.025247 seconds and 4 git commands to generate.