⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sim-bits.h

📁 这个是LINUX下的GDB调度工具的源码
💻 H
📖 第 1 页 / 共 2 页
字号:
/* 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 + -