2 * regset.c: register set abstraction
5 * Dietmar Maurer (dietmar@ximian.com)
7 * (C) 2001 Ximian, Inc.
11 #include <mono/arch/x86/x86-codegen.h>
14 mono_regset_new (int max_regs
)
18 g_return_val_if_fail (max_regs
> 0 && max_regs
<= 32, NULL
);
20 rs
= g_new0 (MonoRegSet
, 1);
22 rs
->max_regs
= max_regs
;
24 rs
->free_mask
= ~rs
->used_mask
;
25 rs
->reserved_mask
= 0;
31 mono_regset_free (MonoRegSet
*rs
)
37 mono_regset_reserve_reg (MonoRegSet
*rs
, int regnum
)
41 g_return_if_fail (rs
!= NULL
);
42 g_return_if_fail (rs
->max_regs
> regnum
);
46 rs
->reserved_mask
|= ind
;
50 mono_regset_alloc_reg (MonoRegSet
*rs
, int regnum
, guint8 exclude_mask
)
54 g_return_val_if_fail (rs
!= NULL
, -1);
55 g_return_val_if_fail (rs
->max_regs
> regnum
, -1);
58 for (i
= 0, ind
= 1; i
< rs
->max_regs
; i
++, ind
= ind
<< 1) {
59 if (exclude_mask
& ind
)
61 if ((rs
->free_mask
& ind
) && !(rs
->reserved_mask
& ind
)) {
62 rs
->free_mask
&= ~ind
;
71 if (exclude_mask
& ind
)
74 if ((rs
->free_mask
& ind
) && !(rs
->reserved_mask
& ind
)) {
75 rs
->free_mask
&= ~ind
;
84 mono_regset_free_reg (MonoRegSet
*rs
, int regnum
)
88 g_return_if_fail (rs
!= NULL
);
89 g_return_if_fail (rs
->max_regs
> regnum
);
96 g_return_if_fail (rs
->free_mask
&& ind
);
102 mono_regset_reg_used (MonoRegSet
*rs
, int regnum
)
106 g_return_val_if_fail (rs
!= NULL
, FALSE
);
107 g_return_val_if_fail (rs
->max_regs
> regnum
, FALSE
);
108 g_return_val_if_fail (regnum
>= 0, FALSE
);
112 return rs
->used_mask
& ind
;