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;