X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Fppc%2Fbits.c;h=767f196fad58a23156dfed7cba21adeaed767a23;hb=00923338dec84505addaf9cdeca2e9c844757824;hp=2424e859f5d0edfa1e2f47ebf06a0d1d4182f784;hpb=e98fe4f7b54cbdf29aef9287bbb1bea8801dd05a;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/ppc/bits.c b/sim/ppc/bits.c index 2424e859f5..767f196fad 100644 --- a/sim/ppc/bits.c +++ b/sim/ppc/bits.c @@ -4,7 +4,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -13,8 +13,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + along with this program; if not, see . */ @@ -24,4 +23,111 @@ #include "basics.h" +INLINE_BITS\ +(unsigned64) +LSMASKED64 (unsigned64 word, + int start, + int stop) +{ + word &= LSMASK64 (start, stop); + return word; +} + +INLINE_BITS\ +(unsigned64) +LSEXTRACTED64 (unsigned64 val, + int start, + int stop) +{ + val <<= (64 - 1 - start); /* drop high bits */ + val >>= (64 - 1 - start) + (stop); /* drop low bits */ + return val; +} + +INLINE_BITS\ +(unsigned32) +MASKED32(unsigned32 word, + unsigned start, + unsigned stop) +{ + return (word & MASK32(start, stop)); +} + +INLINE_BITS\ +(unsigned64) +MASKED64(unsigned64 word, + unsigned start, + unsigned stop) +{ + return (word & MASK64(start, stop)); +} + +INLINE_BITS\ +(unsigned_word) +MASKED(unsigned_word word, + unsigned start, + unsigned stop) +{ + return ((word) & MASK(start, stop)); +} + + + +INLINE_BITS\ +(unsigned_word) +EXTRACTED(unsigned_word word, + unsigned start, + unsigned stop) +{ + ASSERT(start <= stop); +#if (WITH_TARGET_WORD_BITSIZE == 64) + return _EXTRACTEDn(64, word, start, stop); +#else + if (stop < 32) + return 0; + else + return ((word >> (63 - stop)) + & MASK(start+(63-stop), 63)); +#endif +} + + +INLINE_BITS\ +(unsigned_word) +INSERTED(unsigned_word word, + unsigned start, + unsigned stop) +{ + ASSERT(start <= stop); +#if (WITH_TARGET_WORD_BITSIZE == 64) + return _INSERTEDn(64, word, start, stop); +#else + if (stop < 32) + return 0; + else + return ((word & MASK(start+(63-stop), 63)) + << (63 - stop)); +#endif +} + + +INLINE_BITS\ +(unsigned32) +ROTL32(unsigned32 val, + long shift) +{ + ASSERT(shift >= 0 && shift <= 32); + return _ROTLn(32, val, shift); +} + + +INLINE_BITS\ +(unsigned64) +ROTL64(unsigned64 val, + long shift) +{ + ASSERT(shift >= 0 && shift <= 64); + return _ROTLn(64, val, shift); +} + #endif /* _BITS_C_ */