diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /roms/ipxe/src/arch/i386/include/bits/strings.h | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip | |
Diffstat (limited to 'roms/ipxe/src/arch/i386/include/bits/strings.h')
| -rw-r--r-- | roms/ipxe/src/arch/i386/include/bits/strings.h | 50 | 
1 files changed, 50 insertions, 0 deletions
| diff --git a/roms/ipxe/src/arch/i386/include/bits/strings.h b/roms/ipxe/src/arch/i386/include/bits/strings.h new file mode 100644 index 00000000..092bcb59 --- /dev/null +++ b/roms/ipxe/src/arch/i386/include/bits/strings.h @@ -0,0 +1,50 @@ +#ifndef _BITS_STRINGS_H +#define _BITS_STRINGS_H + +FILE_LICENCE ( GPL2_OR_LATER ); + +/** + * Find last (i.e. most significant) set bit + * + * @v value		Value + * @ret msb		Most significant bit set in value (LSB=1), or zero + */ +static inline __attribute__ (( always_inline )) int __flsl ( long value ) { +	long msb_minus_one; + +	/* If the input value is zero, the BSR instruction returns +	 * ZF=1 and leaves an undefined value in the output register. +	 * Perform this check in C rather than asm so that it can be +	 * omitted in cases where the compiler is able to prove that +	 * the input is non-zero. +	 */ +	if ( value ) { +		__asm__ ( "bsrl %1, %0" +			  : "=r" ( msb_minus_one ) +			  : "rm" ( value ) ); +		return ( msb_minus_one + 1 ); +	} else { +		return 0; +	} +} + +/** + * Find last (i.e. most significant) set bit + * + * @v value		Value + * @ret msb		Most significant bit set in value (LSB=1), or zero + */ +static inline __attribute__ (( always_inline )) int __flsll ( long long value ){ +	unsigned long high = ( value >> 32 ); +	unsigned long low = ( value >> 0 ); + +	if ( high ) { +		return ( 32 + __flsl ( high ) ); +	} else if ( low ) { +		return ( __flsl ( low ) ); +	} else { +		return 0; +	} +} + +#endif /* _BITS_STRINGS_H */ | 
