Files
mie/mie/ir/register.c

70 lines
1.6 KiB
C

#include <assert.h>
#include <blue/core/queue.h>
#include <mie/ir/register.h>
static enum mie_status reg_cleanup(void *p)
{
mie_register_cleanup(p);
return MIE_SUCCESS;
}
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;
mie_register_move(dest_reg, src_reg);
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 = reg_cleanup,
.v_move = reg_move,
};
void mie_register_move(struct mie_register *dest, struct mie_register *src)
{
memmove(dest, src, sizeof *dest);
if (src->reg_flags & MIE_REGISTER_F_VIRTUAL) {
mie_name_move(&dest->reg_name, &src->reg_name);
}
}
void mie_register_cleanup(struct mie_register *reg)
{
if (reg->reg_flags & MIE_REGISTER_F_VIRTUAL) {
mie_name_destroy(&reg->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);
}
}