70 lines
1.6 KiB
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_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);
|
|
}
|
|
}
|