X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Fcommon%2Fsim-n-bits.h;h=85184e734620af7e8e75e8327f97624a75f94652;hb=564e2a3fe9e4ab89e76d10015beae33bd2950faf;hp=0359c03fcee8a11a07ed1f95fba8cf2faf582c9e;hpb=f2de7dfd8cf1ffd6edc7ed650e709c7fa4488da1;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/common/sim-n-bits.h b/sim/common/sim-n-bits.h index 0359c03fce..85184e7346 100644 --- a/sim/common/sim-n-bits.h +++ b/sim/common/sim-n-bits.h @@ -24,12 +24,24 @@ #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) @@ -40,56 +52,65 @@ 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