diff options
author | H. Peter Anvin (Intel) <hpa@zytor.com> | 2019-08-06 22:18:34 -0700 |
---|---|---|
committer | H. Peter Anvin (Intel) <hpa@zytor.com> | 2019-08-06 22:23:54 -0700 |
commit | c9cbd03dba0ef318babb6c989e0d4262b811f9ef (patch) | |
tree | 175cd97fd1560f26c1e90b79588ffd82350d4d5b /include | |
parent | 418138c8f2d1b25152e081c984e88b284660b789 (diff) | |
download | nasm-c9cbd03dba0ef318babb6c989e0d4262b811f9ef.tar.gz nasm-c9cbd03dba0ef318babb6c989e0d4262b811f9ef.tar.xz nasm-c9cbd03dba0ef318babb6c989e0d4262b811f9ef.zip |
iflag.h: simplify, fix iflag_cmp() when bit 31 is set
Additional simplifications, including using the new IFM_ masks,
and make IF_GENBIT() automatically mask the field number.
When bit 31 in a field is set, iflag_cmp() could return the wrong
ordering value. Fix.
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/iflag.h | 39 |
1 files changed, 14 insertions, 25 deletions
diff --git a/include/iflag.h b/include/iflag.h index 3282ecae..0486278f 100644 --- a/include/iflag.h +++ b/include/iflag.h @@ -7,21 +7,26 @@ #include "iflaggen.h" -#define IF_GENBIT(bit) (UINT32_C(1) << (bit)) +#define IF_GENBIT(bit) (UINT32_C(1) << ((bit) & 31)) + +static inline int ifcomp(uint32_t a, uint32_t b) +{ + return (a > b) - (a < b); +} static inline bool iflag_test(const iflag_t *f, unsigned int bit) { - return !!(f->field[bit >> 5] & IF_GENBIT(bit & 31)); + return !!(f->field[bit >> 5] & IF_GENBIT(bit)); } static inline void iflag_set(iflag_t *f, unsigned int bit) { - f->field[bit >> 5] |= IF_GENBIT(bit & 31); + f->field[bit >> 5] |= IF_GENBIT(bit); } static inline void iflag_clear(iflag_t *f, unsigned int bit) { - f->field[bit >> 5] &= ~IF_GENBIT(bit & 31); + f->field[bit >> 5] &= ~IF_GENBIT(bit); } static inline void iflag_clear_all(iflag_t *f) @@ -45,7 +50,7 @@ static inline int iflag_cmp(const iflag_t *a, const iflag_t *b) if (a->field[i] == b->field[i]) continue; - return (int)(a->field[i] - b->field[i]); + return ifcomp(a->field[i], b->field[i]); } return 0; @@ -66,21 +71,8 @@ static inline int iflag_cmp(const iflag_t *a, const iflag_t *b) IF_GEN_HELPER(xor, ^) /* Some helpers which are to work with predefined masks */ -#define IF_SMASK \ - (IF_GENBIT(IF_SB) |\ - IF_GENBIT(IF_SW) |\ - IF_GENBIT(IF_SD) |\ - IF_GENBIT(IF_SQ) |\ - IF_GENBIT(IF_SO) |\ - IF_GENBIT(IF_SY) |\ - IF_GENBIT(IF_SZ) |\ - IF_GENBIT(IF_SIZE)) -#define IF_ARMASK \ - (IF_GENBIT(IF_AR0) |\ - IF_GENBIT(IF_AR1) |\ - IF_GENBIT(IF_AR2) |\ - IF_GENBIT(IF_AR3) |\ - IF_GENBIT(IF_AR4)) +#define IF_SMASK (IFM_SB|IFM_SW|IFM_SD|IFM_SQ|IFM_SO|IFM_SY|IFM_SZ|IFM_SIZE) +#define IF_ARMASK (IFM_AR0|IFM_AR1|IFM_AR2|IFM_AR3|IFM_AR4) #define _itemp_smask(idx) (insns_flags[(idx)].field[0] & IF_SMASK) #define _itemp_armask(idx) (insns_flags[(idx)].field[0] & IF_ARMASK) @@ -98,7 +90,7 @@ IF_GEN_HELPER(xor, ^) static inline int iflag_cmp_cpu(const iflag_t *a, const iflag_t *b) { - return (int)(a->field[IF_CPU_FIELD] - b->field[IF_CPU_FIELD]); + return ifcomp(a->field[IF_CPU_FIELD], b->field[IF_CPU_FIELD]); } static inline uint32_t _iflag_cpu_level(const iflag_t *a) @@ -108,10 +100,7 @@ static inline uint32_t _iflag_cpu_level(const iflag_t *a) static inline int iflag_cmp_cpu_level(const iflag_t *a, const iflag_t *b) { - uint32_t aa = _iflag_cpu_level(a); - uint32_t bb = _iflag_cpu_level(b); - - return (int)(aa - bb); + return ifcomp(_iflag_cpu_level(a), _iflag_cpu_level(b)); } /* Returns true if the CPU level is at least a certain value */ |