cxc 0.3.1

A high performance scripting language
Documentation
use crate::{Type, parse::Opcode};

use super::{hlr_data::FuncRep, expr_tree::{HNodeData, MemCpyGen, RefGen}};

pub fn large_set_to_memcpy(hlr: &mut FuncRep) {
    hlr.modify_many_infallible(
        |set_id, data, hlr| {
            let HNodeData::Set { lhs, rhs } = data else { return };
            
            let lhs_type = hlr.tree.get_ref(*lhs).ret_type();
            let rhs_type = hlr.tree.get_ref(*rhs).ret_type();

            let lhs_size = lhs_type.size();
            let rhs_size = rhs_type.size();

            let min_set_size = lhs_size.min(rhs_size);
            let max_set_size = lhs_size.max(rhs_size);

            if max_set_size <= 8 && 
                rhs_type.primitive_fields_iter().skip(1).next().is_none() && 
                lhs_type.primitive_fields_iter().skip(1).next().is_none() { return; }

            hlr.tree.replace(set_id, HNodeData::zero());

            let new_data = hlr.insert_quick(
                hlr.tree.parent(set_id),
                MemCpyGen {
                    from: RefGen(*rhs),
                    to: RefGen(*lhs),
                    size: HNodeData::Number {
                        lit_type: Type::i(64),
                        value: min_set_size as u64,
                    },
                },
            );

            *data = hlr.tree.get(new_data);
        }
    );
}