diff --git a/mie/include/mie/ir/register.h b/mie/include/mie/ir/register.h index 24c3a19..c4a46af 100644 --- a/mie/include/mie/ir/register.h +++ b/mie/include/mie/ir/register.h @@ -62,8 +62,13 @@ struct mie_register { }; extern struct mie_vector_ops mie_register_vector_ops; +extern struct mie_vector_ops mie_register_use_vector_ops; MIE_API void mie_register_move(struct mie_register *dest, struct mie_register *src); MIE_API void mie_register_cleanup(struct mie_register *reg); +MIE_API void mie_register_use_move( + struct mie_register_use *dest, struct mie_register_use *src); +MIE_API void mie_register_use_cleanup(struct mie_register_use *reg); + #endif diff --git a/mie/ir/register.c b/mie/ir/register.c index a3158eb..4ca3732 100644 --- a/mie/ir/register.c +++ b/mie/ir/register.c @@ -1,13 +1,14 @@ #include +#include #include -static enum mie_status cleanup(void *p) +static enum mie_status reg_cleanup(void *p) { mie_register_cleanup(p); return MIE_SUCCESS; } -static enum mie_status move(void *dst, void *src, size_t itemsz) +static enum mie_status reg_move(void *dst, void *src, size_t itemsz) { assert(itemsz == sizeof(struct mie_register)); struct mie_register *dest_reg = dst, *src_reg = src; @@ -15,9 +16,23 @@ static enum mie_status move(void *dst, void *src, size_t itemsz) return MIE_SUCCESS; } +static enum mie_status reg_use_cleanup(void *p) +{ + mie_register_use_cleanup(p); + return MIE_SUCCESS; +} + +static enum mie_status reg_use_move(void *dst, void *src, size_t itemsz) +{ + assert(itemsz == sizeof(struct mie_register_use)); + struct mie_register_use *dest_reg = dst, *src_reg = src; + mie_register_use_move(dest_reg, src_reg); + return MIE_SUCCESS; +} + struct mie_vector_ops mie_register_vector_ops = { - .v_destroy = cleanup, - .v_move = move, + .v_destroy = reg_cleanup, + .v_move = reg_move, }; void mie_register_move(struct mie_register *dest, struct mie_register *src) @@ -35,3 +50,20 @@ void mie_register_cleanup(struct mie_register *reg) mie_name_destroy(®->reg_name); } } + +void mie_register_use_move( + struct mie_register_use *dest, struct mie_register_use *src) +{ + memmove(dest, src, sizeof *dest); + + if (src->u_reg) { + b_queue_move(&src->u_reg->reg_use, &src->u_entry, &dest->u_entry); + } +} + +void mie_register_use_cleanup(struct mie_register_use *use) +{ + if (use->u_reg) { + b_queue_delete(&use->u_reg->reg_use, &use->u_entry); + } +}