#ifndef N
#error "N must be #defined"
#endif
#include "symcat.h"
#if defined(__STDC__) && defined(signed)
#undef signed
#endif
#define unsignedN XCONCAT2(unsigned,N)
#define signedN XCONCAT2(signed,N)
#define LSMASKn XCONCAT2(LSMASK,N)
#define MSMASKn XCONCAT2(MSMASK,N)
#define LSMASKEDn XCONCAT2(LSMASKED,N)
#define MSMASKEDn XCONCAT2(MSMASKED,N)
#define LSEXTRACTEDn XCONCAT2(LSEXTRACTED,N)
#define MSEXTRACTEDn XCONCAT2(MSEXTRACTED,N)
#define LSINSERTEDn XCONCAT2(LSINSERTED,N)
#define MSINSERTEDn XCONCAT2(MSINSERTED,N)
#define ROTn XCONCAT2(ROT,N)
#define ROTLn XCONCAT2(ROTL,N)
#define ROTRn XCONCAT2(ROTR,N)
#define MSSEXTn XCONCAT2(MSSEXT,N)
#define LSSEXTn XCONCAT2(LSSEXT,N)
INLINE_SIM_BITS\
(unsignedN)
LSMASKEDn (unsignedN word,
int start,
int stop)
{
word &= LSMASKn (start, stop);
return word;
}
INLINE_SIM_BITS\
(unsignedN)
MSMASKEDn (unsignedN word,
int start,
int stop)
{
word &= MSMASKn (start, stop);
return word;
}
INLINE_SIM_BITS\
(unsignedN)
LSEXTRACTEDn (unsignedN val,
int start,
int stop)
{
val <<= (N - 1 - start);
val >>= (N - 1 - start) + (stop);
return val;
}
INLINE_SIM_BITS\
(unsignedN)
MSEXTRACTEDn (unsignedN val,
int start,
int stop)
{
val <<= (start);
val >>= (start) + (N - 1 - stop);
return val;
}
INLINE_SIM_BITS\
(unsignedN)
LSINSERTEDn (unsignedN val,
int start,
int stop)
{
val <<= stop;
val &= LSMASKn (start, stop);
return val;
}
INLINE_SIM_BITS\
(unsignedN)
MSINSERTEDn (unsignedN val,
int start,
int stop)
{
val <<= ((N - 1) - stop);
val &= MSMASKn (start, stop);
return val;
}
INLINE_SIM_BITS\
(unsignedN)
ROTn (unsignedN val,
int shift)
{
if (shift > 0)
return ROTRn (val, shift);
else if (shift < 0)
return ROTLn (val, -shift);
else
return val;
}
INLINE_SIM_BITS\
(unsignedN)
ROTLn (unsignedN val,
int shift)
{
unsignedN result;
ASSERT (shift <= N);
result = (((val) << (shift)) | ((val) >> ((N)-(shift))));
return result;
}
INLINE_SIM_BITS\
(unsignedN)
ROTRn (unsignedN val,
int shift)
{
unsignedN result;
ASSERT (shift <= N);
result = (((val) >> (shift)) | ((val) << ((N)-(shift))));
return result;
}
INLINE_SIM_BITS\
(unsignedN)
LSSEXTn (signedN val,
int sign_bit)
{
int shift;
ASSERT (sign_bit < N);
shift = ((N - 1) - sign_bit);
val <<= shift;
val >>= shift;
return val;
}
INLINE_SIM_BITS\
(unsignedN)
MSSEXTn (signedN val,
int sign_bit)
{
ASSERT (sign_bit < N);
val <<= sign_bit;
val >>= sign_bit;
return val;
}
#undef LSSEXTn
#undef MSSEXTn
#undef ROTLn
#undef ROTRn
#undef ROTn
#undef LSINSERTEDn
#undef MSINSERTEDn
#undef LSEXTRACTEDn
#undef MSEXTRACTEDn
#undef LSMASKEDn
#undef LSMASKn
#undef MSMASKEDn
#undef MSMASKn
#undef signedN
#undef unsignedN