void emit_alloc_for_single_call(Merced_Code_Emitter& emitter,
                                int num_in_args,
                                int num_out_args,
                                void **function,
                                int& out0_reg,
                                int& save_pfs_reg,
                                int& save_b0_reg,
                                int& save_gp_reg)
{
    bool should_save_gp = (function[1] != get_vm_gp_value());
    int num_local = (should_save_gp ? 3 : 2);
    save_pfs_reg = IN_REG0 + num_in_args;
    save_b0_reg = save_pfs_reg + 1;
    save_gp_reg = (should_save_gp ? save_b0_reg + 1 : 0);
    out0_reg = IN_REG0 + num_in_args + num_local;
    emitter.ipf_alloc(save_pfs_reg, num_in_args, num_local, num_out_args, 0);
    emitter.ipf_mfbr(save_b0_reg, BRANCH_RETURN_LINK_REG);
    if (should_save_gp)
        emitter.ipf_mov(save_gp_reg, GP_REG);
}