📄 sim-bits.h
字号:
/* The common simulator framework for GDB, the GNU Debugger. Copyright 2002 Free Software Foundation, Inc. Contributed by Andrew Cagney and Red Hat. This file is part of GDB. 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 (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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. */#ifndef _SIM_BITS_H_#define _SIM_BITS_H_/* Bit manipulation routines: Bit numbering: The bits are numbered according to the target ISA's convention. That being controlled by WITH_TARGET_WORD_MSB. For the PowerPC (WITH_TARGET_WORD_MSB == 0) the numbering is 0..31 while for the MIPS (WITH_TARGET_WORD_MSB == 31) it is 31..0. Size convention: Each macro is in three forms - <MACRO>32 which operates in 32bit quantity (bits are numbered 0..31); <MACRO>64 which operates using 64bit quantites (and bits are numbered 0..63); and <MACRO> which operates using the bit size of the target architecture (bits are still numbered 0..63), with 32bit architectures ignoring the first 32bits leaving bit 32 as the most significant. NB: Use EXTRACTED, MSEXTRACTED and LSEXTRACTED as a guideline for naming. LSMASK and LSMASKED are wrong. BIT*(POS): `*' bit constant with just 1 bit set. LSBIT*(OFFSET): `*' bit constant with just 1 bit set - LS bit is zero. MSBIT*(OFFSET): `*' bit constant with just 1 bit set - MS bit is zero. MASK*(FIRST, LAST): `*' bit constant with bits [FIRST .. LAST] set. The <MACRO> (no size) version permits FIRST >= LAST and generates a wrapped bit mask vis ([0..LAST] | [FIRST..LSB]). LSMASK*(FIRST, LAST): Like MASK - LS bit is zero. MSMASK*(FIRST, LAST): Like MASK - LS bit is zero. MASKED*(VALUE, FIRST, LAST): Masks out all but bits [FIRST .. LAST]. LSMASKED*(VALUE, FIRST, LAST): Like MASKED - LS bit is zero. MSMASKED*(VALUE, FIRST, LAST): Like MASKED - MS bit is zero. EXTRACTED*(VALUE, FIRST, LAST): Masks out bits [FIRST .. LAST] but also right shifts the masked value so that bit LAST becomes the least significant (right most). LSEXTRACTED*(VALUE, FIRST, LAST): Same as extracted - LS bit is zero. MSEXTRACTED*(VALUE, FIRST, LAST): Same as extracted - MS bit is zero. SHUFFLED**(VALUE, OLD, NEW): Mask then move a single bit from OLD new NEW. MOVED**(VALUE, OLD_FIRST, OLD_LAST, NEW_FIRST, NEW_LAST): Moves things around so that bits OLD_FIRST..OLD_LAST are masked then moved to NEW_FIRST..NEW_LAST. INSERTED*(VALUE, FIRST, LAST): Takes VALUE and `inserts' the (LAST - FIRST + 1) least significant bits into bit positions [ FIRST .. LAST ]. This is almost the complement to EXTRACTED. IEA_MASKED(SHOULD_MASK, ADDR): Convert the address to the targets natural size. If in 32bit mode, discard the high 32bits. EXTEND*(VALUE): Convert the `*' bit value to the targets natural word size. Sign extend the value if needed. ALIGN_*(VALUE): Round the value upwards so that it is aligned to a `_*' byte boundary. FLOOR_*(VALUE): Truncate the value so that it is aligned to a `_*' byte boundary. ROT*(VALUE, NR_BITS): Return the `*' bit VALUE rotated by NR_BITS right (positive) or left (negative). ROTL*(VALUE, NR_BITS): Return the `*' bit value rotated by NR_BITS left. 0 <= NR_BITS <= `*'. ROTR*(VALUE, NR_BITS): Return the `*' bit value rotated by NR_BITS right. 0 <= NR_BITS <= N. SEXT*(VALUE, SIGN_BIT): Treat SIGN_BIT as VALUEs sign, extend it ti `*' bits. Note: Only the BIT* and MASK* macros return a constant that can be used in variable declarations. *//* compute the number of bits between START and STOP */#if (WITH_TARGET_WORD_MSB == 0)#define _MAKE_WIDTH(START, STOP) (STOP - START + 1)#else#define _MAKE_WIDTH(START, STOP) (START - STOP + 1)#endif/* compute the number shifts required to move a bit between LSB (MSB) and POS */#if (WITH_TARGET_WORD_MSB == 0)#define _LSB_SHIFT(WIDTH, POS) (WIDTH - 1 - POS)#else#define _LSB_SHIFT(WIDTH, POS) (POS)#endif#if (WITH_TARGET_WORD_MSB == 0)#define _MSB_SHIFT(WIDTH, POS) (POS)#else#define _MSB_SHIFT(WIDTH, POS) (WIDTH - 1 - POS)#endif/* compute the absolute bit position given the OFFSET from the MSB(LSB) NB: _MAKE_xxx_POS (WIDTH, _MAKE_xxx_SHIFT (WIDTH, POS)) == POS */#if (WITH_TARGET_WORD_MSB == 0)#define _MSB_POS(WIDTH, SHIFT) (SHIFT)#else#define _MSB_POS(WIDTH, SHIFT) (WIDTH - 1 - SHIFT)#endif#if (WITH_TARGET_WORD_MSB == 0)#define _LSB_POS(WIDTH, SHIFT) (WIDTH - 1 - SHIFT)#else#define _LSB_POS(WIDTH, SHIFT) (SHIFT)#endif/* convert a 64 bit position into a corresponding 32bit position. MSB pos handles the posibility that the bit lies beyond the 32bit boundary */#if (WITH_TARGET_WORD_MSB == 0)#define _MSB_32(START, STOP) (START <= STOP \ ? (START < 32 ? 0 : START - 32) \ : (STOP < 32 ? 0 : STOP - 32))#define _MSB_16(START, STOP) (START <= STOP \ ? (START < 48 ? 0 : START - 48) \ : (STOP < 48 ? 0 : STOP - 48))#else#define _MSB_32(START, STOP) (START >= STOP \ ? (START >= 32 ? 31 : START) \ : (STOP >= 32 ? 31 : STOP))#define _MSB_16(START, STOP) (START >= STOP \ ? (START >= 16 ? 15 : START) \ : (STOP >= 16 ? 15 : STOP))#endif#if (WITH_TARGET_WORD_MSB == 0)#define _LSB_32(START, STOP) (START <= STOP \ ? (STOP < 32 ? 0 : STOP - 32) \ : (START < 32 ? 0 : START - 32))#define _LSB_16(START, STOP) (START <= STOP \ ? (STOP < 48 ? 0 : STOP - 48) \ : (START < 48 ? 0 : START - 48))#else#define _LSB_32(START, STOP) (START >= STOP \ ? (STOP >= 32 ? 31 : STOP) \ : (START >= 32 ? 31 : START))#define _LSB_16(START, STOP) (START >= STOP \ ? (STOP >= 16 ? 15 : STOP) \ : (START >= 16 ? 15 : START))#endif#if (WITH_TARGET_WORD_MSB == 0)#define _MSB(START, STOP) (START <= STOP ? START : STOP)#else#define _MSB(START, STOP) (START >= STOP ? START : STOP)#endif#if (WITH_TARGET_WORD_MSB == 0)#define _LSB(START, STOP) (START <= STOP ? STOP : START)#else#define _LSB(START, STOP) (START >= STOP ? STOP : START)#endif/* LS/MS Bit operations */#define LSBIT8(POS) ((unsigned8) 1 << (POS))#define LSBIT16(POS) ((unsigned16)1 << (POS))#define LSBIT32(POS) ((unsigned32)1 << (POS))#define LSBIT64(POS) ((unsigned64)1 << (POS))#if (WITH_TARGET_WORD_BITSIZE == 64)#define LSBIT(POS) LSBIT64 (POS)#endif#if (WITH_TARGET_WORD_BITSIZE == 32)#define LSBIT(POS) ((unsigned32)((POS) >= 32 \ ? 0 \ : (1 << ((POS) >= 32 ? 0 : (POS)))))#endif#if (WITH_TARGET_WORD_BITSIZE == 16)#define LSBIT(POS) ((unsigned16)((POS) >= 16 \ ? 0 \ : (1 << ((POS) >= 16 ? 0 : (POS)))))#endif#define MSBIT8(POS) ((unsigned8) 1 << ( 8 - 1 - (POS)))#define MSBIT16(POS) ((unsigned16)1 << (16 - 1 - (POS)))#define MSBIT32(POS) ((unsigned32)1 << (32 - 1 - (POS)))#define MSBIT64(POS) ((unsigned64)1 << (64 - 1 - (POS)))#if (WITH_TARGET_WORD_BITSIZE == 64)#define MSBIT(POS) MSBIT64 (POS)#endif#if (WITH_TARGET_WORD_BITSIZE == 32)#define MSBIT(POS) ((unsigned32)((POS) < 32 \ ? 0 \ : (1 << ((POS) < 32 ? 0 : (64 - 1) - (POS)))))#endif#if (WITH_TARGET_WORD_BITSIZE == 16)#define MSBIT(POS) ((unsigned16)((POS) < 48 \ ? 0 \ : (1 << ((POS) < 48 ? 0 : (64 - 1) - (POS)))))#endif/* Bit operations */#define BIT4(POS) (1 << _LSB_SHIFT (4, (POS)))#define BIT5(POS) (1 << _LSB_SHIFT (5, (POS)))#define BIT10(POS) (1 << _LSB_SHIFT (10, (POS)))#if (WITH_TARGET_WORD_MSB == 0)#define BIT8 MSBIT8#define BIT16 MSBIT16#define BIT32 MSBIT32#define BIT64 MSBIT64#define BIT MSBIT#else#define BIT8 LSBIT8#define BIT16 LSBIT16#define BIT32 LSBIT32#define BIT64 LSBIT64#define BIT LSBIT#endif/* multi bit mask *//* 111111 -> mmll11 -> mm11ll */#define _MASKn(WIDTH, START, STOP) (((unsigned##WIDTH)(-1) \ >> (_MSB_SHIFT (WIDTH, START) \ + _LSB_SHIFT (WIDTH, STOP))) \ << _LSB_SHIFT (WIDTH, STOP))#if (WITH_TARGET_WORD_MSB == 0)#define _POS_LE(START, STOP) (START <= STOP)#else#define _POS_LE(START, STOP) (STOP <= START)#endif#if (WITH_TARGET_WORD_BITSIZE == 64)#define MASK(START, STOP) \ (_POS_LE ((START), (STOP)) \ ? _MASKn(64, \ _MSB ((START), (STOP)), \ _LSB ((START), (STOP)) ) \ : (_MASKn(64, _MSB_POS (64, 0), (STOP)) \ | _MASKn(64, (START), _LSB_POS (64, 0))))#endif#if (WITH_TARGET_WORD_BITSIZE == 32)#define MASK(START, STOP) \ (_POS_LE ((START), (STOP)) \ ? (_POS_LE ((STOP), _MSB_POS (64, 31)) \ ? 0 \ : _MASKn (32, \ _MSB_32 ((START), (STOP)), \ _LSB_32 ((START), (STOP)))) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -