10 int ilog2_32(uint32_t v);
14 #define IF_GENBIT(bit) (UINT32_C(1) << (bit))
16 #define IFLAG_INIT (iflag_t){ .field = { 0 }, }
18 static inline unsigned int iflag_test(const iflag_t *f, unsigned int bit)
20 unsigned int index = bit / 32;
21 return f->field[index] & (UINT32_C(1) << (bit - (index * 32)));
24 static inline void iflag_set(iflag_t *f, unsigned int bit)
26 unsigned int index = bit / 32;
27 f->field[index] |= (UINT32_C(1) << (bit - (index * 32)));
30 static inline void iflag_clear(iflag_t *f, unsigned int bit)
32 unsigned int index = bit / 32;
33 f->field[index] &= ~(UINT32_C(1) << (bit - (index * 32)));
36 static inline void iflag_clear_all(iflag_t *f)
38 memset(f, 0, sizeof(*f));
41 static inline void iflag_set_all(iflag_t *f)
43 memset(f, 0xff, sizeof(*f));
46 static inline int iflag_cmp(const iflag_t *a, const iflag_t *b)
50 for (i = sizeof(a->field) / sizeof(a->field[0]) - 1; i >= 0; i--) {
51 if (a->field[i] == b->field[i])
54 return (a->field[i] > b->field[i]) ? 1 : -1;
60 static inline int iflag_cmp_cpu(const iflag_t *a, const iflag_t *b)
62 if (a->field[3] < b->field[3])
64 else if (a->field[3] > b->field[3])
69 static inline unsigned int iflag_ffs(const iflag_t *a)
73 for (i = 0; i < sizeof(a->field) / sizeof(a->field[0]); i++) {
75 return ilog2_32(a->field[i]) + (i * 32);
81 #define IF_GEN_HELPER(name, op) \
82 static inline iflag_t iflag_##name(const iflag_t *a, const iflag_t *b) \
87 for (i = 0; i < sizeof(a->field) / sizeof(a->field[0]); i++) \
88 res.field[i] = a->field[i] op b->field[i]; \
96 /* Use this helper to test instruction template flags */
97 #define itemp_has(itemp, bit) iflag_test(&insns_flags[(itemp)->iflag_idx], bit)
100 /* Maximum processor level at moment */
101 #define IF_PLEVEL IF_IA64
102 /* Some helpers which are to work with predefined masks */
113 (IF_GENBIT(IF_AR0) |\
119 #define _itemp_smask(idx) (insns_flags[(idx)].field[0] & IF_SMASK)
120 #define _itemp_armask(idx) (insns_flags[(idx)].field[0] & IF_ARMASK)
121 #define _itemp_arg(idx) ((_itemp_armask(idx) >> IF_AR0) - 1)
123 #define itemp_smask(itemp) _itemp_smask((itemp)->iflag_idx)
124 #define itemp_arg(itemp) _itemp_arg((itemp)->iflag_idx)
125 #define itemp_armask(itemp) _itemp_armask((itemp)->iflag_idx)
127 static inline int iflag_cmp_cpu_level(const iflag_t *a, const iflag_t *b)
132 iflag_clear(&v1, IF_CYRIX);
133 iflag_clear(&v1, IF_AMD);
135 iflag_clear(&v2, IF_CYRIX);
136 iflag_clear(&v2, IF_AMD);
138 if (v1.field[3] < v2.field[3])
140 else if (v1.field[3] > v2.field[3])
146 static inline iflag_t _iflag_pfmask(const iflag_t *a)
148 iflag_t r = IFLAG_INIT;
150 if (iflag_test(a, IF_CYRIX))
151 iflag_set(&r, IF_CYRIX);
152 if (iflag_test(a, IF_AMD))
153 iflag_set(&r, IF_AMD);
158 #define iflag_pfmask(itemp) _iflag_pfmask(&insns_flags[(itemp)->iflag_idx])
160 #endif /* NASM_IFLAG_H */