qemu/bitops.h: Add extract8 and extract16

Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20200212130311.127515-3-ysato@users.sourceforge.jp>
Message-Id: <20200225124710.14152-14-alex.bennee@linaro.org>
This commit is contained in:
Yoshinori Sato 2020-02-25 12:47:04 +00:00 committed by Alex Bennée
parent 4133686110
commit ed04c8b14c

View File

@ -301,6 +301,44 @@ static inline uint32_t extract32(uint32_t value, int start, int length)
return (value >> start) & (~0U >> (32 - length)); return (value >> start) & (~0U >> (32 - length));
} }
/**
* extract8:
* @value: the value to extract the bit field from
* @start: the lowest bit in the bit field (numbered from 0)
* @length: the length of the bit field
*
* Extract from the 8 bit input @value the bit field specified by the
* @start and @length parameters, and return it. The bit field must
* lie entirely within the 8 bit word. It is valid to request that
* all 8 bits are returned (ie @length 8 and @start 0).
*
* Returns: the value of the bit field extracted from the input value.
*/
static inline uint8_t extract8(uint8_t value, int start, int length)
{
assert(start >= 0 && length > 0 && length <= 8 - start);
return extract32(value, start, length);
}
/**
* extract16:
* @value: the value to extract the bit field from
* @start: the lowest bit in the bit field (numbered from 0)
* @length: the length of the bit field
*
* Extract from the 16 bit input @value the bit field specified by the
* @start and @length parameters, and return it. The bit field must
* lie entirely within the 16 bit word. It is valid to request that
* all 16 bits are returned (ie @length 16 and @start 0).
*
* Returns: the value of the bit field extracted from the input value.
*/
static inline uint16_t extract16(uint16_t value, int start, int length)
{
assert(start >= 0 && length > 0 && length <= 16 - start);
return extract32(value, start, length);
}
/** /**
* extract64: * extract64:
* @value: the value to extract the bit field from * @value: the value to extract the bit field from