diff options
Diffstat (limited to 'src/util.h')
-rw-r--r-- | src/util.h | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..af819f4 --- /dev/null +++ b/src/util.h @@ -0,0 +1,46 @@ +/* SPDX-License-Identifier: LGPL-2.1-only */ + +/* Copyright (C) 2021 Gediminas Jakutis */ + +#ifndef ALGOS_UTIL_H_INCLUDED +#define ALGOS_UTIL_H_INCLUDED + +#include "defs.h" + +static inline int is_less_equal(const field a, const field b) __attribute__((always_inline)); + +static inline int is_less_equal(const field a, const field b) +{ + int ret; + +/* all sizes fitting in a primitive type */ +#if entry_field_size <= 64 + + ret = a <= b; + +/* composite of two 64bit */ +#elif entry_field_size == 128 + + if (unlikely(a.high == b.high)) { + ret = a.low <= b.low; + } else { + ret = a.high < b.high; + } + +/* composite of four 64bit */ +#elif entry_field_size == 256 + if (likely(a.high != b.high)) { + ret = a.high < b.high; + } else if (likely(a.midhigh != b.midhigh)){ + ret = a.midhigh < b.midhigh; + } else if (likely(a.midlow != b.midlow)){ + ret = a.midlow < b.midlow; + } else { + ret = a.low <= b.low; + } +#endif + + return ret; +} + +#endif /* ALGOS_UTIL_H_INCLUDED */ |