#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;
}
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;
}
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;
}
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;
}
#undef INSERTEDn
#undef EXTRACTEDn
#undef LSMASKEDn
+#undef LSMASKn
+#undef MSMASKEDn
+#undef MSMASKn
#undef MASKn
#undef MASKEDn
#undef signedN