9 int ilog2_32(uint32_t v
);
13 #define IF_GENBIT(bit) (UINT32_C(1) << (bit))
15 static inline unsigned int iflag_test(const iflag_t
*f
, unsigned int bit
)
17 unsigned int index
= bit
/ 32;
18 return f
->field
[index
] & (UINT32_C(1) << (bit
- (index
* 32)));
21 static inline void iflag_set(iflag_t
*f
, unsigned int bit
)
23 unsigned int index
= bit
/ 32;
24 f
->field
[index
] |= (UINT32_C(1) << (bit
- (index
* 32)));
27 static inline void iflag_clear(iflag_t
*f
, unsigned int bit
)
29 unsigned int index
= bit
/ 32;
30 f
->field
[index
] &= ~(UINT32_C(1) << (bit
- (index
* 32)));
33 static inline void iflag_clear_all(iflag_t
*f
)
35 memset(f
, 0, sizeof(*f
));
38 static inline void iflag_set_all(iflag_t
*f
)
40 memset(f
, 0xff, sizeof(*f
));
43 static inline int iflag_cmp(const iflag_t
*a
, const iflag_t
*b
)
47 for (i
= sizeof(a
->field
) / sizeof(a
->field
[0]) - 1; i
>= 0; i
--) {
48 if (a
->field
[i
] == b
->field
[i
])
51 return (a
->field
[i
] > b
->field
[i
]) ? 1 : -1;
57 static inline int iflag_cmp_cpu(const iflag_t
*a
, const iflag_t
*b
)
59 if (a
->field
[3] < b
->field
[3])
61 else if (a
->field
[3] > b
->field
[3])
66 static inline unsigned int iflag_ffs(const iflag_t
*a
)
70 for (i
= 0; i
< sizeof(a
->field
) / sizeof(a
->field
[0]); i
++) {
72 return ilog2_32(a
->field
[i
]) + (i
* 32);
78 #define IF_GEN_HELPER(name, op) \
79 static inline iflag_t iflag_##name(const iflag_t *a, const iflag_t *b) \
84 for (i = 0; i < sizeof(a->field) / sizeof(a->field[0]); i++) \
85 res.field[i] = a->field[i] op b->field[i]; \
93 /* Use this helper to test instruction template flags */
94 #define itemp_has(itemp, bit) iflag_test(&insns_flags[(itemp)->iflag_idx], bit)
97 /* Maximum processor level at moment */
98 #define IF_PLEVEL IF_IA64
99 /* Some helpers which are to work with predefined masks */
110 (IF_GENBIT(IF_AR0) |\
116 #define _itemp_smask(idx) (insns_flags[(idx)].field[0] & IF_SMASK)
117 #define _itemp_armask(idx) (insns_flags[(idx)].field[0] & IF_ARMASK)
118 #define _itemp_arg(idx) ((_itemp_armask(idx) >> IF_AR0) - 1)
120 #define itemp_smask(itemp) _itemp_smask((itemp)->iflag_idx)
121 #define itemp_arg(itemp) _itemp_arg((itemp)->iflag_idx)
122 #define itemp_armask(itemp) _itemp_armask((itemp)->iflag_idx)
124 static inline int iflag_cmp_cpu_level(const iflag_t
*a
, const iflag_t
*b
)
129 iflag_clear(&v1
, IF_CYRIX
);
130 iflag_clear(&v1
, IF_AMD
);
132 iflag_clear(&v2
, IF_CYRIX
);
133 iflag_clear(&v2
, IF_AMD
);
135 if (v1
.field
[3] < v2
.field
[3])
137 else if (v1
.field
[3] > v2
.field
[3])
143 static inline iflag_t
_iflag_pfmask(const iflag_t
*a
)
149 if (iflag_test(a
, IF_CYRIX
))
150 iflag_set(&r
, IF_CYRIX
);
151 if (iflag_test(a
, IF_AMD
))
152 iflag_set(&r
, IF_AMD
);
157 #define iflag_pfmask(itemp) _iflag_pfmask(&insns_flags[(itemp)->iflag_idx])
159 #endif /* NASM_IFLAG_H */