summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorMichael Brown2024-10-08 12:52:07 +0200
committerMichael Brown2024-10-10 16:35:16 +0200
commitf78c5a763cc7bb2e2b7b437e7cc74a3efb876960 (patch)
treec0e9186ed0dfad5c3201f87ec5cde3ac4967ae9c /src/include
parent[crypto] Rename bigint_rol()/bigint_ror() to bigint_shl()/bigint_shr() (diff)
downloadipxe-f78c5a763cc7bb2e2b7b437e7cc74a3efb876960.tar.gz
ipxe-f78c5a763cc7bb2e2b7b437e7cc74a3efb876960.tar.xz
ipxe-f78c5a763cc7bb2e2b7b437e7cc74a3efb876960.zip
[crypto] Use architecture-independent bigint_is_set()
Every architecture uses the same implementation for bigint_is_set(), and there is no reason to suspect that a future CPU architecture will provide a more efficient way to implement this operation. Simplify the code by providing a single architecture-independent implementation of bigint_is_set(). Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include')
-rw-r--r--src/include/ipxe/bigint.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/include/ipxe/bigint.h b/src/include/ipxe/bigint.h
index 19cd4e3dd..c556afbc1 100644
--- a/src/include/ipxe/bigint.h
+++ b/src/include/ipxe/bigint.h
@@ -285,6 +285,25 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <bits/bigint.h>
+/**
+ * Test if bit is set in big integer
+ *
+ * @v value0 Element 0 of big integer
+ * @v size Number of elements
+ * @v bit Bit to test
+ * @ret is_set Bit is set
+ */
+static inline __attribute__ (( always_inline )) int
+bigint_bit_is_set_raw ( const bigint_element_t *value0, unsigned int size,
+ unsigned int bit ) {
+ const bigint_t ( size ) __attribute__ (( may_alias )) *value =
+ ( ( const void * ) value0 );
+ unsigned int index = ( bit / ( 8 * sizeof ( value->element[0] ) ) );
+ unsigned int subindex = ( bit % ( 8 * sizeof ( value->element[0] ) ) );
+
+ return ( !! ( value->element[index] & ( 1UL << subindex ) ) );
+}
+
void bigint_init_raw ( bigint_element_t *value0, unsigned int size,
const void *data, size_t len );
void bigint_done_raw ( const bigint_element_t *value0, unsigned int size,